1. icchi_h

    No comment

    icchi_h
Changes in body
Source | HTML | Preview
@@ -1,63 +1,62 @@
# はじめに
Kerasで学習したモデルをAndroidで動かすにあたり、意外とネット上に参考記事がなかったのでメモ。
今回はTensorFlowのAndroidカメラデモアプリをベースに、Kerasで学習したモデルをAndroid上で動かせるようにしました。
# 1. Kerasの学習モデルを作る
モデルを用意するにあたり、人工知能に関する断創録さんの「[VGG16のFine-tuningによる17種類の花の分類](http://aidiary.hatenablog.com/entry/20170131/1485864665)」を非常に参考にさせていただきました。機械学習系ではいつもお世話になっています。感謝。
今回はより使いやすようにように、記事先で使われているプログラムを改良。
以下のような機能を追加。
- 識別クラスやサンプル数などの各種パラメータを学習データのディレクトリ構造から取得
- 識別クラスを記述したラベルファイルを出力
- 各種パラメータはオプションやコマンドライン引数で指定
- 重みだけでなくモデル構造も含めて出力する
- etc...
使い方はリンク先参照。
-
https://github.com/icchi-h/fine-tuning-keras
# 2. 学習モデルをTensorFlowの形式に変換
AndroidのTensorFlowデモアプリで利用されている学習モデルはProtocol Buffers(.pb)形式であるため、Kerasの学習モデルをそのまま利用することはできません。
そこで、amir-abdiさんが[公開されているコード](https://github.com/amir-abdi/keras_to_tensorflow)をベースにモデルの変換プログラムを用意。
使い方はリンク先参照。
https://github.com/icchi-h/keras_to_tensorflow
# 3. Androidアプリの準備
今回はGoogleがTensorFlowリポジトリ内で公開している[Android Camera Demo](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)の中のTF Classifyを利用します。
Googleの推奨するようにBazelでビルドしてもいいですし、私はBazelを使わずAndroid Studioで開発したかったので、プロジェクトに少し手を加えました。
以下の記事でAndroid Studioでアプリをビルドするまでの手順をまとめています。
https://qiita.com/icchi_h/items/a1df9f27569714edfc5e
# 4. アプリの学習モデル・ラベルファイルを変更
アプリのデフォルトの学習モデル・ラベルファイルと手順1で用意したものに変更します。といっても用意したモデル・ラベルファイルを特定ディレクトリにコピーして、コード上でファイル名を定義している部分を変更するだけ。
## モデル・ラベルファイルの設置
手順3でAndroid Studioを使った場合では、Project内に`assets`ディレクトリが表示されているはず。そこに自分のモデル・ラベルファイルをドラッグ&ドロップまたは、`assets`を右クリック→Reveal in FinderでFinderを使ってファイルをコピー。
<img height="400px" src="https://qiita-image-store.s3.amazonaws.com/0/135313/21a4d617-3750-f2bf-5b37-739d959ee00a.jpeg">
## モデル・ラベルファイル名の定義を変更
`/src/org/tensorflow/demo/ClassifierActivity.java`の61行目から各種パラメータが定義されているので、それを用意した学習モデルに合わせ変更。手順1で紹介したコードをそのまま利用している場合は以下のように変更。
```java
INPUT_SIZE = 150;
IMAGE_MEAN = 0;
IMAGE_STD = 255;
INPUT_NAME = "input_1";
OUTPUT_NAME = "sequential_1/dense_2/Softmax";
MODEL_FILE = "file:///android_asset/<your model file>.pb";
LABEL_FILE = "file:///android_asset/<your label file>.txt";
```