はじめに
- Google Cloud AutoML の凄さを体感したく思っていました。
- 先日、TensorFlowで安倍乙と石原さとみの顔認識をやってみた で利用した画像を利用して、比較してみます。
画像
- 画像は、グレースケール化とリサイズ
28x28
したものを利用します。 - 以下が画像の概要です。
名前 | フォルダ名 | 画像数 |
---|---|---|
安倍乙 | 0_abe_oto | 415 |
石原さとみ | 1_ishihara_satomi | 492 |
大原優乃 | 2_ohara_yuno | 372 |
小芝風花 | 3_koshiba_fuka | 400 |
川口春奈 | 4_kawaguchi_haruna | 369 |
森七菜 | 5_mori_nana | 389 |
浜辺美波 | 6_hamabe_minami | 481 |
清原果耶 | 7_kiyohara_kaya | 428 |
福原遥 | 8_fukuhara_haruka | 420 |
黒島結菜 | 9_kuroshima_yuina | 448 |
AutoML
画像のzip化
- AutoML へ画像をアップロードするために
zip
化を行います。 -
.jpeg
を複数ファイルアップロードすることも出来ますが、この場合は、UIでラベル付等をする必要があります。 - 以下の様なフォルダ構成を準備します。
-
images
等の中にラベル名とするフォルダ名0_abe_oto
を作成します。ラベル名は、安倍乙
等の日本語は使えません。 -
0_abe_oto
には、トレーニング、検証、テストに利用する画像ファイルを保存します。
$ tree
.
├── images
│ ├── 0_abe_oto
│ │ ├── 0002-0001.jpeg
│ │ ├── 0004-0001.jpeg
省略
│ ├── 1_ishihara_satomi
│ │ ├── 0001-0001.jpeg
│ │ ├── 0004-0001.jpeg
- 上記を
zip
化します。
$ zip images.zip -r images
adding: images/ (stored 0%)
adding: images/2_ohara_yuno/ (stored 0%)
adding: images/2_ohara_yuno/0393-0001.jpeg (deflated 1%)
省略
プロジェクトの作成
- GCPコンパネでプロジェクトを作成しました。
AutoML Vision の有効化
新しいデータセット
- データセット名を適当につけます。
- 今回は、10人の女優の画像があるので、
マルチラベル分類
を選びます。
- パソコンから画像をアップロードします。今回は、
images.zip
ですね。
- 保存する Cloud Storage を選択します。
- 新規プロジェクトから AutoML APIを有効にした場合は、バケットが作成されているはずです。
- 画像のインポートは、ある程度の時間がかかります。
images.zip
内のファイル数は約4,000、ファイルサイズは約4Mバイトです。 - 終了すると、メール通知があります。だいたい、20分かかりました。
イメージの確認
- ラベル、画像等が確認できます。
トレーニング
- アップロードした画像は、トレーニング、検証、テストに分けられていました。
- マニュアルには、以下の記載があります。
- 各ラベルの画像は、最低100枚、理想的には1,000枚とのこと。
- モデルは、
Cloud hosted
にしました。
- ノード時間は、悩ましいところです。今回の推奨では、
32ノード時間
になっていました。 - これは、画像数が約4,000枚だからでしょう。
-
料金は、以下の様になります。
- 32ノード時間 * 3.15ドル = 100.8ドル = 約11,000円
- 今回は、以下の説明があったので
8ノード時間
にしました。 - また、REST API も試してみたいので、デプロイしました。
- だいたい、1時間後に完了のメールが届きました。
トレーニング結果
- 平均適合率は
0.673
でした。 - 適合率、再現率等は、AutoML Vision 初心者向けガイド 評価 を確認して頂ければと思います。
- 混同行列は、見やすくて良いですね!
テストと使用
- 画像をアップロードして確認することが出来ます。
REST API
-
REST API を使ってみます。
-
画像をBASE64にします。
$ base64 -i input.jpg -o output.txt
$ cat output.txt
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/wAALCAAcABwBAREA/8QAFwABAQEBAAAAAAAAAAAAAAAACQcICv/EACsQAAEDBAEEAQMEAwAAAAAAAAECAwQFBgcRCAASEyExCUFRCiIycRRhof/aAAgBAQAAPwDG+IL1g1Wj0CVftWjQUX1fkGXWnJLqUJTGXUEABSlaCW0tMqBHxpQ66G6hnPFdKx+q9nLxhCiRofkXUmXkqZDYT7IUnY0B9x0Uf1wsxcdOSfHSHcuJrslVOrUOvtSoM5duTI7D7KwW3fDIdaSh0DuSSEk/G/evRAXdLZqdbcqjDYaTKSl3sHsAkbP/AHfV54rYpyryvzfbeJcZzGUPxPHK80yA1LZitNBLaStl0Ft3167FAje/R66MsX8UqPbXGeJY15mM7JiojvzlMw22m/2kfLTaQhI9JJSAE/PoD11jT6h308sbYo4l5VzDkrMN4XNKatudKoqrmu2XOS1KUsLZUEuLDaQj022hCEpSk69+ugZET/IQkkgdg7dHXrpI/wBO2xabOWKlXVOtpqwUG3w6sb8Q/glI/G+4n8k/10ofMLkVWqVbsulY5ydka2ELZ8VUVTLOg9jw7gVPR5E91o77U9oUnvaA2dEnrC31xee1OyBxCoeJ6FCq9Lk3MiM0KbW0tomuspUD5HEtLWgBQSFelH+Q+N66IMR3nE94JBJPdr87PVL4sZNvzEmWEXrju5ZFLnwkKcQtggocAAJQtBBStB+4I/rR99PZYPK69L84Z0DMl22JZ9QrS6WHwudQA+htYbJ2gOqUUex9j0FmaM+ZF5ac6o92ZinR5DhvBiAzChseKNHjokpT2Ib2db1tRJJJ/wBaAlh0002UgfvClnf2JWonXX//2Q==
- request.json を作成します。上記のBASE64の結果を
imageBytes
に設定します。
{
"payload": {
"image": {
"imageBytes": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/wAALCAAcABwBAREA/8QAFwABAQEBAAAAAAAAAAAAAAAACQcICv/EACsQAAEDBAEEAQMEAwAAAAAAAAECAwQFBgcRCAASEyExCUFRCiIycRRhof/aAAgBAQAAPwDG+IL1g1Wj0CVftWjQUX1fkGXWnJLqUJTGXUEABSlaCW0tMqBHxpQ66G6hnPFdKx+q9nLxhCiRofkXUmXkqZDYT7IUnY0B9x0Uf1wsxcdOSfHSHcuJrslVOrUOvtSoM5duTI7D7KwW3fDIdaSh0DuSSEk/G/evRAXdLZqdbcqjDYaTKSl3sHsAkbP/AHfV54rYpyryvzfbeJcZzGUPxPHK80yA1LZitNBLaStl0Ft3167FAje/R66MsX8UqPbXGeJY15mM7JiojvzlMw22m/2kfLTaQhI9JJSAE/PoD11jT6h308sbYo4l5VzDkrMN4XNKatudKoqrmu2XOS1KUsLZUEuLDaQj022hCEpSk69+ugZET/IQkkgdg7dHXrpI/wBO2xabOWKlXVOtpqwUG3w6sb8Q/glI/G+4n8k/10ofMLkVWqVbsulY5ydka2ELZ8VUVTLOg9jw7gVPR5E91o77U9oUnvaA2dEnrC31xee1OyBxCoeJ6FCq9Lk3MiM0KbW0tomuspUD5HEtLWgBQSFelH+Q+N66IMR3nE94JBJPdr87PVL4sZNvzEmWEXrju5ZFLnwkKcQtggocAAJQtBBStB+4I/rR99PZYPK69L84Z0DMl22JZ9QrS6WHwudQA+htYbJ2gOqUUex9j0FmaM+ZF5ac6o92ZinR5DhvBiAzChseKNHjokpT2Ib2db1tRJJJ/wBaAlh0002UgfvClnf2JWonXX//2Q=="
}
}
}
- サービスアカウントを AutoML 編集者で作成して、keyをダウンロードします。
$ export GOOGLE_APPLICATION_CREDENTIALS=/Users/maeda_mikio/Downloads/automl-20200111-67d782c3de3c.json
- curlを実行します。予測結果が取得出来ました。
$ curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" https://automl.googleapis.com/v1beta1/projects/655668842161/locations/us-central1/models/ICN6623260133629624320:predict -d @request.json
{
"payload": [
{
"annotationSpecId": "3339315769602211840",
"classification": {
"score": 0.8167497
},
"displayName": "0_abe_oto"
}
]
}
Python
- Pythonでも実行します。
$ pip install google-cloud-automl
predict.py
import sys
from google.cloud import automl_v1beta1
from google.cloud.automl_v1beta1.proto import service_pb2
# 'content' is base-64-encoded image data.
def get_prediction(content, project_id, model_id):
prediction_client = automl_v1beta1.PredictionServiceClient()
name = 'projects/{}/locations/us-central1/models/{}'.format(project_id, model_id)
payload = {'image': {'image_bytes': content }}
params = {}
request = prediction_client.predict(name, payload, params)
return request # waits till request is returned
if __name__ == '__main__':
file_path = sys.argv[1]
project_id = sys.argv[2]
model_id = sys.argv[3]
with open(file_path, 'rb') as ff:
content = ff.read()
print(get_prediction(content, project_id, model_id))
$ python3 predict.py input.jpg 655668842161 ICN6623260133629624320
payload {
annotation_spec_id: "3339315769602211840"
classification {
score: 0.8167496919631958
}
display_name: "0_abe_oto"
}
おわりに
- AutoML Vision で画像の分類をやりました。
- 評価結果は、非常にわかりやすいですね。また、REST API、Pythonからの利用も簡単です。
- ただ、料金はきになる部分ですね。個人での利用は、悩ましいな。