상세 컨텐츠

본문 제목

실시간 딥페이크(real time deepfake) 실습해보기(feat. avatarify)

인공지능

by 잘못된 선택 2022. 2. 26. 10:42

본문

저번에 만든 웹사이트로 무엇을 만들지 고민하다가 딥페이크를 해주는 사이트를 사이트를 만들면 재밌겠다고 생각했다.

웹캠을 이용하기 위해서 영상처리 기술들 중 '마스크 사용여부 판별하기', '성별, 나이 판별하기', '자세 교정하기', '화장시키기' 등 여러가지 아이디어가 떠올랐지만 기술적으로 너무 쉽지 않은 인공지능 기술을 사용하고 싶었고 딥페이크가 적절하다고 생각했다. 또한 실시간 딥페이크이기 때문에 더 어려운 프로젝트가 될 것으로 생각했다.

 

우선 실시간 딥페이크 모델을 검색한 결과 몇가지 프로그램과 코드를 찾았지만 코드로 이루어진것 중에서 avatarify 라는 모델(https://github.com/alievk/avatarify-python)을 선택하였다. 이 모델은 이미지와 동영상을 주면 이미지가 동영상처럼 움직이게 만들어주는 모델이다. 이때 이미지는 동영상의 얼굴이나 행동을 모방하게 된다. 그리고 동영상 대신 실시간 카메라 영상으로 대체 가능하다. 전체 모델의 구성은 아래 그림과 같다.

모델 구조도

source는 변환을 주고싶은 이미지가 되고 driving frame은 동영상의 프레임을 의미한다. 크게보면 Motion Module과 Generation Module로 이루어져 있는 것을 볼 수 있다. Motion Module은 영상에서 dense motion field를 예측하는 목적을 갖는 모듈이라고 한다. 즉 움직임에 대한 특징을 추출한다고 이해하였다. keypoints Detector 모델에서 영상속 인물의 특징점이라 할 수 있는 Keypoints와 각 Keypoint들이 서로를 고려한 Affine Transformations 값을 찾게 된다. Affine Transformations에 대해 검색해보니 동작이나 움직임을 모델링하는데 있어서 벡터에서 '위치' 정보를 추가로 고려하는 Affine Transformations이 유용해 보였다. 이후 Dense Motion 모델을 통해 dense motion field와 occlusion mask를 출력하게 된다. dense motion field는 motion field를 좀더 세밀하게 찾았다는 의미가 아닐까 생각되고 motion field의 경우 화살표를 통해 움직임을 표현한 모습이라고 알 수 있었다. occlusion mask의 경우 검색해보니 뭔가 가려진 부분에 관련된 것으로 추정된다. 아마도 source 이미지는 2d이다보니 source 이미지 속 인물의 포즈를 변경하려면 가려진 이미지에 보이지 않는 부분을 추정하기 위한 mask라고 생각된다. Generation Module에서는 출력된 dense motion field와 occlusion mask를 고려하여 source 이미지를 변형시킨 후에 occluded(가려져서 보이지 않았던) 부분을 생성하게 된다.

 

 

이번 프로젝트에서는 위의 모델을 사용하여 사진속 인물이 웹캠에 인식된 나의 표정을 따라하도록 만들기로 하였다. 결과는 아래 영상과 같이 사진속 얼굴이 나의 실시간 표정과 유사하게 움직이는 것을 확인할 수 있다.

 

 

웹캠만 띄웠을 경우 fps가 90~100 정도가 유지되는데 avatarify 모델을 실행시킨 경우 fps 17 정도로 떨어지는 모습을 볼 수 있다. 그리고 gpu를 사용하지 않고 cpu만으로 실행할 경우 fps 1~2사이로 떨어져서 버벅거리고 답답한 모습을 보이게 된다. 추가적으로 dlib이나 mediapipe 혹은 face_alignment 과 같이 얼굴 탐지 모델을 사용하여 웹캠의 얼굴을 자동으로 추적하도록 만들어 보았더니 avatarify 모델을 실행시키면 fps가 9~10으로 떨어지게 된다.

 

내 서버는 AWS에서 ubuntu20.04 프리티어 버전을 사용하고 있는데 이 서버의 gpu는 Cirrus Logic GD 5446으로 적혀있는것을 확인하였으나 너무 오래된 버전이라 그런건지 torch의 cuda를 설치할 수 없었다. 따라서 cpu버전으로 돌려보려고 했지만 학습된 모델을 불러오는 부분에서 모델을 다 불러오지 못하고 서버가 터져버리는 문제가 발생하였다. 찾아보니 메모리가 부족해서 나타나는 현상이라고 하는데, 프리티어 버전이다보니 ram의 크기가 너무 작은 것이 문제가 된 것으로 판단된다. 만약 cpu로 모델을 돌릴 수 있었다고 해도 fps가 크게 떨어져서 눈만 아프고 결과가 안좋았을 것으로 추정된다.

내 aws 서버의 ram 크기

 

웹서버에 실시간 딥페이크 모델을 올리는 못해서 아쉽지만 잘 만들어진 복잡한 모델을 분석하고 사용하면서 여러 문제들을 해결하다보니 한단계 발전한 느낌이다.

 

 

 

 

관련글 더보기

댓글 영역