일반적으로 Neural Network을 포함한 머신러닝을 통해 모델을 만든다고 할 때는
크게 지도 학습과 비지도 학습 방법이 있습니다.
지도 학습은 가르칠 데이터셋을 정리해서(labeled datasets) 학습을 시키는 방법이고, 비지도 학습은 (정리되지 않은) 데이터들을 그룹짓거나(군집) 새로운 데이터 생성 등을 할 수 있는 모델을 만드는 학습 방법입니다.
이 중 Image Classification Model은 지도학습 방법을 이용합니다.
따라서, 학습시킬 데이터를 미리 준비하고 가공하는 과정이 반드시 필요한데,
이 과정이 생각보다 훨씬 많은 시간과 노력이 필요합니다.
■ 데이터 수집
1. 분류하고자 하는 타겟 연예인 1차 선정
– 분류를 원하는 연예인 명단을 작성해 봅니다. 서비스 타겟 등에 따라 달라질 수 있음
– 사용층을 고려해서 연예인도 남녀노소 균형있게 고려할 필요가 있겠죠..
– NUGOO는 지금까지 국내 연예인 600~700명 정도의 데이터를 수집하면서 모델화 가능 여부 파악
– 수집된 데이터, 즉 사진의 수량과 질에 따라 최종 반영 여부 결정
2. 해당 연예인 사진 수집(프로그램)
– 간단한 웹 크롤링 프로그램 개발
– 연예인 이름으로 폴더를 만들어서 자동 수집 : 폴더 이름이 class label됨
– 사진을 수집하면서 사진에서 얼굴 영역만 1차 Crop하여 저장 : dlib, OpenCV 등 이용
– But, 아래 사진과 같이 얼굴영역을 잘못 인식하는 경우가 많고, 특정 연예인이 다른 사람들과 같이 찍은 사진이 많아 해당 연예인이 아닌 사진도 같이 Crop 되기도 합니다.
3-1. 사진 선별 작업(프로그램)
– 처음에는 위와 같은 사진을 일일이 수작업으로 제거 했는데, 그건 너무 힘든..쩝
– 그래서, OpenFace나 Open API의 이미지 비교 서비스를 이용하여 필터링 처리!!
(괜찮은 사진을 기준으로 유사도 점수가 낮으면 안쓰는걸로~)
https://cmusatyalab.github.io/openface/demo-2-comparison/
https://azure.microsoft.com/ko-kr/services/cognitive-services/face/
– 이 과정을 통해 제법 많은 공수를 줄일 수 있었음
3-2. 사진 선별 작업(수작업)
– 3-1 과정에서 선별된 연예인별 사진을 최종 점검
– 이 과정에서도 가끔 서로 다른 연예인 사진이 나오는 경우도 있음
– 학습에 도움되지 않는 사진 제거(얼굴 정면이 많이 나오지 않은 사진 등)
4. 사진 수 조정 및 최종 타겟 연예인 선정
– 연예인별 사진 수를 점검하여 가능한 200 ~ 300장 범위가 되도록 조정
– class별 학습 균형을 위해 range를 줄일 수록 좋음
– 사진 수가 부족할 경우 argumentation 처리(flip 등)로 사진수 늘리기
– 그래도 기본적인 사진수가 부족한 경우 최종 타겟에서 제외
– 특정 연예인의 사진 수가 너무 많아도 한쪽으로 학습 편향이 생기기 때문에 사진 선별이 필요함
– NUGOO는 현재 380명의 연예인/유명인 분류
5. 사진 얼굴 변형(Transform)
– 모델의 성능을 높이기 위해 최대한 정면의 바른 포즈가 되도록 변형 작업이 필요함
– 실제로는 개인의 다양한 포즈(정면, 측면, 얼짱각도 등) 사진을 학습하는게 좋으나,
데이터가 부족하기 때문에 한가지 기준(정면 평형)으로 학습하는 것이 성능에 좋음
– 따라서, 새로운 사진을 inference할때도 얼굴 변형 과정 선행!
– 가로, 세로 기준점에 맞춰 눈, 코, 입이 평형 위치가 될 수 있도록 사진 변형하고,
– 눈썹과 턱선을 기준으로 2차 Crop
– dlib, OpenCV 등 이용
위와 같은 모든 과정을 거치면 이제 학습할 데이터 준비 완료!!
Face detection(crop) Algorithms
– Dlib : http://dlib.net/
– MTCNN : https://kpzhang93.github.io/MTCNN_face_detection_alignment