MotoJapan's Tech-Memo

技術めも

【Android】TensorFlow LiteのMobilenetサンプルコードをビルド&実機インストール・実行する方法と雑感 (Android Studio 3.0)

待ちに待っていたTensorFlow Liteが先日リリースされた。
Preview版ということでgithubに公開されていたので、触ってみた。
(そもそも本家GithubのTfLiteCameraDemo.apkというPre-build binaryのapkがエラーでインストールできない(17/11/18現在))

Nexus5実機で実行した結果はこんな感じ。
「ボールペン」と「絆創膏」のリアルタイム認識。
f:id:motojapan:20171118031641g:plain

仕組み

既存のTensorFlow学習済みを、TensorFlow Liteモデル(tflite)に変換。
この変換済みモデルをAndroid / iOSのモバイルプラットフォームに組み込み、推論が可能。
f:id:motojapan:20171118024153p:plain
(画像は、本家サイトの「TensorFlow Lite Architecture」抜粋)

今回はGitHub上で提供されるAndroid側。
Android StudioのMobilenetサンプルプロジェクトをビルドし、実機インストール、実行、デバックする。

主な手順

本家に書いてあるものは下記。

Building in Android Studio using TensorFlow Lite AAR from JCenter
The simplest way to compile the demo app, and try out changes to the project code is to use AndroidStudio.

  • Install the latest version of Android Studio 3 as specified here.
  • Make sure the Android SDK version is greater than 26 and NDK version is greater than 14 (in the Android Studio Settings).
  • Import the tensorflow/contrib/lite/java/demo directory as a new Android Studio project.
  • Click through installing all the Gradle extensions it requests.
  • Download the quantized Mobilenet TensorFlow Lite model from here
    • unzip and copy mobilenet_quant_v1_224.tflite to the assets directory: tensorflow/contrib/lite/java/demo/app/src/main/assets/
  • Build and run the demo app


https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/liteより抜粋。

かなりシンプル。
これを1つずつ追っていく。

前提環境

1. Android Studio 3 インストールする

TensorFlow Liteを使う場合、Android Studio 3が必要。
本家ここからダウンロードとインストール。
f:id:motojapan:20171118035336p:plain

2. TensorFlow Repositoryをcloneする

好きな場所にcloneする。

$ git clone https://github.com/tensorflow/tensorflow

サンプルプロジェクトは、「tensorflow/contrib/lite/java/demo」にある。

3. サンプルプロジェクトをAndroid Studio上で開く

Android Studioの「File」->「Open」で「tensorflow/contrib/lite/java/demo」を開く。
f:id:motojapan:20171118040750p:plain

上記で開いた後、足りない各種ライブラリやbuild-toolsのインストール、gradle syncを進める。
IDEが通知してくるので基本的にはぽちぽちするだけ)
f:id:motojapan:20171118041024p:plain

4. 実機インストール・実行する(モデル無し)

上記が進むと、緑三角形の「Run」が有効になり、USB接続した実機が認識されるようになる。
f:id:motojapan:20171118041331p:plain
実機が認識されたら「OK」で実行する。

まず、インストール後、起動して見事に落ちる。
f:id:motojapan:20171118041647p:plain

アプリ一覧からTfLiteCameraDemoを再度起動する。
f:id:motojapan:20171118041747p:plain

学習済みモデルがないので「Uninitialized Classifier or invalid context.」が表示される。

5. モデルをダウンロードし、プロジェクトに配置する

本家ここからzipダウンロード。

zipを解凍すると2ファイルある。

  • labels.txt : ラベル情報(文字列ベタ書き)
  • mobilenet_quant_v1_224.tflite : tensorflow lite学習済みモデル

f:id:motojapan:20171118041941p:plain

学習済みモデルファイルの配置場所は、androidプロジェクトのasset直下。(tensorflow/contrib/lite/java/demo/app/src/main/assets/mobilenet_quant_v1_224.tflite)

Android Studioのプロジェクト上にも反映されていることを確認する。
f:id:motojapan:20171118042508p:plain

6. インストール・実行を実行する(モデルあり)

5.で晴れてモデル有りで実機にインストールしてみると結果は下記のように表示される。

f:id:motojapan:20171118031922p:plain
ボールペン(ballpoint)を認識した。
万年筆(fountain pen)にも似ているらしい。

f:id:motojapan:20171118031929p:plain
絆創膏(Band Aid)も認識した。
かなりconfidenceが高い。

実機評価

処理速度

手元にあるデバイス Google Nexus5, Huawei P9 liteで確認。
入力画像サイズはMobilenetなので224 x 224、これに対する処理速度。

Google Nexus5(2013) Huawei P9 lite(2016)
CPU Qualcomm Snapdragon 800 MSM8974 2.26GHz(クアッドコア) kirin 650 (オクタコア(2.0GHz×4コア+1.7GHz×4コア))
Android version 5.0.1 6.0
RAM 2.0 [GB] 2.0 [GB]
mobilenet処理速度 (per 1 frame) 210-260 [msec] (best 140 [msec]) 150-160 [msec]

Nexus5の速度が安定しない。(瞬間最大風速的に早くなる時もある)
実際OSの忙しさで待たされたりすることもあるので、ここら辺は揺らぎがあるのかなぁ。
動画でリアルタイムに見ている分には思ったよりサクサク動くし、気にならない。うまくやれば何かしら使えそう。

モデルサイズ

ここが妥当な評価になるかわからないが、TensorFlow Lite v1 model とTensorFlow Mobilenet v1 model を比較してみる。

TensorFlow Lite TensorFlow TensorFlow
mobilenet_quant_v1_224 MobileNet_v1_0.25_224 MobileNet_v1_1.0_224
バイナリサイズ 4.3 [MB] 7.6 [MB] 67.9 [MB]

サイズは小さくなっているように見える。

メモリ使用量

サンプルアプリのメモリ使用量を調べる。

$ adb shell dumpsys meminfo | grep tflitecamerademo
    91689 kB: android.example.com.tflitecamerademo (pid 22383 / activities)

カメラも動いているが、

  • 稼働時はメモリ使用量は90[MB]近い
  • 待機時は38[MB]付近。

ちなみに標準カメラ単体では、

  • 稼働時は18[MB]付近
  • 待機時は4[MB]付近。

雑感

個人的な感想として、

  • 今回程のモデルで、エンジョイユースであれば、リアルタイム性は気にならず快適。
  • モデルのフットプリントは小さくなっている模様。
    • 精度差はわからない(ちゃんと評価してないので)
  • サンプルアプリバイナリでも22.0[MB]は単純にかなり大きいアプリだなという印象。
    • モデル更新の度にアプリ更新が必要?
  • メモリもそれなりに食っている。
  • エッジとサーバーはどう協調していくかこれから大きなテーマになりそう。

近々、自作モデルをビルドしたい。