요즘 심심치 않게 등장하는 기술이 하나 있습니다. 이는 바로 DeepFake라는 것입니다.
이 기술이 사회에 기여하는 순기능도 있지만 악용되는 사례도 많이 발생되고 있습니다. 특히 Deep Fake를 Google에 검색하면 검색 제한이 뜨기도 하니까 말이죠...
요번 포스트에서는 Deep Fake 기술에 대해 알아보고 이를 활용하기 위해, 이에 대해 간략하게 알아보고 정리해보도록 하겠습니다.
우선, DeepFake란 무엇일까요?
DeepFake는 Deep Learning과 Fake의 혼성어로, 인공지능을 기반으로 한 인간 이미지 합성 기술을 의미합니다. GAN을 이용해 기존의 이미지나 영상을 원본이 되는 Image나 영상에 겹쳐서 만들어내는 기술이지요.
이는 영화나 방송계 등에서 이미 사망하거나 나이가 든 배우를 스크린에 되살리는 작업을 수행하거나 초상권을 보호해야 하는 경우 얼굴을 덮어 초상권을 보호할 수 있는 순기능이 있는 반면, 가짜 뉴스, 악의적 사기 행각 등에 활용되기도 하여 부작용도 나타내기도 합니다. 때문에 DeepFake 영상을 판별하는 AI를 개발하도록 Kaggle 등에 높은 상금을 걸어놓는 경우도 발생되고 있습니다.
다음은 DeepFake를 이용해 가짜 영상을 생성한 결과물들입니다.
유명인들의 얼굴을 다른 유명인들의 얼굴로 바꿔 치지 한 결과들로, 몇몇 프레임에는 부자연스러운 것도 있지만 대체적으로 거부감 없는 결과물을 만들어낸 것을 확인할 수 있습니다.
이질감이 없는 영상은 그 인물을 모른다면 무엇이 진짜인지 가짜인지 판단하기 어렵죠...
DeepFake라는 것이 무엇인지 간략하게 알아보았으니 이제 이러한 기술은 어떻게 만들어졌는지 알아보도록 하겠습니다.
현재, DeepFake 기술로 유명한 프로그램은 DeepFaceLab과 FaceSwap이 있습니다. 이중 FaceSwap을 기준으로 설명해보도록 하겠습니다.
얼굴을 합성하는 방식은 Extract → Train → Convert의 순서로 진행됩니다.
우선, 얼굴 추출의 경우, Face Landmark Detection → Alignment → Mask Generation의 순서를 따르며, Face Detector는 OpenCV의 DNN, Mtcnn, S3Fd 방식으로 수행될 수 있습니다. 그리고 Aligner의 경우 OpenCV의 DNN, Fan의 방식으로 수행될 수 있으며, Masker는 Unet-Dfl, Vgg 방식을 사용할 수 있습니다. 이외의 세부 Parameter(= Face Size, Filter 등)를 Customize 하여 사용할 수 있습니다.
다음으로, Image에서 Face Extraction이 되었으면 Train과정을 수행하게 됩니다. 이 과정에서 Face를 생성합니다. Trainer로 Dfaker, Dfl-H128, Dfl-Sae, Dlight, lae, Lightweight, Realface, Unbalanced, Villain 등의 방식을 사용할 수 있습니다.
Model에 따라 세부 내용은 상이하겠지만, 전반적인 과정은 Input (= Image) → Encoder → Decoder → Output (= Image)입니다.
Encoder에서는 얼굴 이미지를 Load하여 Encoding을 진행합니다. 이때 가능한, 가져온 얼굴 이미지에 비슷하도록 Vector로 다시 구조화합니다. Decoder는 Encoder로 생성된 Vector들을 다시 얼굴 이미지로 만드는 작업을 수행하며, 이때 가능한 입력한 얼굴 이미지와 비슷하게 생성합니다.
DeepFake에 사용되는 Neural Network는 Encoding 하거나 Decoding을 잘 수행하기 위해 두 가지 요소를 사용합니다.
- Loss
DeepFake 신경망 알고리즘에서 Encoder와 Decoder를 통해 새로 생성한 Face Image가 실제 입력된 Face와 얼마나 다른지 Loss Value를 측정하며 이는 가중치 변경을 위해 사용됩니다.
- Weights
DeepFake 알고리즘을 통해 새로 생성된 Face를 평가해서 가중치를 업데이트하게 됩니다. 이때 가중치를 한 방향으로 증가시켰는데 다음으로 생성된 Face를 평가하였을 때 오히려 평가가 좋아지지 않는다면 반대 방향으로 가중치를 증가시키는 작업을 수행합니다. 이러한 과정들을 수행해가며 가중치를 변화시키게 되고 이 값을 바탕으로 좀 더 나은 얼굴 모델을 생성하게 됩니다.
위 내용은 Face를 생성하는 신경망에 대한 내용이었습니다. Face를 생성하였으면 이를 바꿔치기하는 기술도 필요합니다. Face를 바꾸기 위해서는 Face Image를 읽어와서 이 Face와 다른 사람의 얼굴을 만들어야 하는데, 이를 위한 구조는 다음과 같습니다.
- 공유된 Encoder
Model을 학습할 때, 2가지 얼굴을 Set로 학습하게 됩니다. (= 바꾸고 싶은 Face Image (A), 바꿀 Face Image (B))
우선, A Set와 B Set의 Encoder를 공유해서 같이 사용하며, 이 경우 공유된 Encoder는 A Set와 B Set의 이미지를 생성하는 알고리즘을 하나의 알고리즘으로 학습하게 됩니다.
- 두 개의 다른 Decoder
앞과 같이, 학습할 때 2가지 서로 다른 Face를 똑같은 Encoder를 사용해 Encoding하고 각각 다른 Decoder(= A Set Decoder, B Set Decoder)를 사용해서 새로운 Face를 생성해가며 Loss Value와 Weights를 Update 해가며 최적의 값을 찾아내가며 학습을 진행합니다. 이 경우 학습이 끝나고 나면 그 Model을 사용해서 Decoder만 바꾸면 다른 얼굴을 생성할 수 있게 됩니다.
위의 전반적인 과정을 그래프로 표현하면 다음과 같습니다.
앞서 Trainer로 Dfaker, Dfl-H128, Dfl-Sae, Dlight, lae, Lightweight, Realface, Unbalanced, Villain 등의 방식을 사용할 수 있다고 언급하였습니다. 각각의 Trainer에 대한 내용은 다음과 같습니다.
- Lightweight
제일 가벼운 Model로 64px 이미지로 64px 이미지를 만든다. 보통 GPU가 2GB이하일 경우 사용되는 Model입니다. 때문에 퀄리티는 떨어집니다.
- Original
64px를 64px로 만드며 기본적으로 사용하는 Trainer입니다. 적당한 퀄리티와 시간을 소요합니다.
- iae
64px/64px로, Model들을 다른 구조로 나누는데 A에 하나, B에 하나, 그리고 그 사이에 하나를 배치하여 3개의 Layer를 가집니다. Original 보다는 좀 더 나은 결과를 얻을 수 있습니다.
- Dfaker
64px/128px로, 원본 모델을 다루는데 Up-Scale해서 높은 해상도의 결과를 가져올 수 있게 합니다. 때문에 많은 시간이 소요되지만, 그만큼 좋을 결과를 보입니다.
- unblanced
64-512px/64-512px로 매우 강력한 Model입니다. 많은 방법으로 역변환할 수 있고 Customizing 해서 사용할 수 있는 Model입니다. 단점은 어떻게 사용하는지 잘 알아야 제대로 사용할 수 있다는 것입니다.
- DFL-H128
128px/128px, Original Trainer와 같은 Model입니다. 다만 64px/64px가 아닌 128px/128px라는 것만 다릅니다.
- DFL-sae
64-256px/64-256px, 두 가지 다른 Network 구조를 가지고 있는 Trainer입니다. 하나는 Original을 베이스로 하여 Encoder는 공유하고 Decoder는 나누는 구조이고 다른 하나는 IAE 베이스로 한 구조입니다. 이것도 많은 Customizing이 가능하여 unblanced Trainer와 마찬가지로 사용하기 어려운 Trainer입니다.
- Villain
128px/128px, 적은 메모리에서 높은 화질의 모델을 얻을 때 사용합니다. 이는 Customize할 수 있는 것이 없습니다.
- Realface
64-128px/64-256px, unbalanced Model 다음에 나온 것으로 dfaker와 unbalanced Model에서 가져온 것으로 좀 더 발전시킨 Model입니다. 이 또한 Customizing이 매우 강력합니다.
- dlight
128px/128-384px, dfaker Model을 베이스로 한 모델로 얼굴을 Up-Scale하는데 초점을 맞춰, 매우 높은 해상도의 결과를 만드는 Model입니다. Customizing이 가능한 Up-Scaler를 가지고 매우 쉽게 Setting이 가능한 Model입니다.
Training은 Original을 기준으로 1080TI에서 3~4시간 정도 소요됩니다. Training이 완료되면 DeepFake영상을 생성할 수 있게 됩니다. 영상을 생성하기 위해서는 Alignment 파일(=. fsa)과 Image, FaceSwap 할 Image들이 필요합니다.
다음은 FaceSwap을 이용해 Original 방식을 기준으로 트럼프를 문재인으로 변환한 결과입니다.
얼굴이 뭉개진것 같은 결과를 얻게 됩니다. 특히, 눈부위를 보면 계속 눈을 감고 있는 영상을 얻게 됩니다.
약 3시간 정도 소요해서 만든 결과가 그리 좋은 결과를 보이는 것 같진 않죠. 대체적으로 좋은 결과를 얻기 위해서는 시간이 많이 소요되는 것은 필연적인 것 같습니다.
이번에는 Custom Data를 이용해서 내 얼굴과 어떤 유투버님의 얼굴을 바꿔보도록 하겠습니다.
우선, 다음 링크에서 프로그램을 다운로드하여 사용합니다.
URL : https://faceswap.dev//
우선, 전반적인 사용은 다음과 같습니다.
어떠한 영상에 얼굴을 A로 덮어씌우고 싶다면 DeepFake A를 학습시켜 A와 관련된. h5 파일을 생성하고, 이후 얼굴을 덮어씌우고자 하는 영상에서 Face Landmark를 추출하여 Alignments 파일을 생성합니다. Input Video와 Alignments File, 그리고 학습 결과인 h5 File을 이용하여 Input Video에 A얼굴을 덮어씌운 output 영상을 얻습니다.
다음은 학습과정에서의 산출물들입니다.
< Face Landmark Detection → one Encoder + two Decoder → Extraction >의 과정을 통해 얻게된 주간 결과는 다음과 같습니다.
Face Landmark Data를 추출하는 부분의 경우 영상의 길이에 따라 다르긴 하지만, 대체적으로 1분안에 마무리됩니다. 그리고 최종적으로 Output Video/Image를 생성하는 시간 또한 Input 영상의 길이에 따라 다르지만 대체적으로 약 2분 정도 소요됩니다.
NVIDIA GeForce GTX 1060 3GB 기준으로 가장 가벼운 Model인 Lightweight를 사용해 약 4시간 정도 Train 시킨 최종 결과는 다음과 같습니다.
결과 이미지 자체가 그리 Clear하지 못하고 두 얼굴에서 헤어 스타일이 비슷하지 못하다 보니 눈썹 부분에서 검은색으로 이상한 부분이 생성되는 현상, 피부색 부분에서의 어색함 등의 현상이 발생되었습니다.
최종 결과가 안타깝긴 하지만, 적은 시간동안 Low 한 자원으로 학습시켰기 때문으로 판단됩니다. 다만 뭉그러지긴 했지만 눈, 코, 입이 자연스러운 위치에 안착되어 있고 얼굴 윤곽도 따라간다는 점에서 DeepFake 기술이 발전이 많이 된 것 같다는 생각을 다시 한번 하게 되었습니다.
요번 포스트는 여기서 마무리하도록 하겠습니다.
'Programming > Computer Vision' 카테고리의 다른 글
[SLAM] EuRoC를 이용한 ORB-SLAM3 테스트 (0) | 2023.01.11 |
---|---|
[SLAM] ORB SLAM과 SLAM Dataset에 관한 정리 (0) | 2023.01.11 |
[GAN] EveryBodyDanceNow에 대한 정보 및 수행 (0) | 2023.01.09 |
[Image Comparison] 두 이미지의 일치율 비교 (0) | 2023.01.06 |
[ZED2] ZED2 카메라를 Unity에서 사용하는 방법 (0) | 2023.01.05 |
댓글