Face Swap 사진 - Face Swap sajin

저번장에 이어서 딥페이크 를 구현하는 방식에 대해 설명한다.

Face Swap 사진 - Face Swap sajin

앞장에서 얼굴을 추출했으면 이제 그 추출할 얼굴사진으로 모델을 만드는데,

모델을 생성하기 위해서는 우선 원본사진 / 바꿀 사진 두개 다 있어야 된다.

아래 매뉴에서 Train탭을 들어가면 다음과 같이 나오는데

Face Swap 사진 - Face Swap sajin

Input A : 원본 얼굴 사진 폴더

Input B : 바꿀 얼굴 사진 폴더

Modeldir: 생성된 모델이 저장될 경로

위 3개만 지정해 놓고

그다음 trainer를 지정하면 되는데,

training 에 대해 간단히 설명하자면,

얼굴을 생성하는데 training 모델들은 다들 신경망(Neural Network)을 기본적으로 크게 2가지 부분을 가지는데

우선 기본적으로 딥페이크에 쓰이는 NN(neural network)에 대해 설명하자면,

1.인코더 : 얼굴 이미지를 읽어와서 인코딩하는데 얼굴자체를 되도록 가져온 얼굴 이미지에 비슷하도록 벡터로 다시 구조화 하는 알고리즘을 말한다.

2. 디코더 : 인코더로 생성된 벡터들을 다시 얼굴 이미지로 만들어 내는데 되도록 입력한 얼굴 이미지와 비슷하게 생성한다.

Face Swap 사진 - Face Swap sajin

딥페이크 인코더 디코더

많은 딥페이크에 쓰는 알고리즘들이 있지만 기본적인 원리는 위와 같다.

딥페이크에 쓰는 신경망 (Neural Network)은 인코딩하거나 디코딩을 잘하기 위해서 두가지 메인요소가 있는데

1. LOSS(로스) : 딥페이크의 신경망 알고리즘에서 인코더와 디코더를 통해 새로 만든 얼굴이미지가 실제 입력된 얼굴과 얼마나 다른지 점수(loss value)를 매겨서 가중치를 변경쓰이기 위해 쓰인다.

2. Weights(가중치) :딥페이크 알고리즘을 통해 새로 생성된 얼굴을 평가해서 가중치를 업데이트하는데 우선 가중치를 한방향으로 증가시켰는데 담으로 생성된 얼굴을 평가했을때 오히려 안좋아진다면, 반대방향으로 가중치를 증가시킨다. 이런식으로 점점 가중치를 변화시켜서 딥페이크 에 쓰이는 완벽한 얼굴 모델을 생성하는 것이다.

Face Swap 사진 - Face Swap sajin

딥페이크 가중치 로스

모델들을 만드는 많은 알고리즘들은 위와 같은 단계를 매우 많이 반복해서, 계속 loss value 값을 추출하고 가중치를 업데이트 해가며, loss value를 추출하는데 실패하거나 아니면, 충분히 만족할 만한 결과 값을 도출( 생성된 얼굴이 입력된 얼굴과 매우 비슷) 할때까지 한다.

이제 딥페이크에 쓰이는 신경망(NN)에 대해 알아보았는데 이건 얼굴을 생성하는 신경망의 기본구조이지 얼굴을 바꾸는 신경망의 구조는 아니다. 얼굴을 바꿀려면 얼굴이미지를 읽어와서 그 얼굴을 그대로 만드는게 아니라, 다른사람의 얼굴을 만들어야 되는데, 이렇게 하려면 기본적으로 몇몇가지 구조가 더 추가 되어야 된다.

1. 공유된 인코더 - 모델을 학습할때 2가지 얼굴을 세트로 학습하게 되는데, 우리가 바꾸기 싶어하는 얼굴이미지 (편하게 A 세트라고 지칭), 바꿔치기할 얼굴이미지(편하게 B세트라고 지칭) 첫번째 단계로 A세트와 B세트의 인코더를 공유해서 같이 쓰는것이다 그러면 공유된 인코더는 A세트와 B세트의 이미지를 생성하는 알고리즘을 하나의 알고리즘으로 학습하게 되는것이다.

