휴대폰으로 사진을 열심히 모았지만, 너무 많아 태그를 입력할 엄두가 나지 않았다. 입력할 때 파일의 정보를 추출하여 데이터 베이스에 정리했다. 언젠가 얼굴을 인식하는 소프트웨어를 응용하여 판별하려고 했는데, 2016년 정도에 개발된 openface를 찾았고 이를 사용하기로 했다. 인터넷의 누군가 좋은 튜토리얼을 (영문)만들었고 이를 많이 참조했다. 또한 openface가 수정없이 그대로 사용할 정도의 완성도를 보여준다. docker 이미지로 제공되는데 바로 사용할 수 있다.
목표한 4명의 얼굴을 학습시켰고, 이 모델을 기반으로 모든 파일을 분류 했다. 모델을 만들기는 금방인데, 사진에서 얼굴찾기, 그 얼굴이 누구인지는 확인하기 위해서는 많은 시간(내가 가진 PC로 3일..)을 썼다. 얼굴 인식 후 이를 파일로 기록하였고 아래와 같다.
=== /root/picture/사진/20150211_202325.jpg ===
=== /root/picture/사진/MyPhoto_0149.jpg ===
Predict Daewon @ x=2075 with 0.66 confidence.
=== /root/picture/사진/20140412_162452.jpg ===
List of faces in image from left to right
Predict Minsu @ x=1377 with 0.63 confidence.
Predict Daewon @ x=1549 with 0.86 confidence.
Predict Minsu @ x=1780 with 0.60 confidence.
Predict Daewon @ x=1893 with 1.00 confidence.
=== /root/picture/사진/20130219_152444.jpg ===
Predict Daewon @ x=63 with 0.52 confidence.
=== /root/picture/사진/20121208_110821.jpg ===
=== /root/picture/사진/사진110702_003.jpg ===
=== /root/picture/사진/사진120207_010.jpg ===
Predict Minsu @ x=732 with 0.59 confidence.
=== /root/picture/사진/20140405_160811.jpg ===
Predict Miae @ x=1288 with 0.99 confidence.
=== /root/picture/사진/20140406_085437_ShearesAve.jpg ===
Predict Daewon @ x=775 with 0.98 confidence.
=== /root/picture/사진/20131013_134752_과천동.jpg ===
가끔 한 파일에 여러 이름을 기록하는데, 아마 학습하지 않은 인물이 사진에 있기 때문이다. 신뢰도 0.8 미만이면 믿을 수 없다고 판단하여 지웠다. 공백을 지우고, 여러 행을 한 행으로 만들기 위해 다음 python 스크립을 사용 했다. sed를 사용하려 했으나, python이 낫다. docker로 디렉토리를 root 아래에 바로 마운트하여 경로에 root가 포함되었다. vim으로 해당 경로로 모두 변경했다. 데이터베이스에 굳이 신뢰도와 얼굴 위치를 넣지 않아도 되어 모두 지웠다.
#_*_ coding: utf-8 _*_
import re
import sys
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)
result_file = open('./resultv3.txt','r')
flag_found_path=False;
flag_found_prediction=False;
num_lines = sum(1 for line in open('./resultv3.txt'))
for x in range(num_lines):
context=result_file.readline()
#path를 찾는부분.
path = re.compile("=== .* ===")
searched_path = path.search(context)
#predict를 찾는 부분
prediction = re.compile("Predict.*")
searched_prediction = prediction.search(context)
#===로 시작하는 부분.
if searched_path != None:
flag_found_path=True
#간단한 버전.
path_str = searched_path.group()
print('\n'+path_str,end=',')
if searched_prediction != None:
predict_str = searched_prediction.group()
print(predict_str,end=',')
내가 하려는 작업은 2개 점이 찍힌 레이어를 랜덤수치만큼 이동하여 약 100개정도 이미지를 만듦이다. gimp 이미지 원본 파일에 배경, 점이 찍힌 레이어가 있다. 아래와 같이 간단한 코드로 50개를 금방 만들 수 있다.
#-*- coding: utf-8 -*-
import random
from gimpfu import *
#python-fu console에 직접 붙일 수 없어 아래 방식으로 명령어 실행.
#>> gimp -idf --batch-interpreter=python-fu-eval -b -< !!!!!여기에 파일 이름 입력!!!
i=0
img = pdb.gimp_file_load("/home/now0930/gimpScript/basicForm.xcf","/home/now0930/gimpScript/basicForm.xcf")
#점 2개가 찍힌 레이어. 점 2개를 임의의 위치로 이동.
layer = img.layers[1]
for i in range(1,50):
x_new = random.randrange(-5,5)
y_new = random.randrange(-5,5)
x_off, y_off = layer.offsets
pdb.gimp_layer_translate(layer, x_new-x_off, y_new-y_off)
new_image = pdb.gimp_image_duplicate(img)
new_layer = pdb.gimp_image_merge_visible_layers(new_image, CLIP_TO_IMAGE)
i=i+1
filename = '/home/now0930/gimpScript/Spec2/spec%d.png'%(i,)
pdb.gimp_file_save(new_image, new_layer, filename,'?')
pdb.gimp_image_delete(new_image)
#원래 위치로 이동.
pdb.gimp_layer_translate(layer, x_new+x_off, y_new+y_off)
파일 이름을 입력으로 하는 방법도 있겠지만, 나만 쓸 스크립트이므로, 그냥 직접 경로를 넣었다.
아나콘다에 tensorflow를 설치하여 사용했다. 그러나 1.6버전 이후로 tensorflow를 import하면 illegal instruction을 내고 죽었다. 혹시나 해결되었는지 1.10으로 업데이트하여 확인했다. 그러나 역시 같은 문제로 1.5로 다시 돌어왔다.
검색해 보니, 구글이 제공하는 tensorflow binary 1.6이후 파일이 cpu의 AVX를 기본지원한다. 인텔이 2008년 자사 CPU에 AVX 기능을 적용했다. 불행히도 나는 골동품 투반을 사용한다. CPU를 도저히 교체할 상황이 아니라, 힘들게 컴파일 하기로 했다. 담에는 intel cpu를 쓰리라.
아래 순서로 작업했다.
nvidia 드라이버 설치. 390버전을 ubuntu 16.04가 지원하지 않아 과감히 패스.