組み込み画像オブジェクト検出アルゴリズム スタートガイド

AI Platform Training の組み込みアルゴリズムを使用すると、トレーニング アプリケーションのコードを一切作成せずに、トレーニング データの送信とアルゴリズムの選択を行い、AI Platform Training による前処理とトレーニングを実施できます。画像組み込みアルゴリズムを使用すると、最小限の構成を使用し TPU 上でトレーニングできます。結果として生成される TensorFlow SavedModel は、CPU と GPU での処理に対応しています。

概要

このチュートリアルでは、コードを記述せずに画像オブジェクト検出モデルをトレーニングします。COCO データセットを AI Platform Training に送信してトレーニングを行い、AI Platform Training にモデルをデプロイして予測を取得します。結果として得られるモデルにより、複雑な日常のシーンの画像内にある一般的なオブジェクトが分類されます。

始める前に

コマンドラインでこのチュートリアルを実行するには、Cloud Shell を使用するか、Google Cloud CLI がインストールされている環境を使用します。

次の手順で GCP アカウントの設定、必要な API の有効化、Google Cloud CLI のインストールと有効化を行います。

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. AI Platform Training & Prediction and Compute Engine API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  8. Google Cloud プロジェクトで課金が有効になっていることを確認します

  9. AI Platform Training & Prediction and Compute Engine API を有効にします。

    API を有効にする

  10. Google Cloud CLI をインストールします。
  11. gcloud CLI を初期化するには:

    gcloud init

Cloud TPU にプロジェクトへのアクセスを許可する

Google Cloud プロジェクトに関連付けられた Cloud TPU サービス アカウント名を承認する手順は次のとおりです。

  1. projects.getConfig を呼び出して、Cloud TPU サービス アカウント名を取得します。例:

    PROJECT_ID=PROJECT_ID
    
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
        https://ml.googleapis.com/v1/projects/$PROJECT_ID:getConfig
    
  2. API から返された serviceAccountProjecttpuServiceAccount フィールドの値を保存します。

  3. Cloud TPU サービス アカウントを初期化します。

    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
      -H "Content-Type: application/json" -d '{}'  \
      https://serviceusage.googleapis.com/v1beta1/projects/<serviceAccountProject>/services/tpu.googleapis.com:generateServiceIdentity
    

Cloud ML サービス エージェントのロールを使用して、Cloud TPU サービス アカウントをプロジェクト内のメンバーとして追加します。Google Cloud Console または gcloud コマンドを使用して、次の手順を行います。

コンソール

  1. Google Cloud Console にログインし、TPU を使用しているプロジェクトを選択します。
  2. [IAM と管理] > [IAM] を選択します。
  3. [追加] ボタンをクリックして、プロジェクトにメンバーを追加します。
  4. [メンバー] テキスト ボックスに TPU サービス アカウントを入力します。
  5. [ロール] プルダウン リストをクリックします。
  6. Cloud ML サービス エージェントのロールを有効にします([サービス エージェント] > [Cloud ML サービス エージェント])。

gcloud

  1. プロジェクト ID と Cloud TPU サービス アカウントが格納されている環境変数を設定します。

    PROJECT_ID=PROJECT_ID
    SVC_ACCOUNT=your-tpu-sa-123@your-tpu-sa.google.com.iam.gserviceaccount.com
    
  2. Cloud TPU サービス アカウントに ml.serviceAgent ロールを付与します。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member serviceAccount:$SVC_ACCOUNT --role roles/ml.serviceAgent
    

サービス アカウントへのロールの付与については、IAM のドキュメントをご覧ください。

設定

このチュートリアルで使用するため、COCO データセットに変更を加えて、Cloud Storage の公開バケット gs://cloud-samples-data/ai-platform/built-in/image/coco/ に置きました。

Console

