GCP Cloud AutoML Vision Edgeを使ってカスタムモデルを作ってエッジデバイスで動かす話(Firebase ML Kit)

#はじめに
Google Cloud Next'19(4/9-11@サンフランシスコ)にて、AutoML Vision Edgeが発表されたので、少し触ってみました。

## そもそもAutoMLとは
専門的な知識なしで、ユーザは学習させたいデータを集めて、学習させるだけで、高品質のカスタム機械学習モデルを作成できるサービスです。
リリース当初は、ラーメン二郎の店舗分類などで、非常に高精度な結果を出し、[注目もされました。](https://cloudplatform-jp.googleblog.com/2018/03/automl-vision-in-action-from-ramen-to-branded-goods.html)
現在は、ベータ版で、Vison(画像分類)、NaturalLanguage(自然言語処理のテキスト分類)、Translation(カスタム翻訳)があります。ほかに、Google Cloud Next'19で、AutoML Tables(テーブルデータでの予測)も発表されました。[Qiitaで早速書かれていました。](https://qiita.com/fufufukakaka/items/220113aec7e5a65e24eb)

## AutoML Vision Edgeとは
今回の本題AutoML Vision Edgeは、AutoML Visionの拡張で、Edgeデバイスで動くカスタムモデルを作成できるサービスとなっています。

では早速動かしてみます。


## 前提と流れ
トレーニングデータの保存方法などは、AutoML Visionと同一なので、割愛し、異なる点のみ記載します。
また、作成されたカスタムモデルは、Firebase ML Kitを活用して、自分のAndroid端末で動作させるサンプルアプリ上で動かしました。[参考：ML Kit for Firebase(on device)でカスタムモデルを動かす話(TensorFlowLite/Keras)](https://qiita.com/shinkoizumi0033/items/614e10c7db61ded3c212)

流れは以下です。

1. GCPポータルで、AutoML Vision Edgeモデルの作成
2. tfliteファイルを、GCSに保存、ダウンロード
3. ML Kit for Firebaseで動くようにコードを修正
4. アプリを端末へ転送し、動かします。完成。


## GCP以外の環境
### ローカルPC
AndroidStudioを入れて、タブレットとUSB接続し、アプリをインストールする用途

+ Windows 10
+ AndroidStudio 3.2.1


### タブレット端末
作成したカスタムモデルを入れて、Androidアプリを動かす用途

+ HuaweiMediaPad
+ Android7.0

## 1. GCPポータルで、AutoML Vision Edgeモデルの作成
まず、学習データは、9種類のラベルと、それぞれ100枚の画像を用意（計900枚の画像)しました。
それをAutoML Visionに読み込ませておき(このあたりは他のサイト参照)、「TRAIN NEW MODEL」ボタンを押して、生成するためのパラメータを入力します。

Model Typeが選べるようになっており、Cloud-hosted(これまでのクラウドホスト型)のほかに、Edgeが選択可能となっており、今回はEdgeを選択します。

また、遅延と精度も最適化手法が選べ、Best trade-offを選びました。
遅延の推定値は、GooglePixel1/Samsung Galaxy S7/iPhone8(iOS11)/Edge TPUから選択できます。
ちなみに、今回のモデルはGalaxyだと65msec処理のものでしたが、Edge TPUだと3msecという推定結果です。Edge TPUは爆速ですね。
最後に、ノード時間に対する予算を設定します。リコメンドで2 node hoursになっていたので、そのままにしています。

![train new model1](https://storage.googleapis.com/permanent_koizumi/20190414_train_new_model1.png "train new model1")

![train new model2](https://storage.googleapis.com/permanent_koizumi/20190414_train_new_model2.png "train new model2")

約一時間ほどで、処理が完了しました。
![https://storage.googleapis.com/permanent_koizumi/20190414_processing.png](https://storage.googleapis.com/permanent_koizumi/20190414_processing.png)


## 2. tfliteファイルを、GCSに保存、ダウンロード

得られた結果は、以下のようなもので過学習の疑いしかありませんが、取り急ぎ、完成したので良しとして、tfliteファイルをエクスポートします。GCS(Google Cloud Storage)にエクスポートされます。

![https://storage.googleapis.com/permanent_koizumi/20190414_score.png](https://storage.googleapis.com/permanent_koizumi/20190414_score.png)

![https://storage.googleapis.com/permanent_koizumi/20190414_export.png](https://storage.googleapis.com/permanent_koizumi/20190414_export.png)

エクスポートされた先には、以下のファイルがありました。

|ファイル名|内容|
|---|---|
|labels.txt|ラベル情報（今回は、9種類のラベルがoutputされていました)|
|model.tflite|tfliteファイル|
|tflite_metadata.json|メタデータファイル（設定もろもろ）|

このメタ情報を見ることで、イメージの縦横サイズや、input type(quantized_uint8)であるとかが分かります。

```json-doc:tflite_metadata.json
{
    "batchSize": 1, 
    "imageChannels": 3, 
    "imageHeight": 224, 
    "imageWidth": 224, 
    "inferenceType": "QUANTIZED_UINT8", 
    "inputTensor": "image", 
    "inputType": "QUANTIZED_UINT8", 
    "outputTensor": "scores", 
    "supportedTfVersions": [
        "1.10", 
        "1.11", 
        "1.12"
    ]
}
```



## 3. ML Kit for Firebaseで動くようにコードを修正
AndroidStudioで、ML Kit for Firebaseのクイックスタートを使って、作成したカスタムモデル(tflite)を利用するようにコードを変更します。


```Python:app/java/custommodel/CustomImageClassier.java
    //private static final String LOCAL_QUANT_MODEL_NAME = "mobilenet_quant_v2_1.0_299";
    private static final String LOCAL_QUANT_MODEL_NAME = "automl_model";

    //private static final String LOCAL_QUANT_MODEL_PATH = "mobilenet_quant_v2_1.0_299.tflite";
    private static final String LOCAL_QUANT_MODEL_PATH = "automl_model.tflite";

    //private static final int DIM_IMG_SIZE_X = 299;
    //private static final int DIM_IMG_SIZE_Y = 299;
    private static final int DIM_IMG_SIZE_X = 224;
    private static final int DIM_IMG_SIZE_Y = 224;
```

次に、app/assets　に格納されているlabels.txtを修正
最後に、tflite自体を、app/assetsに格納(automl_model.tflite)


## 4. アプリを端末へ転送し、動かします。完成。
AndroidStudioで、Runして、自分の端末を指定してアプリを転送します。
とりあえず、9つの分類タスクが動いたことを確認しました。。

|結果1|結果2|
|---|---|
|![](https://storage.googleapis.com/permanent_koizumi/20190414_result1.png)|![](https://storage.googleapis.com/permanent_koizumi/20190414_result2.png)|


端末のせいですごくモッサリとした処理だったのですが、ある程度の結果が得られました。


## コスト
気になるかかったコストは、AutoML Vision Edgeでのトレーニングコスト、0円（無料枠？）＋　Edgeデバイスでの実行はコストがかからないので、無料でした。

![https://storage.googleapis.com/permanent_koizumi/20190414_automlvisionedge_cost.jpg](https://storage.googleapis.com/permanent_koizumi/20190414_automlvisionedge_cost.jpg)

##おわりに
躓くことなく、驚くほど簡単な操作（GUI）で、お手軽に、tfliteモデルを作成、（しかもダウンロードも！！）でき、かつEdgeデバイスででも利用できるので、今後活躍の場が増えること間違いありません。