Deepfake Tutorial - 자신만의 딥페이크를 만들어 보자 (0부터 100까지)
먼저 본 글을 통해서 악의적이나 불법적으로 이용할 경우, 어떠한 책임도 지지 않음을 알려드립니다.
본 글을 쓴 목적은, 예전부터 흥미를 가졌던 FaceSwap과 VoiceSwap 두개중 먼저 FaceSwap(얼굴 교체)에 대해 포스팅을 해보려고 합니다.
먼저 필자의 환경은 다음과 같습니다.
OS | Windows 11 x64 |
CPU | AMD Ryzen 3700X 8-Core Processor |
RAM | 32GB |
VGA | NVIDIA GeForce GTX 1660 SUPER |
먼저 FaceSwap 즉, Deepfake를 구현하기 위해서는 VGA와 CPU의 성능이 좋아야합니다.
딥페이크를 구현하기 이전, CUDA와 tensorflow를 설치해보도록 하겠습니다.
먼저 CUDA를 설치해줍니다.
11.5 버전의 CUDA ToolKit 을 사용하지 않은 이유는 11.5 버전으로 진행한 결과, Tensorflow에서 오류가 생겨, 11.4버전으로 다운그레이드 후 구현을 진행했습니다. 다운 받은 후 설치파일을 실행 시켜줍니다.
CUDA 11.4 버전을 설치가 완료 되면, 환경변수가 제대로 설정되었는지 확인해야합니다.
기본적으로 CUDA를 설치한다면, 환경변수가 설정되어 있지만, Path 경로에 많은 경로가 존재하면, CUDA 환경변수가 추가되지 않을 수 도 있습니다.
물론 11.4 버전을 사용하지 않고, 다른 버전을 사용한다면, 환경 변수와 시스템 변수에 다른 버전이 들어 있을 수도 있습니다.
2개의 시스템 변수와 2개의 환경변수가 정상적으로 등록이 되어 있다면, 그 다음 단계로 넘어가면됩니다.
https://developer.nvidia.com/rdp/cudnn-archive
cudnn-archibe 를 통해서 CUDA Tool Kit 을 업데이트(?) 시켜줍니다.
cuDNN Archive에서 본인의 CUDA 버전과 맞는 cuDNN 파일을 다운 받아 줍니다.
다운 후 압축을 풀면 다음과 같이 폴더 3개를 확인 할 수 있습니다.
해당 폴더 3개를 다음 위치로 복사해 줍니다.
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4
이렇게 CUDA Tool Kit 과 cuDNN 작업을 마쳤다면, CUDA 설치는 완료 되었습니다.
이제 tensorflow를 설치하겠습니다. CMD 또는 다른 쉘을 통해서 다음과 같이 입력합니다.
pip install tensorflow
다음과 같이 pip를 통해서 tensorflow 를 설치하게 된다면 (미리 CUDA 를 설치한 경우) 자동으로 CUDA 버전에 따라, tensorflow 버전을 잡아서 설치해줍니다.
다음과 같이 입력하면 tensorflow 버전을 확인 할 수 있습니다.
pip freeze
이제, 모든 준비는 끝났습니다. 이제 본격적으로 시작하도록 하겠습니다.
https://faceswap.dev/download/ 를 통해서 faceswap 파일을 다운받아줍니다.
설치 과정은 기본적으로 할 줄 아시니, 이 포스팅을 보고 있을거라 생각해 생략하겠습니다.
faceswap의 파일은 다음과 같은 경로에 존재합니다.
C:\Users\[사용자명]\faceswap
cmd 또는 쉘을 통해서 다음과 같이 입력합니다.
faceswap 에 필요한 외부 모듈들을 다운 받기 위해서 pip install -r 을 통해서 진행합니다.
requirements 에는 총 3가지 버전이 존재합니다. CPU, AMD, Nvidia 가 존재하는데, 사용자의 환경에 따라 설치를 진행해 주시면 됩니다. 설치를 완료하고 faceswap_win_launcher.bat 파일을 실행하면 다음과 같은 화면을 발견 할 수 있습니다.
먼저 Extract, train, Convert, Tools 총 4개의 메뉴를 확인 할 수 있습니다.
Extract의 경우 얼굴 데이터 셋의 추출, Train은 얼굴 학습, Convert는 동영상에 얼굴 Swap 기능을 담당하고 있습니다.
먼저 대상 얼굴이 있는 동영상을 src라 부르고, 합성을 할 동영상을 dst라고 칭하겠습니다.
대상 얼굴이 있는 동영상(src)을 Extract - Data - input dir에 탑재합니다. 동영상의 경우 알아서 준비하길 바랍니다.
필자의 경우, 미리 파일 명에 src와 dst를 통해서, 대상 얼굴이 있는 동영상과, 합성을 할 동영상을 구분했습니다.
Input Dir 에는 대상 동영상을 탑재, Output Dir 에는 데이터가 담길 폴더를 지정합니다. 그후 Detector에서는 Cv2-Dnn, Aligner에서도 Cv2-Dnn 을 선택합니다. 따로 설명은 하지 않겠습니다. 경로 설정을 완료 했다면, Extract 버튼을 눌러 추출을 진행합니다.
Extract 버튼을 누르게 되면, Preview에서 얼굴이 추출되는 것을 확인 할 수 있고, 우측 하단에 남은 게이지를 확인 할 수있습니다.
추출이 완료되면, dst 즉 합성을 할 동영상도 동일하게 지정해서 추출을 진행합니다.
data_dst와 data_src 폴더에는 총 2450파일이 존재하는것을 확인했고, 얼굴이 인식되지 않았거나, 다른 얼굴이 인식된 경우를 삭제해줘야 하기에, 사진 분류 작업을 진행합니다.
위 그림 18과 같이 불필요하거나, 다른 얼굴이 인식된 사진을 모두 삭제합니다. src와 dst 둘다 동일하게 삭제합니다.
그후 학습 과정을 시작합니다. Train 탭으로 들어가 다음과 같이 세팅합니다.
Input A에는 합성 할 대상 얼굴 데이터 폴더 , Input B에는 합성을 시킬 얼굴 데이터 폴더를 각각 지정해주고, Model Dir에는 합성 데이터가 들어갈 경로를 지정해줍니다. 그후 Train 버튼을 누르면 학습이 진행됩니다.
필자의 경우 미리 학습을 진행시키고 있었어서, Preview와 Graph 값이 다르게 나옴을 알려드립니다.
위 그림 20과 같이 학습 진행 현황을 확인 할 수 있으며, Graph 탭으로 넘어가면 다음과 같은 화면을 확인 할 수 있습니다.
위 그래프를 간단히 설명하자면 Iterations는 학습한 데이터 수, Loss 는 정확도 라고 생각하시면 됩니다.
Loss 값이 0에 수렴 할 수록, 합성이 원할하게 진행될 것이고, Loss 값이 크다면, 합성이 정상적으로 진행되지 않을 수 있습니다.
어느정도 학습을 진행했다면, 합성 과정을 진행합니다.
Stop 을 누르면 학습을 멈추고, 다시 Train을 할 수도 있습니다. 합성이 원할하게 되지 않았다면 다시 Train을 해서 학습을 시키는 것을 추천드립니다.
다음은 합성과정입니다. Convert 탭으로 들어갑니다.
Input Dir 에는 합성할 영상, 즉 dst파일을 선택하고, Ouput Dir에는 합성이 완료된 동영상이 저장될 폴더를 지정합니다.
Alignments의 경우 Extract 과정시 자동으로 생성되는 파일으로, 해당 영상이 있는 폴더에 같이 존재합니다.
Model Dir에는 Train 에서 지정한 Model 폴더를 지정합니다.
모든 경로가 설정되었다면, Convert 버튼을 통해서 합성을 진행합니다.
합성이 완료된 파일을 확인해봅니다.
아직 학습이 완료 되지 않아, 대상을 구분하기 어렵습니다. 학습을 최대한 많이 한 후 Convert 를 하게 된다면, 원하시는 작업물을 얻을수 있을겁니다.
대략 1시간 ~ 1일 까지 걸릴 수도 있습니다.
지금까지 긴 글을 읽어주셔서 감사합니다.
문의는 아래 댓글을 통해서 남겨주시면 감사하겠습니다.
2021-12-17 추가 분석 내용
아래 사진은 각각 Iterations가 25000 ~ 52000 학습을 진행한 일부 결과물이다.
아직은 학습량이 부족해, 대상이 정확히 인식되지 않는 점이 보인다. 조금더 학습을 진행 한 후 다시 추가적으로 포스팅 할 예정이다.
'이것저것' 카테고리의 다른 글
[CentOS7] CentOS7에 APM 설치하기 & PHP 로그인 (0) | 2022.06.08 |
---|---|
[Python] Pyinstaller Decompile (암호화되어 있는 바이너리 디컴파일) (8) | 2021.11.02 |
[Arduino] OLED 모듈과 온습도 센서 사용 (0) | 2021.10.09 |
DRM to PDF (0) | 2021.02.27 |
[DIY] 자작 NAS 구축하기 - 구입부터 설치까지 (6) | 2021.02.15 |
댓글
이 글 공유하기
다른 글
-
[CentOS7] CentOS7에 APM 설치하기 & PHP 로그인
[CentOS7] CentOS7에 APM 설치하기 & PHP 로그인
2022.06.08 -
[Python] Pyinstaller Decompile (암호화되어 있는 바이너리 디컴파일)
[Python] Pyinstaller Decompile (암호화되어 있는 바이너리 디컴파일)
2021.11.02 -
[Arduino] OLED 모듈과 온습도 센서 사용
[Arduino] OLED 모듈과 온습도 센서 사용
2021.10.09 -
DRM to PDF
DRM to PDF
2021.02.27