AutoML(Vertex AI)でおもちゃの画像分類をやってみた

記事タイトルとURLをコピーする

G-genの片岩です。当記事では AutoML を利用して、実際におもちゃの画像分類をしてみた事例をご紹介します。

画像分類とは

画像分類とは、ある画像を見たときに、その画像のラベルを予測することです。さまざまな分野で応用されていますが、たとえば以下のような用途が挙げられます。

  • 大量の建築物件の画像を、玄関やキッチン、浴室や外観などに分類する
  • 原材料の不良品を検知する

Google Cloud の機械学習サービスである Vertex AI には、容易に画像分類できる AutoML サービスが含まれます。今回はそのサービスを利用してプラレール、アンパンマン、ブロックの写真を分類しました。

なお、Vertex AI について詳しく知りたい方は、以下の記事をご覧ください。

blog.g-gen.co.jp

画像データの確保

人間の子供でも同じですが、プラレール、アンパンマン、ブロックの画像を用意して、各画像がどのラベルに属するかをあらかじめ学習させる必要があります。そのために必要な写真を撮影して画像データを確保します。

画像データの前処理

公式ドキュメントでは、ラベルごとに1,000枚のトレーニング画像を用意することが推奨されています。撮影する労力を削減するために、上下左右にシフトした画像や回転させた画像を生成し、画像データ数を20倍に増やしました。あわせて、今回は非常にシンプルな画像しか扱わないため、画像データの解像度を下げてデータを軽量化しました。
参考までに回転させた画像を生成するプログラムを掲載します。

import glob
import os
import cv2

dataName = "block"

dataPath = "drive/MyDrive/testData/test/" + dataName + "/1_input/*"
files = glob.glob(dataPath)

for file in files:
  basename = os.path.basename(file)
  print(basename)
  img = cv2.imread(file)

  img_rotate_90_clockwise = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
  img_rotate_180 = cv2.rotate(img, cv2.ROTATE_180)
  img_rotate_90_counterclockwise = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)

  dataPath2 = "drive/MyDrive/testData/test/" + dataName + "/2_rotate/"
  path = os.path.join(dataPath2,basename)
  cv2.imwrite(path, img)
  path = os.path.join(dataPath2,'rot90_' + basename)
  cv2.imwrite(path, img_rotate_90_clockwise)
  path = os.path.join(dataPath2,'rot180_' + basename)
  cv2.imwrite(path, img_rotate_180)
  path = os.path.join(dataPath2,'rot270_' + basename)
  cv2.imwrite(path, img_rotate_90_counterclockwise)
print("完了")

Vertex AI のデータセット作成

Vertex AI のメニューから画像分類(単一ラベル)のデータセットを作成します。

次に、前処理した画像データを Cloud Storage に保存します。
そして、トレーニングさせたい画像ファイルのパスとラベルを以下のように記載した csv ファイルを作成し、Cloud Storage に保存します。

gs://xxxxx_bucket/IMG_6291.jpg,block
gs://xxxxx_bucket/IMG_6292.jpg,block
gs://xxxxx_bucket/IMG_6293.jpg,block
gs://xxxxx_bucket/IMG_6294.jpg,train

上記で作成した csv ファイルを指定して、インポートを実行します。

各画像ファイルにラベルが付与された状態でインポートされます。
今回は2,300枚の画像と3種類のラベルになりました。

トレーニング

トレーニングに費やすノード時間を設定してトレーニングを実行します。
今回はノード時間に最小値である8を設定しました。

今回の検証の主な費用として、トレーニングに約3,800円掛かりました。
ノード時間は費用に直結する部分になります。 トレーニングに掛かる料金は公式ドキュメントをご覧ください。

トレーニング結果確認

トレーニング完了後に結果を確認します。
トレーニング中に内部的に実行されるテストでは、100%分類できた結果となりました。

予測

新しい画像のラベルを予測するために、エンドポイントにデプロイします。

デプロイ完了後に新しい画像アップロードして予測させたところ、ほぼ100%で的中しています。今回のデータくらいシンプルだと、簡単に分類できることが判ります。
データが複雑な場合でも、ラベルの特徴を捉えた画像を用意すれば分類できそうです。

片岩 裕貴 (記事一覧)

データアナリティクス準備室

2022年5月にG-gen にジョイン。
AI/ML系に関心が強く、ディープラーニングE資格とProfessional Machine Learningを取得。最近話題のGenerative AIにも興味がある。毎日の日課は三人乗りの電動自転車で子供を幼稚園に送り迎えすること。和歌山県在住。