표정을 어떻게 “정확히” 주문할까
요즘 게임 회사들은 생성형 AI로 인물 프로토타입을 빠르게 뽑습니다. 콘셉트 단계에서 캐릭터 한 명의 표정 변주를 수십 장씩 만들어 보고, 그중 방향이 맞는 것을 골라 다음 단계로 넘깁니다. 문제는 “표정”이라는 주문이 생각보다 다루기 어렵다는 데 있습니다.
웃는 여성 캐릭터라고 프롬프트를 넣으면 모델은 일단 웃는 얼굴을 만들긴 합니다. 하지만 그게 어떤 웃음인지는 모델이 알아서 정합니다. 입만 웃는 어색한 미소일 수도, 눈까지 접히는 함박웃음일 수도 있습니다. 여기서 “입꼬리만 살짝 더 올리고 눈은 그대로”, “지금보다 30%만 슬프게” 같은 미세 조정을 하려고 하면 자연어로는 길이 막힙니다. 표정을 가리키는 공용 좌표계가 없기 때문입니다.
그런데 사실 그 좌표계는 이미 40년 전부터 존재했습니다. 심리학과 컴퓨터 비전이 오래 써온 표정의 표기 체계, FACS와 Action Unit이 그것입니다.
FACS: 감정이 아니라 움직임을 코딩한다
FACS(Facial Action Coding System)는 심리학자 Paul Ekman과 Wallace V. Friesen이 1978년에 발표한 표정 기술 체계입니다. 2002년 Joseph Hager가 합류해 개정판을 냈습니다. 뿌리를 더 거슬러 올라가면 스웨덴 해부학자 Carl-Herman Hjortsjö의 1970년 안면 근육 연구가 있고, 그보다 멀리는 표정이 진화적·보편적 신호라고 본 Darwin의 1872년 저작 The Expression of the Emotions in Man and Animals까지 닿습니다.
FACS의 핵심 발상은 한 문장으로 요약됩니다.
FACS의 핵심
표정을 “행복”, “분노” 같은 감정 라벨로 기록하지 않습니다. 어떤 근육이 어떻게 움직였는지, 그 물리적 움직임만을 기술합니다.
이 분리가 전부입니다. “이 사람은 행복해 보인다”는 관찰자의 해석(inference)이고, “광대근(zygomaticus major)이 수축해 입꼬리가 위로 당겨졌다”는 객관적 기술(description)입니다. FACS는 후자만 다룹니다. 감정이라는 해석 레이어를 떼어내자, 표정은 관찰자 주관에 휘둘리지 않고 재현 가능하며 조합 가능한 데이터가 됐습니다. 실제로 FACS로 관찰된 AU 조합은 7,000가지가 넘습니다.
Action Unit: 표정의 알파벳
FACS가 표정을 적는 문자 체계라면, Action Unit(AU)은 그 알파벳입니다. AU는 하나의 근육 또는 함께 움직이는 근육군이 만들어내는 최소 움직임 단위입니다. 모든 표정은 이 AU들의 조합으로 표기됩니다. 알파벳을 조합해 단어를 만드는 것과 같습니다.
주요 Action Unit
표정을 구성하는 핵심 AU는 대략 1번부터 28번까지입니다. 얼굴 위쪽(눈썹·눈)과 아래쪽(코·입·턱)으로 나누면 외우기 쉽습니다.
상안면(upper face) AU:
| AU | 이름 | 움직임 | 근육 |
|---|---|---|---|
| 1 | Inner Brow Raiser | 눈썹 안쪽을 올림 | frontalis (pars medialis) |
| 2 | Outer Brow Raiser | 눈썹 바깥쪽을 올림 | frontalis (pars lateralis) |
| 4 | Brow Lowerer | 눈썹을 내리고 미간을 찌푸림 | corrugator / depressor supercilii |
| 5 | Upper Lid Raiser | 윗눈꺼풀을 올려 눈을 크게 뜸 | levator palpebrae superioris |
| 6 | Cheek Raiser | 볼을 올리고 눈가에 주름 | orbicularis oculi (pars orbitalis) |
| 7 | Lid Tightener | 눈꺼풀을 조임 | orbicularis oculi (pars palpebralis) |
| 43 | Eyes Closed | 눈을 감음 | levator palpebrae 이완 |
| 45 | Blink | 깜빡임 | orbicularis oculi |
| 46 | Wink | 한쪽 눈 윙크 | orbicularis oculi |
하안면(lower face) AU:
| AU | 이름 | 움직임 | 근육 |
|---|---|---|---|
| 9 | Nose Wrinkler | 코를 찡그림 | levator labii superioris alaeque nasi |
| 10 | Upper Lip Raiser | 윗입술을 올림 | levator labii superioris |
| 11 | Nasolabial Deepener | 팔자주름을 깊게 | zygomaticus minor |
| 12 | Lip Corner Puller | 입꼬리를 위/옆으로 당김 (미소) | zygomaticus major |
| 13 | Sharp Lip Puller | 입꼬리를 날카롭게 올림 | levator anguli oris |
| 14 | Dimpler | 보조개, 입꼬리를 조여 당김 | buccinator |
| 15 | Lip Corner Depressor | 입꼬리를 내림 | depressor anguli oris |
| 16 | Lower Lip Depressor | 아랫입술을 내림 | depressor labii inferioris |
| 17 | Chin Raiser | 턱끝을 올려 아랫입술을 밀어 올림 | mentalis |
| 18 | Lip Pucker | 입술을 오므림 | incisivii labii |
| 20 | Lip Stretcher | 입술을 양옆으로 늘림 | risorius / platysma |
| 22 | Lip Funneler | 입술을 나팔 모양으로 | orbicularis oris |
| 23 | Lip Tightener | 입술을 좁고 팽팽하게 | orbicularis oris |
| 24 | Lip Pressor | 입술을 맞물어 누름 | orbicularis oris |
| 25 | Lips Part | 입술이 벌어짐 | depressor labii / orbicularis oris 이완 |
| 26 | Jaw Drop | 턱이 떨어져 입이 벌어짐 | masseter 이완 |
| 27 | Mouth Stretch | 턱을 크게 벌림 | pterygoids, digastric |
| 28 | Lip Suck | 입술을 안으로 빨아들임 | orbicularis oris |
이 외에 머리와 눈의 방향도 별도 코드로 기술합니다. 표정 자체는 아니지만 표정이 향하는 맥락을 담는 부분입니다.
| 코드 | 의미 | 코드 | 의미 |
|---|---|---|---|
| 51 / 52 | 고개 좌 / 우 회전 | 61 / 62 | 시선 좌 / 우 |
| 53 / 54 | 고개 위 / 아래 | 63 / 64 | 시선 위 / 아래 |
| 55 / 56 | 고개 좌 / 우 기울임 | 19 | 혀 내밀기 |
| 57 / 58 | 고개 앞 / 뒤 | 21 | 목 긴장 (platysma) |
강도: 같은 AU, 다른 세기
AU는 켜짐/꺼짐의 이진값이 아닙니다. 각 AU에는 A부터 E까지 5단계 강도가 붙습니다. 같은 미소(AU12)라도 12A는 입꼬리가 겨우 움직인 흔적이고 12E는 활짝 당겨진 최대치입니다.
| 강도 | 의미 |
|---|---|
| A | trace (흔적) |
| B | slight (약함) |
| C | marked / pronounced (뚜렷함) |
| D | severe / extreme (강함) |
| E | maximum (최대) |
감정은 AU의 조합이다
개별 AU 자체에는 감정이 없지만, Ekman은 특정 AU 조합이 보편적으로 특정 감정을 표현한다고 봤습니다(이 매핑을 EMFACS라 부릅니다). 자주 인용되는 프로토타입 조합은 다음과 같습니다.
| 감정 | AU 조합 | 풀어 쓰면 |
|---|---|---|
| 행복 | 6 + 12 | 볼이 올라가고 입꼬리가 당겨짐 (눈까지 웃는 진짜 미소) |
| 슬픔 | 1 + 4 + 15 | 눈썹 안쪽이 올라가 미간이 모이고 입꼬리는 내려감 |
| 놀람 | 1 + 2 + 5 + 26 | 눈썹 전체가 올라가고 눈이 커지며 턱이 떨어짐 |
| 공포 | 1 + 2 + 4 + 5 + 7 + 20 + 26 | 놀람과 비슷하나 미간이 모이고 입이 옆으로 늘어남 |
| 분노 | 4 + 5 + 7 + 23 | 미간을 찌푸리고 눈을 부릅뜨며 입술을 팽팽히 조임 |
| 혐오 | 9 + 15 + 16 | 코를 찡그리고 입꼬리와 아랫입술을 내림 |
| 경멸 | 12 + 14 (한쪽만) | 한쪽 입꼬리만 당겨 비대칭으로 |
여기서 행복의 6 + 12가 흥미롭습니다. 입꼬리만 올리는 12 단독은 의식적으로 지어낼 수 있지만, 눈가 근육인 6은 의지로 통제하기 어렵습니다. 그래서 6이 동반된 미소를 진짜 즐거움의 신호인 뒤센 미소(Duchenne smile)라 부릅니다. 표정을 AU로 분해하면 “진짜 웃음과 가짜 웃음의 차이” 같은 직관적 개념도 이렇게 좌표 차이로 또렷하게 잡힙니다.
텍스트 프롬프트의 한계, AU의 강점
다시 처음의 문제로 돌아오겠습니다. 생성형 AI에게 웃어라고 말하면, 어떤 웃음일지는 모델이 학습 분포에서 알아서 샘플링합니다. 자연어 프롬프트는 본질적으로 모호하고, 표정이라는 연속적인 대상을 가리키기엔 해상도가 너무 낮습니다.
이산적인 감정 라벨로 학습한 모델도 한계가 같습니다. 예컨대 초기 표정 변환 모델인 StarGAN은 “행복/슬픔/분노” 같은 정해진 몇 개의 감정 도메인 사이에서만 변환할 수 있습니다. 데이터셋에 있는 표정의 개수만큼만 만들어내는 셈입니다.
AU는 이 문제를 정면으로 풉니다.
- 연속적: 각 AU에 강도 값을 줄 수 있어, 표정이 이산 라벨이 아니라 연속적인 공간(manifold) 위의 한 점이 됩니다.
- 분리되어 있음(disentangled): 눈썹은 그대로 두고 입꼬리만 0.3만큼 올리는 식으로, 부위별 독립 제어가 됩니다.
- 조합적: 적은 수의 AU 조합으로 7,000가지 이상의 표정을 표기합니다.
- 해석 가능:
AU12 = 0.3이 무슨 뜻인지 사람이 읽을 수 있습니다. 블랙박스 잠재 벡터와 다릅니다.
요컨대 AU는 표정에 대해 측정 가능하고 재현 가능한 제어 신호를 제공합니다. “웃어”가 아니라 “AU6를 0.5, AU12를 0.7”이라고 주문할 수 있게 되는 것입니다.
AU를 조건으로 거는 생성 파이프라인
표정 생성 연구가 AU를 조건(conditioning) 신호로 가져온 흐름은 꽤 명확합니다.
GANimation (Pumarola et al., ECCV 2018)이 분기점입니다. 이 연구는 AU 강도 벡터를 GAN의 조건으로 직접 집어넣었습니다. 앞서 말한 StarGAN의 이산적 한계를, “AU가 그리는 연속적인 표정 manifold”로 대체한 것입니다. 덕분에 각 AU의 활성 정도를 따로 조절하고 여러 AU를 조합할 수 있게 됐고, attention mask를 함께 학습해 배경·조명이 바뀌어도 얼굴 부분만 안정적으로 바꿉니다.
최근에는 이 아이디어가 diffusion 모델로 옮겨왔습니다. MagicFace, FineFace 같은 연구는 text-to-image diffusion에 AU 조건을 부가하는 어댑터를 붙여, 베이스 모델의 생성 능력은 그대로 둔 채 표정만 AU 단위로 정밀하게 편집합니다. 정체성(누구의 얼굴인지)은 유지하면서 표정 좌표만 움직이는 것이 핵심입니다.
생성의 반대편, 즉 AU를 읽어내는 쪽도 함께 봐야 파이프라인이 완성됩니다. OpenFace(Tadas Baltrušaitis)나 Py-Feat 같은 도구는 이미지에서 AU와 그 강도를 자동 검출합니다. 이게 두 군데서 쓰입니다.
- 학습 데이터 라벨링: 표정 이미지에 AU 주석을 자동으로 달아 조건부 학습 데이터를 만듭니다.
- 결과 검증: 생성된 이미지를 다시 검출기에 넣어, 의도한 목표 AU와 실제로 나온 AU의 오차를 정량 측정합니다. “정확도”를 눈대중이 아니라 숫자로 평가하는 루프가 닫힙니다.
3D와 게임: 블렌드셰이프라는 다리
여기까지는 2D 이미지 생성 이야기지만, 게임에서는 결국 3D 캐릭터로 넘어가야 합니다. 이 다리 역할을 하는 것이 블렌드셰이프(blendshape)입니다.
Apple ARKit의 표정 추적은 52개의 블렌드셰이프를 쓰는데, 이 표준은 FACS에서 파생됐습니다. 블렌드셰이프는 모프 타깃(morph target)이라고도 부르며, 각 표정 요소를 0.0에서 1.0 사이 가중치로 조절합니다. AU의 강도 값과 사실상 같은 인터페이스입니다. 언리얼의 MetaHuman 페이셜 릭도 이 ARKit 52 블렌드셰이프 표준에 정렬되어 있고, Live Link Face로 아이폰 표정을 그대로 받습니다.
그래서 그림이 이렇게 이어집니다.
flowchart LR A["FACS / AU<br/>좌표계"] --> B["ARKit 52 blendshape<br/>3D 구현 단위"] B --> C["MetaHuman 릭<br/>실제 캐릭터"] C --> D["인게임 표정<br/>최종 결과물"]
콘셉트 단계의 2D 프로토타입과 최종 3D 릭이 사실상 같은 표정 언어를 공유하게 되는 셈입니다. 캐릭터 한 명의 표정 시트 전체를 AU 좌표로 명세하면, 생성 단계에서든 리깅 단계에서든 동일한 기준으로 표정을 맞출 수 있습니다. 캐릭터마다, 컷마다 표정이 들쭉날쭉해지는 일관성 문제가 줄어듭니다.
커피챗에서 들었던 “AU를 쓰면 정확도가 비약적으로 오른다”는 말의 정체가 여기 있습니다. 모호한 자연어 대신, 측정·재현·검증이 가능한 제어 신호를 모델에게 줬기 때문입니다. 정확도가 마법처럼 오르는 게 아니라, 애초에 가리킬 수 없던 것을 정확히 가리킬 수 있게 된 것입니다.
한계: FACS가 말해주지 않는 것
마지막으로 균형을 맞추겠습니다. AU는 강력하지만 만능은 아닙니다.
- 기술과 해석의 간극: FACS는 어디까지나 움직임을 기술할 뿐 감정을 단정하지 않습니다.
AU6 + AU12가 늘 “진짜 행복”인 것은 아닙니다. 사회적 미소, 어색한 웃음일 수도 있습니다. 감정으로의 매핑(EMFACS)은 그 위에 얹은 별도의 해석 레이어이고, 이 해석의 문화적 보편성은 여전히 학계의 논쟁거리입니다. - ARKit과 FACS의 불일치: 둘은 비슷하지만 일대일 대응이 아닙니다. Apple 문서가 명확하지 않고 유사한 표정 shape을 구분하기 어려워, ARKit-FACS 변환에는 오역이 흔합니다.
- 검출기의 한계: AU 자동 검출도 완벽하지 않습니다. 조명, 머리 각도, 개인별 얼굴 차이에 따라 오차가 생깁니다. 검증 루프의 숫자도 그만큼 걸러서 봐야 합니다.
그럼에도 핵심은 분명합니다. 표정에 좌표계를 부여하는 순간, 자연어로는 불가능했던 정밀한 주문과 정량적 검증이 가능해집니다. 40년 전 심리학 실험실에서 만든 표기 체계가, 지금 게임 캐릭터 프로토타입을 뽑는 파이프라인 한가운데서 다시 쓰이고 있는 이유입니다.