アルゴリズムを選択する

  1. Google Cloud コンソールで AI Platform Training の [ジョブ] ページに移動します。

    AI Platform Training の [ジョブ] ページ

  2. [新規トレーニング ジョブ] ボタンをクリックします。下に表示されたオプションから、[組み込みアルゴリズムによるトレーニング] をクリックします。[新しいトレーニング ジョブの作成] ページが表示されます。

  3. トレーニング ジョブの作成は 4 つのステップに分かれています。最初のステップはトレーニング アルゴリズムです。[Image Object Detection] を選択し、[次へ] をクリックします。

トレーニング データ

  1. [トレーニング データ] セクションで、一般公開の Cloud Storage バケットに置かれているサンプル データセット用のトレーニング データを選択します。

    1. [1 つの Cloud Storage ディレクトリに保存されている複数のファイルを使用する] を選択します。

    2. [ディレクトリ パス] に、「cloud-samples-data/ai-platform/built-in/image/coco/」と入力します。

    3. ディレクトリ内のすべてのトレーニング ファイルを選択するため、[ワイルドカードの名前] には「train*」と入力します。

    4. [Complete GCS path] に、"gs://cloud-samples-data/ai-platform/built-in/image/coco/train*" と表示されます。

  2. [検証データ] セクションで、一般公開の Cloud Storage バケットでホストされているサンプル データセット用の検証データを選択します。

    1. [1 つの Cloud Storage ディレクトリに保存されている複数のファイルを使用する] を選択します。

    2. [ディレクトリ パス] に、「cloud-samples-data/ai-platform/built-in/image/coco/」と入力します。

    3. ディレクトリ内のすべての検証ファイルを選択するため、[ワイルドカードの名前] には「val *」を入力します。

    4. [Complete GCS path] に "gs://cloud-samples-data/ai-platform/built-in/image/coco/val*" と表示されます。

  3. AI Platform Training がトレーニングしたモデル、チェックポイント、その他のトレーニング ジョブ出力を保管する Cloud Storage バケットの出力ディレクトリを指定します。バケット内の正確なパスを入力するか、[BROWSE] ボタンをクリックしてパスを選択します。

gcloud

プロジェクト ID、Cloud Storage バケット、Cloud Storage 上のトレーニング データへのパス、使用するアルゴリズムのそれぞれを格納する環境変数を設定します。

AI Platform Training の組み込みアルゴリズムは、Container Registry でホストされている Docker コンテナにあります。

PROJECT_ID="YOUR_PROJECT_ID"
BUCKET_NAME="YOUR_BUCKET_NAME"
REGION="us-central1"

gcloud config set project $PROJECT_ID
gcloud config set compute/region $REGION

# Set paths to the training and validation data.
TRAINING_DATA_PATH="gs://cloud-samples-data/ai-platform/built-in/image/coco/train*"
VALIDATION_DATA_PATH="gs://cloud-samples-data/ai-platform/built-in/image/coco/val*"

# Specify the Docker container for your built-in algorithm selection.
IMAGE_URI="gcr.io/cloud-ml-algos/image_object_detection:latest"

トレーニング ジョブを送信する

ジョブを送信するには、基本的なトレーニング引数と、画像オブジェクト検出アルゴリズムに関する基本的な引数を指定する必要があります。

トレーニング ジョブの一般的な引数:

トレーニング ジョブの引数
引数 説明
job-id トレーニング ジョブの一意の ID。トレーニング ジョブを送信した後、この ID を使用してログを検索しトレーニング ジョブのステータスを確認できます。
job-dir トレーニング ジョブが正常に完了した後に AI Platform Training がトレーニング ファイルを保存する Cloud Storage のパス。
scale-tier トレーニング用のマシンタイプを指定します。単一マシン構成を選択するには、BASIC を使用します。
master-image-uri トレーニング ジョブに使用する Docker コンテナを指定するための Container Registry URI。すでに IMAGE_URI として定義されている組み込みオブジェクト検出アルゴリズムのコンテナを使用します。
region トレーニング ジョブを実行するために利用可能なリージョンを指定します。このチュートリアルでは、us-central1 リージョンを使用できます。

組み込み画像オブジェクト検出アルゴリズムに固有の引数:

