
[Day 13] 고양이가 '말하게' 만들었습니다. 가장 큰 장벽: AI가 고양이의 얼굴을 인식하지 못함
요약
LivePortrait를 사용하여 정지된 고양이 이미지에 사람의 움직임을 입혀 '말하는 고양이'를 만드는 실험 과정을 다룹니다. AI가 사람의 얼굴 위주로 설계되어 고양이의 얼굴을 인식하지 못하는 기술적 한계와 이를 해결하기 위한 시도를 소개합니다.
핵심 포인트
- LivePortrait를 활용한 정지 이미지의 비디오 애니메이션 구현
- 기존 얼굴 검출기(MediaPipe, InsightFace)의 고양이 얼굴 인식 불가 문제
- 사람 중심의 AI 모델이 가진 데이터셋 및 설계상의 한계 확인
서론 (Intro)
Day 13!
오늘의 실험: 단 한 장의 고양이 이미지에 사람의 얼굴 움직임을 입혀서 "말하는 고양이"를 만드는 것입니다. 제 얼굴 대신 고양이를 사용한다는 점을 제외하면 일반적인 "말하는 아바타 (talking avatar)" 아이디어와 같습니다. 사용된 도구는 LivePortrait (정지 이미지 + 움직임이 담긴 "드라이빙 비디오 (driving video)" → 비디오의 표정을 정지 이미지에 전이)입니다.
결과: 제대로 말하는 고양이가 탄생했습니다. 어려운 점은 애니메이션이 아니었습니다. 그 전 단계인, AI가 고양이의 얼굴을 인식하게 만드는 것이었습니다. 여기서 문제가 발생했고, 제가 어떻게 이를 해결했는지 소개합니다.
사용 도구: DGX Spark (저의 홈 AI 머신) / LivePortrait / 고양이 이미지 한 장 (AI 생성) / 드라이빙 비디오 (LivePortrait와 함께 제공됨).
결과부터 보기: 말하는 고양이
사람이 말하는 비디오의 입과 눈 움직임이 고양이의 얼굴에 적용되었습니다. 하지만 이 과정에서 몇 가지 걸림돌이 있었습니다.
걸림돌 #1: "얼굴"을 전혀 인식하지 못함
고양이를 말하게 하려면 첫 번째 단계가 필요합니다: 이미지 내에서 얼굴이 어디에 있는지 찾는 것 (눈, 코, 입의 위치) — 즉, 얼굴 검출기 (face detector) 단계입니다.
제가 처음 사용한 도구에는 설치된 검출기가 단 하나도 없어서, 매번 에러와 함께 멈췄습니다. 검출기들을 추가하고 다시 시도해 보았지만 결과는 달라지지 않았습니다:
| 추가한 검출기 | 상업적 이용 | 고양이 얼굴 인식 여부 |
|---|---|---|
| MediaPipe | 가능 (OK) | ❌ 아니오 |
| InsightFace | 허용되지 않음 (비상업적) | ❌ 아니오 |
어느 것도 고양이의 얼굴을 인식할 수 없었습니다. 이들이 고장 난 것이 아닙니다. 이들은 모두 사람의 얼굴을 찾도록 설계되었기 때문에, 고양이의 얼굴은 "얼굴"로 등록되지 않는 것입니다.
난관 #2: 왜 얼굴을 인식하지 못했는가
제가 시작했던 도구의 "동물 모드 (animal mode)"는 오직 **움직임 부분 (motion part)**만을 동물의 버전으로 교체할 뿐이었습니다. 즉, 가장 중요한 "동물의 얼굴을 찾는" 탐지기 (detector)는 포함되어 있지 않았던 것입니다. 남은 것은 인간용 탐지기뿐이었습니다.
지난번에도 작업이 여기서 중단되었던 이유가 바로 이것이었습니다. 디스크 공간 문제도, GPU 문제도 아니었습니다. 그저 동물의 얼굴을 찾을 수 없는 도구였을 뿐입니다.
해결책: 원본 도구를 사용하고, 빌드(build)는 건너뛰기
업스트림 (upstream, 원본) LivePortrait에는 XPose라고 불리는 동물 전용 얼굴 탐지기가 포함되어 있습니다. 그래서 저는 별도의 폴더에 이를 설정하고 사용했습니다.
문제는 XPose가 보통 사용자의 로컬 머신에서 **특정 부분을 직접 컴파일 (compile, build)**해야 한다는 점이었고, 이 차세대 머신에서는 빌드가 성공할 것이라는 보장이 없었습니다. 그래서 코드를 읽어보던 중, 내부에 숨겨진 속도는 느리지만 빌드가 필요 없는 예비 부품을 발견했습니다. 저는 컴파일 과정을 완전히 피하기 위해 세 개의 파일을 수정하여 해당 부품을 사용하도록 경로를 재설정했습니다. 짧은 클립을 만드는 데 있어서는 속도가 느려도 상관없습니다.
정확한 파일명과 수정 사항은 하단의 "상세 내용 (The details)"에 있습니다.
성공했습니다 — 하지만 처음에는 그저 고양이가 혀를 내민 것처럼 보였습니다
탐지기가 작동했고, 고양이의 얼굴이 인식되었으며, 비디오가 생성되었습니다. 하지만 첫 번째 결과물은 마치 고양이가 살짝 혀를 내민 (blep) 것처럼 보였습니다. 표정 전이 (expression transfer)는 분명히 작동하고 있었는데, 왜 그랬을까요?
원인은 바로 **드라이빙 비디오 (driving video, 즉 AI에 입력하는 소스 영상)**였습니다. 제가 처음 사용한 것은 "그저 입을 벌리는" 짧은 샘플이었고, 참조 영상이 입만 벌린다면 고양이도 입만 벌리게 됩니다. 실제로 말을 하는 사람의 영상으로 교체하자, 눈과 입이 모두 움직이는 고양이를 얻을 수 있었습니다.
드라이빙 비디오의 품질이 결과물을 거의 결정한다고 해도 과언이 아닙니다.
오늘의 교훈
- 어려운 점은 모션 엔진 (motion engine)이 아니라, 동물의 얼굴을 인식하는 것입니다.
- 도구의 "동물 지원 (animal support)" 기능은 실제 구성 요소(검출기, detector)가 빠진 채 라벨만 붙어 있는 상태일 수 있습니다. 실행이 되지 않을 때는 어떤 구성 요소가 누락되었는지 추적하는 것이 가장 빠른 방법입니다.
- 너무 최신 사양의 기기에서 "반드시 컴파일해야 하는 (must compile)" 부분에 부딪힌다면, 먼저 빌드가 필요 없는 폴로백 (no-build fallback) 경로가 있는지 확인하세요.
- 결과물의 품질은 대부분 입력값(드라이빙 모션, driving motion)의 품질에 의해 결정됩니다.
라이선스에 관한 참고 사항
- 고양이의 얼굴을 인식할 수 있었던 검출기들(XPose / InsightFace)은 모두 비상업적 (non-commercial) 라이선스입니다. 따라서 영상 자체의 상업적 이용은 피하고 있으며, 이 글은 방법론과 주의 사항에 초점을 맞춥니다.
- 상업적으로 이용 가능한 검출기(MediaPipe)는 이번에 고양이를 인식하지 못했습니다.
세부 사항
무엇이 누락되었으며, 어떻게 해결했는가
- 제가 처음 사용한 ComfyUI 노드의 "동물 모드 (animal mode)"는 동물의 모션 (motion) 모델만 교체할 뿐, 동물 얼굴 검출기 (animal face detector, XPose)는 포함되어 있지 않았습니다. 사람용 검출기(InsightFace / MediaPipe / FaceAlignment)는 고양이의 얼굴을 감지할 수 없으므로,
No face detected단계에서 멈추게 됩니다. - 해결 방법: 별도의 폴더에 상위 단계의 KwaiVGI/LivePortrait를 설정하고, 공식 가중치 세트(
xpose.pth포함)를 가져온 뒤inference_animals.py를 사용했습니다. - 이미 보유하고 있던 InsightFace 및 랜드마크 (landmark) 모델들은 재사용할 수 있었습니다.
XPose를 위한 컴파일 없는 패치 (no-compile patch)
XPose는 MultiScaleDeformableAttention이라 불리는 자체 CUDA 커스텀 연산 (custom op)을 컴파일하도록 설계되었습니다. 최신 GPU/CUDA 세대에서는 빌드 성공을 보장할 수 없으므로, 저는 대신 번들로 제공되는 순수 PyTorch 폴로백 (pure-PyTorch fallback) 경로로 우회시켰습니다.
세 개의 파일이 수정되었습니다 (XPose의 ops/ 디렉토리 하위):
functions/ms_deform_attn_func.py: 컴파일된 버전의import를try/except로 감싸고, 실패 시 플래그를False로 설정합니다.modules/ms_deform_attn.py: 해당 플래그가False일 때,forward함수가 순수 PyTorch 버전인ms_deform_attn_core_pytorch를 통해 분기되도록 합니다.- (필요한 경우)
animal_landmark_runner.py내의torch.load에weights_only=False를 추가합니다.
이제 동물 탐지(animal detection)는 컴파일 없이 실행됩니다. 속도는 더 느리지만, 짧은 클립의 경우 괜찮은 수준입니다 (한 번의 생성에 약 8초 소요).
환경 설정 시 주의사항 (Environment gotchas)
- 탐지기(detector)를 교체할 때마다 기본 라이브러리(numpy) 버전이 널뛰기를 했습니다 (mediapipe는 numpy < 2를 요구하고, insightface는 2.x를 요구함). 기존 코어(cv2/torch)는 유지되었으나, 가장 깔끔한 방법은 상위(upstream) LivePortrait를 별도의 격리된 환경(isolated environment)에 유지하는 것입니다.
- 서버를 중단할 때, 프로세스 이름으로 종료(killing)하면 제가 사용 중인 명령줄(command)까지 함께 종료되었습니다. 포트 번호로 중단하는 것이 안전했습니다.
- 디스크와 GPU는 내내 여유 공간이 충분했습니다. 리소스 부족이 문제가 된 적은 단 한 번도 없었습니다.
다음 단계
다음 시간에는 또 다른 종류의 실험으로 변화를 줄 예정입니다 🎬
100ExperimentsWithDGX #LocalLLM
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
