인공지능 개발시 훌륭한 학습 알고리즘도 중요하지만 양질의 데이터를 구하는 작업 또한 중요하다. 데이터는 되도록 많을 수록 그리고 정확할 수록 학습에 도움이 된다. 이번 포스팅에서는 폴리페이스에서 어떤 방식으로 데이터를 구했고 가공했는지를 정리해보려 한다.


1. 학습에 사용할 데이터 모으기


학습에 사용할 전혀 손때 묻지 않는 RAW 데이터를 구하는 것이 첫번째 과정이다. 폴리페이스의 서비스는 정치인 얼굴 닮은 정도를 측정하는 것이므로 이때 필요한 RAW 데이터는 인터넷 상에 떠도는 정치인의 얼굴이 담긴 사진이다. 가장 간단한 방법은 정치인의 이름으로 구글 이미지 검색을 해서 나오는 이미지들을 다운 받는 것이다. 그런데 한 명당 몇장이나 필요한가가 의문이었다. 딥마인드는 알파고를 학습시키려고 10만기보를 준비했다는데 사진은 10 ~ 20장으로는 택도 없을 것 같다.


구하기에 앞서 한 명당 얼마나 사진이 필요한지를 논문으로 확인해봤는데 논문에선 한명당 최소 500장은 사용하고 있었다고 한다. 인물 한명당 500장의 사진을 다운 받는것 자체가 매우 힘든 일인데 게다가 우리는 100명의 정치인 얼굴을 학습시키는 것을 목표로 했으니 총 합하면 50,000장을 다운 받아야 했다. 직접 검색하며 다운받기엔 너무 방대한 양이다. 개발을 시작하기도 전에 사진 데이터를 모으다가 시간이 다 갈것이다.


몇차례 우여곡절 끝에 친구가 이미지 다운 전용 크롤러를 만들어냈다. 처음에는 bing에서만 사용 할 수 있다느니 몇장 이상은 다운로드가 되지 않는다며 제약사항을 걸었는데 다행이 icrawler라는 패키지에서 여러 검색 포탈을 대상으로 이미지 다운을 할 수 있게 구현해뒀다. 우리는 구글 이미지 검색으로 설정해뒀고 좀더 확장해 파이썬에서 정치인의 명단이 담긴 엑셀파일을 읽고 자동으로 정치인의 사진을 다운 받을 수 있도록 구현했다.


로그메시지가 나오면서 자동으로 다운로드를 시작한다. 받는 양과 속도에 따라서 시간이 오래 걸린다


500장 넘게 받으려고 했는데 대부분의 정치인들의 사진이 100~150장 정도에서 끝났다. 구글에서 500장 이상을 결과로 내놓지 않아서 그런것 같다. 일단 한명당 100장 또는 그 이상을 기준으로 두고 데이터를 구했다.


2. 데이터 가공하기


앞서 말했듯디 크롤러로 받은 데이터는 구글 이미지 검색에서 정치인 이름을 검색했을 때 나온 사진 리스트이다. 문재인이나 안철수처럼 대중성 있는 정치인들은 정확도가 높아 100% 순도 높은 사진들만 나오는데, 연관 인물이 있거나 또는 동명이인으로 연예인이 있는 정치인들은 순도 높은 사진이 나오지 않았다. 예로 유승민을 크롤링한 결과 유승민의 자녀분인 유담씨의 사진이 적지 않게 나왔고 국민의당 김경진의원의 사진 데이터에는 개그맨 김경진의 사진이 상당수 나왔다(김경진 의원님은 좀더 노력하시길) 이 사진들을 모두 학습에 사용하면 정확도가 떨어지기에 따로 분류를 해야 한다. 이건 모두 수작업으로 했다. 100명이나 되다보니 생각보다 시간이 오래 걸렸다. 데이터를 구하면서 가장 힘들었던 일이다.


사람의 얼굴을 학습하는 작업인만큼 사진에서 불필요한 배경 없이 사람의 얼굴만 보여 진다면 학습 오차를 줄일 수 있을 것 같았다. 파이썬 패키지로 된 opencv2를 이용하면 쉽게 사진에서 사람의 얼굴을 추출 할 수 있었고 뿐만 아니라 여러 사람이 있는 사진의 경우에는 얼굴을 여러장 추출 할 수 있었다. 이 기능을 이용해서 정치인 얼굴만 뽑아내는 작업 뿐만 아니라 여러사람이 찍힌 사진인 raw 데이터를 분류 해낼 수 있었다. 여러 사람이 찍힌 raw 데이터는 불순한 데이터로 두고 학습에 사용하지 않았다. 


문재인 대통령 사진에서 얼굴만 추출해낸 작업


이 작업이 전체 학습에 얼마나 도움이 됐는지 수치상으로 확인 할 수는 없다. 하지만 한 명당 500장을 사용한 논문과 학습 결과가 별반 차이가 없는 것을 보면 얼굴 부분을 오려내는 작업이 적지 않은 도움이 됐던 것 같다. 비록 적지만 순도 높은 데이터를 이용해서 학습효과를 극대화 시킨 작업 이었던 것 같다.


3. Tensorflow용 데이터로 전환


얼굴만 추출한 순도높은 데이터를 Tensorflow 학습에 사용할 수 있는 학습데이터(TF Record)로 전환하는 과정이다. 물론 사진 이미지 파일을 그대로 학습에 사용 할 수 있는데 그대로 사용할 시 "터진다"는 로그가 많았고 어차피 Tensorflow에서 제공하는 이미지 학습 모델이 대부분 TF record 형식을 input으로 사용해서 우리도 변환해서 사용하기로 했다.


변환하는 파일은 tensorflow flower 예제 코드를 이용해서 쉽게 만들 수 있었다. 이 코드는 참 좋은것이 학습(training)에 사용할 데이터와 평가(validation)에 사용할 데이터를 자동으로 분리해서 만들어준다. 이렇게 만들어두면 학습할때도 사용 할 수 있고 평가 할 때도 사용 할 수 있다. 정말 편리한 툴인것 같다


train이라고 된 파일은 학습용, validation으로 된 파일은 평가용이다.


10,000장 정도 되는 데이터를 크게 학습과 평가용 데이터로 분류하고 여기서도 데이터를 크게 5개로 분류한다. 이건 어떤 원리인지는 잘 모르겠다. 코드상으로 한번 찾아봐야 할 것 같다.


labels.txt는 학습데이터로 전환된 정치인들의 목록이다. 데이터를 변환 할 때 사진 데이터가 모인 장소를 argument로 전달하는데 사진 데이터들은 모두 특정 폴더 안에 존재하고 이 폴더의 이름이 사진 데이터의 label이 된다. 사소한것 같은데 정말 편리하게 만들어뒀다.

728x90