アルゴリズムの引数
引数 説明
training_data_path トレーニングに使用される TFRecord パスパターンのパス。
validation_data_path 検証に使用される TFRecord パスパターンのパス。
pretrained_checkpoint_path 事前にトレーニングされたチェックポイントのパス。パブリッシュされたチェックポイントを使用できます。
num_classes トレーニング / 検証データ内のクラスの数。
max_steps トレーニング ジョブを実行するステップの数。
train_batch_size トレーニング ステップごとに使用する画像の数。
num_eval_images 評価に使用される画像の合計数。
これが 0 の場合、validation_data_path 内のすべての画像が評価に使用されます。
learning_rate_decay_type トレーニング中に学習率を減衰させる方法。
warmup_learning_rate ウォームアップ フェーズの開始時の学習率。
warmup_steps ウォームアップ フェーズで実行するステップの数、またはステップ内のウォームアップ フェーズの長さ。トレーニング ジョブはウォームアップ フェーズで warmup_learning_rate を使用します。ウォームアップ フェーズが終了すると、トレーニング ジョブは initial_learning_rate を使用します。
initial_learning_rate ウォームアップ フェーズ完了後の初期学習率。
stepwise_learning_rate_steps 段階的学習率減衰型の学習率を減衰または変化させるステップ。
たとえば、100,200 は学習率がステップ 100 とステップ 200 で(stepwise_learning_rate_levels に関して)変わることを意味します。これは learning_rate_decay_type が段階的に設定されている場合にのみ使用されます。
stepwise_learning_rate_levels 段階的学習率減衰型の各ステップの学習率値。これは learning_rate_decay_type が段階的に設定されている場合にのみ使用されます。
image_size トレーニングに使用される画像サイズ(幅と高さ)。
optimizer_type トレーニングに使用されるオプティマイザ。次のいずれかになります。
{momentum, adam, adadelta, adagrad, rmsprop}
optimizer_arguments オプティマイザの引数。「name=value」ペアのカンマ区切りのリストです。optimizer_type と互換性がある必要があります。例:
  • Momentum オプティマイザの場合、momentum=0.9 を受け入れます。詳細については、tf.train.MomentumOptimizer をご覧ください。
  • Adam オプティマイザの場合、beta1=0.9,beta2=0.999 にすることが可能です。詳細については、tf.train.AdamOptimizer をご覧ください。
  • RMSProp オプティマイザの場合、decay=0.9,momentum=0.1,epsilon=1e-10 にすることが可能です。詳細については、RMSPropOptimizer をご覧ください。
fpn_type マルチレベルの Feature Pyramid Network(FPN)タイプ。{fpn, nasfpn} のいずれかにする必要があります。
resnet_depth ResNet バックボーンの深度。{18,34,50,101,152,200} のいずれかにする必要があります。
max_num_bboxes_in_training トレーニングに使用するように提案された境界ボックスの最大数。
max_num_bboxes_in_prediction 予測出力で使用するように提案された境界ボックスの最大数。
bbox_aspect_ratios 各レベルに追加されたアスペクト比のアンカーを表す基本アンカーのサイズ。数値は、幅と高さの比を示します。たとえば、「1.0,2.0,0.5」では、各スケールレベルに 3 つのアンカーが追加されます。
nms_iou_threshold 非最大抑制のために IOU に対して境界ボックスが重なるかどうかを決定するしきい値。
nms_score_threshold スコアに基づいて境界ボックスを削除するタイミングを決定するしきい値。
focal_loss_alpha フォーカル ロス アルファ(バランシング パラメータ)値。
focal_loss_gamma フォーカル ロス ガンマ(フォーカシング パラメータ)値。
aug_scale_min 画像の拡大中に適用される最小縮尺。値は、[0, 1.0] の間です。
aug_scale_max 画像の拡大中に適用される最大縮尺。値は、[1.0, inf] の間です。
aug_rand_hflip ブール値。True に設定すると、ランダム水平フリップでトレーニングが強化されます。

