Kaggleにリンゴとトマトの画像を分類するという課題があります。
GCP Vertex AIを用いてこの課題を解いてみます。
また作成したモデルを使って、画像の自動分類器を作成します。
データセットをダウンロードする
上記のURLからデータセット(リンゴとトマトの画像)をダウンロードできます。(要ログイン)
データセット中にはモデルの訓練用の train
と 検証用の test
が含まれています。
データセットをアップロードする
画像ファイルをCloud Storageにアップロードします。
あとでVertex AIにとりこむ際に、以下2点が必要です。
- 画像ファイルそのもの
- 画像ファイルのパスと、ラベルの対応を示したCSVファイル
CSVファイルの書式は以下のとおりで、1列目がCloud Storage上のパス、2列目がラベルです。
(例)
gs://hogehoge/train0.jpg,apple
gs://hogehoge/train1.jpg,apple
gs://hogehoge/train2.jpg,tomato
gs://hogehoge/train3.jpg,tomato
モデルを作成する
- Vertex AIにアクセスします。
- データセットを作成します。
- ウィザードでデータの種別と目的を選択します。
- 今回は画像分類かつラベル1つのため
Image classification (Single-label)
とします。
- モデルの訓練を行います。
- 途中、Budgetの指定を求められます。この記事では最低の8を指定しました。
-
機械学習の完了を待ちます。
- 筆者の環境では学習完了まで約2時間を要しました。
-
学習を完了すると、モデルの精度を確認できます。
- 混合行列の形でも確認できます。
エンドポイントを作成する
- Cloud Functionsから作成したモデルを利用できるように、エンドポイントを作成します。
- 同じ画面上で、画像をアップロードし、モデルをテストできます。
- この画像の場合は、確度100%でリンゴと判定しています。
- 同じ画面上で、エンドポイントの呼び出し方を確認できます。
- 以下の画像でREST APIを試してみます。
- こちらは99.9%の確度でトマトと判定しています。
{
"predictions": [
{
"ids": [
"7964256950458253312"
],
"confidences": [
0.999813378
],
"displayNames": [
"tomato"
]
}
],
"deployedModelId": "1595853166786641920",
"model": "projects/579808288126/locations/us-central1/models/200711449603997696",
"modelDisplayName": "untitled_1675029982159",
"modelVersionId": "1"
}
Cloud Functionsを作成する
先に作成したエンドポイントを呼び出す、Cloud Functionsを作成します。
動作概要
-
src
バケットへの画像アップロードをトリガーにCloud Functionsを実行する。 - 先に作成したエンドポイントを呼び出し、リンゴかトマトか判別する。
- リンゴの場合は
apple
バケットへ トマトの場合はtomato
バケットへ画像を移動する。
認証
Vertex AIエンドポイントの呼び出しにはアクセストークンが必要です。
Cloud Functionsでアクセストークンを得るには、メタデータサーバーにアクセスします。
動作確認
-
src
バケットに画像をアップロードすると、apple
/tomato
バケットに自動で振り分けられます。 - ダウンロードしたデータセット中の
test
ディレクトリ内の画像をテストに使えます。
ソースコード全体
CDK for Terraformによる環境構築コードも含みます。
料金
Cloud Storage, Cloud Functionsの料金は微々たるものなので、Vertex AIの料金が大半を占めます。
Vertex AIの価格表によれば、以下のとおりです。
- トレーニング 3.465ドル/ノード・時間
- デプロイとオンライン予測 1.375ドル/ノード・時間
トレーニングで先に設定した8ノード・時間の予約枠を使いきったと仮定し、
1ノード・時間程度、デプロイしておいたとすると、
利用料金は約25ドルになります。
後始末
デプロイ状態だと課金対象になるため、エンドポイントを削除します。
プロジェクトごと削除するのが確実です。