본문 바로가기
archive.tar

[TensorFlow] Inception-v3 를 이용하여 원하는 이미지 학습과 추론 해보기

by 냉동만두 2016. 12. 16.

/*

텐서플로우와 학습된 inception v3 모델을 이용하여

원하는 이미지를 학습해보고 샘플 이미지를 판단 시켜본다

서로 다른 자동차 5개 구분 해보기 !

각 차량별 샘플 사진은 50~70개 사이

빠른 학습을 위해 적은 step으로 테스트

명령 실행 후 터미널 내용

*/

1. 리트레이닝 스크립트로 기존 inception 모델에 재학습

2. 추론 스크립트로 테스트 이미지 추론 결과 확인


# 이미지 데이터 준비

photos 폴더 안에 서로 다른 이름의 폴더를 만들고 그 이름에 맞는 사진을 분류해서 저장한다

이 폴더 구조가 지도학습에 사용될 레이블과 샘플 이미지 구조가 된다

# jpg 이미지를 TFRecord 등 전처리를 하지 않아도 된다


# inception-v3 모델에  리트레이닝

터미널 열고 tensorflow/examples/image_retraining/retrain.py 스크립트를 실행 시킨다

만약 텐서플로우 소스 폴더에 image_retraining폴더나 retrain.py 스크립트가 없다면 깃허브에 가서

설치된 텐서플로우 버전에 맞는 브랜치를 열어서 최신 소스를 가져온다. 아래 경로는 자신 환경에 맞게 수정

$ python $HOME/tensorflow/examples/image_retraining/retrain.py \
--bottleneck_dir=$HOME/work/cars/bottlenecks \
--how_many_training_steps 500 \
--model_dir=$HOME/work/cars/inception \
--output_graph=$HOME/work/cars/retrained_graph.pb \
--output_labels=$HOME/work/cars/retrained_labels.txt \
--image_dir=$HOME/work/cars/photos \
--summaries_dir=$HOME/work/cars/log

   * 명령 설명

--bottleneck_dir = 학습할 사진을 변환해서 저장할 폴더
--how_many_training_steps 5000  = 스탭 설정
--model_dir = inception 모델을 다운로드 할 경로
--output_graph = 추론에 사용할 학습된 바이너리 파일(.pb) 저장 경로
--output_labels = 추론에 사용할 레이블 파일 저장 경로
--image_dir = 원본 이미지가 저장된 경로
--summaries_dir = tensorboard에 사용될 로그 파일 저장 경로

I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:944] Found device 0 with properties:
name: GeForce GTX 960
major: 5 minor: 2 memoryClockRate (GHz) 1.266
pciBusID 0000:01:00.0
Total memory: 1.95GiB
Free memory: 1.68GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:965] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] 0:   Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1034] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 960, pci bus id: 0000:01:00.0)
Looking for images in 'mohave'
Looking for images in 'genesis'
Looking for images in 'qm6'
Looking for images in 'spark'
Looking for images in 'k5'
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1034] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 960, pci bus id: 0000:01:00.0)
Creating bottleneck at /home/hwang/work/cars/bottlenecks/spark/pic_006.jpg.txt
W tensorflow/core/framework/op_def_util.cc:332] Op BatchNormWithGlobalNormalization is deprecated. It will cease to work in GraphDef version 9. Use tf.nn.batch_normalization().
W tensorflow/core/common_runtime/bfc_allocator.cc:217] Ran out of memory trying to allocate 1.91GiB. The caller indicates that this is not a failure, but may mean that there could be performance gains if more memory is available.
Creating bottleneck at /home/hwang/work/cars/bottlenecks/spark/pic_014.jpg.txt
Creating bottleneck at /home/hwang/work/cars/bottlenecks/spark/pic_008.jpg.txt

---------------- 중간 생략-------------

2016-12-16 22:06:42.725670: Step 490: Train accuracy = 95.0%
2016-12-16 22:06:42.725734: Step 490: Cross entropy = 0.262693
2016-12-16 22:06:42.780005: Step 490: Validation accuracy = 94.0%
2016-12-16 22:06:43.297735: Step 499: Train accuracy = 94.0%
2016-12-16 22:06:43.297798: Step 499: Cross entropy = 0.279427
2016-12-16 22:06:43.352678: Step 499: Validation accuracy = 90.0%
Final test accuracy = 87.4%
Converted 2 variables to const ops.

터미널 내용을 대충 보면 GPU 잡고 각 폴더 안에 샘플 이미지를 읽어낸다 그리고 전처리를 자동으로 한 후 학습을 시작한다


# 학습 완료 후 생성된 폴더 및 파일 확인

위에서 설정한 경로를 확인하면 학습 후 폴더 및 파일이 생성 되었으니 확인


# 추론 스크립트 작성 (label_image.py)

import tensorflow as tf
import sys

# change this as you see fit
image_path = sys.argv[1]

# Read in the image_data
image_data = tf.gfile.FastGFile(image_path, 'rb').read()

# Loads label file, strips off carriage return
label_lines = [line.rstrip() for line
                   in tf.gfile.GFile("retrained_labels.txt")]

# Unpersists graph from file
with tf.gfile.FastGFile("retrained_graph.pb", 'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    _ = tf.import_graph_def(graph_def, name='')

with tf.Session() as sess:
    # Feed the image_data as input to the graph and get first prediction
    softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
    
    predictions = sess.run(softmax_tensor, \
             {'DecodeJpeg/contents:0': image_data})
    
    # Sort to show labels of first prediction in order of confidence
    top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]
    
    for node_id in top_k:
        human_string = label_lines[node_id]
        score = predictions[0][node_id]
        print('%s (score = %.5f)' % (human_string, score))


# 추론 스크립트 실행

$ python label_image.py test.jpg

스크림트 이름 뒤에 테스트할 이미지를 지정해준다

I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:944] Found device 0 with properties:
name: GeForce GTX 960
major: 5 minor: 2 memoryClockRate (GHz) 1.266
pciBusID 0000:01:00.0
Total memory: 1.95GiB
Free memory: 1.65GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:965] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] 0:   Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1034] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 960, pci bus id: 0000:01:00.0)
W tensorflow/core/framework/op_def_util.cc:332] Op BatchNormWithGlobalNormalization is deprecated. It will cease to work in GraphDef version 9. Use tf.nn.batch_normalization().
W tensorflow/core/common_runtime/bfc_allocator.cc:217] Ran out of memory trying to allocate 1.91GiB. The caller indicates that this is not a failure, but may mean that there could be performance gains if more memory is available.
mohave (score = 0.68172)
qm6 (score = 0.25622)
genesis (score = 0.04780)
k5 (score = 0.00927)
spark (score = 0.00499)

추론할 이미지를 새로운 모하비로 했다.

가장 높은 점수로 mohave로 추론했다. 샘플 이미지와 스탭 등 세부사항을 조정하면 점수는 달라진다~


# 이미지 추론 서버로 만들기

http://gusrb.tistory.com/55



출저

https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/index.html?index=..%2F..%2Findex#0


부록 : 이미지 추론 서버 만들기


http://gusrb.tistory.com/47