MediaPipe Face Landmarker — 학부생을 위한 학습 교재

00. 기초 — 이 책을 읽기 위한 공통 어휘

Contents

뒤의 모든 장은 여기서 정의한 말을 다시 설명하지 않고 그대로 쓴다. 그래서 이 장만 한 번 읽어 두면 01장부터는 새 용어에 막히는 일이 거의 없다. 읽다가 단어가 헷갈리면 이 장으로 돌아오거나, 책 끝의 GLOSSARY.md에서 한 줄 요약과 해당 절 링크를 찾으면 된다.

이 책의 주인공은 MediaPipe Face Landmarker다. 한 문장으로 줄이면 이렇다. 카메라로 찍은 평범한 RGB 사진(또는 영상) 한 장에서 사람 얼굴을 찾아, 그 얼굴 위에 478개의 점을 정확히 찍고, 덤으로 지금 어떤 표정인지를 숫자로 알려 주는 소프트웨어 도구다. 이 문장에 들어 있는 말 — RGB, 얼굴 검출, 랜드마크, 메시, 정규화 좌표, 표정 계수 — 을 아래에서 하나씩 푼다.

먼저 전체 흐름을 큰 그림으로 본다.

runs all of this

describe

reference for

reference for

RGB image

face detection

ROI crop and align

landmark regression

478 landmarks on a mesh

blendshape coefficients

transformation matrix

on-device inference

normalized coordinates

canonical face model

그림의 영어 노드 이름이 곧 아래 절 제목이다. 실선 화살표는 데이터가 흐르는 방향이고, 점선은 어떤 개념이 무엇을 떠받치는지를 나타낸다.


0.1 RGB 이미지와 픽셀 — 입력이 무엇인가

가장 밑바닥부터 시작한다. 컴퓨터가 보는 사진은 숫자 격자다. 사진을 아주 잘게 나눈 한 칸 한 칸을 픽셀(pixel, 이미지의 가장 작은 칸)이라 부른다. 컬러 사진의 픽셀 하나는 빨강(R)·초록(G)·파랑(B) 세 숫자로 색을 표현하고, 이 방식을 RGB라 한다. 1280×720 해상도라면 가로 1280칸 × 세로 720칸으로 약 92만 개의 픽셀이 있고, 픽셀마다 (R, G, B) 세 값이 들어 있다.

Face Landmarker가 받는 입력이 바로 이 RGB 이미지다. 깊이 센서나 적외선, 다중 카메라 같은 특별한 하드웨어가 필요 없다. 스마트폰 셀피 카메라나 노트북 웹캠 한 대면 된다. 영상은 결국 이런 이미지(프레임)가 1초에 수십 장씩 이어진 것이다.

RGB 이미지는 색칠된 모눈종이에 가깝다. 모눈 한 칸이 픽셀이고, 칸마다 "빨강 200, 초록 150, 파랑 100" 같은 메모가 적혀 있다. 컴퓨터는 이 메모만 보고 어디에 얼굴이 있는지 알아내야 한다.

이 책에서 "입력 이미지"라고 하면 별다른 말이 없는 한 이 RGB 이미지를 가리킨다.

Advertisements

0.2 얼굴 검출(face detection)과 BlazeFace

얼굴 검출은 이 사진 어디에 얼굴이 있는지에 답하는 일이다. 답은 보통 바운딩 박스(bounding box) — 얼굴을 감싸는 네모 — 와 코끝·양 눈 같은 몇 개의 핵심 점(키포인트)으로 나온다. 이 단계는 얼굴의 위치만 알면 되고, 표정이나 정밀한 윤곽은 필요 없다. 그래서 거칠더라도 빠른 것이 목표다.

BlazeFace는 바로 이 일을 하는 초경량 얼굴 검출기다. 2019년 구글이 발표했고(arXiv:1907.05047), 모바일 GPU에서 1밀리초 안팎으로 얼굴을 찾을 만큼 가볍게 설계됐다. Face Landmarker는 이 BlazeFace의 경량 변형인 BlazeFace short-range 모델을 검출 단계에 그대로 쓴다.

