2017년 6월 7일 수요일

[DM/DL] 텐서플로우의 인셉션으로 사진 구분하는 예제 (5)

기존에 인셉션v3 실습은 과연 무엇을 하고 있는지 정확히 알수 없는 결과였다. 
엔지니어라고 해도 프로그래밍을 하는 알고리즘 자체는 다 알순 없어도 결과는 알아보게 나오면 좋을텐데요. 

그래서 다른 예제를 찾았습니다. 
텐서플로우 설명서라는 깃허브로 다양한 코드들이 어느정도의 설명과 함께 작성되어 있습니다. 
만약 텐서플로우의 모델에 대한 학습이 필요하다면, 아래의 2사이트가 초-중급의 학습으로는 큰 도움이 될 것 같다.
1) https://github.com/golbin/TensorFlow-Tutorials
2) https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/tutorials/


하지만, 시스템/네트워크 엔지니어가 막상 이걸 딱 본다고 해서 어떻게 쓰는지 알기도 어려울 수 있으니, 실행하는 것에 대해서 따라하기 수준으로 진행하겠습니다.


1. git clone하기 

작성해 놓은 파일들을 그대로 모두 다운로드 합니다.

root@hoonjo-VirtualBox:~# git clone https://github.com/golbin/TensorFlow-Tutorials.git
Cloning into 'TensorFlow-Tutorials'...
remote: Counting objects: 367, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 367 (delta 1), reused 9 (delta 1), pack-reused 356
Receiving objects: 100% (367/367), 14.06 MiB | 4.04 MiB/s, done.
Resolving deltas: 100% (148/148), done.

Checking connectivity... done.


2. inception 디렉터리로 이동하기 

너무 쉬운건데 제가 설명하고 있지 않나 그런 생각이 드네요.

root@hoonjo-VirtualBox:~# cd TensorFlow-Tutorials/
root@hoonjo-VirtualBox:~/TensorFlow-Tutorials# ls
01 - TensorFlow Basic      04 - MNIST        07 - GAN        10 - DQN
02 - Neural Network Basic  05 - CNN          08 - RNN        README.md
03 - TensorBoard, Saver    06 - Autoencoder  09 - Inception
root@hoonjo-VirtualBox:~/TensorFlow-Tutorials# cd 09\ -\ Inception/
root@hoonjo-VirtualBox:~/TensorFlow-Tutorials/09 - Inception# ls

predict.py  README.md  retrain.py

3. retrain.py 실행하기 

사용법과 실행하기 그리고 옵션이 모두 위의 깃허브 페이지가 자세히 나와 있습니다.
다만 실행 결과가 없을 뿐이죠.

#1번의 링크에 인셉션 항목을 보면 사용에 대해서 상세하게 설명이 되어 있다.
https://github.com/golbin/TensorFlow-Tutorials/tree/master/09%20-%20Inception

학습시켜 볼 샘플 자료 다운로드

curl http://download.tensorflow.org/example_images/flower_photos.tgz | tar xz -C ./workspace
자신이 가진 다른 이미지를 학습시켜보고 싶다면, 학습시킬 사진을 각각의 레이블 이름으로 폴더를 생성하고, 그 안에 폴더 이름에 맞는 사진을 넣어두면 됩니다.

학습 실행

# python retrain.py \
    --bottleneck_dir=./workspace/bottlenecks \
    --model_dir=./workspace/inception \
    --output_graph=./workspace/flowers_graph.pb \
    --output_labels=./workspace/flowers_labels.txt \
    --image_dir ./workspace/flower_photos \
    --how_many_training_steps 1000

retrain.py 주요 옵션

  • --bottleneck_dir : 학습할 사진을 인셉션 용으로 변환해서 저장할 폴더
  • --model_dir : inception 모델을 다운로드 할 경로
  • --image_dir : 원본 이미지 경로
  • --output_graph : 추론에 사용할 학습된 파일(.pb) 경로
  • --output_labels : 추론에 사용할 레이블 파일 경로
  • --how_many_training_steps : 얼만큼 반복 학습시킬 것인지

4. 실행 결과 

저는 실행을 /workspace를 만들고 거기서 실행을 했습니다.
경로를 다른 절대 경로로 바꾸면 predict가 동작을 하지 않네요. 아마도 코드에 입력해 둔거 같습니다...그래서 시키는대로 ./workspace에 다시 만들었습니다.

대략...엔지니어가 봤을때는 ./workspace/bottlenecks이라는 곳은 학습을 목적으로 하는 데이터들이 저장되고, 반복적으로 특정 이미지의 특정 정보를 가지고 추론했을때 그게 맞다면 좀더 가중치를 주고...하는 방법이 아닐까? .....이건 프로그래밍보다 수학인것처럼 느껴지는..

