연예인 얼굴 인식 서비스를 만들어보자 #2
CSV 목록에 있는 이미지 데이타를 읽어보자
조대협 (http://bcho.tistory.com)
앞의 글(http://bcho.tistory.com/1166) 에서는 얼굴 인식 데이타를 확보하고, 전처리를 통해서 96x96 사이즈로 만드는 것을 살펴보았다.
그러면, 이 전처리가 끝난 데이타를 텐서플로우에서 학습용으로 쓰기 위해서 데이타를 읽어 들이는 것을 살펴보겠다.
파일에서 학습데이타를 읽는 방법과 큐에 대한 설명은 아래 두 글을 참고하기 바란다.
파일 포맷
파일 포맷은 다음과 같다
/Users/terrycho/traning_datav2/training/007BIL_Aaron_Eckhart_001.jpg,Aaron Eckhart
/Users/terrycho/traning_datav2/training/08486023.jpg,Aaron Eckhart
/Users/terrycho/traning_datav2/training/09.jpg,Aaron Eckhart
/Users/terrycho/traning_datav2/training/0_61_091107_411.jpg,Aaron Eckhart
‘,’로 구분되는 CSV 형태의 파일 포맷이며, 앞에는 이미지의 경로, 뒤에는 해당 이미지의 라벨이 명시되어 있다.
예제 코드
예제코드를 살펴보자
예제 코드의 형태는 http://bcho.tistory.com/1165 에 소개된 CSV 파일을 읽는 코드와 크게 드리지 않다.
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
csv_file = tf.train.string_input_producer(['/Users/terrycho/dev/ws_gae_demo/terry-face-recog/training_file.txt']
,name='filename_queue')
textReader = tf.TextLineReader()
_,line = textReader.read(csv_file)
imagefile,label = tf.decode_csv(line,record_defaults=[ [""],[""] ])
image = tf.image.decode_jpeg(tf.read_file(imagefile),channels=3)
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
for i in range(100):
image_value,label_value,imagefile_value = sess.run([image,label,imagefile])
plt.imshow(image_value)
plt.show()
print label_value,":",imagefile_value
coord.request_stop()
coord.join(threads)
특별한 부분만 살펴보자면
imagefile,label = tf.decode_csv(line,record_defaults=[ [""],[""] ])
image = tf.image.decode_jpeg(tf.read_file(imagefile),channels=3)
부분인데, TextReader로 읽어드린 문자열을 파싱해서 이미지 파일명 (imagefile)과 라벨(label)로 추출하고
이 imagefile을가지고, tf.image.decode_jpeg 메서드를 이용하여 jpeg 파일을 읽어서 텐서형으로 바꾼다. 이때, channel=3 으로 설정하였는데, 이유는 이 이미지는 칼라 이미지로 RGB 3개의 값을 가지기 때문에 3차원으로 정의하였다.
다음 텐서 플로우 세션을 시작한 다음에
image_value,label_value,imagefile_value = sess.run([image,label,imagefile])
Image,label,imagefile 값을 읽은 후에, 확인을 위해서 matplotlib를 이용하여, 이미지와, 라벨, 그리고 파일 경로를 출력하여, 값이 정확하게 읽히는지 순서에 맞게 읽히고 누락은 없는지 확인할수 있다.
(확인을 위해서 데이타를 읽을때 shuffle을 하지 않고 순차적으로 읽었다.)
실행 결과
그 실행 결과를 보면 다음과 같다.
다른 코드
만약에 읽어드린 이미지들을 한꺼번에 보고 싶을 경우에는 아래와 같은 코드를 사용한다. 아래 코드는 200개의 이미지를 읽어서 가로로 10개씩 출력하는 코드이다. 아래 코드 부분을 바꿔치면 된다.
fig = plt.figure(figsize=(20,120))
for i in range(200):
image_value,label_value,imagefile_value = sess.run([image,label,imagefile])
subplot = fig.add_subplot(50,10,i+1)
subplot.set_xlabel(label_value)
plt.imshow(image_value)
print label_value ,imagefile_value
plt.show(
출력 결과는 다음과 같다.
다음번에는 텐서로 읽어드린 이미지 데이타를 활용하여 얼굴 인식 모델을 CNN으로 만들어보고 학습 시켜 보겠다.
'빅데이타 & 머신러닝 > 머신러닝' 카테고리의 다른 글
텐서플로우의 세션,그래프 그리고 함수의 개념 (1) | 2017.04.03 |
---|---|
텐서플로우-배치 처리에 대해서 이해하자 (2) | 2017.04.03 |
연예인 얼굴 인식 서비스를 만들어보자 #1 - 학습 데이타 준비하기 (2) | 2017.03.14 |
텐서플로우 - 파일에서 학습데이타를 읽어보자#2 (Reader와 Decoder) (2) | 2017.03.11 |
텐서플로우-파일에서 학습 데이타를 읽어보자 #1 (큐 사용 방법과 구조) (4) | 2017.03.07 |