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

방구석퀀트

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

2018년 8월 27일 월요일

TensorFlowSharp - 03-2 내가 만든 TensorFlow slim 모델 사용 ( InceptionV1 Preprocessing in TensorFlowSharp )

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

실습 소스 코드 링크 : https://github.com/euhyeji/TensorFlowSharpinWinForm

이번 글에서는 InceptionV1에서 사용하는 이미지 Preprocessing 과정을 살펴보고 그대로 TensorFlowSharp에서의 Preprocessing 으로 구현을 해보겠습니다.

4. 학습된 모델 사용하기 => 이 링크에 있는 image_classification_caltech256.py 코드를 이용해서 InceptionV1 모델에서 사용하는 이미지가 어떻게 preprocssing 되는지 비쥬얼 스튜디오에서 바로 실행하고 결과를 확인해보겠습니다.(참고 : 비쥬얼 스튜디오에서 파이썬 사용하기 - PTVS WITH ANACONDA)

Visual Studio에 Slim 셋팅


slim 폴더에 slim이랑 관련된 Python 코드들이 포함되어 있기 때문에 image_classification_caltech256.py만 Visual Studio에서 실행 시킬 수는 없습니다. 방법은 slim 폴더를 통째로 복사해서 새로 만든 Python 프로젝트 폴더로 복사하는 것입니다.
(사실... slim 폴더에서 Jupyter notebook 을 실행 시켜서 테스트 해보는 것이 가장 쉽고 편한 방법이긴 하나... 이 글의 컨셉이 윈도우즈,비쥬얼스튜디오,C# 이기 떄문에.. 억지로 해보겠습니다..)

Visual Studio를 실행하고 Python 응용 프로그램을 새로 만들겠습니다. 이름은 InceptionV1_Preprocessing 으로 하고 위치는 저 같은 경우 D:\TensorFLowSharp\ 으로 하겠습니다. image_classification_caltech256.py 의 코드를 복사해서 InceptionV1_Preprocessing.py 편집창에 붙여 넣고, 전체를 선택하고 Ctrl+Enter 를 눌러 실행 시켜 보겠습니다.

nets, preprocessing 같은 폴더가 없기 때문에 에러가 발생 하는 것입니다.
slim 폴더를 모두 복사해서 현재 프로젝트 폴더로 복사한후 다시 Python 코드를 실행해 보겠습니다. 정상적으로 실행 되는 것을 확인 할 수 있을 것입니다.

InceptionV1 Preprocessing


이제 지난 글에서 문제가 되었던 Preprocessing 에 유무에 따라 다른 분류 결과가 도출되는 원인에 대해 알아보겠습니다. 지난 글에 사용된 이미지 파일(D:\tmp\caltech256\caltech256_photos\198.spider\198_0017.jpg)을 복사해서 현재 InceptionV1_Proprocessing.py가 있는 폴더로 복사하고, 아래와 같이 코드를 변경하겠습니다.
실행을 해보면 이전 글에서 확인했던 거 처럼 198.spider 로 정확하게 분류하고 있습니다. 그럼 위 코드에서 preprocessing된 processed_image를 띄어보도록 하겠습니다. 코드를 아래 처럼 바꾸고 실행.
그렇습니다. 실제 InceptionV1으로 들어가는 이미지는 위 원본 이미지가 아닌 전처리 후의 이미지 입니다. 학습 할 때도 전처리 후 이미지를 사용해서 학습하기 때문에 나중에 Inference 할때도 원본 이미지를 그대로 InceptionV1에 넣으면 이상한 결과로 분류하게 되는 것입니다.


자 그럼 slim의 InceptionV1 preprocessing 방법대로 TensorFlowSharp에서 구현해 보겠습니다.
slim에 구현되어 있는 InceptionV1 preprocessing은 models-master\research\slim\preprocessing\inception_preprocessing.py 에서 수행하고 있습니다. TensorFlow에서 제공하는 함수들 대부분이 TensorFlowSharp에서도 지원하고 있어 그대로 코드를 변경 시키면 아래와 같습니다.

아쉬운 점은 TensorFlow에서는 tf.image.central_crop이라는 함수로 기본 사이즈에서 0.875 만큼 사이즈를 크롭하고 있는데 TensorFlowSharp에서는 대응되는 함수를 찾을 수 없었습니다.

F5를 눌러 실행시켜보겠습니다.
TensorFlow에서 위 이미지를 넣고 inference를 해보면 96%의 확률로 198.spider를 분류하지만 TensorFlowSharp에서는 약 95%의 확률로 분류하고 있습니다. 이건 아마도 crop을 하지 않았기 때문으로 생각됩니다.

이상 TensorFlowSharp을 이용해 윈도우즈에서 TensorFlow 모델을 이용하는 응용 프로그램을 만들어 보았습니다.

댓글 1개:

  1. 티쳐블 머신 이용해서 텐서플로우 pb 파일로 다운 받았는데 TensorFlow.TFException: 'Invalid GraphDef' 이런 오류가 뜹니다 ㅠㅠ

    답글삭제

가장 많이 본 글