画像オブジェクト検出アルゴリズムに関する他のフラグすべての詳細リストについては、画像オブジェクト検出組み込みアルゴリズムのリファレンスをご覧ください。

Console

アルゴリズムの引数

[アルゴリズムの引数] タブの最初の部分に、次の値を入力します。

  • クラス数: 91
  • 最大ステップ数: 15000
  • トレーニングのバッチサイズ: 64
  • 評価画像の数: 5000

[アルゴリズムの引数] タブの [モデル セクション] 内:

  1. [Pretrained checkpoint path] に、gs://cloud-samples-data/ai-platform/built-in/image/pretrained_checkpoints/detection/ を入力します。

  2. 他のフィールドはすべてデフォルト設定のままにして、[次へ] をクリックします。

ジョブの設定

[ジョブの設定] タブで次の操作を行います。

  1. [ジョブ ID] に一意の ID(「object_detection_example」など)を入力します。
  2. [リージョン] に使用可能なリージョン(「us-central1」など)を入力します。
  3. マシンタイプを選択するには、[スケール階層] で [CUSTOM] を選択します。カスタム クラスタ仕様を指定するためのセクションが表示されます。
    1. [マスタータイプ] には、[complex_model_m] を選択します。
    2. [ワーカータイプ] には、[cloud_tpu] を選択します。[ワーカー数] はデフォルトで 1 に設定されます。

[完了] をクリックしてトレーニング ジョブを送信します。

gcloud

  1. gcloud でジョブを送信する前に、トレーニング ジョブとアルゴリズムのすべての引数を設定します。

    DATASET_NAME="coco"
    ALGORITHM="object_detection"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}_model"
    
    # Give a unique name to your training job.
    DATE="$(date '+%Y%m%d_%H%M%S')"
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Make sure you have access to this Cloud Storage bucket.
    JOB_DIR="gs://${BUCKET_NAME}/algorithms_training/${MODEL_NAME}/${DATE}"
    
  2. ジョブを送信します。

    gcloud ai-platform jobs submit training $JOB_ID \
      --region=$REGION \
      --config=config.yaml \
      --job-dir=$JOB_DIR \
      -- \
      --training_data_path=$TRAINING_DATA_PATH \
      --validation_data_path=$VALIDATION_DATA_PATH \
      --train_batch_size=64 \
      --num_eval_images=500 \
      --train_steps_per_eval=2000 \
      --max_steps=15000 \
      --num_classes=90 \
      --warmup_steps=500 \
      --initial_learning_rate=0.08 \
      --fpn_type="nasfpn" \
      --aug_scale_min=0.8 \
      --aug_scale_max=1.2
    

  3. ジョブが正常に送信されたら、次の gcloud コマンドを使用してログを表示できます。

    gcloud ai-platform jobs describe $JOB_ID
    gcloud ai-platform jobs stream-logs $JOB_ID
    

ジョブ ディレクトリについて

トレーニング ジョブが正常に完了すると、AI Platform Training によってトレーニング済みモデルとその他のアーティファクトが Cloud Storage バケットに作成されます。JOB_DIR 内のディレクトリ構造は次のようになっています。

  • model/(TensorFlow SavedModel ディレクトリdeployment_config.yaml ファイルも格納します)
    • saved_model.pb
    • deployment_config.yaml
  • eval/
    • events.out.tfevents.[timestamp].cmle-training-[timestamp]
    • events.out.tfevents...
    • ...
  • variables/
    • variables.data-00000-of-00001
    • variables.index

ジョブ ディレクトリには、さまざまなモデル チェックポイント ファイルも格納されます。

JOB_DIR のディレクトリ構造が上記と一致していることを確認します。