정확하게 자세한 내용은 아래의 링크를 참고하야 할듯 하다.
https://norman3.github.io/papers/docs/google_inception.html

일단 결과는 다음과 같다.
중요한 것은 학습이 진행되는 동안 1에서 1000까지 정확도가 점점 상승하는 것이 눈에 보인다는 것이다.

일단의 위의 실행보다는 이 실행에 time을 넣어서 PoC하거나 고객 데모용으로 쓰는게 더 보기 좋을 것 같다. 어쨌든 무언가 일하는 것 같은 느낌이라?

사진도 고객쪽에서 받아서 직접 넣고 돌린다면 더 좋아할지도...

root@hoonjo-VirtualBox:~# python retrain.py \
>     --bottleneck_dir=./workspace/bottlenecks \
>     --model_dir=./workspace/inception \
>     --output_graph=./workspace/flowers_graph.pb \
>     --output_labels=./workspace/flowers_labels.txt \
>     --image_dir ./workspace/flower_photos \
>     --how_many_training_steps 1000
>> Downloading inception-2015-12-05.tgz 100.0%
<중략>
Looking for images in 'daisy'
Looking for images in 'dandelion'
Looking for images in 'tulips'
Looking for images in 'roses'
Looking for images in 'sunflowers'
Creating bottleneck at /workspace/bottlenecks/daisy/5602738326_97121e007d_n.jpg.txt
<중략>
2017-06-07 19:12:57.690368: Step 0: Train accuracy = 44.0%
2017-06-07 19:12:57.690465: Step 0: Cross entropy = 1.504567
2017-06-07 19:12:57.798181: Step 0: Validation accuracy = 30.0% (N=100)
2017-06-07 19:12:58.809131: Step 10: Train accuracy = 75.0%
2017-06-07 19:12:58.809331: Step 10: Cross entropy = 1.087505
2017-06-07 19:12:58.904638: Step 10: Validation accuracy = 65.0% (N=100)
2017-06-07 19:12:59.884631: Step 20: Train accuracy = 84.0%
2017-06-07 19:12:59.884729: Step 20: Cross entropy = 0.930921
2017-06-07 19:12:59.998434: Step 20: Validation accuracy = 73.0% (N=100)

2017-06-07 19:13:01.013036: Step 30: Train accuracy = 80.0%
<중략>
2017-06-07 19:14:49.076590: Step 999: Train accuracy = 93.0%
2017-06-07 19:14:49.076712: Step 999: Cross entropy = 0.241719
2017-06-07 19:14:49.175123: Step 999: Validation accuracy = 94.0% (N=100)
Final test accuracy = 90.2% (N=346)
Converted 2 variables to const ops.



원본 출력 결과물은 다음 링크에서 다운 받을수 있습니다. 
Link#
Link#2

5. 사진 예측 

그러면 사진을 어떤식으로 예측하는지 그 과정을 눈으로 한번 보자.
물론 내부 코드 설명을 하자는게 아니라..돌아가는걸 그냥 보자는 뜻이다..;;

추론 테스트

# python predict.py ./workspace/flower_photos/roses/20409866779_ac473f55e0_m.jpg
예제에 나와 있는 내용을 일단 그냥 입력해 본다.
아래에 보이는 것처럼 normalization을 해서 가장 높은 가능성을 가지고 있는 장미에 투표한다.


예제만 보면 이건 PoC라고 할수 없으니까...다른 것을 한번 해보겠다.
Daisy? 이게 이름이 가장 짧아서 좋은거 같다.

python predict.py ./workspace/flower_photos/daisy/3900172983_9312fdf39c_n.jpg

실행 결과는 다음과 같다. 데이지라고 적었지만 이게 무언가 싶어서 찾아봤더니..국화 종류중에 하나라고 한다..이게 데이지인가..? 싶긴 한데...어제 친구랑 한 대화가 생각난다.
표본이 중요하다고...그건 아직 사람 손이 많이 간다고..그 얘기를 무슨 소리인지 이제 더 확실하게 알겠다;;


일단은 고객 BMT나 세션을 할때는 이 예제가 고객/파트너가 보기에는 더 무슨 뜻인지 쉽게 알수 있을꺼 같다. 재미있는 예제인거 같다~!

끝!

0 개의 댓글:

댓글 쓰기

 
Copyright © . 엔지니어를 위한 파이썬 및 기술 블로그 - Posts · Comments
Theme Template by BTDesigner · Powered by Blogger