【機械学習】GoogleのVertexAIで画像分類モデルを作ってみる

WEBCAMP ENGINEER COMMUNITY Advent Calendar 2022 17日目の記事になります！

# はじめに
都内でWEBエンジニアをしているsf-12と申します。普段はVue.jsやRails、GCPを使って自社サービスを開発しています。
今回は、普段あまり触ることのないサービスに触れてみようと思い、VertexAIを触ってみました。

# VertexAIとは
Google Cloud が提供している機械学習関連の統合プラットフォームです。
機械学習に使用するデータの収集や加工、モデルの作成や学習、テスト、デプロイなどを行うことができます。

# 作成するもの
画像に何が写っているか分類する機械学習モデルを作ってみようと思います。
画像データには[CIFAR-10](https://cifcs.toronto.edu/~kriz/cifar.html)と言われるデータを使用しました。
CIFAR-10は32x32ピクセルのカラー画像で、犬や猫などの10クラスの画像が6000枚ずつ用意されています。

今回はこのデータの中から、4種類（飛行機、自動車、猫、馬）の画像500枚ずつを使用し、それらを判別できるモデルを作成します。

（↓CIFAR-10 のデータサンプル）
![CIFAR-10 データサンプル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/cbd40a8d-cd3b-0c52-bd50-1c843b7aaaae.png)


# 手順
### 1.データを登録する
#### ダッシュボード画面
こちらがVertexAIのダッシュボード画面です。
まずはデータを登録するため、「トレーニングデータを準備する」のところの「データセットを作成」をクリックします。
![スクリーンショット 2022-12-15 1.15.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/5b5094b2-e560-e82c-abfb-8711d9a10cf9.png)

#### データタイプと目標の選択
「データセット名」に適当な名前を入れつつ、データタイプと目標の選択をします。
今回は複数の種類の画像を分類できるようにしたいので「画像分類（マルチラベル）」を選択します。
「作成」ボタンを押すとデータセットが作成できます。
![スクリーンショット 2022-12-15 1.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/0a7fb6c0-b354-adea-6014-35b810d9c05b.png)

#### データセットに画像を追加
データのインポート方法は3つのうちから選べるみたいです。
今回は「パソコンから画像をアップロード」を選択しました。
「ファイルを選択」ボタンを押し、ひとまず飛行機の画像100枚をアップロードしてみます。
※ データが多いとアップロードに少し時間がかかるのですが、完了したらメールで通知してくれます。やさしい😊
![スクリーンショット 2022-12-15 1.20.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/d185fcc9-e80a-e08c-9770-4fcac93d573e.png)

### 2.データにラベルを付ける
飛行機の画像100枚をアップロードした結果です。
画像にはまだラベル（これが何の画像なのか、についての情報）が付いていないため、これから付与していきます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/c3d86d20-46f1-9cdf-9280-cf7351d28f76.png)

画面中央やや左寄りのところに「新規ラベルを追加」というボタンがあるので、こちらをクリックします。
飛行機の画像に対してラベルをつけたいので、「airplane」と入力します。
![スクリーンショット 2022-12-15 1.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/d9ca70b8-b498-33ed-3978-fc98071e1131.png)

「完了」ボタンを押すと、「新規ラベルを追加」ボタンの上に「airplane」というラベルが作られました。
まだこのラベルを付与している画像がないので、数が0と表示されているのがわかります。
![スクリーンショット 2022-12-15 1.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/0c2b83ff-967c-bd49-d264-6b34ee4b3517.png)

すべて選択にチェックを入れて、
画面中央上にある「ラベルの割り当て」をクリックすると、右からラベル割り当てのナビゲーションが出てきます。
ここで「airplane」にチェックを入れて保存します。
![スクリーンショット 2022-12-15 1.35.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/e28a96af-ad7d-c052-4876-5527ebd5f9d0.png)

これで画像に「airplane」ラベルをつけることができました！
「airplane」のラベルの数が100になったのが確認できます。
![スクリーンショット 2022-12-15 1.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/6a95b355-7f18-57e0-55c8-6689e858e52a.png)

同じように画像データの登録とラベル付けを繰り返し、「airplane, automobile, cat, horse」のそれぞれ500データをラベル付けしました。
これでデータの準備は完了です！
![スクリーンショット 2022-12-16 2.40.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/f6c1d3a9-f3eb-e344-839a-0f7fc25c390d.png)

### 3.モデルの作成と学習

#### 新しいモデルのトレーニング
データの準備ができたので、機械学習モデルをトレーニングしていきます。
画面右側にある「新しいモデルのトレーニング」をクリック。
![新しいモデルのトレーニング](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/ee47baab-453a-00fb-1ad0-aa30ea21f68f.png)

#### トレーニング方法
デフォルトの設定で「続行」を押しました。お好みで調整してください。
![トレーニング方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/a9b15d42-e272-0321-ae25-5fca3b90910d.png)

#### モデルの詳細
こちらもデフォルト設定です。
![モデルの詳細](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/8273f07a-4995-9bad-e5ba-b1836c9026e2.png)

