サンフランシスコで開催されたGoogle Cloud Next '19(2019.4.9-11)で, AutoML Visionの拡張機能としてAutoML Vision Edgeが発表された.
AutoML Vision Edgeは, Edgeデバイス(例えば, Android端末など)で動作する画像分類のカスタムモデルを作成することができるサービスである.
昨年からCODE for YAMATOKORIYAMAの取組みの一環として, 金魚の種類の識別にチャレンジしており, モデル学習やAndroid端末での識別などをやってきた[1][2]ので, 金魚データを使ってこのAutoML Vision Edgeを少し試してみた.
1. モデル学習
AutoML Vision Edgeのモデル学習方法は, 基本的にはAutoML Visionと同一であるが, 「TRAIN_ NEW MODEL」を選択すると, 以下のようにModel Typeや学習条件などを選択することができる.
条件設定:
- Model Type : Edge
- Optimize model : Higher accuracy
- Show latency estimaters : Samsung Galaxy S7
- Set a node hour budget : 1 node hour
(Higher accuracyを選択すると7 node hours (recommended)となるが, AutoML Visionの時は1 node hoursのみが無料だったので...)
今回は学習データに, 以前GCPUG NaraのイベントでLT[3]やったときのデータと同じものを用いた.
1 node hourで学習したのだが, 学習終了のメールが来るまでに, 4.5時間くらいかかった.
出来上がったモデルは, Avg precisionが0.78で, 同条件で学習したCloud-hostedより少し精度が落ちているようだ.
気になっていた料金だが, どうもプロモーション枠が設けられているようで, その範囲であれば無料で試せるようだ.
今回の1 node hourの学習で, 「AutoML Image Classification On-Device Model Training」が約550円($4.95/hour)減っていた.
あと13~14 node hoursは無料で試せそうだ. Googleさん, ありがとう!!
2. Edgeデバイスによる動作
Android端末で動作させるためには, 学習したモデルのtfliteファイルをダウンロードし, ML Kit for Firebaseのサンプルコードを利用する.
2.1 tfliteファイルのダウンロード
AutoML Visionインターフェースで, 学習したモデルの「PREDICT」の画面からダウンロードすることができる.
以下の3ファイルをダウロードする.
tflite_metadata.jsonファイルを覗くと, なんと「QUANTIZED_UINT8」の8bit量子化モデルになっているではないか...
以前, kerasで学習したモデルを, tflite floatモデルに変換したり, 量子化するのに結構悩んだのは何だったんだろう.
{ "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", "1.13" ] }
2.2 ML Kit for Firebaseサンプル修正
(1) tfliteモデルを動かすのに, ML Kit for Firebaseのquickstart-android[4]のコードを活用する.
[コード修正]
apps/mlkit/java/custommodel/CustomImageClassifier.javaの以下3か所を修正.
・モデルファイル指定箇所
/** * Name of the quantized model file. */ // private static final String LOCAL_QUANT_MODEL_NAME = "mobilenet_quant_v2_1.0_299"; private static final String LOCAL_QUANT_MODEL_NAME = "automl_model"; /** * Path of the quantized model file stored in Assets. */ // private static final String LOCAL_QUANT_MODEL_PATH = "mobilenet_quant_v2_1.0_299.tflite"; private static final String LOCAL_QUANT_MODEL_PATH = "model.tflite";
・ラベルファイル
/** * Name of the label file stored in Assets. */ // private static final String LABEL_PATH = "labels.txt"; private static final String LABEL_PATH = "dict.txt";
・画像サイズ
// 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;
(2) 2.1でダウロードしたモデルファイル, ラベルファイルをassetsの下に配置する.
(3) Firebaseと連携するため, google-services.jsonも必要.
2.3 動作例
端末:Nexus 7 (2013)
AutoML Vision Edgeで学習したモデルを簡単にAndroidで動作させることがきることは確認できたが, 学習条件でOptimize modelを"Higher accuracy"としたためか, Nexus 7のCPU処理ではフレーム毎の分類処理が追い付いていないようだ...
そのため, 多分画像バッファオーバーか何かで, しばらくするとアプリが落ちてしまう.
(あぁ, Pixel 3ほしくなってきた~)
ただ, 今まで独自タスクの画像分類をAndroid端末で行う場合,
といったことが必要だったが, このAutoML Vision Edgeを利用すると, 簡単にカスタムモデルを作成でき, 端末側で画像分類を行うことができるようになったということだ.
モバイルアプリ開発をやっている人達は使ってみたくなるんじゃないかと...
GoogleさんのML技術バンザーイ!!
あと, quickstart-androidのサンプルコードもかなり機能追加がされているようなので, この週末いろいろと触ってみよう!!
----
参照URL:
[1] 金魚って見分けられる? (1) - (4)
[2] Cloud AutoML Visionは金魚を見分けられるか?
[3] Kingyo AI Navi - Speaker Deck
[4] ML Kit for Firebase Quickstart