LoginSignup
10
10

More than 5 years have passed since last update.

AutoML Vision APIを使ってみた

Posted at

AutoML VisionのAPIを使って見たのでメモを残しておきます。

今回は、pythonを使います。JAVA、node.jsも使えるみたいです。
Client Libraries

この辺りを参考にしながらやっていきます。

サンプルコード

基本的に、AutoML VisionのPREDICTタブにあるpythonのコードのまま叩けます。

from google.cloud import automl_v1beta1
# 認証
KEY_FILE = "******.json"
prediction_client = automl_v1beta1.PredictionServiceClient()
prediction_client = prediction_client.from_service_account_json(KEY_FILE)

# 予測
name = 'projects/{}/locations/us-central1/models/{}'.format(project_id, model_id)
payload = {'image': {'image_bytes': content }}
request = prediction_client.predict(name, payload)

# 予測結果の取得
print(request)

認証

automl_v1beta1.PredictionServiceClient()で認証を行います。
以下のように環境変数を設定しておくとそこから自動で読み込んでくれるらしい。

export GOOGLE_APPLICATION_CREDENTIALS=key-file

今回は環境変数を汚したくなかったのでファイルから読み込むようにしました。


prediction_client.from_service_account_json(KEY_FILE)

予測

nameにはproject_idとモデルidを、payloadには指定されたフォーマットのjsonを使って、予測したい画像を与えます。

name = 'projects/{}/locations/us-central1/models/{}'.format(project_id, model_id)
payload = {'image': {'image_bytes': content }}

残りの引数は以下の通り。

def predict(self,
                name,
                payload,
                params=None,
                retry=google.api_core.gapic_v1.method.DEFAULT,
                timeout=google.api_core.gapic_v1.method.DEFAULT,
                metadata=None):
  • params (dict[str -> str])の形で score_thresholdなどのパラメータを渡す。
  • retry retryクラスがあるのでそれにそって渡す。デフォルトではretryしない。
  • timeout predictに割と時間がかかることがあるので、タイムアウトはセットしておいても良いかも。 Github sourceによるとデフォルト値は60s

予測結果の取得

jsonかと思わせてjsonじゃないフォーマットだったので、ハマりました。

request = prediction_client.predict(name, payload)
print(request)

AutoML VisionのPREDICTタブにあるpythonのコードを実行すると、以下の結果が返ってきます。

payload {
  classification {
    score: 0.215105131269
  }
  display_name: "kotobuki_tsumugi"
}

scoreは予測結果、display_nameはラベル。
これがjsonかと思わせて、jsonじゃないのが罠です。

そこで、ドキュメントをみると、以下のように書いてあります。

Returns: A PredictResponse instance.

で、PredictResponce instanceというのは以下。

class google.cloud.automl_v1beta1.types.PredictResponse
 - payload
 - metadata

なにやらpayloadとmetadataをもっているクラスだそうです。

そこで、以下のようにするとうまく中身が取り出せます。

print (request.payload)

出力

[classification {
  score: 0.215105131269
}
display_name: "kotobuki_tsumugi"
]

さらに、scoreとdisplay_nameは以下のようにすると取り出せます。

score = request.payload[0].classification.score
display_name = request.payload[0].display_name

print(score, display_name)

出力

0.215105131269
kotobuki_tsumugi

無事中身が取り出せました。

予測結果の取得2

データセットを増やすと、Precisionは高い値となったがRecallは低くなりました。

すると、判定しようとした画像によっては、予測結果が空で返ってくることがありました。おそらく、Recall(再現度)が低いと、空が返ってくる模様。payloadにerror文とかは入れてくれてないんですね...。

PrecisionとRecallはAutoML VisionのEVALUATEタブにあるScore thresholdのバーから変更できます。データセットの画像がTrue positives/False negativesかどうかをみることができるのでそれを見ながら調整できます。

APIを叩くときには、predictの引数のparamsから設定できます。デフォルトは0.5。

まとめ

今回は、pythonを使ってAutoML VisionのAPIを叩いてみました。
簡単に使うことができて、リファレンスもちゃんとあるので難しくないかと思います。まだベータ版なので出力結果のフォーマットやエラー周りは、これからわかりやすく変わってくるのではないでしょうか。

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10