얼굴 검출은 큰 운동장(전체 사진)에서 저기 사람이 서 있다고 손가락으로 가리키는 일과 같다. 그 사람의 표정까지 읽는 건 다음 단계의 몫이다.

검출이 왜 별도 단계로 나뉘는지, 검출 결과인 박스와 키포인트가 다음 단계에서 어떻게 쓰이는지는 02장에서 자세히 본다. 여기서는 얼굴 검출은 위치 찾기이고 그 도구가 BlazeFace라는 점만 기억하면 된다.

0.3 ROI — 관심 영역 자르기와 정렬

ROI(Region of Interest, 관심 영역)는 전체 이미지에서 우리가 집중할 부분, 곧 검출된 얼굴 영역을 말한다. 검출기가 여기 얼굴이라고 박스를 주면, 그 박스 주위를 잘라내고(crop), 머리가 기울어져 들어왔어도 두 눈을 잇는 선이 수평이 되도록 회전시킨다(align). 이렇게 일정한 크기의 작은 얼굴 사진으로 정리한다. 이 잘리고 정렬된 작은 얼굴 패치가 다음 모델의 입력이 된다.

증명사진을 찍을 때 사진관에서 얼굴을 가운데에 똑바로 맞춰 주는 것과 같다. 비뚤어진 얼굴과 멀리 있는 얼굴을 매번 다르게 처리하면 정밀 모델이 헷갈린다. 미리 가운데, 똑바로, 일정한 크기로 맞춰 주면 정밀 모델은 늘 비슷한 모양의 입력만 보면 되니 훨씬 정확해진다.

crop과 align이 왜 정확도와 속도에 결정적인지는 02장에서 단계별로 푼다. 여기서는 ROI는 잘라서 똑바로 세운 얼굴 패치라는 점만 잡고 간다.

0.4 랜드마크(landmark)와 얼굴 메시(face mesh)

랜드마크(landmark)는 얼굴 위의 의미 있는 한 점이다. 코끝, 왼쪽 눈꼬리, 윗입술 가운데 같은 특정 지점을 가리키는 좌표다. 이 책에서는 "feature"라는 말도 같은 뜻으로 쓴다. 얼굴에서 뽑아낸 점 하나하나가 곧 feature다.

점이 많아지면 그 점들을 이어 삼각형 그물을 만들 수 있다. 이렇게 얼굴 표면 전체를 빈틈없이 덮는 삼각형 그물을 얼굴 메시(face mesh)라 부른다. 메시는 단순한 점 모음이 아니다. 이 점과 저 점을 이으면 한 삼각형이라는 연결 구조까지 가진 면(surface)이다.

landmarks (points)

connections (triangles)

face mesh (surface)

texture / makeup

AR mask

expression driving

점이 모여 삼각형이 되고, 삼각형이 모여 표면이 되며, 그 표면이 메이크업·AR 마스크·표정 구동 같은 응용으로 이어진다.

랜드마크가 밤하늘의 별이라면 메시는 그 별들을 이어 그린 별자리다. 별만 있으면 위치만 알지만, 선으로 이으면 코의 곡면이나 뺨의 볼록함 같은 얼굴의 입체 형태가 보인다.

왜 점이 478개씩이나 필요한지, 그 점들이 얼굴 어디에 어떻게 분포하는지는 03장에서 깊게 다룬다. 지금은 랜드마크는 의미 있는 점, 메시는 그 점들로 만든 얼굴 표면 그물이면 충분하다. 그런데 그 점의 좌표를 어떤 단위로 적을까. 픽셀이 아니라 정규화 좌표를 쓴다.

Advertisements

0.5 정규화 좌표(normalized coordinates)

랜드마크 위치를 픽셀 절댓값(예: x=820픽셀)으로 주면, 사진 해상도가 바뀔 때마다 값이 달라져 불편하다. 그래서 Face Landmarker는 정규화 좌표(normalized coordinate)를 쓴다. 좌표를 이미지 크기로 나눠 0과 1 사이의 값으로 만든 것이다.

  • x = (그 점의 가로 위치) ÷ (이미지 ) → 0.0 ~ 1.0
  • y = (그 점의 세로 위치) ÷ (이미지 높이) → 0.0 ~ 1.0
  • z = 상대 깊이 (아래에서 따로 설명)

