TensorFlow - 03. Inception V3 모델 사용하기



Python 환경에 TensorFlow GPU도 사용할 수 있는 환경도 구축. 이제 무엇을 해야하나? 라는 고민에 빠졌네요. 사실 딥러닝의 딥자도 모르고 시작했는데 지금까지 환경설정한거 말고는 멀해야 하는지도 모르는 상황!

그래서 내가 못만들면 남이 만든거라도 사용해봐야겠다 싶어 검색하다 알게된 'Inception V3' 모델. 이름이 굉장히 친숙한데 아마도 영화 <인셉션> 때문이 아닌가 싶음.

여튼 이 Inception V3 모델은 구글에서 만든 모델인데 2014년 IRSVRC 대회에서 1등을 차지한 모델 GoogLeNet 을 응용한 버전인 것 같음.

Inception에 대한 자세한 내용은 아래 블로그를 참조하기 바란다.
https://norman3.github.io/papers/docs/google_inception.html  (재밌음 ㅋ)

이 Inception 모델은 이미지를 비교하여 찾아내는 성능 좋은 모델인데 (1등 했는데 당연히 좋겠지) 이 모델을 가지고 고양이와 개를 학습시켜서 분류하는 테스트를 해보도록 하겠습니다.

우선은 구글 사진을 통해서 고양이와 개의 JPG 사진들을 모아 각각 폴더를 나누어 분류 합니다.

그리고 cat_dog_img 라는 폴더에 넣습니다.






구글링을 통해 대충 끌어온 사진이라 위와 같이 나타나네요 ㅎㅎ

그 다음 하나 더 필요한 것이 있는데 Tensorflow 소스파일 입니다.
아래 github를 통해서 다운 받을 수 있는데요.

https://github.com/tensorflow/tensorflow

저희는 이미 pip로 자동설치 했는데 왜 소스파일이 필요하냐면 inception 모델로 retrain 시키는 예제가 소스파일에 있기 때문입니다.

소스코드를 받은 다음 압축을 풀면

아래와 같은 경로에 retrain 모델이 있는데요. 이 예제 덕분에 손쉽게 쓸 수 있는거죠 ㅠ

\tensorflow-master\tensorflow\examples\image_retraining

정리하면

D:\cat_dog_img 폴더 안에 cat 폴더와 dog 폴더가 있고 tensorflow 소스를 받아서 image_retraining 폴더로 간후 쉬프트 + 마우스 오른쪽 버튼을 누르면 여기서 명령어창 열기가 있습니다.

 그리고 아래 명렁어로 dog와 cat을 retrain 시켜 봅니다.

python retrain.py --image_dir d:\cat_dog_img

그럼 인셉션 모델을 자동으로 다운로드 받고 학습을 시작합니다!!
학습 시간은 사진양에 따라 다른데 좀 걸리는 편이니 다른 작업을 하고 옵니다.


GPU로 하게되면 훨씬 더 빠른 학습을 시키실 수 있습니다. ㅎㅎ
CPU랑 GPU는 그냥 돌리면 tensorflow가 선택해서 진행하게 되고 수동설정은 tensorflow 홈페이지를 참조하시면 될 것 같네요.

완료가 되면 테스트할 강아지 이미지를 구글에서 찾아서 다운 받습니다.


만약 제대로 되셨으면 실행한 드라이브의 tmp 폴더안에 저런 폴더들이 생성되셨을 겁니다.
images.jpg는 제가 다운받은 테스트할 강아지 이미지 이구요.



아래 코드로 테스트하시면 다음과 같은 결과를 보실 수 있습니다.
코드참조 링크
http://solarisailab.com/archives/1422

# -*- coding: utf-8 -*-

"""Inception v3 architecture 모델을 retraining한 모델을 이용해서 이미지에 대한 추론(inference)을 진행하는 예제"""

import numpy as np
import tensorflow as tf

imagePath = 'c:/tmp/images.jpg'                                      # 추론을 진행할 이미지 경로
modelFullPath = 'c:/tmp/output_graph.pb'                                      # 읽어들일 graph 파일 경로
labelsFullPath = 'c:/tmp/output_labels.txt'                                   # 읽어들일 labels 파일 경로


def create_graph():
    """저장된(saved) GraphDef 파일로부터 graph를 생성하고 saver를 반환한다."""
    # 저장된(saved) graph_def.pb로부터 graph를 생성한다.
    with tf.gfile.FastGFile(modelFullPath, 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        _ = tf.import_graph_def(graph_def, name='')


def run_inference_on_image():
    answer = None

    if not tf.gfile.Exists(imagePath):
        tf.logging.fatal('File does not exist %s', imagePath)
        return answer

    image_data = tf.gfile.FastGFile(imagePath, 'rb').read()

    # 저장된(saved) GraphDef 파일로부터 graph를 생성한다.
    create_graph()

    with tf.Session() as sess:
        softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
        predictions = sess.run(softmax_tensor, {'DecodeJpeg/contents:0': image_data})
        predictions = np.squeeze(predictions)

        top_k = predictions.argsort()[-5:][::-1]  # 가장 높은 확률을 가진 5개(top 5)의 예측값(predictions)을 얻는다.
        f = open(labelsFullPath, 'rb')
        lines = f.readlines()
        labels = [str(w).replace("\n", "") for w in lines]
        print(top_k)
        for node_id in top_k:
            human_string = labels[node_id]
            score = predictions[node_id]
            print('%s (score = %.5f)' % (human_string, score))

        answer = labels[top_k[0]]
        return answer


if __name__ == '__main__':
    run_inference_on_image()



폴더명이랑 비교할 이미지 경로 잘 설정해주시고 테스트 하시면 될 것 같습니다.



b'dog\n' (score = 0.94860)
b'cat\n' (score = 0.05140)

약 94% 확률로 강아지로 분류 되었네요~~~ >.<

이제 예제 샘플 하나 돌려서 테스트해봤네요...
언제 모델링이라는걸 해볼려나 ㅠ

--------------------------------------------------------------------
2017년 작성한글인데 지울까 하다가 올려 봅니다. ㅎㅎ


댓글 쓰기

2 댓글