DeepFakes 소프트웨어: FaceSwap을 이용해 추출한 얼굴로 학습하기(Training)
※ 오토 인코더의 구성요소
1) 인코더(Encoder): 얼굴 이미지를 '인코딩(Encoding)' 하는 역할을 수행한다. 얼굴 이미지가 입력으로 들어 오면 그 이미지를 Representation 벡터(Vector)로 변환한다. 다시 말해 Representation에는 입력 이미지의 어떠한 특징(Feature)들이 임의의 형태로 저장된다.
2) 디코더(Decoder): 압축된 Representation을 다시 얼굴 이미지로 되돌리는 역할을 수행하는 파트다.
이러한 인코더와 디코더를 합친 구조를 흔히 오토 인코더(Auto-Encoder)라고 부르는데, 주로 차원 축소, 데이터 압축이나 Generative Model의 기능으로 인공지능 분야에서 많이 활용되고 있다. 사실 이러한 AE는 GAN과 더불어 현재 Generative Model의 주축이라고 할 수 있는데, 자세한 내용에 대해서 궁금하신 분께는 VAE 논문을 읽어 보는 것을 추천한다.
아무튼, 오토 인코더 자체는 어떤 이미지를 '압축'했다가 다시 '복원'하는 과정을 수행해주는 모델이라고 할 수 있다. 이러한 구조가 DeepFakes 분야에서 유용한 이유는, 기본적으로 오토 인코더는 중간 레이어라고 할 수 있는 Representation Layer가 '얼굴의 특징'을 잡아내고 있기 때문이다.
예를 들어 오바마 사진을 넣어서 학습을 시키면, 오바마가 가지고 있는 얼굴의 특징들이 Representation Layer에 남아 있게 된다. (Controllable 한지는 잘 모르겠다.) 특징이라고 하면, 다음과 같은 것들이 있다.
- 눈썹의 위치
- 입술의 모양
- 눈의 크기
- 등등
아무튼 이러한 Feature들을 Representation Layer에서 인코딩된 정보로서 포함하게 된다.
※ 오토 인코더의 학습
기본적으로 머신러닝 모델 학습에 있어서는 다음과 같은 용어를 알고 있으면 좋다.
- 손실(Loss): 모델에 입력으로 넣는 이미지가 복원(Reconstruction)된 이미지와 얼마나 다른지를 정량화한 것이다. 학습 초반에는 당연히 손실 값이 크고, 학습이 잘 되고 나면 손실 값이 낮다. 학습을 시킨다는 것은 손실 값 자체를 낮추기 위해 모델을 Update하는 것을 의미한다. 일반적으로 FaceSwap에서는 오토 인코더의 Loss 값이 0.01 미만으로 떨어졌을 때, 상당히 DeepFakes 영상이 그럴싸하게 나온다.
- 가중치(Weights): 흔히 모델의 파라미터 값이라고 불리는 Weight 값은, 모델 그 자체의 값을 의미한다. 이미지 자체가 원래 고차원의 Vector 형태로 주어지며, 모델은 여기에 임의의 가중치 값을 곱하여 연산을 수행한다. 사실 모델을 Update한다는 의미도 이 가중치를 업데이트하는 것을 의미한다.
※ FaceSwap의 동작 원리
이제 이러한 오토 인코더를 이용하여 어떻게 DeepFake가 만들어지는지 자세히 알아보자. DeepFakes 모델은 오토 인코더 모델을 재미있게 변형하여 만들어졌다. 바로 학습 과정에서 두 영상이 '공통된 인코더(Shared Encoder)'를 사용하고, 서로 다른 디코더(Decoder)를 이용하도록 하면 된다.
그러면 Encoder에서는 두 얼굴에서 공통적인 특징들(눈썹의 위치, 코의 위치, 얼굴 각도 등)을 효과적으로 추출할 수 있게 되고, 두 얼굴에서 서로 다른 특징들(눈썹의 모양, 코의 모양, 얼굴의 형태 등)은 Decoder 파트에서 구분하여 이미지를 복원(Reconstruction)하게 된다.
그렇게 학습을 하고 나면, Source의 이미지를 Encoder에 넣어서 추출된 '눈썹의 위치, 코의 위치, 얼굴 각도' 등의 Representation을 다시 Decoder에 넣게 되면, 해당 위치에 맞게 Target의 이미지의 인물이 가지는 정체성(Identity)이 입혀지게 된다. 다시 말해 해당 인물이 누구인지를 알려주게 되는 정체성 정보는 Decoder 파트가 처리하게 되어 DeepFakes 비디오가 만들어지는 것이다.
※ 학습(Training) 실습
이제 지난 시간에 추출했던 이미지를 가지고 학습을 진행해보자. Input A는 Source이며, Input B는 Target이 된다. 다시 말해 Source 동영상의 얼굴 부분에 Target(피해자) 동영상에 존재하는 사람의 얼굴 정체성(Identity)를 삽입하는 것이다. 즉, Input A에 Input B의 얼굴이 삽입된다. 예를 들어
- Input A: 부시(Bush)
- Input B: 오바마(Obama)
위와 같이 설정하면 부시 미국 전 대통령이 연설하는 동영상에 오바마 미국 전 대통령의 얼굴이 삽입된다.
이제 학습이 진행됨에 따라서 모델 파일을 저장할 경로를 [Model Dir]에 기록한다. 이후에 [Train] 버튼을 누르면 학습이 진행된다.
※ 학습이 안 되는 경우
원래는 학습(Training)이 정상적으로 진행이 되며 모델이 학습됨에 따라서 Face Swapping이 얼마나 잘 되는지 [Preview]에서 보인다. 하지만 저자의 경우 AMD 그래픽 카드를 가지고 있어 호환 문제로 다음과 같은 크래시(Crash)가 발생하였다.
이런 문제가 발생하는 경우, 선택할 수 있는 방법은 여러 가지가 있는데, 대략 다음과 같다.
- FaceSwap을 CPU 버전으로 설치 및 실행하여 CPU만 가지고 학습을 진행하기
- Google Colab과 같은 무료 GPU 서비스를 이용하여 학습을 진행하기
- 개인용 학습 워크스테이션을 구축하여 리눅스 서버상에서 학습을 진행하기
- 별도로 AWS 등에서 GPU 서버를 구축하여 학습을 진행하기
사실상 이전 포스팅에서도 저자가 가지고 있는 AMD GPU 그래픽 카드의 호환 문제 때문에 추출(Extraction)을 CPU만 가지고 수행하였다. 역시 학습(Training)을 수행할 때에도 동일한 문제가 발생하고 있는 것이다. 하지만 걱정할 필요는 없다. 어차피 나중에 제대로 장비를 갖추어서 학습을 진행할 때는 리눅스에서 진행하게 되므로, 미리 공부하는 셈 치면 된다. 아무래도 공짜로 학습을 시키는 방법 중에서는 Google Colab이 가장 효과적일 것이다.
저자가 사용한 Google Colab 소스코드를 첨부하겠다.
※ 학습 과정 살펴보기
# 학습 시작 직후
# 학습 시작 5분 후
# 학습 시작 30분 후
# 학습 시작 8시간 후
'기타' 카테고리의 다른 글
윈도우(Windows)에서 Zephyr OS 개발환경 구축하여 시작하기 (2) | 2020.02.11 |
---|---|
Visual Studio 2017 이전 버전 다운로드 (0) | 2020.02.11 |
STM32CubeIDE를 활용한 Nucleo-144 Blinky 예제 (0) | 2020.01.31 |
STM32CubeIDE 설치 방법 (0) | 2020.01.31 |
DeepFakes 소프트웨어: FaceSwap을 이용해 비디오에서 얼굴 추출하기(Extraction) (0) | 2020.01.30 |