FaceNet을 이용한 이상형 학습 및 추천 알고리즘

Michael Kim·2021년 9월 11일
0

colab 주소: https://colab.research.google.com/drive/1TPWYcpTIotUj1Wou3rD7Vy2l508MWC1a#scrollTo=4MmNXKTkIIec

이번 글은 지난 KDT 프로젝트 글에 이어서 쓰는 글입니다.

최근 3주동안 지인들을 만날 때마다 팀에서 만든 서비스 테스트를 부탁드려봤습니다. 재미는 물론, 어느 정도 정확도도 나오는 걸 확인할 수 있었어요. 대략 이상형에 가까운 연예인 7명을 추천하면, 그 중 2~5명은 이상형에 해당한다고 응답해주셨습니다.


0. 지난 글


지난 번에는 얼굴의 Feature를 구하기에 앞서, AutoEncoder를 이용해 Feature를 얻고, Clustering을 수행했을 때, 유의미한 결과가 나오는지 살펴보았습니다. 그리고 Cluster 알고리즘이 Classifier의 역할도 할 수 있다는 것을 알게 되었죠. 하지만 이 실험을 하고 나서도, AutoEncoder가 얼굴 Feature를 잘 잡아낼 수 있을지 평가해보기도 어려웠고, 얼굴 Feature를 얻더라도 그 Feature가 이상형에 관련된 Feature일 지 의문은 풀리지 않았었어요.


1. FaceNet 모델을 이용한 얼굴 Feature 생성

다른 조원분이 AutoEncoder를 대신해서 쓸 수 있는 모델을 찾아와 주셨어요. FaceNet은 얼굴 Feature에 Metric Learning을 이용하여, 동일한 일물이라면 distance가 작도록 학습시킨 모델입니다. (FaceNet 논문, 논문 리뷰) 일단 저는 이 모델을 써볼 겸, 얻어낸 Feature가 어떤 Feature인지 구분해낼 수 있을지 실험해보기로 했습니다.

MTCNN 모델을 이용하여 얼굴을 찾아 crop하고, FaceNet을 이용하여 128개의 Feature를 얻어냈습니다. 그 다음, 각 Feature마다 가장 작은 값을 갖는 이미지 6장, 가장 큰 값을 갖는 6장을 출력해보았어요.
위의 사진과 같이 남자 122번째 feature는 안경의 유무라는 것을 알 수 있었어요. 하지만 나머지 Feature는 눈으로 보았을 때 어떠한 Feature인지 알아낼 수가 없었죠. 더군다나, 화질이 좋지 않은 이미지도 있고, 화장, 명암, 등 여러 가지 요소에 의해 좋은 Feature를 얻기 어렵다고 생각했죠. 저는 이러한 부분을 팀에 전달했고, 다른 조원분이 이러한 이슈를 맡아, 해당 연예인의 해상도 높은 다른 사진을 수집해주시기로 했어요.


2. 인지심리학: '끌리는 얼굴은 무엇이 다른가?'


일단, 이상형 Feature를 얻기 전에, 이상형이란 무엇인지, 어떤 것들과 연관이 있을지 연구해볼 필요가 있었어요. 그래서 매력에 관계된 이 책을 읽게 되었죠. 책에는 여러 가지 재밋는 내용이 많았지만, 저희 프로젝트에 가장 직접적으로 영향을 미친 두 가지 내용만 소개해드리고자 합니다.

  1. 눈을 통해 얼굴이라 인지할 수 있는 시각 정보를 얻고, 해당 정보를 가지고 있던 기억과 연결시키는 원리로 이상형이 만들어지게 됩니다. - 이 내용은 어떠한 아이디어를 주기보다, '얼굴 Feature에 이상형 Feature가 담겨있다'는 가설을 입증해주는 자료가 되었습니다. FaceNet을 이용하여 얼굴 Feature를 얻었으니, 이제 이 Feature 중에서 어떤 Feature가 이상형과 관계있는지 학습시키기만 하면 되는 거죠. 즉, 이상형 Feature를 알아낸다는 것은, 어떤 Feature가 기억과 연관되어 있는지 알아내는 작업이 되겠네요.
  2. 사람은 평균적인 얼굴을 매력적이라 생각한다고 합니다. 사람의 얼굴을 모두 모아 합성했을 때, 더 매력적인 얼굴이 나온다고 해요. 그리고 매력적이라 느끼는 얼굴끼리 합성하면 더 더욱 매력적인 얼굴이 나온다고 합니다. - 이 내용을 읽고 딱 느낌이 왔어요. 사용자가 선택한 얼굴 Feature를 모두 합성하면 이상형에 가장 가까운 얼굴이 만들어지지 않을까요? 그리고 그 얼굴의 Feature는 사용자의 이상형에 가까운 Feature겠죠. 그리고 굳이 GAN을 이용하여 합성할 필요없이, 선택한 얼굴 Feature를 모두 더해 평균을 내면 그게 이상형에 가장 가까운 Feature가 되지 않을까요?

그리고 저는 2번 내용에서 얻은 아이디어를 바로 실험해보기로 하였습니다.


3. 선택한 얼굴 Feature로 이상형 Feature 만들기

  1. 일단, 아직 Cluster Sampling 기능이 만들어지지 않았으니, 사용자에게 무작위의 이미지가 선택지로 주어지게끔 만들었습니다. 그리고 아래 사진과 같이 N개의 선택지가 있는 문제를 M번 보여주기로 하였죠. (N, M은 사용자 설정 상수)
  2. 사용자가 선택한 이미지에 해당한 Feature들의 평균을 구합니다. 그 다음, 그 Feature와 가까운(euclidean distance 사용) Feature를 가진 얼굴 이미지들을 출력해냅니다.
    솔직히 제 사용 후기는 '매우 만족'입니다. 뭔가 본 알고리즘을 평가할 지표가 없어 아쉽네요. 그래서 만나는 지인들께(대략 15명?) 테스터로 참여해주시길 부탁드렸습니다. 그리고 테스트 결과, 추천한 이상형 연예인 7명 중 2~5명이 실제 이상형에 해당하는 결과를 얻을 수 있었습니다. 일단은 650개의 데이터 중에 2~5명의 이상형을 찾아냈다는 게 너무 놀라웠어요. 학습 데이터 Cluster Sampling 기능까지 갖춰지게 된다면, 더 더욱 좋은 알고리즘이 될 것 같네요. 얼른 서비스를 배포해보고 사용자들의 반응을 보고 싶네요~
profile
정리하고 복습하고 일기도 쓰고

0개의 댓글