CNN 배운 지 한 달
김태희는 미의 대명사로 불릴 정도로 대단한 외모를 지녔다. 이에 따라 "김태희 닮은꼴"이라는 말로 등장한 여러 연예인도 있는데, 예를 들면 김지원, 박희본, 지연, 한다민, 허이재 등이 이에 해당한다. 물론 김태희를 닮았다기보다는 그저 뚜렷한 이목구비에서 이러한 외모를 지니게 되는 것일지도 모른다. 또한 그들도 닮은꼴 연예인이라는 말로 볼 것이 아니라, 나름대로 자신의 분야에서 프로들로서 높게 평가해야 되지 않나 싶다.
횡설수설이 길었고.. 요즘 연구 참여하면서 tensorflow로 CNN을 배우고 있다. 요즘 말하는 머신러닝, 딥러닝, AI, 이미지 처리의 분야라고 할 수 있겠다. 얼마 전에 custom dataset에 대해 transfer learning 하는 코드를 돌려봤는데, 이거 참 재밌네ㅋ 싶어서, 여러 가지 돌려보고 있다. 과연 머신러닝, 딥러닝이 구분할 수 있는 미묘한 차이는 어디까지일까 생각해봤는데, 그래서 떠오른 주제가, 닮은꼴 연예인에 대한 classifier를 만들어보고 성능을 확인해보자는 것이다. 그래서 잘 알려진.. 김태희 닮은꼴 연예인에 대해 진행해보려고 한다. 큰 흐름에서는, dataset을 준비하고, 적절히 가공한 뒤, transfer learning으로 모델링하고, 그 결과를 확인하고자 한다. 참고로 필자가 CNN 시작한 지 아직 한 달밖에 안된 초짜니까, 설명이 이상한 부분이 있을 수 있음.
먼저 필자는 김지원, 김태희, 지연, 허이재로 4인의 연예인을 대상으로 하였다. 박희본과 한다민이 빠진 이유는 나중에 설명하고.. 우선 이미지를 모으려고 하는데, 수동으로 마우스 우클릭해서 몇백 장쯤 모으려고 하니 말이 안돼서, 자동으로 이미지를 모으는 프로그램이 없을까 생각했다. 그래서 찾은 것이 Extreme Picture Finder.
이런 프로그램인데, 검색 키워드를 설정해두면, google, bing, naver 등의 여러 검색엔진에서 나온 이미지를 자동으로 다운로드하여주는 프로그램이다. 몇백 장 모으는 것도 순식간이다. 귀차니즘을 덜어준 제작사에 소소한 감사를.. 여기서 다운로드한 이미지를 살펴보면, 중복되거나 거의 유사한 이미지가 다소 나타남을 확인할 수 있다. train set에서 내부적으로 중복된 이미지가 있다고 하면 뭔가 찝찝하고, test set과 train set에 중복된 이미지가 하나씩 있으면 당연히 맞출 수밖에 없으니, 이런 것들은 중복제거를 해주자.
필자의 경우 Visipics라는 프로그램을 사용했다. 중복 이미지를 group별로 발견하고, 거기서 가장 화질이 낮은 이미지를 선택하여 삭제하는 방식인데, 꽤 유용하다. 여기서도 제작사에 소소한 감사를.. 한편 중복 제거된 이미지라고 할지라도, 얼굴이 명확하게 드러나지 않은 것들도 있고, 본인의 얼굴이 아닌 이미지가 다운로드하여지는 경우도 있다. 여기서도 일일이 내가 확인해서 수정하는 건 역시나 귀찮다..
여기서 꽤 유용한 API를 소개하고자 한다. 네이버에서 연예인 얼굴인식 API를 제공하고 있는데, 이미지를 쏴주면 json 형태로 결과를 얻을 수 있다. 예제도 제공하고 있어 넘나 감사한 곳.. 이걸 통해 이미지들을 하나씩 API에 날려보면서 체크해서, 본인의 얼굴이 명확하게 드러난 이미지만 걸러내서 dataset으로 활용하고자 한다. 이 API에서 박희본, 한다민의 이미지는 지원하고 있지 않아 아쉽게도 탈락..
그 외에도 이름이 지저분하니까 보기 좋게 바꿔주면 나중에 편하니.. DarkNamer라는 프로그램을 사용했는데, 그냥 python 등에 자신 있는 사람이라면 직접 만들어서 써도 금방 구현 가능한 부분.
최종적으로 김지원, 김태희, 지연, 허이재의 4명에 대한 dataset 준비가 완료되었다. 각각 160장씩 준비하였으며, 또한 이 dataset에 포함되지 않은 이미지를 따로 몇 개만 남겨두었다. 어떤 머신러닝 문제든 dataset을 질 높게 준비하는 과정은 꽤 번거롭지만, data의 정보적 손실이 있지 않도록 주의하는 것이 필요하다. 여기에 대해서는 이후에 다시 설명.
우리가 하고자 하는 것은 class가 4개 있는, muliclass의 classification이며, modeling method는 CNN이다. Convolutional Neural Network, ConvNet이라고 하기도 하며, 많이 요약하면 이미지 처리에 적합한 뉴럴 네트워크라고 할 수 있다. 고성능을 내는 유명한 CNN으로는 VGGNet, GoogLeNet, ResNet 등이 알려져 있다. 여기서 우리는 transfer learning을 하고자 하는데, 이처럼 굉장한 performance를 내는 모델을 다운로드하여서, 우리의 custom dataset에 대해 retrain 해서 모델링하고자 하는 방법이다. 만약 retrain 없이 진행한다면 처음에 초기화할 parameters를 그냥 막 정하는데(random이라던가..) 그러한 경우 학습 속도나 성능적인 면에서 비효율적이다. 여기서 transfer 할 모델로 우리는 inception-v3을 쓰려고 하는데, 참고로 inception의 한 버전이 GoogLeNet이기도 하다. inception에 대해서는 논문도 있고 국내에 잘 설명된 블로그도 많은데, 주요 특징은 inception module을 사용하는 구조로 parameter 수를 줄이고 성능을 높였다 정도로 요약할 수 있겠다. inception을 받아서 transfer learning을 하는 방법은 꽤 잘 알려져 있고, 국내 블로그에도 정리해둔 분들이 많다.
- 11. 텐서플로우(TensorFlow)를 이용해서 Inception V3 모델 Retraining을 통해 나만의 데이터셋을 이미지 인식(추론) 해보기
- [TensorFlow] Inception-v3 를 이용하여 원하는 이미지 학습과 추론 해보기
이 예제들은 굉장히 편한데, 폴더별로 이미지를 잘 정리해두기만 하면 알아서 정답이 label 되고 이미지 자체적인 전 처리과정(크기를 조절한다거나)이 필요 없고, 그래서 모델링적인 부분에서 사람이 건드릴 부분이 적다ㅋ 당연하지만 폴더명은 한글보단 영어가 좋다. retrain을 진행하면 bottleneck file을 열심히 만들어준 후, step을 밟아가며 train이 진행된다. 이 예제의 경우 cross entropy를 minimize 하는 방향으로 optimize 하고 있으며, 각 step마다 train accuracy와 validation accuracy를 찍어주고, 학습이 끝나면 최종 test accuray를 찍어준다.
결론적으로, 김지원, 김태희, 지연, 허이재의 이미지 160장을 inception으로 retrain 하면 1,000 step에서 test accuray 63.5%까지는 나온다. 닮은꼴 연예인에 대해, 얼굴 crop 없이 진행했음을 생각하면, 그럭저럭 흥미로운 결과. 사실 진짜 similarity를 따지려면 multiclass classification 말고 dataset의 similarity 같은걸 볼 수 있는 방법이 있겠지만 tensforflow 한 달 배운 나로서는 그냥 이 정도까지만 하는 걸로..
여기서 이미지를 하나씩 test 하는 것도 가능하다. 이건 train set에 포함되지 않은 것들로 준비했다.
hij225.jpg(fail)
b'jy\n' (score = 0.58817)
b'kth\n' (score = 0.23400)
b'hij\n' (score = 0.14518)
b'kjw\n' (score = 0.03266)
(허이재 -> 지연)
jy217.jpg(fail)
b'kjw\n' (score = 0.40477)
b'hij\n' (score = 0.28865)
b'jy\n' (score = 0.27727)
b'kth\n' (score = 0.02930)
(지연->김지원)
(이 사진은 진짜 김태희 닮았다고 생각했는데 김태희가 4등이었다..)
kjw343.jpg(ok)
b'kjw\n' (score = 0.51066)
b'jy\n' (score = 0.29878)
b'kth\n' (score = 0.13368)
b'hij\n' (score = 0.05689)
(김지원->김지원)
kth210.jpg(ok)
b'kth\n' (score = 0.80630)
b'kjw\n' (score = 0.11281)
b'jy\n' (score = 0.05092)
b'hij\n' (score = 0.02997)
(김태희->김태희)
김태희와의 닮은꼴이 김지원, 지연, 허이재라고 생각하고 한 시도지만, 실제로는 모두들 서로서로 닮았다고 볼 수 있다. fail 한 경우를 보면 허이재(hij225.jpg)를 지연으로 예상한다거나, 지연(jy217.jpg)을 김지원으로 예상한다거나 하는 등, 김태희와의 관계라기보다는 서로 다 연관이 있는 관계라고 생각할만하다.
class 4개에 대해 겐또로 찍으면 accuracy가 25% 나오겠지만 train 결과 63.5%라는 건 그럭저럭 잘 나오는 것 같기도 하고, 좀 부족하기도 한 느낌. 그럼에도 닮은꼴 연예인에 대해 이 정도 분류가 가능하다는 건 꽤 흥미롭다.
개선 방법으로는 비슷한 시도를 했던 조대협 님 블로그가 꽤 참고할만하다. 이분은 데이터 질을 강조했는데, 얼굴 각도, 표정, 메이크업, 선글라스 등의 요소로 질이 낮은 데이터를 걸러내고, 또한 사진 전체가 아닌 얼굴만 추출하는 방식으로 CNN 적용해서 연예인 5인(안젤리나 졸리, 니콜키드만, 제시카 알바, 빅토리아 베컴, 설현)의 이미지 분류를 시도했는데, 7,000 step으로 accuracy 91%까지 올렸다는 이야기. 닮은꼴이 아닌, 즉 명확하게 구분 가능한 연예인들을 class로 하면서 데이터 질을 높이면 그 정도까지는 된다는 것으로 이해할 수 있다.
혹은 dataset 준비하는 과정에서 visipics로 중복 제거나 네이버 API 돌리는 과정에서 정보 손실 가능성을 검토해봐야 될 수 있다. 실제로 네이버 API에서 지연 사진을 김태희로 분류한 경우도 있었는데 이떻게 개선이 필요하려나.. 아니면 모델링적인 차원에서, 즉 dataset을 늘린다거나 training step을 이빠이 돌린다거나 CNN을 개선한다거나(깊고 넓게 등등) 등등이 있겠다.