みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

Cloud AutoML Vision Edgeを試してみる(2)

Googleから以下のようなメールがやってきた.

f:id:moonlight-aska:20200122233707p:plain

昨年の11月にAutoML VisionのGA(General Availability)版のリリースと共に価格改定が行われた.
そして, 以前に学習したモデルは, 再デプロイしないと2020/2/20で使えなくなるようだ.
あと1か月ほどということで, 最後の警告のようだ!!
(見落としていたが, この料金改定に関する通知は2019年10月頃にもメールで送信されているそうだ....)


対象となっているベータ版モデルはCODE for YAMATOKORIYAMAがらみで開発している「Kingyo AI Navi」[1]で, 金魚の種類を認識するのに使用しているものだ.
以前は予測はAPIのコール回数で課金されていたが, 価格改定後は予測を行うためにはモデルを再度デプロイする必要があるとのこと.
デプロイの料金は, ノード時間あたり $1.25. 1か月利用すると約$900[2]だそうだ.

さすがに, これでは趣味のアプリでちょっと使うといったことはできない.
TensorFlow/Kerasで独自にモデル学習することも以前やったことがあるが, やっぱりカスタムモデル作成にはAutoML Visionが便利. 使わない手はない!!
そこで, AutoML Vision Edgeでモデル学習し, 学習済モデルをエクスポートしてローカルのPCで予測することを試してみた.


関連記事:
Cloud AutoML Vision Edgeを試してみる(1)
・Cloud AutoML Vision Edgeを試してみる(2)


1. モデルの学習[3][4]
AutoML Vision Edgeモデルの学習は, 基本的にはこちらの手順に沿ってやればよい.
PCで予測するので, モデル最適化のオプションは"Higher accuracy"で, そして学習データはいつものやつ.

f:id:moonlight-aska:20200125093900p:plain

4時間ほどで学習終了.
とりあえず, こんな感じに仕上がった!!

f:id:moonlight-aska:20200125095425p:plain


2. 学習済モデルのエクスポート[5]
学習済モデルのエクスポートは, 以前に比べると使用できるものがかなり増えている.

f:id:moonlight-aska:20200125100517p:plain

PCで予測をやるにあったて使えそうなものがいくつかあるが, 今回は「TF Lite」を試したみた.
(精度を求めるなら「Container」の方がいいと思うが, それは次回以降で...)
エクスポートは, こちらを参考にやればよい.

f:id:moonlight-aska:20200125101212p:plain:w400

以下ものがエクスポートできる.
・dict.txt
・model.tflite
・tflite_moetadata.json


3. 予測[6]
エクスポートしたクラス情報とtflite modelを使って, 画像分類を行う.
[コード]

import numpy as np
import pandas as pd
import tensorflow as tf
import cv2

CANDIDATE_MAX = 5
THRESHOLD = 30
IMAGE_SIZE = 224

# Load the dictionary and the tflite model
def load_dict():
    global names
    names = pd.read_csv('./model/dict.txt', header=None)
    print(names)

def load_model():
    global interpreter, input_details, output_details
    interpreter = tf.lite.Interpreter(model_path='./model/model.tflite')
    interpreter.allocate_tensors()
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()
    print('Model loading completed.')

# Classify a image
def recog_image(img):
    dim = (IMAGE_SIZE, IMAGE_SIZE)
    img = cv2.resize(img, dim)
    img = img.reshape(1, IMAGE_SIZE, IMAGE_SIZE, 3)
    input_data = np.array(img, dtype=np.uint8)
    interpreter.set_tensor(input_details[0]['index'], input_data)
    interpreter.invoke()
    output_data = interpreter.get_tensor(output_details[0]['index'])
    return output_data[0]

# Set candidates with good probability
def set_result(output):
    data = []
    for i in range(CANDIDATE_MAX):
        no = np.argsort(output)[::-1][i]
        prob = np.sort(output)[::-1][i]
        if prob < THRESHOLD:
            break
        r = {'label': names.iat[no, 0], 'probability': str(prob)}
        data.append(r)
    return data

if __name__ == '__main__':
    load_dict()
    load_model()
    img = cv2.imread('./sample.jpg')
    input = img[:,:,::-1]
    output = recog_image(input)
    cand = set_result(output)
    print(cand)
    cv2.imshow('View Window', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

[動作例]
入力:
f:id:moonlight-aska:20200125102334p:plain:w300

結果:
f:id:moonlight-aska:20200125102352p:plain

"蝶尾"が正しく予測できてるー!!


AutoML Vision Edgeで学習したモデルをエクスポートし, ローカルのPCで画像分類ができることを確認した.
これで, Auto ML Visionでモデルをデプロイしなくて, アプリ内に画像分類処理を組み込んだり, 独自に画像分類サーバをたてることができそうだ.

----
参照URL:
[1] 「Kingyo AI Navi」のアプリ化を考える (1)~(4)
[2] 料金 | Cloud AutoML Vision | Google Cloud
[3] Edge device model quickstart | Cloud AutoML Vision | Google Cloud
[4] Training Edge exportable models | Cloud AutoML Vision | Google Cloud
[5] Exporting Edge models | Cloud AutoML Vision | Google Cloud
[6] AutoML Vision Edge: Build machine learning models for mobile and edge devices—in hours






グーグルに学ぶディープラーニング

グーグルに学ぶディープラーニング

  • 作者:
  • 出版社/メーカー: 日経BP
  • 発売日: 2017/01/26
  • メディア: 単行本(ソフトカバー)

AI時代の翻訳に役立つGoogle活用テクニック

AI時代の翻訳に役立つGoogle活用テクニック

  • 作者:安藤 進
  • 出版社/メーカー: 丸善出版
  • 発売日: 2018/06/14
  • メディア: 単行本(ソフトカバー)