데이터로 딥페이크 성능 개선하기
더 나은 데이터로 고품질 Faceswap 생성하기
이 글은 AI로 번역되었습니다. 오역이 의심되면 댓글로 알려 주세요.
Created on September 15|Last edited on September 15
Comment
이 프로젝트에서 나는 Faceswap 저장소 이번 실험을 위해 기꺼이 사진 사용을 허락해 준 루카스와 크리스의 얼굴을 서로 바꾸는 작업을 진행했다. 특히 데이터가 모델 성능을 개선하는 데 어떤 영향을 미치는지에 집중해 살펴보겠다.

과제는 분명하다. 우리는 피부색과 얼굴 털이 서로 다른 사람들 사이에서 얼굴을 서로 바꾸려 하고 있다.
보통은 얼굴 교체 성공률을 높이기 위해 비슷한 외형적 특징을 가진 사람을 고르는 편이 좋다. 많은 경우 얼굴의 내부 영역만 교체한다. 일부 프로젝트는 아예 입 주변만 대상으로 가짜 연설을 만들기도 한다. 딥페이크는 생성된 이미지의 “이어붙이기와 블렌딩” 과정도 전통적인 알고리즘으로 처리한다.
이 글에서는 얼굴 생성과 관련된 딥러닝 부분에만 집중하겠다.
이 과제의 난이도를 보여 주기 위해, 기본 설정으로 얻을 수 있는 결과 예시를 제시한다(빨간 상자는 이미지에서 생성된 영역을 표시한다).

몇 가지 문제가 눈에 띈다:
- 피부색은 꽤 잘 흐려졌지만, 확대해서 보면 차이가 확연하다
- 머리카락과 수염은 재구성하기가 매우 어렵다. 얼굴을 크롭하는 과정에서 한쪽 면만 포함되는 경우가 많아 그 어려움이 더 커진다.
게다가 긴 머리와 짧은 머리의 차이 때문에 재현해야 할 얼굴 윤곽을 정확하게 정의하기가 어려워지는 문제가 생긴다.
이런 문제들은 보통 다음 방법들로(적어도 부분적으로) 해결된다:
- 피부색이 같은 사람을 사용하는 것
- 수염이 비슷한 사람을 사용하는 것
- 정면 얼굴만(또는 약간 옆으로 기운 각도만)으로 샘플을 제한하기
- 긴 머리인 사람에게 적용하면 얼굴 앞쪽으로 머리카락이 내려오지 않아 얼굴이 또렷한 경우가 많다.
이 경우에는 선택한 두 사람으로 계속 결과를 개선해 보겠다.
가장 먼저 떠오르는 방법은 얼굴에서 더 넓은 영역을 포함하도록 크롭 범위를 키우는 것이다.
몇 시간 정도 학습한 뒤 얻은 결과는 다음과 같다.


고려해야 할 이미지 공간은 다음과 같다:
- 루카스(수염이 없는 사람)의 “A” 공간(또는 “원본”)
- 크리스(수염이 있는 사람)의 “B” 공간(또는 “스왑”)
결과는 세 장씩 한 묶음으로(왼쪽에서 오른쪽 순서) 보여 준다.
- 입력 이미지(왼쪽 묶음의 “A”이든 오른쪽 묶음의 “B”이든)
- 같은 이미지 공간에 머무는 생성 이미지
- 한 이미지 공간에서 다른 이미지 공간으로 변환한 생성 이미지
그 이미지들을 살펴보니(학습은 몇 시간만 하고 중단했다) 몇 가지가 바로 눈에 띄었다:
- 이번에는 이미지의 더 넓은 영역을 재구성해야 해서, 이전보다 좋은 이미지를 생성하는 데 더 오래 걸렸다.
- 오른쪽의 “스왑 > 원본” 이미지 묶이가 왼쪽의 “원본 > 스왑”보다 더 잘 생성된 듯하다. 즉, “B→A” 변환이 반대 방향보다 더 쉬워 보인다.
- “B”의 이미지를 생성할 때(“원본 > 스왑” 참조), 배경이 항상 부자연하게 그려졌다. 즉, “B” 도메인에서 배경을 제대로 구분하지 못해 머리카락처럼 렌더링된다.
- “B” 도메인(Chris)에서는 얼굴의 오른쪽이 왼쪽보다 항상 더 잘 그려진다
결과 품질의 불균형을 이해하려면 수집한 데이터로 돌아가 확인할 수밖에 없었다.


Lukas의 데이터셋은 배경, 얼굴 방향, 조명 노출 등 이미지 도메인에서의 다양성이 더 풍부하다(튜토리얼에서 파란색과 회색 셔츠를 유난히 좋아하긴 하지만). 반면 Chris의 데이터셋은 단일 영상에 기반하고, 항상 같은 방향을 바라보고 있다. 이 점이 생성된 이미지 품질의 불균형을 설명해 줄 수 있다.
구현도 더 자세히 살펴봤다. 특히 인코더와 디코더의 구조, 그리고 손실 함수 정의에 주목했다. 그러던 중 다음과 같은 점을 발견했다. torzdf의 가이드 핵심 원리를 더 잘 이해하는 데 매우 유용했으며, 특히 다음 다이어그램이 큰 도움이 되었다.

