얼굴 교체가 머리카락을 못 바꾸는 건 성능이 아니라 마스크 범위다 — 모델 여러 개가 릴레이하는 파이프라인
FaceFusion 을 뜯어 보니 — 머리는 처음부터 대상이 아니었고, 깜빡임은 「다른 사람」 판정이었다
FaceFusion 으로 영상 속 얼굴을 내 얼굴로 바꿨더니, 머리는 원본 배우의 삭발 그대로였다. 처음엔 모델 성능 탓인 줄 알았다. 더 좋은 교체 모델로 바꾸면 머리도 따라오겠지 하고.
아니었다. 파이프라인을 뜯어 보니 머리카락은 처음부터 바꿀 대상이 아니었다. 이 글을 읽으면 얼굴 교체 결과의 한계(머리, 깜빡임, 떨림)를 「어느 단계가 어디까지만 보나」 로 설명할 수 있다.
실험은 본인 얼굴이나 동의를 받은 얼굴로만 하고, 공개할 때는 AI 로 바꾼 영상이라고 밝힌다.
모델 하나가 아니라 릴레이
얼굴 교체는 모델 여러 개가 바통을 넘기는 파이프라인이다. 프레임을 ffmpeg 로 쪼갠 뒤, 이번 작업(hyperswap_1a_256)에서 실제로 돈 순서는 이렇다.
| 단계 | 모델 | 하는 일 |
|---|---|---|
| 검출 | yoloface_8n |
얼굴 박스 + 눈 · 코 · 입꼬리 5점 |
| 랜드마크 | 2dfan4 |
얼굴 점 68개 |
| 정렬 | (모델 없음) | 점을 기준으로 정면 규격 크롭으로 편다 |
| 신원 추출 | arcface_w600k_r50 |
얼굴 → 512차원 벡터. 같은 사람이면 벡터가 가깝다 |
| 교체 | hyperswap_1a_256 |
크롭 + 신원 벡터 → 표정 · 각도는 두고 신원만 바꾼 256px 얼굴 |
| 마스크 | xseg_1, bisenet_resnet_34 |
손 · 마이크 같은 가림막, 피부 · 눈 · 입술 같은 부위 나누기 |
| 보정 | gfpgan_1.4 |
흐린 얼굴 복원. blend 80 = 80% 섞기 |
마지막에 원래 위치로 되돌려 합성하고, 원본 오디오를 붙여 다시 인코딩한다.
한계 1 — 머리는 애초에 대상이 아니다
교체 모델은 정렬된 얼굴 크롭 안쪽만 그린다. 마스크도 box occlusion 이라 얼굴 영역만 오려 붙인다. 머리카락 · 귀 · 두상 · 목은 어느 단계도 건드리지 않는다.
그러니 모델을 더 좋은 걸로 바꿔도 머리는 안 바뀐다. 범위 밖이니까. 머리까지 바꾸려면 계열 자체를 바꿔야 한다. 사람을 통째로 다시 그리는 영상 생성 쪽이다 (4계열 지도).
한계 2 — 깜빡임은 「다른 사람」 판정
첫 결과에는 1.2~1.6초, 2.4~2.8초 구간에서 원래 얼굴이 튀어나오는 깜빡임이 있었다.
기본값인 reference 모드는 프레임마다 검출한 얼굴의 ArcFace 벡터를 기준 얼굴과 비교한다. 거리가 reference_face_distance(이번 설정 0.3)를 넘으면 다른 사람으로 보고 그 프레임은 교체를 건너뛴다. 고개를 돌리거나 조명이 바뀌면 벡터가 흔들린다.
one 모드는 이 비교를 하지 않는다. 화면에서 제일 큰 얼굴 하나를 매 프레임 무조건 바꾼다. 검출 점수 기준을 0.5 → 0.35 로 내린 건 그 앞 단계, 얼굴을 아예 못 찾는 프레임을 줄이려는 것이다.
FaceFusion 이 실행마다 남기는 기록(.jobs/completed/*.json)에 옵션이 다 남아 있어서 비교가 쉬웠다.
| 시각 | 소스 | selector mode | detector score | 결과 |
|---|---|---|---|---|
| 12:48 | 테스트 얼굴 | reference |
0.5 | 깜빡임 |
| 12:54 | 테스트 얼굴 | one |
0.35 | 해결 |
| 13:11 | 내 사진 | one |
0.35 | 성공 |
reference 모드 그대로 거리 기준을 0.6 으로 올려서 깜빡임이 줄어드는지는 아직 안 해 봤다. 그걸 보면 원인이 확정된다. 지금 말할 수 있는 건 「one 으로 바꾸니 사라졌다」 까지다.
한계 3 — 프레임을 한 장씩 따로 본다
앞뒤 프레임을 참고하지 않는다. 미세한 떨림이 남는 구조적인 이유다. 옆얼굴이나 빠른 움직임에서는 교체보다 앞에서, 검출 · 랜드마크 단계가 먼저 무너진다.
증상을 단계에 대 본다
머리가 그대로다 → 마스크 범위. 모델 탓이 아니다. 몇 프레임만 원래 얼굴이다 → 선택 모드와 거리 기준. 얼굴 가장자리가 떨린다 → 프레임을 따로 처리하는 구조. 증상을 단계에 대 보면 어디를 만질지 바로 나온다. 교체 모델만 바꿔 가며 운에 맡기는 것보다 훨씬 빠르다.
영상 속 얼굴 처리를 서비스나 제작 흐름에 넣으려다 막혔다면 negabaro 에 물어봐도 된다 (문의).
핵심 개념
검출 → 랜드마크 → 정렬 → 신원 → 교체 → 마스크 → 보정, 모델 여러 개의 릴레이
교체 모델은 얼굴 크롭 안만 그린다 — 머리는 범위 밖
깜빡이면 --face-selector-mode one 과 낮은 detector score 를 먼저 본다
증상을 단계에 대 본다 — 모델 교체는 그다음