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

방구석퀀트

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

2018년 8월 26일 일요일

TensorFlowSharp - 03-1 내가 만든 TensorFlow slim 모델 사용 ( InceptionV1 ckpt to pb conversion )

1. 기본 함수 사용하기(콘솔 앱)
2. TensorFlow 모델 사용하기(Winform 앱)
3-1. 내가 만든 TensorFlow slim 모델 사용( InceptionV1 ckpt to pb convertion )
3-2. 내가 만든 TensorFlow slim 모델 사용( InceptionV1 Preprocessing in TensorFlowSharp)

지난 글에서 TensorFlowSharp에서 기본 예제로 제공하는 ExmapleInceptionInference을 Winform에서 구현해 보았습니다.

이번 글에서는 TensorFlow에서 내가 직접 학습해서 만든 모델을 사용해 보겠습니다.

먼저 윈도우즈에서 Tensorflow를 사용해 모델을 만드는 방법은 아래 글을 참고해주세요. 아래 3번글에서 만들어진 Caltech Classification 모델을 사용해 실습해 볼 것입니다.


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


그럼 위 글을 통해 caltech Classification 모델을 만들었다고 가정하고 글을 진행하겠습니다. 다행히 위 3번 글에서 모델을 학습시킬 때 inception_v1 네트워크를 사용했기 때문에 지난 글에서 사용한 winform 앱에 모델만 바꾸어주면 바로 동작 될 것입니다만...

여기서 문제가 있습니다. TensorFlowSharp에서 사용하는 모델의 형태를 보게 되면

tensorflow_inception_graph.pb 로 확장자가 pb 로 되어 있습니다. TensorFlow에서 학습을 하고 생긴 모델의 확장자는 ckpt이기 때문에 형태가 다르다는 것을 확인 할 수 있습니다.

ckpt to pb conversion

1. Export unfrozen_graph

Anaconda를 실행 시키고 slim 폴더로 가서 아래와 같이 코드를 입력해 실행 시킵니다.

python export_inference_graph.py 
--alsologtostderr 
--model_name=inception_v1 
--dataset_name=caltech256 
--output_file=inception_v1_caltech256_inf_graph.pb
python export_inference_graph.py --alsologtostderr --model_name=inception_v1 --dataset_name=caltech256 --output_file=inception_v1_caltech256_inf_graph.pb
실행 시키면 아래와 같이 pb 파일이 만들어졌습니다. 하지만 이 pb 파일은 실행 코드에서도 볼 수 있듯이 학습된 모델의 pb가 아니가 네트워크 그래프 구성에 대한 pb 파일 입니다.

2. Export frozen_graph

앞에서 실행한 파이썬 코드는 export_inference_graph.py 입니다. 지금 사용할 파이썬 코드는 freeze_graph.py 라는 코드인데... 다운 받은 TensorFlow/models에는 포함이 되어 있지 않습니다. 구글에 검색해서 다운받아 보겠습니다. 

tensorflow 깃헙에 역시 있군요. 제가 깃헙에서 다운받아서 실행을 해봤는데 제 아나콘다에 깔려있는 Tensorflow와 버전이 안 맞는 것이지 실행시 에러가 생기더군요. 그래서 확실하게 freeze_graph.py 파일을 얻을 수 있는 방법은 아나콘다가 설치된 폴더에서 바로 복사해 오는 방법입니다.

저 같은 경우는 위와 같은 폴더에서 freeze_graph.py 파일을 복사해서 slim 폴더로 복사하겠습니다.


이제 아래 코드를 실행 시키겠습니다.

python freeze_graph.py 
--input_graph=inception_v1_caltech256_inf_graph.pb 
--input_checkpoint=D:\tmp\train_inception_v1_caltech256_FineTune_logs\all\model.ckpt-500 
--input_binary=true 
--output_graph=Tensorflow_inception_v1_caltech256_graph.pb 
--output_node_names=InceptionV1/Logits/Predictions/Softmax
python freeze_graph.py --input_graph=inception_v1_caltech256_inf_graph.pb --input_checkpoint=D:\tmp\train_inception_v1_caltech256_FineTune_logs\all\model.ckpt-500 --input_binary=true --output_graph=Tensorflow_inception_v1_caltech256_graph.pb --output_node_names=InceptionV1/Logits/Predictions/Softmax
실행 시키면 아래와 같이 TensorFlowSharp에서 사용할 수 있는 pb 파일이 생성 되었습니다.

Visual Studio C# winform에 모델 적용하기

이 파일을 이전 글에서 만들었던 앱의 모델 참조 폴더에 복사하겠습니다.
아! imagenet_comp_graph_label_strings.txt에 대응하는 파일도 생성해야 합니다. Classification 될 label에 대해 정리되어 있는 파일입니다. 파일을 열어보면 그냥 학습에 사용된 label이 한줄씩 들어가 있는 파일입니다. caltech256에 학습 이미지를 만들때 생성된 labels.txt를 복사해서 위 폴더에 caltech256_comp_graph_label_strings.txt 로 이름을 변경하겠습니다.
이전 글에서 만들었던 솔루션 파일을 로드하고 c# 코드에서 ModelFiles(string dir) 함수를 아래와 같이 수정합니다.
그리고 아래 코드도 수정해 주어야 합니다. 
이제 F5를 눌러 실행해 보겠습니다.


Inference 결과가 이상한 것을 확인 할 수 있습니다.  TensorFlow 에서 위 그림을 넣어서 Inference를 해보면 아래와 같은 정상적인 분류 결과를 확인 할 수 있습니다. 
같은 모델을 사용했는데 왜 다른 분류결과를 보이는 것일까요??

그 이유는 모델에 이미지를 넣기 전에 이루어지는 Preprocessing을 InceptionV1에 맞게 수정을 하지 않았기 때문입니다. TensorFlowSharp에서 Preprocessing에 해당하는 함수는 아래와 같습니다.

InceptionV1 TensorFlow 코드에서 이루어지는 preprocessing 코드는 아래와 같습니다. (\slim\preprocessing\inception_preprocessing.py)
Preprocessing에 관련 해서는 다음 글에서 더 자세히 다루도록 하겠습니다.


댓글 1개:

  1. 안녕하세요 tensorflowsharp글 전부 읽어봤는데 궁금한점이있어 댓글 남깁니다.
    혹시 제가 https://teachablemachine.withgoogle.com/ 해당 사이트에서 학습을 시킨뒤
    export한 파일로 작업을하고싶은데 pb파일 맞춰줫는데도 불구하고 그래프를 찾을수없다고 뜨는데 한번 확인해주실수있을까요?

    답글삭제

가장 많이 본 글