LoginSignup
0
0

More than 1 year has passed since last update.

AutoML Vision で物体検出モデルを作成する為の学習データセットをVoTTで作成してみた

Posted at

はじめに

以前、AutoML Vision EdgeでTensorFlow.js用のモデルをexportしてみたというタイトルで、サンプルデータを利用したモデルの作成とEdgeデバイス向けにモデルをエクスポートするところまで試したので、今回はAutoML Vision用の学習データセットを自分で作成してみようと思います。

VoTTのインストール

画像に対するラベル付けについては、GCPのWeb画面上で操作出来るツールがありますが、やはりローカルで作業出来た方が良いと思ったので、今回はVoTT(マイクロソフト社製のアノテーションツール)を利用することにしました。※こちらからダウンロード出来ますので、ご利用の環境に合ったものをインストールしてください。

VoTTでラベル付きのデータを作成する

ラベル付け作業はVoTTの公式ドキュメントに記載されている手順で実施し、作業が完了したらCSV形式でエクスポートしてください。※VoTTでエクスポート出来るフォーマットの中にAutoML Visionでそのまま読み込めるものがない為、以降の手順でフォーマットを変換します。

GCSにバケットを作成する

VoTTでエクスポートした画像データを格納する、GCSのバケット(+ディレクトリ)を作成します。

フォーマットを変換するスクリプトを実行する

以下に記載したスクリプトを実行すると、スクリプトを実行したディレクトリにAutoML VisionフォーマットのCSVファイルが出力されます。※スクリプトを作成するにあたり、こちらの情報を参考にさせて頂きました。

以下の定数は環境に合わせて適宜書き換えてください。
GCS_IMAGE_DIR_PATH : 画像データを格納するGCSのディレクトリパス
EXPORT_DIR_PATH : VoTTでエクスポートしたデータが格納されているディレクトリパス
EXPORT_FILE_NAME : VoTTでエクスポートしたCSVファイル名
CONVERT_FILE_NAME : 出力されるCSVファイル名


import pandas as pd
import cv2

# Google Cloud Storage の画像を格納するディレクトリのパス
GCS_IMAGE_DIR_PATH = 'gs://***/'

# VoTTのエクスポートしたデータの情報
EXPORT_DIR_PATH = '/***/'
EXPORT_FILE_NAME = '***.csv'

# AutoML Vision用に変換したCSVファイルのファイル名
CONVERT_FILE_NAME = '***.csv'

# AutoML Vision のフォーマット
COLUMNS_LIST = [
    'set',
    'path',
    'label',
    'x_min',
    'y_min',
    'x_max_not_used',
    'y_min_not_used',
    'x_max',
    'y_max',
    'x_min_not_used',
    'y_max_not_used'
]


# OpenCVの機能を利用して、画像の高さと幅を取得する
def get_height_and_width(image_path):

    file_name = image_path.split('/')[-1]
    img = cv2.imread(EXPORT_DIR_PATH + file_name)

    height, width, _ = img.shape

    return pd.Series([height, width])


if __name__ == "__main__":

    # VoTTで出力したCSVファイルの読み込み
    df = pd.read_csv(EXPORT_DIR_PATH + EXPORT_FILE_NAME)

    # AutoML Vision のフォーマットだと、座標はwidth, heightを1とした相対値にする必要があるので
    # OpenCVでwidth, heightを取得して、それぞれ計算する
    df[['height', 'width']] = df['image'].apply(get_height_and_width)
    df['x_min'] = df['xmin'] / df['width']
    df['y_min'] = df['ymin'] / df['height']
    df['x_max'] = df['xmax'] / df['width']
    df['y_max'] = df['ymax'] / df['height']

    # TRAINING、VALIDATION、TEST、UNASSIGNEDから選択可能、GCP側で自動で割り振って欲しいのでUNASSIGNEDを選択する
    df['set'] = 'UNASSIGNED'

    # バウンディングボックスを構成する頂点4つの内、対角線上にある2点を指定すれば良いので、残りはNULLで埋める
    df['x_max_not_used'] = None
    df['y_min_not_used'] = None
    df['x_min_not_used'] = None
    df['y_max_not_used'] = None

    # 画像のファイルパスを、GCSに格納された時のファイルパスに変換する(カラム名も公式ドキュメントに合わせて変更する)
    df['path'] = df['image'].apply(lambda x: GCS_IMAGE_DIR_PATH + x.split('/')[-1])

    # AutoML Vision のフォーマット(並び順も含めて)に合わせて、CSV形式で出力する
    df[COLUMNS_LIST].to_csv(CONVERT_FILE_NAME, header=False, index=False)

GCSのバケットに学習データセットをアップロードする

ここまでの作業で、学習用の画像データとバウンディングボックスの情報などが記載されたAutoML VisionフォーマットのCSVファイルが用意出来ているはずなので、データセット一式を先ほど作成したGCSのバケット(GCS_IMAGE_DIR_PATHに記載したパス)にアップロードします。

AutoML Vision からインポートする

以降の手順については、こちらを参考にすれば問題なくAutoML Visionにデータをインポート出来ると思います。

0
0
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
0
0