티스토리 뷰

728x90

1. 개요

 페이스북의 글을 읽던 중 Google Cloud Platform Korea User Group조대협님께서 작성하신 글을 보고 흥미가 있어 따라하게 되었고, 거기에 대한 과정을 작성한 내용입니다. 최종 목표는 CNN(Convolutional Neural Network)와 뎉서 플로우를 이용한 얼굴인식 서비스 구현까지입니다. 이번 글은 기나긴 여정의 첫번째이며, 원본 글의 첫번째 내용인 학습할 이미지 데이터를 받아오는 부분입니다.


원본 글을 조대협님의 Blog(http://bcho.tistory.com/1166)에 가시면 확인하실 수 있습니다.



2. 공개 데이터 다운

 머신러닝을 하기위해서는 일정량 이상의 데이터가 필요한데 특정 인물의 사진을 적정량을 일일이 수집하기엔 많은 시간이 들어갑니다. 그렇기 때문에 공개되어 있는 데이터를 이용하도록 하겠습니다.



위 싸이트(http://www.cs.columbia.edu/CAVE/databases/pubfig/)에서 Download로 가시면 중단 쯤에 dev_urls.txt라는 이미지 URL이 담긴 텍스트 파일이 있습니다. 해당 파일은 사람이름, 번호, URL, 사진 크기, 체크섬을 필드로 가지고 있습니다. 

dev_urls.txt 첨부 파일은 제가 사용했던 파일입니다.



3. 이미지 다운

 앞서 다운받은 txt 파일에는 16,336개의 이미지에 대한 url이 있습니다. 손으로 하나하나 다운받기엔 무리가 있고, 조대협님의 블로그를 토대로 따라하고 있기 때문에 조대협님의 동료분께서 작성하신 프로그램을 이용하겠습니다. 소스코드는  https://github.com/wwoo/tf_face/blob/master/tf/face_extract/pubfig_get.py에서 다운받으실 수 있습니다.



사용법은 https://github.com/wwoo/tf_face에 잘 설명되어 있으며 main함수의 파라메터로 URL이 담긴 txt 파일과 이미지가 저장될 폴더 위치입니다.



4. 이미지 선별

 구글 얼굴 추출 API를 사용하기 위해서는 하나의 사진에 2명의 얼굴이 있으면 안됩니다. 또한 깨진 사진이나 URL이 없어져 다운에 실패한 사진들도 걸러주셔야합니다.




5. Google Vision

 이미지 선별이 끝나셨으면 Google Console로 갑니다. 프로젝트를 생성해 주신 다음에 API 관리자 페이지(https://console.cloud.google.com/apis)로 갑니다. 그리고 라이브러리 항목으로 이동해 주신 다음 Vision API를 활성화 시킵니다.


이후 사용자 인증 정보 항목을 눌러주시고 아래와 같이 서비스 계정 키 항목을 눌러 Json 파일을 다운받습니다.


6. Google Vision Example Code

 우선 예제 코드는 https://github.com/bwcho75/facerecognition/blob/master/com/terry/face/extract/crop_face.py에서 확인하실 수 있습니다.


소스 코드를 잠시 보도록 하겠습니다.


1. Main

Main 함수입니다. 사진 파일이 있는 폴더와 얼굴부분만 잘라낸 사진을 저장할 폴더의 위치가 파라메터로 들어갑니다.


2. FaceDetector Init

Google Vision API 초기화 부분입니다. 중간에 json 파일 경로를 넣는 부분이 있는데 자신의 json 파일을 집어 넣으시면 됩니다.


3. crop_faces_rootdir

원본 사진 폴더 위치와 저장할 폴더 위지가 파라메터로 들어가며 원본 사진 폴더에서 특정 인물의 사진이 모여 있는 폴더를 하나 하나 읽어 crop_faces_dir 함수를 실행시킵니다.


4. crop_faces_dir

해당 프로그램의 메인 함수입니다. 폴더의 각각의 사진 파일을 읽어 얼굴부분을 자르는 함수인 detect_face()를 실행시킵니다. 또한 작업한 사진 파일의 로그를 남길 뿐만 나이라 결과물을 일정 비율에 따라 다른 위치에 저장합니다.


5. detect_face

구글 Vision API를 사용하는 함수가 있는 함수입니다. 이미지 파일을 읽어 batch_request라는 문자열을 만들고 base64 인코딩 방식으로 인코딩을 하여 패킷을 전송합니다. 보낼 때 VISION API 중 얼굴 인식을 사용할것이기 때문에 'FACE_DETECTION'으로 정의합니다.

이후 response가 올텐데 response는 배열로 오며 다음과 같은 항목에 얼굴 데이터가 들어있습니다. Array['responses'][0]['faceAnnotations'] 여기에서 ['fdBoundingPoly']['vertices']는 얼굴 영역의 각 모서리 위치 정보가 들어있고 저희는 이 정보를 저장 후 리턴합니다.


6. crop_face

앞 함수에서 찾은 얼굴 위치 정보를 가지고 원본 사진내에서 얼굴 영역만 잘라내 새로운 이미지 파일을 만듭니다.



7. 결과

 소스코드 수정 없이 실행만 잘 시키시면 아래와 같은 결과를 얻을 수 있습니다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함