Tensorflow 학습 부터 모바일에 테스트까지 예제를 따라 해보기
예제는 Tensorflow For Poets 를 참고 했습니다.
예제1) Tensorflow MobileNet 학습해보기, Tensorboard 써보기
예제2) 학습한 Tensorflow MobileNet 네트워크를 tflite 파일로 변경해보기, App에서 동작시켜보기
예제3) App에서 classification이 아닌 style transfer 를 동작시켜보기
먼저 당연히 tensorflow를 설치. tensorflow-gpu 버전을 다운로드(물론, CUDA, cuDNN설치도 이는 앞의 pytorch mobile을 참조)
pytorch버전과 꼬이지 않길 바래서 anaconda에서 새로운 가상환경을 만들어서 설치를 진행하였다.
1. 예제의 테스트 코드를 git을 통해서 다운로드 (본인이 원하는 경로에 다운로드)
git clone https://github.com/googlecodelabs/tensorflow-for-poets-2
cd tensorflow-for-poets-2
2. 학습에 사용될 이미지 데이터를 추가로 다운로드
curl http://download.tensorflow.org/example_images/flower_photos.tgz | tar xz -C tf_files
잘 다운로드가 된다면 tf_files/flower_photos에 다양한 폴더에 꽃 사진들이 저장됨.
3. 학습을 시작해보기
IMAGE_SIZE=224
ARCHITECTURE="mobilenet_0.50_${IMAGE_SIZE}"
tensorboard --logdir tf_files/training_summaries &
python -m scripts.retrain --bottleneck_dir=tf_files/bottlenecks --how_many_training_steps=500 --model_dir=tf_files/models/ --summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" --output_graph=tf_files/retrained_graph.pb --output_labels=tf_files/retrained_labels.txt --architecture="${ARCHITECTURE}" --image_dir=tf_files/flower_photos
4. 학습한 모델을 사용해서 테스트해보기
python -m scripts.label_image --graph=tf_files/retrained_graph.pb --image=tf_files/flower_photos/daisy/21652746_cc379e0eea_m.jpg
python -m scripts.label_image --graph=tf_files/retrained_graph.pb --image=tf_files/flower_photos/daisy/3475870145_685a19116d.jpg
흠 예제 사이트에서 결과를 보면 0.140s 가 나왔다는데 내 컴퓨터에서는 1.05s 가 나오는 이유가 뭘까? 흠 GPU의 성능 차이가 이렇게 크지는 않을 것 같은데...
일단 계속 진행.
TOCO (Tensorflow LIte Optimizing Converter) 라는 프로그램을 사용해서 mobile 환경에 보다 적합한 모델로 최적화 한다.
toco를 사용해서 모델을 최적화 할 수 있고, tflite format 으로 변경할 수 있다. 이를 한번에 할수도 있고 따로 할 수 도 있다.
이 예제를 그대로 사용해서는 toco가 에러가 발생된다. 에러가 발생된 이유는 tensorflow 버전 때문이다. toco가 제대로 동작되는 버전은 1.7 버전이므로
pip install tensorflow==1.7.*
이렇게 버전에 맞게 새롭게 설치한뒤에 toco를 사용하면 올바르게 tf_files 폴더 내에 tflite 파일이 만들어진 것을 확인 할 수 있다. <진행중>
IMAGE_SIZE=224
toco --input_file=tf_files/retrained_graph.pb --output_file=tf_files/optimized_graph.lite --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --input_shape=1,${IMAGE_SIZE},${IMAGE_SIZE},3 --input_array=input --output_array=final_result --inference_type=FLOAT --input_data_type=FLOAT