앞선 두 장은 표정을 7~8가지 중 하나로 분류했습니다. MediaPipe 블렌드셰이프는 발상이 다릅니다. 표정을 하나의 이름표로 단정하는 대신, 얼굴 근육의 움직임을 52개의 계수로 잘게 표현합니다. "왼쪽 눈을 0.8만큼 감았고, 입꼬리를 0.6만큼 올렸다"처럼요. 이 장에서는 이 연속적인 표정 표현을 다룹니다.
블렌드셰이프란
블렌드셰이프(blendshape)는 원래 3D 캐릭터 애니메이션에서 온 개념입니다. "입 벌리기", "눈썹 올리기" 같은 기본 표정 단위 각각을 0~1의 강도로 조절해 섞으면(blend) 어떤 표정이든 만들 수 있다는 아이디어입니다. MediaPipe FaceLandmarker는 얼굴에서 이 52가지 표정 단위의 강도를 읽어 줍니다.
| 접근 | 출력 | 성격 |
|---|---|---|
| 감정 분류(2·3장) | happy 등 1개 라벨 | 이산적, 7~8가지 |
| 블렌드셰이프(이 장) | 52개 계수(각 0~1) | 연속적, 세밀 |
분류가 "이 표정은 행복"이라고 답한다면, 블렌드셰이프는 "입꼬리가 올라갔고 볼이 당겨졌다"는 구성 요소를 알려 줍니다. 감정을 단정하지 않으므로, 미묘한 표정이나 AR 필터·아바타처럼 표정을 그대로 옮겨야 하는 곳에 강합니다.
블렌드셰이프 추출 코드
PART 03에서 쓴 FaceLandmarker에 output_face_blendshapes=True만 켜면 됩니다. 추가 모델이 필요 없습니다(face_landmarker.task에 포함).
# 파일: blendshapes.py"""MediaPipe FaceLandmarker로 52개 블렌드셰이프를 읽는다."""import mediapipe as mpfrom mediapipe.tasks import pythonfrom mediapipe.tasks.python import visionbase = python.BaseOptions(model_asset_path="face_landmarker.task")options = vision.FaceLandmarkerOptions( base_options=base, output_face_blendshapes=True, # 블렌드셰이프 켜기 num_faces=1,)landmarker = vision.FaceLandmarker.create_from_options(options)result = landmarker.detect(mp.Image.create_from_file("face.jpg"))# result.face_blendshapes: 얼굴별 [Category(category_name, score), ...] 52개for blendshapes in result.face_blendshapes: top = sorted(blendshapes, key=lambda b: b.score, reverse=True)[:5] print("두드러진 표정 단위 상위 5개:") for b in top: print(f" {b.category_name:20s} {b.score:.2f}")
result.face_blendshapes는 얼굴마다 52개 Category 목록을 줍니다. 각 항목은 이름(category_name, 예: mouthSmileLeft)과 강도(score, 0~1)를 가집니다. 점수 높은 순으로 정렬하면 지금 가장 두드러진 표정 단위가 보입니다. 웃는 얼굴이라면 mouthSmileLeft·mouthSmileRight 같은 미소 관련 계수가 위로 올라옵니다.

계수에서 감정으로
블렌드셰이프는 감정을 직접 주지 않습니다. 대신 계수를 조합해 우리가 직접 규칙을 만들 수 있습니다. 예를 들어 미소 계수가 높으면 행복, 눈썹 안쪽이 올라가고 입이 처지면 슬픔으로 해석하는 식입니다.
# 파일: blend_to_emotion.py (개념)scores = {b.category_name: b.score for b in result.face_blendshapes[0]}smile = (scores.get("mouthSmileLeft", 0) + scores.get("mouthSmileRight", 0)) / 2if smile > 0.5: print("미소가 강함 → 긍정적 표정")
이 방식의 장점은 투명함입니다. "왜 그렇게 판단했는가"가 계수로 드러나, 7분류 모델의 블랙박스보다 해석하기 쉽습니다. 단점은 규칙을 직접 설계해야 한다는 것입니다.
블렌드셰이프의 강점
- 신원과 무관: 누구인지 몰라도 표정 단위만 읽으므로 개인정보 부담이 적습니다.
- 실시간: MediaPipe 특유의 빠른 속도로 영상에서 부드럽게 동작합니다.
- 추가 모델 불필요: FaceLandmarker 하나로 랜드마크와 블렌드셰이프를 함께 얻습니다.
- 투명한 해석: 계수가 표정 구성을 직접 보여 줍니다.
실무 팁. 7분류 모델과 블렌드셰이프는 경쟁이 아니라 보완입니다. 빠르고 투명한 일차 판단은 블렌드셰이프로 하고, "행복/슬픔" 같은 최종 라벨이 꼭 필요하면 분류 모델을 함께 쓰는 식입니다. 특히 아바타·AR처럼 표정을 그대로 옮겨야 하는 응용은 블렌드셰이프가 거의 유일한 선택입니다.
이 장에서 기억할 것
MediaPipe 블렌드셰이프는 표정을 7분류로 단정하는 대신 52개 근육 계수(각 0~1)로 표현하는 연속적 접근입니다. PART 03의 FaceLandmarker에 output_face_blendshapes=True만 켜면 추가 모델 없이 얻으며, 계수를 조합해 직접 감정 규칙을 만들 수 있습니다. 신원 무관·실시간·투명한 해석이 강점이라 AR·아바타에 특히 적합합니다. 다음 장에서는 더 세밀한 학술적 접근인 Py-Feat의 Action Unit을 (선택적으로) 살펴봅니다.