이렇게 하면 640×480 사진이든 1920×1080 사진이든 코끝은 x=0.5(가로 한가운데)처럼 해상도와 무관하게 같은 의미를 갖는다. 픽셀 좌표가 필요하면 다시 곱하면 된다. 픽셀 x = x × 이미지 폭, 픽셀 y = y × 이미지 높이다.

주의할 점이 두 가지 있다.

첫째, 이미지 좌표계의 원점은 왼쪽 위(top-left)다. x는 오른쪽으로 갈수록 커지고, y는 아래로 갈수록 커진다. 수학 시간에 배운 y축과는 방향이 반대다. 각도를 계산하거나 그림을 그릴 때 부호를 헷갈리지 말자.

둘째, z(깊이)는 03장에서 따로 다루지만 핵심만 미리 적는다. z는 상대 깊이일 뿐 절대 거리(미터·센티)가 아니다. "코끝이 카메라에서 30cm" 같은 값을 z에서 바로 읽으면 안 된다.

정규화 좌표는 칠판의 왼쪽에서 30%, 위에서 40% 지점처럼 비율로 위치를 말하는 방식이다. 칠판이 크든 작든 "왼쪽에서 30%"는 늘 같은 곳을 가리킨다. 이 책에서 랜드마크를 말할 때는 이 정규화 좌표가 기본 규약이다.

0.6 canonical face model — 표준 얼굴 모델

canonical face model(표준 얼굴 모델)은 MediaPipe가 미리 만들어 둔 정면을 보는 표준 3D 얼굴 메시다. 특정 사람의 얼굴이 아니라, 모든 얼굴을 맞춰 보는 기준 틀에 가깝다. 이 표준 모델은 468개의 정점(vertex)으로 이루어진다. 이 468개가 곧 Face Landmarker가 출력하는 표면 랜드마크 468개와 번호까지 1:1로 대응한다. 478개 중 468개이고, 나머지 10개는 03장에서 다룬다.

이 표준 모델이 중요한 이유는 두 가지를 고정으로 물려주기 때문이다.

  • UV 좌표(텍스처 매핑용 2D 좌표): i번 점이 텍스처 이미지의 어디에 대응하는지를 적은 정보. 메이크업이나 마스크 이미지를 얼굴에 입힐 때 쓴다.
  • 삼각형 연결(triangulation/topology): j·k·l번 점을 이으면 한 삼각형이라는 그물 구조.

매 프레임 사람마다 점의 3D 위치(XYZ)는 바뀐다. 하지만 UV와 삼각형 구조는 표준 모델에서 그대로 상속된다. 덕분에 몇 번 점이 항상 어느 부위인지가 고정되어, 프레임이 바뀌어도 같은 부위를 안정적으로 추적하고 텍스처를 입힐 수 있다. 이 고정 토폴로지의 이점은 03장의 핵심 주제다.

또 표준 모델은 길이 단위를 센티미터(cm)로 가진다(metric 공간). 검출된 실제 얼굴을 이 표준 모델에 맞춰 정렬하면 머리가 어디를 보고 어디에 있는지를 행렬로 뽑아낼 수 있다. 이것이 0.9절의 변환 행렬이다.

canonical face model은 옷 가게의 마네킹과 같다. 손님(검출된 얼굴)마다 체형은 달라도, 마네킹이라는 기준이 있으면 단추는 늘 가슴 중앙, 소매는 늘 팔처럼 부위를 일관되게 맞출 수 있다. 그리고 이 표준 모델 위에 점을 찍는 일은 회귀라는 기계학습 기법으로 이뤄진다.

0.7 회귀(regression)와 온디바이스 추론(on-device inference)

회귀 — 숫자를 직접 예측하기

기계학습의 예측에는 크게 두 종류가 있다. 분류(classification)는 이건 개냐 고양이냐처럼 범주를 고르는 일이다. 회귀(regression)는 코끝의 x좌표는 0.52, y좌표는 0.48처럼 연속적인 숫자 값을 직접 맞히는 일이다.