gsutil ls -a $JOB_DIR/*

トレーニング済みモデルをデプロイする

AI Platform Training は、モデルリソースとバージョン リソースを使用してトレーニング済みモデルを整理します。AI Platform Training モデルは、機械学習モデルの複数のバージョンを格納するコンテナに相当します。

モデルをデプロイするには、AI Platform Training でモデルリソースを作成し、そのモデルのバージョンを作成してから、そのモデルとバージョンを使用してオンライン予測をリクエストします。

モデルを AI Platform Training にデプロイする方法については、TensorFlow モデルをデプロイする方法をご覧ください。

Console

  1. [ジョブ] ページには、すべてのトレーニング ジョブが一覧表示されます。先ほど送信したトレーニング ジョブの名前(「object_detection」または実際に使用したジョブ名)をクリックします。

  2. [ジョブの詳細] ページでは、ジョブの全般的な進行状況を確認できます。[ログを表示] をクリックすると、進行状況の詳細が表示されます。

  3. ジョブが成功すると、[モデルをデプロイ] ボタンが上部に表示されます。[モデルをデプロイ] をクリックします。

  4. [新しいモデルとしてデプロイ] を選択し、「algorithms_object_detection_model」などのモデル名を入力します。次に、[確認] をクリックします。

  5. [バージョンの作成] ページでバージョン名(「v1」など)を入力します。他のフィールドはすべてデフォルト設定のままにします。[保存] をクリックします。

gcloud

組み込み画像オブジェクト検出アルゴリズムを使用するトレーニング プロセスでは、deployment_config.yaml ファイルが生成されます。これを使用して、予測用のモデルを AI Platform Training に簡単にデプロイできます。

  1. ファイルをローカル ディレクトリにコピーし、その内容を表示します。

    gsutil cp $JOB_DIR/model/deployment_config.yaml .
    cat deployment_config.yaml
    

    deployment_config.yaml ファイルの内容は次のようになっているはずです。

    deploymentUri: gs://BUCKET_NAME/algorithms_training/coco_object_detection/model
    framework: TENSORFLOW
    labels:
      global_step: '1000'
      job_id: coco_object_detection_20190227060114
    runtimeVersion: '1.14'
    
  2. AI Platform Training でモデルとバージョンを作成します。

    gcloud ai-platform models create $MODEL_NAME --regions $REGION
    
    # Create a model and a version using the file above.
    VERSION_NAME="v_${DATE}"
    
    gcloud ai-platform versions create $VERSION_NAME \
      --model $MODEL_NAME \
      --config deployment_config.yaml
    

    バージョンの作成には数分かかります。

オンライン予測を取得する

予測をリクエストするときは、入力データが JSON 形式であることを確認する必要があります。

  1. トレーニング アーティファクト ファイルをダウンロードします。

    gsutil cp $JOB_DIR/artifacts/* .
    
  2. 1 つの画像の予測入力を準備します。

    Google Cloud CLI を使用してオンライン予測リクエストを送信するには、次の例のように、改行で区切られた JSON ファイルの行に各インスタンスを書き込みます。

    ターミナルで次のコマンドを実行して、AI Platform Prediction に送信できる単一インスタンスの入力を作成します。

    次の Python スクリプトは、base64 を使用して単一の画像をエンコードし、予測用に形式設定します。また、インスタンス キーを追加して、prediction_instances.json という名前のファイルに結果を書き込みます。

    import json
    import base64
    import tensorflow as tf
    
    IMAGE_URI='gs://cloud-samples-data/ai-platform/built-in/image/tutorial_examples/coco_sample.jpeg'
    
    with tf.gfile.Open(IMAGE_URI, 'rb') as image_file:
      encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
    
    image_bytes = {'b64': str(encoded_string)}
    instances = {'image_bytes': image_bytes, 'key': '1'}
    with open("prediction_instances.json","w") as f:
      f.write(json.dumps(instances))
    
  3. 予測リクエストを送信します。

    gcloud ai-platform predict --model $MODEL_NAME \
     --version $VERSION_NAME \
     --json-instances prediction_instances.json
    

画像内で検出される各オブジェクトについて、予測出力にはクラス、スコア、境界ボックスの位置が含まれます。

データについて

Microsoft Common Objects in Context(COCO)データセットは、大規模なオブジェクト検出、セグメンテーション、キャプション生成用データセットです。

次のステップ