【初心者向け】AndroidスマホでTensorflow Liteサンプルを使って機械学習モデルを動かしてみた～準備編～

## やること
最近機械学習系の仕事をすることが増え、Androidスマホ(以下、スマホ)でも作成した機械学習モデルが動かせないかと考えていたのが今回記事を書く動機です。
とはいえ、Androidのアプリ開発などしたことはなく今回はまず公開されているサンプルをスマホ上で動かしてみようと思います。

慣れていないとサンプルを実行するのにも頭を抱えることも多いと思うので、備忘録の為メモを残します。

今回使用するTensorflow Liteですが、組み込み・モバイル向けのTensorflowのモデルの軽量版になります。
うまくサンプルが動かせたら、自分で作成した機械学習のモデルが使えるかなど今後試していきたいと思います。

TensorFlow Lite を使用しているアプリの例(公式)
https://www.tensorflow.org/lite/examples

## 環境
(2019年8月時点)
PC：windows10
スマホ：Galaxy S8
Android：バージョン 9
Android Studio : 3.4.2

## 準備

■モジュール

Android Studioが必要なので下記からダウンロード＆インストールしておいてください

Android Studio
https://developer.android.com/studio?hl=ja

gitコマンドが入っていない場合は下記でダウンロードしておいてください。

Git
https://git-scm.com/downloads


■スマホ設定
スマホ側の「開発者向けオプション」で下記設定をONにしました
　・USBデバッグ

後、私は開発用途なので下記の設定もONにしました
※設定は自己責任でお願いします
　・スリープモード非設定（充電中はスリープモードにしない）


■PC接続
スマホとPCはケーブルで接続した状態にしておいてください
PCにスマホ接続時に「端末のデータへのアクセスを許可しますか？」で「許可」にする必要あり

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/5a6f71a0-bc73-8a06-ee12-0ad2c90463d4.jpeg" width=30%>

## 手順

①サンプルをダウンロード
②Android Studioでビルド
③アプリをスマホにインストール
④アプリ実行

# ①サンプルをダウンロード

画像分類(image classification)を例にとり実行したいと思います。
TensorFlow Liteのサンプルが載っているサイトから下記を選択します。
(今回はAndroidの例なのでAndroidを選択)

![screenshot.391.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/05ad98ad-071d-6fe9-d864-dc2a09d08f39.jpeg)

Githubのページに飛び、前提や実行方法が書いてあります。
(一応初心者向けなので、Githubのページ見てできる人はどんどん進んでもらって構いません)

コマンドプロンプトでサンプルをダウンロードします。
これは画像分類だけではなく5種類のサンプルのコードが入っています。

```git:サンプルダウンロード
git clone https://github.com/tensorflow/examples
```

![screenshot.392.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/95088d84-4ef0-49ee-1f1a-0da474eea7d0.jpeg)


# ②Android Studioでビルド

Android Studioを起動して、プロジェクトを開きます。

![screenshot.396.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/09cc67f9-ec70-b52f-2f36-d6b5695a84e8.jpeg)

examples -> lite -> examples -> image_classification -> android　を指定

![screenshot.397.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/9b852995-0188-bb70-4d93-52040ff0de74.jpeg)

開くとこんな感じになっています

![screenshot.398.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/a94320ea-ae50-2e28-b478-1d2d30ddbad3.jpeg)


Build -> Make Projectからビルドを実行します
![screenshot.399.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/6d8b36ab-1f6c-b979-b94a-6f79a331e15c.jpeg)

ビルドが成功すると下記の「Build:completed successfully」が出力されます
もし、足りないモジュールやパッケージなどあればプロンプトで表示されますのでダウンロードしてください。

![screenshot.400.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/4fe9169a-311b-66f7-72d5-935c9aeb51e6.jpeg)

(2019/8/19追記)
まずは、スマホではなくエミュレータでビルドできるかなど試す方がいるかと思います。
私も試したのですが、「minSdkVersion」で怒られました。
元々「build.gradle」に記載されているバージョンから変更したりしたので、同じようなエラーが出た方は「Tensorflow Lite」「minSdkVersion」などでググってみてください。


# ③アプリをスマホにインストール

ビルドが完了したらスマホ側にインストールします。

Run -> Run 'app' を選択

![screenshot.402.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/83c5c0f4-537c-3ed8-1e5e-010b1a6e74da.jpeg)

接続されているスマホを選択し、「OK」を選択します。
※PCにスマホ接続時に端末データへのアクセスを許可しますか？で「許可」にしておかないと出てこないので注意

![screenshot.404.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/f85d52e2-4167-4c62-8034-c6b447658f81.jpeg)

正常に終わるとスマホ側にアプリができているので確認。
カメラ撮影の許可が出るので「許可」を選択

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/7fe6c2ce-162e-062d-c4a3-18850cb807b7.jpeg" width=30%>　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/b6a11632-8a8b-64eb-a6ba-1a914a1e9038.jpeg" width=30%>


# ④アプリ実行

アプリを実行してみます。
1秒おきくらいにスコアリングを内部的にしているのか、目まぐるしい速さで今カメラで見ているものを判別しようとします。

物にもよるのでしょうが、判別できているものは確率が高いですね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/15f20df3-5663-73a9-2f20-56b2b45d3587.jpeg" width=30%>

全部試したわけではないですが、他のサンプルも同様にスマホで試せると思います。

今回は一旦ここまでで終了とします。
次回以降は自分で作成したモデルを組み込んで判別させる、などができればなぁと思っています。