Face Landmarker의 핵심은 회귀다. 모델은 얼굴 패치를 보고 478개 점 각각의 (x, y, z)를 숫자로 직접 예측한다. 이 점이 눈인지 코인지를 분류하는 게 아니다. 표준 모델의 i번 점이 이 사람 얼굴에서는 화면 어디에 있는지를 좌표로 회귀한다. 뒤에 나올 블렌드셰이프 계수(0~1 사이 표정 강도)도 분류가 아니라 회귀로 얻는다.

분류가 객관식 시험(①개 ②고양이)이라면 회귀는 주관식 빈칸 채우기(코끝 x = ___)다. Face Landmarker는 빈칸을 478×3개(좌표) 채우는 주관식 시험을 매 프레임 푸는 셈이다.

온디바이스 추론 — 서버 없이 기기 안에서

추론(inference)은 학습이 끝난 모델을 실제로 돌려서 답을 얻는 과정이다. 온디바이스 추론(on-device inference)은 그 추론을 클라우드 서버로 사진을 보내지 않고 사용자의 기기(스마트폰·노트북·브라우저) 안에서 직접 하는 것이다.

장점은 세 가지다.

  • 속도/지연: 네트워크 왕복이 없어 실시간(수십 FPS) 처리가 가능하다.
  • 프라이버시: 얼굴 이미지가 기기 밖으로 나가지 않는다.
  • 오프라인 동작: 인터넷이 없어도 된다.

대신 제약이 있다. 스마트폰의 작은 칩으로 매 프레임 처리해야 하므로 모델을 작고 빠르게 만들어야 한다. 이 책에 계속 나오는 "경량(lightweight)", "모바일 GPU 최적화", "float16" 같은 표현은 모두 이 온디바이스 제약을 맞추려는 설계의 흔적이다.

float16은 숫자를 16비트로 저장하는 방식이다(일반적인 32비트 float의 절반). 정밀도를 조금 희생하는 대신 모델 파일이 작아지고 추론이 빨라져, 모바일 추론에 흔히 쓴다. 이 책의 모델 번들이 모두 float16인 이유다.

이렇게 기기 안에서 회귀로 얻은 478점 위에, 한 단계 더 얹어 표정의 의미를 뽑는 것이 블렌드셰이프다.

0.8 블렌드셰이프(blendshape)와 표정 계수

478개 좌표는 점이 어디 있는지는 알려 주지만, 사람이 그것만 보고 지금 웃고 있다를 읽기는 어렵다. 블렌드셰이프(blendshape)는 표정을 좌표가 아니라 의미 있는 표정 단위 52개의 강도로 표현하는 방식이다. 각 단위는 0~1 사이의 계수(coefficient) 하나를 갖는다.

  • eyeBlinkLeft = 0.92 → 왼쪽 눈을 거의 다 감음
  • jawOpen = 0.30 → 입을 살짝 벌림
  • mouthSmileLeft = 0.65 → 왼쪽 입꼬리가 꽤 올라감

0.0이면 그 표정 요소가 전혀 활성화되지 않은 상태이고, 1.0이면 최대로 활성화된 상태다.

이름의 유래가 개념을 잘 설명한다. blend(혼합) + shape(모양)이다. 원래 3D 캐릭터 애니메이션에서 쓰던 morph target(= blend shape) 기법에서 왔다. 아티스트가 무표정 얼굴, 활짝 웃는 얼굴, 눈 감은 얼굴 같은 기본 모양을 미리 만들어 두고, 이들을 가중치로 섞어(blend) 임의의 표정을 만든다. Face Landmarker는 이 과정의 역문제를 푼다. 이미지를 보고 지금 표정은 웃음 0.65 + 눈감음 0.92처럼 그 가중치(계수)를 거꾸로 알아낸다.

블렌드셰이프는 오디오 믹싱 콘솔의 슬라이더와 같다. 베이스 70%, 보컬 40%, 드럼 0%로 소리를 만들 듯, 눈감음 92%, 미소 65%, 입벌림 30%로 표정을 만든다. Face Landmarker는 완성된 소리를 듣고 각 슬라이더가 몇 %였는지 알아맞히는 일을 한다.

