1. icchi_h

    Posted

    icchi_h
Changes in title
+Kerasで学習したモデルをAndroidで動かしてみた
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +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";
+```
+
+
+
+
+
+