연세대학교 빅데이터 학회 YBIGTA에서 2018년 6월 30일에 상반기 컨퍼런스를 진행하였고

저는 Catch-Tone이라는 프로젝트로 컨퍼런스에 참여하였습니다.



< Catch-Tone 프로젝트 소개 >


사진 한 장만으로 퍼스널 컬러를 찾아주는 프로젝트


※ 퍼스널 컬러 : 자신이 갖고 있는 신체색과 조화를 이루어 생기가 돌고 활기차 보이도록 하는 개개인의 컬러



퍼스널 컬러 진단 과정 -


1) 추출한 피부의 황색도와 적색도를 이용하여 웜톤과 쿨톤으로 구분 (L*a*b* 색체계 이용)

2) 눈동자의 밝기을 이용하여 사계절 중 하나로 구분 (웜톤 中 밝은 눈 - 봄, 어두운 눈 - 가을 / 쿨톤 中 밝은 눈 여름, 어두운 눈 - 겨울)




이번 글에서는 퍼스널 컬러 진단 과정 중 두 번째 단계에 대해 자세히 다루도록 하겠습니다.




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


저희가 사용한 방법을 간단하게 정리하자면 아래와 같습니다.



1. Opencv와 dlib을 이용하여 눈동자 영역 추출

2. 추출한 눈동자 영역의 가로와 세로의 길이를 이용하여 전처리

3. 눈동자 영역을 grayscale로 변환하여 동공 영역과 빛 영역 제거

4. 제거 후 남은 영역을 홍채라고 간주하여 새로운 인공눈 생성

5. 인공눈의 각 픽셀의 L*(Lightness) 값을 추출하여 표준편차 계산

6. 계산한 표준편차가 임계값을 기준으로 큰지 작은지를 계산하여 밝은 눈인지 어두운 눈인지 판단






또한 저희는 PANTONE Humanae Project에서 사용한 사진을 크롤링하여 사용했습니다.