미리 못 박을 사실이 하나 있다(상세는 04장). 블렌드셰이프는 랜드마크 모델이 같이 뱉는 출력이 아니다. 랜드마크를 입력으로 받는 별도의 작은 2차 모델이 따로 계산한다. 그리고 MediaPipe의 52개는 애플 ARKit의 52개와 개수만 같고 구성이 살짝 다르다. 이 두 가지가 04장의 핵심 오해 정정이다.

표정은 얼굴 안쪽의 움직임이다. 이와 별개로 머리 전체가 어디를 향하는지는 다음 개념이 담는다.

0.9 변환 행렬(transformation matrix)과 머리 자세

블렌드셰이프가 얼굴 안쪽의 표정(눈·입·눈썹 움직임)을 담는다면, facial transformation matrix(얼굴 변환 행렬)는 머리 전체의 자세(pose)를 담는다. 어느 방향을 보는지(회전), 어디에 있는지(이동), 얼마나 큰지(스케일)다. 형태는 컴퓨터 그래픽스의 표준인 4×4 행렬이다.

이 행렬의 역할은 0.6절의 canonical face model과 이어진다. 표준 얼굴 모델을 현재 검출된 실제 얼굴의 위치·방향·크기에 맞춰 옮기는 변환이 바로 이 4×4 행렬이다. 그래서 3D 안경·모자·마스크 같은 가상 물체를 얼굴 자세에 맞춰 정확히 얹을 수 있다.

블렌드셰이프가 배우의 표정 연기라면, 변환 행렬은 그 배우가 고개를 어느 쪽으로 돌렸고 카메라에서 얼마나 떨어져 있는지다. 아바타를 자연스럽게 움직이려면 둘 다 필요하다. 표정만 따라 하고 머리는 정면 고정이면 어색하고, 머리만 돌고 표정이 없으면 마네킹 같다.

행렬의 내부 구조(회전·이동·스케일이 4×4 안에 어떻게 배치되는지)와 응용은 04장에서 그림과 함께 푼다.


0.10 한눈에 보는 용어 지도

마지막으로 지금까지의 용어를 입력에서 출력으로 흐르는 순서 위에 한 번 더 배치한다. 이 그림이 머리에 들어오면 이 책의 뼈대를 잡은 것이다.

outputs

place the points

find the face

input

makes it fast and private

RGB image (pixels)

face detection (BlazeFace)

ROI crop and align

regression

face mesh on canonical model

478 landmarks (normalized x,y,z)

52 blendshape coefficients

4x4 transformation matrix (head pose)

on-device inference, float16

RGB 한 장이 들어와 얼굴을 찾고 점을 찍은 뒤, 478점·52계수·4×4 행렬 세 가지 출력으로 나온다.

용어 한 줄 정의 자세히
RGB 이미지 / 픽셀 색을 (R,G,B) 숫자로 적은 모눈종이. 입력. 0.1
얼굴 검출 / BlazeFace 얼굴이 "어디 있는지" 빠르게 찾기. 그 도구가 BlazeFace. 0.2
ROI (crop & align) 검출된 얼굴을 잘라 똑바로 세운 작은 패치. 0.3
랜드마크 / feature 얼굴 위의 의미 있는 점 하나. 0.4
얼굴 메시 점들을 삼각형으로 이은 얼굴 표면 그물. 0.4
정규화 좌표 이미지 크기로 나눠 0~1로 만든 좌표. 0.5
canonical face model 미리 만든 표준 3D 얼굴(468 정점). 기준 틀. 0.6
회귀(regression) 범주가 아니라 연속적인 숫자 값을 직접 예측. 0.7
온디바이스 추론 서버 없이 기기 안에서 모델을 돌리기. 0.7
float16 16비트로 숫자를 저장해 가볍게. 모바일용. 0.7
블렌드셰이프 표정을 52개 "표정 단위 강도(0~1)"로 표현. 0.8
변환 행렬(4×4) 머리의 자세(회전·이동·스케일)를 담는 행렬. 0.9

이 용어들을 가지고, 다음 장에서는 이 기술이 왜 이런 모양으로 진화했는지 그 역사를 따라간다.

다음 장: 01. 기술 히스토리·계보