Search

'공상프로젝트/폴리페이스'에 해당되는 글 3건

  1. 2017.10.12 폴리페이스 - 데이터 학습시키기
  2. 2017.09.12 폴리페이스 - 데이터 구하고 가공하기
  3. 2017.09.04 폴리페이스 -기획

데이터 구하고 가공하기에서 한 작업은 정치인들의 사진을 인터넷에서 크롤링 한 후 정확도 향상을 위해 사진에서 얼굴 부분만 추려낸 후 이 것을 Tensorflow서 사용 할 수 있는 파일 형식인 tfrecord로 변환하는 작업이었다. 이제는 변환된 데이터를 이용해서 학습을 시키는 일만 남았다. 이번 포스팅에서는 데이터를 학습시키는 과정들을 쭉 살펴보려고 한다.


1. Tensorflow 설치하기 (feat, 그래픽 카드 없이는 못쓴다)


Tensorflow는 내 데스크탑에 그래픽 카드가 있느냐 아니면 없느냐에 따라서 설치 명령어가 달라진다.


(tensorflow)$ pip install --upgrade tensorflow      # for Python 2.7
(tensorflow)$ pip3 install --upgrade tensorflow     # for Python 3.n
(tensorflow)$ pip install --upgrade tensorflow-gpu  # for Python 2.7 and GPU
(tensorflow)$ pip3 install --upgrade tensorflow-gpu # for Python 3.n and GPU


이 프로젝트를 처음 시작 했을 때 내 리눅스 PC는 그래픽 카드가 없었다. 애초에 이 PC는 오직 교육용으로만 사용하기 위해 게임을 할 수 있는 환경 자체를 차단 하려고 했었다. 그래서 맨 처음에 tensorflow를 설치 했을 때는 가장 위에 있는 CPU만 사용 하는 tensorflow 버전으로 설치했었다. CPU만 사용하니 한 번 학습 시키는데(뉴럴 네트워크에서 1회 학습을 하는 경우) 10초 정도 소요됐다. 10000회 정도 학습 시키려면 컴퓨터를 켜 두고 출근해야 하기도 했다.


그런데 회사 선배가 자기가 쓰던 그래픽 카드를 싸게 판다는 말을 듣고 컴퓨터에 설치해서 학습 시켜보니 퍼포먼스가 무려 20배 이상 차이가 났다. CPU만 사용했을 때 10초 정도 소요되던 것이 그래픽 카드를 사용하니까 0.5초면 가능했다. 10000회 학습 시키려고 컴퓨터를 켜두고 출근을 했었는데 이제는 1-2시간 정도면 끝났다. 그동안 내가 얼마나 많은 시간을 학습 과정에서 소비하고 있었던 것일까. 시간이 넉넉한 사람이면 모르겠지만 그래픽 카드의 유무에 따라서 작업의 퍼포먼스 차이가 크다. 초기부터 그래픽 카드를 사용했다면 불필요하게 시간을 허비하지 않았을텐데.


그래픽 카드를 사용했을 때 학습 속도, 1회 학습하는데 0.5초가 소요되고 있다

2. 학습 모델 선택하기


Tensorflow github에선 이미지를 분류 할 수 있는 다양한 학습 모델을 파이썬 코드로 짜뒀다. 개발자는 학습시키는 명령어에 사용할 학습 모델을 옵션으로 추가하면 간단히 학습 시킬 수 있다. 현재 tensorflow에서 만들어둔 학습 모델로는 이런 것들이 있다.


위 사진에 있는 학습 모델들은 이미 논문에 등재된 뉴럴 네트워크를 구글이 tensorflow에서 사용 할 수 있는 형태로 변환 한 것이다. 학습 모델의 이름을 인터넷에 검색해보면 논문 자료를 다운 받을 수 있으니 관심이 있으면 읽어보는 것도 좋다. 물론 내용이 결코 쉽진 않다. 나는 간단히만 읽어봤다.


이미지 인식 모델 중 가장 유명한 모델은 inception 시리즈이다. 이 모델은 현재 네번째 버전까지(inception_v4) 나왔고 imagenet 컨테스트에서 가장 우수한 학습 알고리즘으로 선정됐다. 하지만 서비스를 하려면 정확도 뿐만 아니라 학습하는데 소요되는 시간 및 유지 관리의 측면도 중요할 것 같아서(당시엔 그래픽 카드가 없었기 때문이기도 하다) 이 모든 요소를 절충 할 수 있는 학습 모델을 찾기로 했다. 이때 검증용으로 사용한 데이터는 tensorflow에서 제공하는 flower 데이터를 사용했다. inception_v1을 사용 했을 때는 학습 속도 자체는 나쁘지 않았으나 퍼포먼스가 좋지 않았고 inception_v3, inception_v4는 학습 속도가 너무 느렸다. 결과적으로 inception_v2가 학습시간 대비 가장 훌륭한 퍼포먼스를 보였다. 이미지 학습 모델은 inception_v2로 선정했다.