서로 다른 두 사람의 이미지 세트가 하나의 공용 encoder를 사용한다. 이후 각 데이터셋에 특화된 decoder를 사용해 원본 이미지를 복원한다.
encoder의 역할은 특정 이미지의 고유한 세부 정보를 포착하는 것이고, decoder는 encoder가 제공한 특징을 바탕으로 이미 알고 있는 사람의 이미지를 복원해야 한다.
두 얼굴이 하나의 공용 encoder를 사용함으로써, latent space(encoder 이후)에서의 표현이 일관되게 중요한 세부 요소(표정, 입 모양, 눈의 개폐 등)를 포착하고, 이를 다른 face에 연결된 decoder로도 안정적으로 전이할 수 있기를 기대한다.
이상적으로는 헤어스타일, 눈동자 색, 피부 톤처럼 개인에게 고유한 특징은 디코더가 전담하고, 표정이나 미소처럼 모든 사람에게 공통적으로 적용되는 특징은 엔코더가 제공해야 한다.
제가 예상하는 위험 중 하나는 encoder가 얼굴을 식별해 버려, 바라보는 사람이 누구냐에 따라 latent space에서 서로 다른 특징을 만들어낼 수 있다는 점이다. 예를 들어 어떤 얼굴은 눈썹 형태가 더 복잡하고, 다른 얼굴은 입 모양 표현이 더 복잡할 수 있는데, 이로 인해 stack encoder/decoder의 loss 최적화 전략이 달라질 수 있다.
이 가설을 더 파보지는 않았지만, 가능한 해결책으로는 어떤 얼굴��도 쓰일 수 있는 범용 encoder를 만들고 decoder 부분은 버리는 방법이 있다. 다만 latent space를 더 크게 잡아야 할 수도 있다.
결과를 개선하기 위해, 매번 데이터에 집중할지 모델에 집중할지 평가한다. 이번 경우에는 다음과 같다:
- 괜찮은 결과를 얻는 데 훈련에 1~2일이 걸린다
- GAN의 품질은 지표만으로 평가하기 어렵다. 결과가 대체로 주관적이거나, 여러 참여자 패널의 평가가 필요하기 때문이다.
- 이 저장소는 인기가 많으니, 모델 아키텍처도 꽤 잘 갖춰져 있다고 기대할 수 있다.
- Chris는 짧은 영상 하나만 사용해서 데이터가 매우 제한적이었다
이 경험으로 더 많은 데이터를 모아야 한다는 점이 분명해졌다. 제 입장에서는 요청만 하면 되는, 아주 쉬운 일이었다.
Chris가 다양한 환경과 포즈에서 촬영한 짧은 클립 5개를 제공해 줘서 훨씬 풍부한 데이터셋을 얻을 수 있었다. 같은 날 촬영되어 헤어스타일과 수염 상태가 완전히 동일하다는 점은 있었지만, 데이터 다양성은 크게 개선되었다.

훈련 그래프에는 두 번의 간격이 보이는데, 각각 내가 데이터를 추가한 시점(한 번은 “A”, 한 번은 “B”)에 해당한다. “B”의 손실이 더 높은 이유는 현실적인 머리카락과 수염을 생성하기가 더 어렵기 때문인 것으로 보인다.

덕분에 생성된 샘플이 훨씬 더 흥미로워졌다.


그 정도 수준의 결과에 도달한 뒤에야 비로소 신경망 아키텍처를 통해 성능을 개선해 보기로 했다.
더 강력한 encoder/decoder 스택을 사용하면(훈련 속도는 느려지지만) 생성 샘플의 품질이 향상되었다. “original” 구현에서 “dfaker”로 옮기면서 품질이 좋아졌고, 사진을 살펴보는 일이 훨씬 더 재미있어졌다.


실제로 과적합이 시작되는 시점을 보기 위해 며칠 동안 계속 학습을 돌렸다. 생성 샘플의 품질이 떨어지기 시작할 거라고 예상했지만, 비교적 작은 데이터셋이었음에도 그런 일은 끝내 일어나지 않았다. 예상보다 모델이 훨씬 견고하다는 걸 확인한 셈이다.
완벽하진 않지만, Lukas는 몇 개의 튜토리얼 영상만으로, Chris는 20–30초짜리 짧은 클립 5개만으로 구성된 데이터셋이라는 점을 고려하면 결과는 상당히 인상적이다.
이 모델의 한계를 짚어 보는 것도 흥미롭다. 특히 어떤 이미지가 생성된 것인지 인간은 비교적 쉽게 구분할 수 있다.
- 헤어스타일과 수염은 특히 큰 영향을 받는데, 이는 원래 사람별 특성을 담당해야 할 decoder 쪽에 속해야 함에도 불구하고 encoder가 이들을 특징으로 인코딩하고 있음을 보여준다. 며칠이 지나자 모델이 Lukas는 짧은 머리, Chris는 긴 머리를 가져야 한다는 점을 학습하기 시작한 듯하지만, 이를 생성하는 데에는 여전히 어려움이 있어 흐릿하게 남는다.
- 공간을 바꿀 때 배경이 흐려지는 것으로 보아, 모델이 생성된 얼굴과 배경이 독립적이라는 점을 완전히 학습하지 못했다는 뜻이다. 다양한 배경을 포함한 더 많은 이미지가 필요하다.
Add a comment