#### トレーニングオプション
デフォルト設定です。
![トレーニングオプション](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/68484292-114b-24b0-cc9f-addbe33485dd.png)

#### 説明可能性
こちらにチェックをつけると、どのような特徴が予測結果に影響するのか出力してくれます。余分にお金がかかるので今回はチェックなしにしました。
![説明可能性](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/3a3e5d37-fc37-df6d-d143-deca5ccafd1b.png)

#### コンピューティングと料金
ここで、最大どれくらいトレーニングさせるかを指定します。入力できる最小値が8だったため、8にしています。
早期停止を有効にする、にチェックを入れておくと、モデルに改善の余地がなくなるまでトレーニングが済んだ場合に指定したノード時間よりも早く停止してくれるため、料金を節約できます。
ここまで設定したら「トレーニングを開始」ボタンでモデルのトレーニングが始まります。
![コンピューティングと料金](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/37554cfb-a692-b2be-a6a8-9a2a4b07cada.png)

#### トレーニング中
トレーニングが開始されると、ステータスが「トレーニング」になります。トレーニングには時間がかかるため、完了したときにメールで通知してくれます。
![トレーニング中](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/66346823-018c-b66b-ceef-c43b52e4ff8b.png)

#### トレーニング結果
数時間後、トレーニングが終了して結果が表示されました。
適合率 90.2％となっているため、画像の90％を正しく予測できているようです。
![トレーニング結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/2d80b786-7cad-f2e8-98e2-ede6fb558ad1.png)

### 4.モデルのデプロイ
作成したモデルを試すためにデプロイします。
「デプロイとテスト」タブを開いて、「エンドポイントにデプロイ」をクリック。
![スクリーンショット 2022-12-16 6.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/cf021dea-7ccb-4482-7232-7474916ac58e.png)
ナビゲーションの指示に従って必要事項を埋めていきます。
エンドポイントの定義が終わったら「続行」ボタンをクリック。
![スクリーンショット 2022-12-16 6.14.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/72922eef-71d5-7c12-663f-d028897cc484.png)
「モデル設定」についても項目を埋めていきます。
最後に「デプロイ」をクリック。
![スクリーンショット 2022-12-16 6.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/aaeaff91-dddb-c8d9-ac44-338aa4759561.png)
これでデプロイできました！
「画像のアップロード」ボタンを押すことで、モデルが予測結果を返してくれます。
![スクリーンショット 2022-12-16 6.26.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/b49ed210-9c9c-8ad1-07b0-db3ef7a844f9.png)

# 予測してみる
いくつか画像をアップロードして、予測結果を確認してみます。
注意点として、ここでアップロードする画像はトレーニングで使用した画像とは別のものを用意します。
一度学習したことのある画像を使って予測させても、カンニングさせているような状態なのでちゃんと予測できているかわからないからです。
### 成功したケース
まずは、予測が成功しているケースからです。

airplaneが95%と予測しています。当たっていますね！個人的には自動車と飛行機の判別で迷うのかなと思っていたのですが、airplaneの次に数値が高いのがcat1.6%だったのが意外です。
![スクリーンショット 2022-12-16 17.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/3d2965a7-55d2-d2b2-f7b6-f34ebe1f7197.png)

automobileが97％でした。
![スクリーンショット 2022-12-16 17.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/69e1d140-175f-8603-b18a-0ffa19b0211c.png)

もはや人間の目で見ても猫なのかどうか怪しい画像ですが、きちんと判別できています。
![スクリーンショット 2022-12-16 17.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/11b06852-bf29-4e02-a8ff-2070a6d28e57.png)

人間が一緒に写っているみたいですが、ちゃんと馬だと認識できていました。
![スクリーンショット 2022-12-16 17.29.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/07edf42f-eb34-6405-d7a7-6e798fa353c9.png)

どれも正しく予測できてますね！

### 失敗したケース
予測が失敗してしまったケースについてもご紹介します。

こちらは飛行機なのですが馬と間違えています。飛行機の画像は背景が空の場合が多いのですが、この画像は背景が地面なので、判別が難しかったものと思われます。
![スクリーンショット 2022-12-16 17.36.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/aecaa675-ed9b-a936-0ad6-25c0de083e46.png)

これは猫なのですが、馬と間違えています。おそらく靴の爪先に猫がじゃれている画像なのですが、爪先と猫を一体として捉えて馬と判別しているものと思われます。
![スクリーンショット 2022-12-16 17.27.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/ec9df15f-57bd-0383-a6b9-5214f8c001ae.png)

こちらは自動車なのですが飛行機と間違えています。背景が空色なので、飛行機と判別してしまったものと思われます。
![スクリーンショット 2022-12-16 17.38.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/dfeb1003-e96c-08f7-e0d5-6b3de55d3d60.png)

# 所感
VertexAIでは難しい知識なしに指示に従うだけて機械学習モデルを作成することができました。各ラベルのデータが500枚だと少ないかと思っていたのですが、想定以上に高性能のモデルを作ることができて驚いています。今回はお試しでモデルを作成して精度を検証するだけでしたが、Webサービスに組み込めば面白いサービスが色々作れそうなので次回があればチャレンジしてみようと思いました。