はじめに
Kerasで学習したモデルをAndroidで動かすにあたり、意外とネット上に参考記事がなかったのでメモ。
今回はTensorFlowのAndroidカメラデモアプリをベースに、Kerasで学習したモデルをAndroid上で動かせるようにしました。
1. Kerasの学習モデルを作る
モデルを用意するにあたり、人工知能に関する断創録さんの「VGG16のFine-tuningによる17種類の花の分類」を非常に参考にさせていただきました。機械学習系ではいつもお世話になっています。感謝。
今回はより使いやすようにように、記事先で使われているプログラムを改良。
以下のような機能を追加。
- 識別クラスやサンプル数などの各種パラメータを学習データのディレクトリ構造から取得
- 識別クラスを記述したラベルファイルを出力
- 各種パラメータはオプションやコマンドライン引数で指定
- 重みだけでなくモデル構造も含めて出力する
- etc...
使い方はリンク先参照。
https://github.com/icchi-h/fine-tuning-keras
2. 学習モデルをTensorFlowの形式に変換
AndroidのTensorFlowデモアプリで利用されている学習モデルはProtocol Buffers(.pb)形式であるため、Kerasの学習モデルをそのまま利用することはできません。
そこで、amir-abdiさんが公開されているコードをベースにモデルの変換プログラムを用意。
使い方はリンク先参照。
https://github.com/icchi-h/keras_to_tensorflow
3. Androidアプリの準備
今回はGoogleがTensorFlowリポジトリ内で公開しているAndroid Camera Demoの中の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を使ってファイルをコピー。
モデル・ラベルファイル名の定義を変更
/src/org/tensorflow/demo/ClassifierActivity.java
の61行目から各種パラメータが定義されているので、それを用意した学習モデルに合わせ変更。手順1で紹介したコードをそのまま利用している場合は以下のように変更。
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";