2. 두개의 다른 디코더 : 앞에서 학습할때 2가지 서로 다른 얼굴을 똑같은 인코더를 사용해서 인코딩을 하고 각각 다른 디코더( A 세트용 디코더/ B 세트용 디코더) 를 사용해서 새로 얼굴을 생성해가며, loss value와 가중치를 업데이트해가며 최적의 값을 찾아내며 학습해간다. 이렇게 되면 학습이 끝나고나면 그 모델을 사용해서 디코드만 바꾸면 다른 얼굴을 생성할수 있는 것이다.

Face Swap 사진 - Face Swap sajin

Face Swap 사진 - Face Swap sajin

이제 딥페이크 를 하는 원리에 대해 알아봤는데 이제 위와 같은 원리를 적용할 trainer를 선택하기만 하면 된다.(물론 나중에 좀더 정밀할 결과를 도출하려면 신경망도 fine-tuning해야 되긴할것이다)

트레이너에 대해서는 아래와 같이 정리했으니 알아서 선택하시면 되고

Face Swap 사진 - Face Swap sajin

시간 어마어마하게 걸리니 반드시 GPU사용해야 된다 CPU연산으로 돌려보실분 포기하시길. cpu연산으로 제일 가벼운 lightweight돌려도 왠만하면 하루종일 돌려야 될것이다.

자신이 원하는 퀄리티가 나오기 위해서는 트레이너 바꿔가며 해야되는데 여기서는 그냥 예제로 돌릴거라서 original로 테스트 진행할것이다 1080TI로 연산하는데 한 3~4시간 걸린다.

트레이닝하는데 옵션에서는

batch size 를 한번에 처리하는 이미지 양을 결정하는거라 GPU사용시에는 자신의 vram사이즈에 따라서 적절히 선택하시면 된다 보통 8~16정도 선택하면 좋은 결과를 준다.

iterations은 말그대로 반복횟수이다. 딥러닝 해보신분들은 아시겠지만, 그래프보면서 적당히 만족할만한 결과가 나올때 멈추면 된다.

이제 training 아이콘클릭해서 training을 시작하면.

Face Swap 사진 - Face Swap sajin

아래와 같이 반복되면서 실행사기 시작한다.

프리뷰랑 그래프를 보면서 생성된 이미지가 만족할 결과가 되면 멈추던가 반복횟수를 적절히 해놔서 반복횟수가 끝나면 완료되게 기다리면 된다.

Face Swap 사진 - Face Swap sajin

이제 모델생성이 끝났으면 그 모델을 사용해서 딥페이크 영상을 만들면 된다.

우선 기본적으로 추출했던 영상에서의 alignment파일과 영상 그리고 faceswap할 사진들이 필요하다.

특히 이중에서 alignment파일은 .fsa로 되어있는데 처음 영상에서 추출할때 생성된다. (만일 지웠으면, 다시 추출하던가. tool탭에 있는 alignment를 새로 해야된다)

이제 딥페이크 프로그램인 faceswap 프로그램에서 Convert탭에 들어가면 다음과 같은 화면이 나오는데,

Face Swap 사진 - Face Swap sajin

Input DIR:원본 동영상 파일 (alignment파일이 같이 있어야됨)

Output DIR: 변환한 동영상이 저장될 파일 경로

Aligaments: 원본 동영상 파일에서 얼굴이 추출된 위치를 가지고 있는 파일 이 파일이 있어야 적절한 위치에 얼굴을 변환해서 넣을 수 있다.

Model Dir: training과정에 의해서 생성된 모델 training할때 A와 B 헷갈리지 않게 잘해야 원본 동영상에 변환이 된다 반대로 했으면 같은 얼굴을 원본동영상에 바꿀것이므로 안된다.

다른것들은 다 필요없고 이제

writer만 동영상으로 할것이므로 Ffmpeg으로 선택하면 된다.

파라미터갑을 다 입력을 제대로 했으면 이제 convert를 실행하면 된다.

Face Swap 사진 - Face Swap sajin

그럼 이제 아래와 같이 변환이 쭉쭉 실행이 된다.

Face Swap 사진 - Face Swap sajin