/*
텐서플로우와 학습된 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