상세 컨텐츠

본문 제목

웹캠으로 화장하기(feat. 빵형)

인공지능

by 잘못된 선택 2022. 3. 3. 22:34

본문

코로나 시대를 맞이한 이후 화상 회의나 화상 수업 또는 화상 면접과 같이 비대면으로 만남이 이루어지는 일이 잦아지고 있다. 외출하지도 않고 컴퓨터 앞에서 잠깐 마주하기 위해서 외모를 꾸미는 것을 귀찮아하는 사람들이 생각보다 많을 것이라고 생각한다. 이러한 고충을 해결하기 위해서 인공지능 기술을 활용하여 웹캠에 비춰진 나의 모습에 자동으로 화장을 해주는 프로그램을 만들어보았다.

 

메이크업 딥러닝 모델 중에서 'BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversarial Network' 논문에서 제시한 BeautyGAN 모델을 사용하였다. 아래 그림을 보면 해당 모델이 어떤 구조를 갖고 어떤 방식으로 학습했는지 대략적으로 알 수 있다. 이 모델의 생성자는 메이크업 사진과 노메이크업 사진을 입력으로 받고 메이크업 사진은 노메이크업으로, 노메이크업 사진은 입력된 메이크업 스타일의 메이크업 사진으로 출력하게 된다. 단순한 딥러닝 모델이었다면 makeup loss를 통해서 생성된 메이크업 사진과 입력 메이크업 사진간의 메이크업 유사도만을 학습했을 것이다. 하지만 GAN이라는 모델의 특성을 이용하여 스스로 더 정교하고 자연스러운 결과 이미지가 나오도록 학습시킨 방법이 굉장히 기발하다고 생각했다. 우선 두개의 판별자 모델을 사용했다는 특징이 있다. 각각 메이크업과 노메이크업 이미지가 원본 이미지인지 생성자 모델로 생성된 가짜 이미지인지 판별하게 된다. 이는 생성자가 더 자연스러운 원본 같은 이미지를 만들어 내도록 학습시킬 것이다. 또한 출력된 결과물을 다시한번 생성자에 입력으로 주었을때 처음 입력했던 이미지들과 같은 결과가 나오게 된다는 특성을 십분 활용하여 cycle consistency loss를 추가한 모습또한 아주 기발했다. 추가적으로 perceptual loss를 사용하고 있는데 검색해보니 GAN에서 사용되는 loss중 하나로 사전학습된 모델을 통해서 이미지의 스타일이나 특성을 유지시키는데 도움을 주는 용도의 loss 함수라고 이해하였다.

 

 

 

학습된 모델을 사용하는 방법은 그닥 어렵지 않았다. 깃헙 사이트(https://github.com/Honlan/BeautyGAN)에 올라온 코드와 같이 tensorflow를 사용해서 사전 학습된 모델을 불러와서 사용하면 된다. 해당 코드는 이미지를 읽어와서 다양한 스타일의 메이크업 이미지로 변환된 결과물을 저장하도록 되어있다. 나는 저번에 구입한 웹캠을 이용해서 실시간으로 나의 얼굴에 메이크업이 되도록 만들어 보았다. 결과물은 아래 영상과 같다.

 

사진 전체 크기에서 얼굴의 비율에따라 결과가 달라질 수 있는데 영상에서 보는 것처럼 카메라에서 30~40cm 정도 적당한 거리를 유지하는 것이 제일 결과가 좋았다.  오직 opencv만을 이용해서 원본 그대로 imshow를 했을때 FPS가 30정도가 나오는데 반에 BeautyGAN을 매 프레임마다 적용해도 FPS가 21정도로 꽤나 괜찮은 속도를 유지해주는 모습을 확인할 수 있었다. 실시간 영상에 적용시켜야 하기 때문에 GPU를 100% 사용했고 내 컴퓨터의 그래픽카드는 GeForce GTX 1060 3GB이다. 아래 사진은 해당 프로그램을 돌렸을때 그래픽카드 상태이고 전용 GPU 메모리 3GB중 2.8GB를 사용하는 모습이다.  

또한 해당 모델은 tensorflow 1.9버전을 사용했다고 나와있는데 나는 1.13버전을 사용했고 2 이상의 버전을 사용할 경우 tensorflow 함수가 바뀐부분들 때문에 작동하지 않았다. 그리고 영상에서 보면 얼굴을 탐지하여 메이크업 모델이 잘 적용될 수 있는 적정 비율로 이미지로 확대되도록 구현해놓았는데 이때는 face detection 모델인 dlib을 사용하였다. 더 좋고 빠른 얼굴 탐지 모델도 있지만 python3.8 이하 버전에서는 dlib이 잘 돌아가서 dlib을 사용했다. 참고로 tensorflow-gpu < 2 버전을 사용하기 위해서는 python 3.8이하 버전을 사용해야한다. face detection 모델을 매 프레임마다 적용하면 FPS가 5이하로 떨어지기 때문에 특정 키보드를 눌러서 얼굴의 위치를 잡을때만 모델을 사용하도록 했다.

 

이렇게 구현된 인공지능 메이크업 프로그램을 화상 회의에 사용할 수 있도록 만들기 위해서 python의 pyvirtualcam이라는 가상 카메라를 사용했다. OBS Studio라는 가상 카메라를 지원하는 공개 소프트웨어가 있는데 pyvirtualcam을 통해서 파이썬에서 OBS Studio으로 스트림 데이터를 보내면 OBS Studio에서 zoom이나 구글 미트같은 화상회의 프로그램에서 가상 카메라를 사용할 수 있게 해준다. 가상 카메라 드라이버를 별도로 설치하는 방법은 약간 복잡하기 때문에 OBS Studio를 설치하여 자동으로 드라이버가 설치되는 방법을 사용하였다. 아래 영상은 구글 미트에 적용해본 결과이다.

 

 

 

처음에는 얼굴 부분만 crop하여 BeautyGAN에 넣어서 결과물을 얻어낸 이후 원본 이미지의 crop했던 부분에 다시 덮어씌워서 전체 full 카메라를 유지하는 방법을 사용해보려 했으나 BeautyGAN 모델을 거친 이미지가 전체적으로 필터를 적용한 것처럼 색감이 달라지기 때문에 부자연스러운 모습을 보이는 문제가 있었다. segmentation을 통해 사람 이외의 배경은 원본 이미지를 유지하는 방식으로 좀더 자연스럽게 할 수 있지 않을까 생각해 보았으나 그렇게 할 경우 매 프레임마다 segmentation 모델을 수행해야 하기 때문에 FPS가 크게 떨어지는 문제가 발생할 것이다. 따라서 프레임을 낮추지 않고 자연스럽게 BeautyGAN을 사용하는 방법으로써 최대한 crop할 부분을 크게 하면서 BeautyGAN 모델이 잘 적용될만한 비율을 찾아서 crop하는 방법을 선택하였다.

관련글 더보기

댓글 영역