(Photography by Angelica Dass : http://www.angelicadass.com/)





1. 눈동자 영역 추출



저희는 눈동자 영역 추출을 위해 dlib의 Face Landmark Detector와 OpenCV를 사용했습니다.


dlib을 이용하여 인식한 얼굴은 아래와 같습니다.





저희는 눈동자 영역만 필요로 하기 때문에

Landmark중 38, 39, 41, 그리고 42의 좌표값만 추출하여

직사각형 형태로 눈 영역을 얻어냈습니다.



2. 눈동자 영역의 가로, 세로 길이를 이용하여 전처리


추출한 눈 영역의 가로와 세로의 길이가 작다는 것은 그 사람의 눈이 작다는 것을 의미합니다.


저희는 홍채의 밝기를 얻어내는 것이 목적이었기 때문에

4번 과정에서 작은 눈을 사용하는 것은 부적절하다고 판단하여 전처리해주었습니다.


왜냐하면 작은 눈의 경우에는 큰 눈에 비해서 눈꺼풀의 그림자나 속눈썹이 차지하는 영역의 비율이 더 클 것이고

이로 인해서 추출한 눈의 영역 중 대부분이 홍채가 아닌 부분에 해당할 것이기 때문입니다.


또한 눈의 크기가 과도하게 큰 사진은 아웃라이어로 간주했습니다.


따라서 저희는 눈 크기가 너무 작거나 큰 데이터는 전처리 과정에서 제거해주었습니다.









3. 눈동자 영역을 gracyscale로 변환 & 빛 - 동공 제거




얻어낸 눈의 영역을 Grayscale로 변환한 사진은 위와 같습니다.



저희가 눈동자의 밝기를 측정할 때 가장 중요하게 고려했던 부분은

눈동자의 밝기를 따지는 것에 동공과 눈에 비친 빛은 고려되어서는 안된다는 것이었습니다.



따라서 저희는 OpenCV의 threshold를 이용하여 특정 Grayscale 범위에 속하는 값들만 추출했습니다.



조금 더 구체적으로 설명드리자면 threshold를 90으로 설정해주었을 때 결과는 아래와 같습니다.

(Grayscale 값이 90 이상인 값들만 검은 색으로 표현)




Grayscale로 변환한 눈의 사진과 비교해보면 빛이 비친 영역과 흰자에 해당하는 영역만 흰색으로 표시되었음을 알 수 있습니다.








반면에 threshold를 20으로 설정한 결과는 아래와 같습니다.



이번에는 눈의 영역 중 동공에 해당하는 부분만 검은색으로 표시되어 있습니다.





저희는 위와 같이 빛의 영역과 동공 영역을 인식하여 제거해주는 전처리를 거쳤고

남은 부분을 홍채로 간주하였습니다.


이때 전처리 과정을 거치며 눈의 밝기에 따라서 빛의 영역과 동공 영역 각각에 해당하는

threshold가 다르다는 것을 발견하였습니다.


따라서 저희는 홍채를 추출할 때 각각의 눈을 어두운 눈, 중간 눈, 밝은 눈이라는 세 가지 가정을 한 뒤에

전처리 후 남은 픽셀의 수가 많은 데이터를 이용했습니다.



위의 그림은 어두운 눈, 중간 밝기의 눈, 그리고 밝은 눈 각각을 Grayscale로 변환한 후

그 값들을 그래프에 나타낸 것입니다.


그래프를 통해 눈의 밝기에 따라 값들이 대체로 분포해있는 영역이 다름을 알 수 있습니다.

또한 빛이 비친 영역과 동공 영역이 차지하는 grayscale 값도 다르다는 것을 알 수 있습니다.




따라서 저희는 동일한 눈이 어두운 눈, 중간 밝기의 눈, 그리고 밝은 눈 3가지 중 하나에 속한다는 가정으로

세 종류의 전처리를 거친 후 살아남은 픽셀이 가장 많은 데이터를 사용했습니다.


[어두운 눈 : 35 ~ 110 / 중간 밝기의 눈 : 50 ~ 140 / 밝은 눈 : 65 ~ 150]




4. 인공눈 생성


그리고 남은 홍채 영역을 이용하여 눈의 밝기를 결정하는 과정에서는

'인공눈'과 '표준편차'의 개념을 이용했습니다.



전처리를 거친 눈은 동공이 삭제된 형태입니다.

따라서 저희는 임의로 동공을 추가해주는 방식을 택했습니다.


전처리 후 남은 픽셀들에서 각 픽셀의 L*값(Lightness value)들만 남긴 후

L*값이 0인 데이터를 전체 데이터의 15%만큼 차지하도록 추가해주었습니다.


전처리와 인공눈 생성 과정을 그림으로 나타내면 아래와 같습니다.


5. L* 값들의 표준편차 계산 & 경계값 계산


전처리 결과 홍채에 해당하는 L*값이 85%, 동공에 해당하는 L*(=0)이 15%만큼 존재하게 됩니다.


만약, 이 눈이 밝은 눈이라면 홍채에 해당하는 L*값이 대체로 큰 값을 가지므로 L* 값들의 표준편차를 구하면 

동일하게 15%만큼 L* = 0 데이터를 갖고 있는 어두운 눈에 비해서 표준편차가 더 클 수 밖에 없습니다.


저희는 밝은 눈과 어두운 눈의 경계가 되는 표준편차 값을 얻어내기 위해

PANTONE Humanae Project의 데이터에 모두 동일한 전처리 과정과 인공눈 생성을 거쳐 각각의 사진에 대해서 표준편차를 구하였고,

약 1700개의 사진에서 얻어낸 1700개의 표준편차를 이용하여 K-means Clustering을 하였습니다.







6. 경계값을 통해 눈의 밝기 판단


K-means Clustering을 통해서 경계값이 38.28임을 얻어내었고

그 결과 L* 값들의 표준편차가 38.28보다 큰 눈은 밝은 눈, 38.28보다 작은 눈은 어두운 눈이라고 결론내렸습니다.














눈동자 밝기를 측정하는 것은 어떻게 보면 정성적인 방법으로 진행되어 왔습니다.


이번 프로젝트에서 얻을 수 있었던 결과는

표준편차 개념을 이용하여 정량적으로 눈의 밝기를 따지고

게다가 동공이나 빛과 같은 외부의 환경을 제거할 수 있었다는 점입니다.



그러나 프로젝트의 한계점으로

같은 사람의 피부와 눈이라도 사진의 필터, 조명 등의 요소로 인해서 사진에 따라 달라지는 것을 극복하지 못했다는 것입니다.




이러한 외부 환경의 영향까지 완벽하게 조절할 수 있는 모델을 구현하였다면

더욱 신뢰할 수 있는 결과를 만들어낼 수 있었으리라는 아쉬움이 있었습니다.










ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


혹시 프로젝트 관련 질문이 있으시다면 댓글을 남겨주시거나

ehdalsrjs@naver.com 으로 메일 부탁드립니다.


감사합니다.


Thanks to YBIGTA 김지현, 서보아