Skip to content

Latest commit

 

History

History
157 lines (126 loc) · 5.58 KB

README.md

File metadata and controls

157 lines (126 loc) · 5.58 KB

Project

GitHub : AfterTripGithub

AfterTrip : 여행 후 그룹별 사진 공유의 불편함을 해결하기 위해 얼굴인식AI와 객체인식AI를 이용해 폴더를 분류하는 사진 공유용 모바일 웹


Face Recognition

1. FaceDetection : MTCNN모델으로 하나의 이미지에서 얼굴에 해당하는 모든 부분을 찾아 112x112 사이즈로 crop

2. FaceEmbedding : Arcface 손실함수를 이용한 Backbone모델로 얼굴이미지를 512 사이즈의 embedding vector로 변환

t-sne로 시각화 : embedding된 얼굴들을 t-SNE를 이용해 시각화 해보면 동일인물의 얼굴끼리 가까운 공간에 분포

3. Similarity 계산 : 모든 얼굴의 embedding vector가 연결된 embeddings vector와 그것의 transpose vector를 내적하여 cosine similarity를 계산

4. Grouping : crop된 얼굴이미지가 thresholod 값 0.55을 기준으로 유사하다면, original이미지들끼리 grouping

최종 결과 : 동일인물의 사진끼리 하나의 폴더

성능 : 얼굴인식AI는 얼굴 60장에 약 1분 소요 (Tesla T4 GPU 이용)


실행 방법

from main import *

groups, group_idx_list, images = run_face_recog(images)
Args:
      images (list of dictionary) : [{
                      "id" : DB에서 이미지 id
                      "url" : S3에서 생성한 url
                    }]
Returns:
      groups (list of dictionary): [{
                      "original_images_idx_list" : 해당 crop이미지의 원본이미지 idx
                      "crop_path_list" : crop이미지가 저장된 경로들의 list
                      "face_list" : crop이미지의 list
                      "face2_idx_list" : crop이미지 idx의 list
                      "face1_idx_list" : 해당 crop이미지가 해당 group에 추가될때 group내의 어떤 얼굴과 유사하다 생각되어 들어갔는지. 
                                          그 crop얼굴이미지의 idx의 list. 
                                         (빈 리스트이면 해당 그룹에 맨 처음 추가된 이미지인것)
                      "cosine_similarity_list" : 그때 face2와 face1의 유사도가 얼마였는지. 그 유사도의 list. 
                                                 (-1 이면 맨 처음 추가된 이미지인 것)
                    }]

      group_idx_list (list of int) : 유효한 group의 idx만 들어있는 list. (한 group에 하나의 얼굴만 들어간 경우 해당 그룹은 유효하지 않다 판단)
                                     (group idx 중 
                                      -2 (얼굴이 없는 사진들이 들어가는 그룹), 
                                      -1 (얼굴이 있는데 group에 넣기엔 너무 한장인 사진들이 들어가는 그룹)은 넣지 않았다)

      images (list of dictionary) : [{
                      "id" : DB에서 이미지 id
                      "url" : S3에서 생성한 url
                      "group_idx" : [1, 4, 9] (해당 사진이 속한 group의 list를 전송), 얼굴이 없으면 [-2]. 얼굴이 있는데 group에 넣기엔 너무 한장일 경우 [-1].
                    }]

ipynb notebooks

[ver1] FaceRecognition_Floder.ipynb

: [input] 이미지가 들은 폴더.

[ver2] FaceRecognition_URL.ipynb

: [input] AWS s3에 사용자 이미지를 저장. 해당 이미지들의 url이 저장된 dictionary.

[최종 ver] face_recognition.py

: 리펙토링, 모듈화 마친 코드

참고 자료

MTCNN (face detection) : github

Arcface (face embedding) : github


결과 시각화

1. T-SNE를 이용해 embedding 결과의 분포 확인

  • ex1

  • ex2

2. grouping 결과 시각화

image

image

image