Kerasで学習したモデルをAndroidで動かしてみた

  • 6
    いいね
  • 0
    コメント

はじめに

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";