DeepLearning
gcp
AutoML
GoogleCloudNext

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


はじめに

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


そもそもAutoMLとは

専門的な知識なしで、ユーザは学習させたいデータを集めて、学習させるだけで、高品質のカスタム機械学習モデルを作成できるサービスです。

リリース当初は、ラーメン二郎の店舗分類などで、非常に高精度な結果を出し、注目もされました。

現在は、ベータ版で、Vison(画像分類)、NaturalLanguage(自然言語処理のテキスト分類)、Translation(カスタム翻訳)があります。ほかに、Google Cloud Next'19で、AutoML Tables(テーブルデータでの予測)も発表されました。Qiitaで早速書かれていました。


AutoML Vision Edgeとは

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

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


前提と流れ

トレーニングデータの保存方法などは、AutoML Visionと同一なので、割愛し、異なる点のみ記載します。

また、作成されたカスタムモデルは、Firebase ML Kitを活用して、自分のAndroid端末で動作させるサンプルアプリ上で動かしました。参考:ML Kit for Firebase(on device)でカスタムモデルを動かす話(TensorFlowLite/Keras)

流れは以下です。


  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

train new model2

約一時間ほどで、処理が完了しました。

https://storage.googleapis.com/persistent_koizumi/20190414_processing.png


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

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

https://storage.googleapis.com/persistent_koizumi/20190414_score.png

https://storage.googleapis.com/persistent_koizumi/20190414_export.png

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

ファイル名
内容

labels.txt
ラベル情報(今回は、9種類のラベルがoutputされていました)

model.tflite
tfliteファイル

tflite_metadata.json
メタデータファイル(設定もろもろ)

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


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)を利用するようにコードを変更します。


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


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


コスト

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

https://storage.googleapis.com/persistent_koizumi/20190414_automlvisionedge_cost.jpg


おわりに

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