3. 학습 결과


정치인들 한 명당 대략 100장 정도 사진이 있었고 총 정치인의 수는 99명 이었다. 이 데이터로 inception_v2 모델로 10000회 정도 학습을 시켰는데 정확도가 70%정도 나왔다. 이 정도면 데모용으로 사용하기엔 적합한 수치였다. 기존 논문 대비 적은 양의 데이터임에도 불구하고 퍼포먼스가 좋은 이유는 아마 크롤링한 데이터에서 따로 얼굴 부분만 추려내고 동명 이인인 데이터를 필터링 하면서 순도 높은 데이터를 골라 냈기 때문인 것 같다. 많은 양의 데이터도 중요하지만 순도 높은 데이터도 중요하다는 사실을 확인해 볼 수 있었던 것 같다.

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


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이 된다. 사소한것 같은데 정말 편리하게 만들어뒀다.

폴리페이스 -기획

공상프로젝트/폴리페이스 2017.09.04 21:13 Posted by 아는 개발자

회사안에서 계속 시대에 뒤쳐진 기술을 부여잡고 살다간 밥벌이를 잃게 될 것 같아서 마음이 맞는 친구와 공부를 해볼겸 새로운 프로젝트를 시작했다. 이름은 폴리페이스(Poliface)다. 


폴레페이스 이름은 정치인(Poliface)와 얼굴(Face)를 합친 말이다. 이름에서 대강 짐작할 수 있듯이 이 프로젝트는 '정치인 닮은 꼴'을 찾아주는 서비스다. 웹크롤러를 이용해 인터넷 상에 있는 정치인들의 얼굴을 모으고 tensorflow에 있는 이미지 학습 기능을 응용해 학습시킨 후 파이썬을 사용하는 서버 프레임워크를 입혀 사용자들이 웹 또는 모바일에서 자신과 닮은 정치인을 찾아 볼 수 있게 하는 것이 이번 프로젝트의 목표다.


(폴리페이스 구상도)


이것으로 특별히 수익을 낼 생각은 없다. 이번 프로젝트는 순수히 배우는 것이 목적이다. 무언가를 공부 할 때는 배운것을 직접 응용하는 것이 가장 학습 효과가 좋다. 이 프로젝트는 '어디가서 인공지능을 해봤다'고 말할 수 있을 정도의 결과물을 내는 것 일차적인 목표이며 세부 목표는 기본적인 인공지능 지식을 습득하고 최신 인공지능 API인 tensorflow를 사용해보며 회사에서는 사용하지 않는 웹 기술(크롤러, 서버 프레임워크)를 적극적으로 사용하는 것이다.


계획은 나름 거창하게 세웠는데 결과가 어떨지는 모르겠다. 대중적으로 사용되진 않더라도 포트폴리오로 내놓아도 손색이 없을 정도만 되었으면 좋겠다.


굳이 닮은 꼴 대상을 정치인으로 고른 이유는 신선함 때문이다. 이미 연예인 닮은꼴 프로그램은 충분히 많다. 우리까지 나서서 연예인 닮은 꼴을 만든다면 아무도 재미삼아라도 사용하지 않을 것 같다. 


어쩌면 정치인 닮은 꼴이 연예인 닮은 꼴 보다 훨씬 만족스러운 결과가 나올 것 같기도 하다. 연예인들은 일반인들과 생김새 차이가 많아(매우 잘생기고/매우 이쁘고/매우 개성이 있고) 나온 예측 결과가 일반인 얼굴과 괴리가 발생할 여지가 많은데 정치인들의 얼굴은 일반인들과 생김새가 비슷해서(다들 평범한 수준) 상대적으로 설득력 있는 결과가 나올 것 같은 예감이다. 물론 내가 싫어하는 정치인이 나와 닮았다면 거부감이 들겠지만.


추가로 정치인 기본 정보까지 볼 수 있는 기능을 넣으려고 한다. 기본적인 정보만 넣어놓고 세부 정보는 위키/나무위키 링크를 넣어서 연동할 계획이다. 정치에 관심이 없는 사람들이라도 자신과 닮은 정치인 만큼은 호기심이 생길 것 같다. 정치인이 어떤 이력을 지닌 인물인지, 무슨 의정활동을 했는지 알게 된다면 정치에 조금은 관심을 가지게 되지 않을까? 특별히 이러려고 만든 것은 아니지만 긍정적인 효과가 있을 것 같기도 하다. 물론 성공적으로 완성을 하는것이 먼저겠지만!