본문 바로가기
archive.tar

[TensorFlow] Inception v3 모델 를 이용하여 Android 에서 이미지 분류 해보기

by 냉동만두 2017. 5. 15.


개요


Tensorflow  Android 예제를 활용하여 이미지 분류 해보기. Android tensorflow image classification.

tensorflow 소스코드에는 Android 예제가 있다. 그중 이미지 분류 예제를 활용하여 나만의 이미지 분류 모델을 만들어 봅시다.

기존의 예제는 Inception-v1 모델이 들어가 있다. 이번에는 Inception-v3 모델에 원하는 이미지를 재 학습 시켜 나만의 모델을 만든 후

Android 예제에서 사용한다.

스크린샷은 꽃데이터를 재학습하여 안드로이드로 분류시킨 화면이다.

* 참고

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android

      

준비 : 테스트 환경. 소스코드


* Tensorflow 1.1.0 RC1 이상의 버전과 그에 맞는 소스 코드

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android

* Ubuntu 16.04 , Anaconda 2


준비 : Inception-v3 모델 이미지 재학습


Inception-v3 모델에 원하는 이미지를 재 학습 시킨다. 

이번 포스팅에서는 대표 예제인 Flowers data set을 사용 했다.

학습 후의 모델 파일(.pb) 레이블 파일(.txt) 파일을 준비한다

* 참고 : http://gusrb.tistory.com/16


준비 : 재 학습 모델 파일 전처리


출력된 모델 파일(.pb) 이번 예제에서 사용 할 수 있도록 전처리가 필요하다

필요하지 않는 노드를 제거하는 작업이 필요하다. 그냥 따라 해도 된다.

텐서플로우 전체 소스코드 중 아래 경로의 스크립트를 사용 한다

/tensorflow/tensorflow/python/tools/strip_unused.py

python /home/hwang/tensorflow/tensorflow/python/tools/strip_unused.py \

--input_graph="retrained_graph.pb" \

--output_graph="stripped_graph.pb" \

--input_node_names="Mul" \

--output_node_names="final_result" \

--input_binary=true

파란 글자 : 전처리 할 모델 파일 경로. 위에서 재학습 후 만든 결과물(.pb)를 지정 한다

초록 글자 : 전처리 후 나온 결과 모델 파일을 저장할 경로와 이름.

위와 같이 스크립트를 실행하면 " stripped_graph.pb " 새로운 모델 파일이 출력 된다.

안드로이드 예제에서는 이 모델 파일을 사용 한다. 레이블 파일은 위의 재학습에서 만든 레이블 파일을 사용 한다(retrained_labels.txt)


준비 : 모델 파일, 라벨 파일 위치 이동


위에서 전처리한 모델 파일(stripped_graph.pb) 와 라벨(retrained_labels.txt)파일 을 빌드할 위치로 이동 시킨다.

tensorflow/tensorflow/examples/android/assets

위의 경로로 이동 시킨다.


준비 : Android SDK , NDK 설치


예제를 앱으로 만들기 위해 SDK와 NDK가 필요하다. Android Studio를 이용해서 SDK와 NDK를 설치해도 되고 각각 따로 설치해도 된다.

안드로이드 스튜디오 & SDK : https://developer.android.com/studio/index.html

NDK : https://developer.android.com/ndk/downloads/older_releases.html?hl=ko#ndk-12b-downloads

SDK의 버전은 자신이 테스트할 폰에 맞게 해주면 된다.

NDK 는 위의 주소에서 받는걸 추천한다. 여러 버전으로 테스트 해본 결과 위의 버전이 잘 맞느다.

SDK와 NDK의 설치법을 잘 모른다면 구글링 후 돌아오길 !


준비 : Bazel WORKSPACE 수정


텐서플로우와 함께 컴파일을 하기 때문에 Bazel을 사용해야 한다

중요한 설정이다. 여기서 많은 오류와 실수가 있었다.

Tensorflow의 루트 폴더의 WORKSPACE 를 수정 한다 (LINE 18 ~ 31)

초기에는 # 으로 주석 처리가 되어있으니 필요한 부분만 #을 제거 후 수정한다

파란 글자 : SDK 설정법. 자신의 설치 버전과 경로에 맞게 수정 한다.

초록 글자 : NDK 설정법. 경로(path)만 자신에 맞게 하고 api_level은 아래와 같이 한다

android_sdk_repository(

    name = "androidsdk",

    api_level = 25,

    build_tools_version = "25.0.2",

    path = "/home/hwang/Android/Sdk"

)

android_ndk_repository(

    name="androidndk",

    path="/home/hwang/Android/android-ndk-r12b",

    api_level=14

)


준비 : Tensorflow Android 소스코드 수정


/tensorflow/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java

위의 경로를 찾아가 ClassifierActivity.java 코드를 편집 한다. Incpetion v3에 맞게 값을 수정 해야 한다.

기존의 소스코드를 아래와 같이 변경 한다 (Line 61 ~ 70 )

중요한 설정이다. 여기서 많은 오류와 실수가 있었다.

파란 글자 : Inception v3 모델의 이미지 처리 관련 속성 값이이다. 똑같이 수정 한다

초록 글자 : 위에서 재학습 시킨 후 출력된 모델의 그래프 이름이다. 재학습 과정에서 특별히 수정을 하지 않았다면 아래와 같이 수정 한다

빨간 글자 : 출력된 모델 파일과 라벨 파일이다. 특별한 수정을 하지 않았다면 아래와 같이 수정 한다

 private static final int INPUT_SIZE = 299;

  private static final int IMAGE_MEAN = 128;

  private static final float IMAGE_STD = 128;

  private static final String INPUT_NAME = "Mul";

  private static final String OUTPUT_NAME = "final_result";

  private static final String MODEL_FILE = "file:///android_asset/stripped_graph.pb";

  private static final String LABEL_FILE = "file:///android_asset/retrained_labels.txt";


실행 : Android 예제 소스 컴파일


원하는 이미지 파일 모델도 재학습 시키고, 모델파일 전처리도 하고, 위치 이동도 하고, 소스코드 수정도 했다.

이 포스팅에서는 Bazel을 사용 했지만, 필요에 따라서 Android studio 환경에서 해도 된다 !

이제 Tensorflow Android 예제 앱을 빌드해 보자. 

Tensorflow 루트 폴더에서 아래의 명령어를 실행 !

bazel build -c opt //tensorflow/examples/android:tensorflow_demo 

실행 결과를 보면 아래와 같은 메세지가 출력 된다.

마지막 tensorflow_demo.apk 를 안드로이드 폰에 설치 한다.

APK 파일 경로 : /tensorflow/bazel-bin/tensorflow/examples/android

Target //tensorflow/examples/android:tensorflow_demo up-to-date:

  bazel-bin/tensorflow/examples/android/tensorflow_demo_deploy.jar

  bazel-bin/tensorflow/examples/android/tensorflow_demo_unsigned.apk

  bazel-bin/tensorflow/examples/android/tensorflow_demo.apk


설치 : 컴파일된 APK 설치


설치를 하게 되면 3개의 앱이 설치된다.

기본적으로 Tensorlfow의 예제 앱이 설치 되는데, 그 중 'TF Classify' 를 수정하여 사용 한다.

TF Classify를 실행하면 위의 스크린샷과 같은 단순한 인터페이스의 앱이 실행 된다.

자신이 학습시킨 종류의 사진을 비추면 (포스팅을 예를들면 꽃 사진) 위쪽에 추론 레이블과 스코어가 출력 된다 !

만약 어플이 실행이 불가하면 WORKSPACE , ClassifierActivity.java 수정을 다시 해봐야 한다.