みらいテックラボ

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

Cloud AutoML Visionは金魚を見分けられるか?

今年のGoogle Cloud Next '18で発表されたCloud AutoML Vision(Public Beta) [1]を試してみた.
Cloud AutoMLは, 機械学習やコーディングに関する専門知識がなくても, 誰でも独自のニーズに合わせてカスタマイズした機械学習モデルを作れるというサービスだ.

基本的な使い方は, Cloud AutoML Visionドキュメント(ただし, Alpha版用)[2] の入門ガイドや「Google Cloud AutoML Visionの使い方 機械学習モデルを作ってみよう」[3]などが参考になる.

今回は, 「金魚って見分けられる? (1)」[4]で収集した22種類の金魚画像を使って, 金魚の分類をやってみることにした.


1. データの準備
データセットの作成方法は, AutoML Visionインタフェースを使用して, 簡単に作成することができる.

[手順]
1) 「ADD IMAGES > Upload from your computer」で, 画像を選択してアップロードする.
f:id:moonlight-aska:20181013091516p:plain:w500

2) Add labelで, ラベルを登録する.
f:id:moonlight-aska:20181013092019p:plain:w500

3) 各画像を選択し, ラベルを付与する.
f:id:moonlight-aska:20181013092505p:plain:w500

かなり簡単な操作で, ラベル付きのデータセットが作成できるようになっている.

しかし, すでにラベルがあるデータや, 多数のデータをこれでやるのは結構大変そうである.
そのような場合は, データをCloud Storageにあげておき, ファイル名とラベルを記載したimage list(CSVファイル)をインポートし, データセットを作成することもできる.

CSVファイルの例:
f:id:moonlight-aska:20181013093631p:plain

で, 出来上がったデータセットはこちら.
f:id:moonlight-aska:20181013094928p:plain

ちょっと便利なところは, 同一の画像がアップロードされると, チェックして除去してくれる点だ.

Duplicated files detected gs://PROJECT_ID-vcm/DATASET_NAME/images/chakin/GF13-00014.jpg and gs://PROJECT_ID-vcm/DATASET_NAME/images/chakin/GF13-00012.jpg have the same content

それゆえ, 集めたデータ内に重複があるかどうかをあまり気にせず, データをどんどん登録すればよい.


2. モデルの学習&評価
モデルの学習は, AutoML Visionインタフェースの「TRAIN」から行うことができる.
学習には数十分くらいかかったと思うが, AutoMLがよきに計らってくれるので, とても簡単である.
データセットは, デフォルトではランダムに3つのセットに分割され, 学習&評価に使用されるそうだ.
・80%がトレーニングに
・10%がハイパーパラメータ調整と, トレーニングの停止するタイミングの決定に
・10%がモデルの評価に. (トレーニングには使用しない)

学習した結果がこちら.
f:id:moonlight-aska:20181013104228p:plain


3. 分類テスト
AutoML Visionインタフェースの「PREDICT」から画像をアップロードすることで行うことができるが, 今回はPythonからAPIコールして分類をやってみた.

[コード]

import argparse
import cv2
import numpy as np
from google.cloud import automl_v1beta1 as automl

# AutoML情報
project_id = 'PROJECT_ID'
compute_region = 'us-central1'
model_id = 'MODEL_ID'

def main(args):
    # AutoML & Model情報
    automl_client = automl.AutoMlClient()
    prediction_client = automl.PredictionServiceClient()
    model_full_id = automl_client.model_path(project_id,
                                             compute_region,
                                             model_id)
    params = {}
    if args.threshold:
        params = {"score_threshold" : args.threshold }

    # データ読み込み
    with open(args.input, 'rb') as image_file:
        content = image_file.read()
    payload = {"image": {"image_bytes": content}}

    # 予測
    response = prediction_client.predict(model_full_id, payload, params)
    print('prediction results:')
    for result in response.payload:
        print('Predicted class name: {}'.format(result.display_name))
        print('Predicted class score: {}'.format(result.classification.score))

    # 結果表示
    if args.view:
        img = cv2.imread(args.input)
        if img is not None:
            width, height, channel = img.shape[:3]
            print(width, height)
            cv2.putText(img, result.display_name, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255))
            score = '{:06f}'.format(result.classification.score)
            cv2.putText(img, score, (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255))
            cv2.imshow('Image', img)
            cv2.waitKey(0)
            cv2.destroyAllWindows()

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    help_ = 'Input file'
    parser.add_argument('-i', '--input', help=help_)
    help_ = 'Score threshold (0.0 - 0.5)'
    parser.add_argument('-t', '--threshold', help=help_)
    help_ = 'View window'
    parser.add_argument('-v', '--view', help=help_, action='store_true')
    args = parser.parse_args()
    main(args)

f:id:moonlight-aska:20181013210721p:plain:w500

一応金魚画像で, 分類を試せるようになった.
数枚程度しか試してないが, 学習データが少なくてもそこそこ認識している感じ.

わりと簡単にカスタム学習モデルが作れたので, アイデアとデータ/ラベルがあれば画像認識を活用したちょっとしたものが意外と簡単に作れるかも...

次は, Androidjavaから利用できるか試してみよう.

----
参照URL:
[1] Cloud AutoML - カスタム機械学習モデル | AutoML | Google Cloud
[2] Cloud AutoML Vision ドキュメント | Cloud AutoML Vision | Google Cloud
[3] Google Cloud AutoML Visionの使い方 機械学習モデルを作ってみよう | あぱーブログ
[4] 金魚って見分けられる? (1) - みらいテックラボ




Google Cloud Platformではじめる機械学習と深層学習

Google Cloud Platformではじめる機械学習と深層学習


Google Cloud Platformによる機械学習システム構築

Google Cloud Platformによる機械学習システム構築