개미들을 위한 퀀트 자동 매매 프로그램 개발자 블로그입니다. 프로그래밍과 퀀트 투자를 합니다.

방구석퀀트

네이버카페 : 방구석 퀀트 놀러오세요^^ https://cafe.naver.com/conerquant 가입해 주세요.

2017년 8월 14일 월요일

(TF 1.1 & Slim) 4 학습된 모델 사용하기( Caltech ) - 이미지 한장 분류하기

*Tensorflow 1.9 버전 튜토리얼
1. 윈도우에 Tensorflow GPU 버전 설치하기
2 딥러닝 slim 라이브러리 설치, 학습, 평가하기
3. 내 이미지로 학습 하기 ( caltech 이미지 사용 )
4. 학습된 모델 사용하기

1. 윈도우에 Tensorflow GPU 버전 설치하기
2.1 딥러닝 slim 라이브러리 설치 및 이미지 셋 다운로드
2.2 딥러닝 모델 학습하기
2.3 딥러닝 모델 평가하기
3. 내 이미지로 학습 하기 ( caltech 이미지 사용 )
4. 학습된 모델 사용하기 - 이미지 한장 분류하기

드디어... 드디어... 마지막 장입니다. 3장에서 4장을 넘어 오는데.. 많은 시간이 걸렸네요. 개인적으로 많은 일들이 있어서... 이제 다 정리되고 다시 제자리로 돌아왔습니다.

3장까지 잘 따라 오셨다면 이번 장은 아주 쉬울 겁니다. 학습된 모델에 내가 원하는 이미지를 넣어보고 그 결과를 확인해 보겠습니다.

* 여기에 사용된 코드는 slim 폴더에 있는 slim_walkthrough.ipynb 을 참조해서 만들었습니다.

이번 실습에서는 아래 파이썬 코드를 직접 코딩하여 Image_Classification_Caltech256.py 로 저장하겠습니다.

코드 설명은... 음... 저도 잘 모르지만.. 제가 바꾼 코드는 10 라인 checkpoints_dir 를 저희가 사용한 실습 데이터 경로로 정해줬고요. 리눅스였다면 디렉토리 경로를 '/'로 해줘야 하지만 저희는 윈도우에서 사용하고 있기 때문에 '\'를 써야하고 문자열에서의 '\'는 특수 기호이기 때문에 '\\' 이렇게 써줘야지 잘 인식되게 됩니다.

18라인 image_input = tf.read_file("080_0010.jpg")

slim 폴더에 위 파일을 복사해서 넣어 두었습니다. 080_0010.jpg 는 \\tmp\\caltech256\\caltech256_photos 디렉토리의 080.frog 폴더 아래에 있는 파일중 하나입니다. 폴더 이름에서 알 수 있듯이 개구리 사진입니다. 과연 저희가 학습한 모델이 이 사진을 개구리라고 분류할 수 있을까요? (잠시후 확인하시죠)

27라인 logits, _ = inception.inception_v1(processed_images, num_classes=257, is_training=False)

원 코드에는 1001로 되어 있으나 우리의 모델은 257개의 클래스로 분류를 하기 때문에 257로 변경 시켰습니다. 학습된 모델의 클래스와 이 수가 다르면 에러가 발생 되게 됩니다.

31라인 os.path.join(checkpoints_dir, 'model.ckpt-500'),

모델 이름을 적어 주었고요.

45라인 names = os.listdir("\\tmp\\caltech256\\caltech256_photos")

분류된 결과는 인덱스(숫자)로만 출력이 되기 때문에 그 인덱스가 의미하는 라벨이 뭔지를 같이 보여주면 결과를 더 잘 확인 할 수 있습니다. 우리의 인덱스는 위 폴더 이름을 그대로 인덱스로 만들어 졌기 때문에 폴더명을 읽어서 names에 저장하였습니다.

자! 이제 한번 실행시켜 볼까요!
from matplotlib import pyplot as plt

import numpy as np
import os
import tensorflow as tf

from nets import inception
from preprocessing import inception_preprocessing

checkpoints_dir = '\\tmp\\train_inception_v1_caltech256_FineTune_logs\\all'

slim = tf.contrib.slim

image_size = inception.inception_v1.default_image_size    

with tf.Graph().as_default():
    
    image_input = tf.read_file("080_0010.jpg")
    image = tf.image.decode_jpeg(image_input, channels=3)
    processed_image = inception_preprocessing.preprocess_image(image,
                                                         image_size,
                                                         image_size,
                                                         is_training=False)
    processed_images  = tf.expand_dims(processed_image, 0)
    
    with slim.arg_scope(inception.inception_v1_arg_scope()):
        logits, _ = inception.inception_v1(processed_images, num_classes=257, is_training=False)
    probabilities = tf.nn.softmax(logits)
    
    init_fn = slim.assign_from_checkpoint_fn(
        os.path.join(checkpoints_dir, 'model.ckpt-500'),
        slim.get_model_variables('InceptionV1'))
    
    with tf.Session() as sess:
        init_fn(sess)
        np_image, probabilities = sess.run([image, probabilities])
        probabilities = probabilities[0, 0:]
        sorted_inds = [i[0] for i in sorted(enumerate(-probabilities), key=lambda x:x[1])]
        
    plt.figure()
    plt.imshow(np_image.astype(np.uint8))
    plt.axis('off')
    plt.show()

    names = os.listdir("\\tmp\\caltech256\\caltech256_photos")
    for i in range(5):
        index = sorted_inds[i]
        print('Probability %0.2f%% => [%s]' % (probabilities[index], names[index]))
위 코드를 Image_Classification_Caltech256.py 로 slim 폴더에 저장하고 아나콘다에서 아래와 같이 실행하겠습니다.

python Image_Classification_Caltech256.py

와우! 이미지 창이 하나 떳습니다!
개구리! 아나콘다 프롬프트에는 아무런 결과가 표시 되지 않는군요. 이 이미지 창을 Close 시켜 보겠습니다.

네! 위와 같이 위 이미지를 우리가 학습한 모델을 통과 시킨 뒤의 결과를 확인 할 수 있습니다. 60%의 확률로 080.frog로 예측, 분류를 했습니다.

위의 코드 중 18라인의 이미지 파일을 변경해보면서 테스트 해보시기 바랍니다.

자 Tensorflow, 딥러닝 CNN 네트워크에 대해 하나도 몰라도 slim 이라는 라이브러리를 이용해 딥러닝 모델을 생성 시켜 보았습니다.

다음 연재할 내용은... 뭐가 좋을까요? 고민해 보겠습니다.

질문은 댓글로 주세요~



댓글 3개:

  1. 작성자가 댓글을 삭제했습니다.

    답글삭제
  2. slim을 이용한 multi-label classification을 해보시는 건 어떠세요~? 진행중인데 쉽지 않네요 ㅎㅎ

    답글삭제
  3. 정말 좋은 자료 감사합니다. 공부하는 데 큰 도움이 되었습니다!

    답글삭제

가장 많이 본 글