GitHub : AfterTripGithub
AfterTrip : 여행 후 그룹별 사진 공유의 불편함을 해결하기 위해 얼굴인식AI와 객체인식AI를 이용해 폴더를 분류하는 사진 공유용 모바일 웹
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].
}]
: [input] 이미지가 들은 폴더. : [input] AWS s3에 사용자 이미지를 저장. 해당 이미지들의 url이 저장된 dictionary. : 리펙토링, 모듈화 마친 코드
MTCNN (face detection) : github
Arcface (face embedding) : github
- ex1
- ex2