組み込みの画像オブジェクト検出アルゴリズムを使用したトレーニング

AI Platform Training での組み込みアルゴリズムを使用したトレーニングでは、データセットを送信し、トレーニング コードを一切作成せずに、モデルをトレーニングできます。このページでは、組み込みの画像オブジェクト検出アルゴリズムの仕組みと使用方法について説明します。

概要

組み込みの画像オブジェクト検出アルゴリズムは、トレーニングと検証のデータセットを使用してモデルを継続的にトレーニングし、トレーニング ジョブの過程で生成された最も正確な SavedModel を出力します。ハイパーパラメータ調整を使用してモデルの精度を最適化することもできます。エクスポートされた SavedModel は、ローカルでの予測に直接使用することも、本番環境サービス用に AI Platform Prediction にデプロイすることもできます。

制限事項

組み込みの画像検出アルゴリズムでは、単一 CPU、GPU、TPU によるトレーニングがサポートされています。結果として生成される SavedModel は、CPU および GPU での処理と互換性があります。

組み込みの画像オブジェクト検出アルゴリズムを使用したトレーニングでは、次の機能はサポートされていません

  • 分散トレーニングAI Platform Training で TensorFlow 分散トレーニング ジョブを実行するには、トレーニング アプリケーションを作成する必要があります。
  • マルチ GPU トレーニング。組み込みアルゴリズムによって使用される GPU は一度に 1 つだけです。1 台のマシンで複数の GPU を使用したトレーニングを行うには、トレーニング アプリケーションを作成する必要があります。マシンタイプの詳細については、こちらをご覧ください。

サポートされているマシンタイプ

次の AI Platform Training スケール階層とマシンタイプがサポートされています。

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 コマンドを使用して、次の手順を行います。

Console

  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 のドキュメントをご覧ください。

入力データをトレーニング用にフォーマットする

組み込みの画像オブジェクト検出アルゴリズムでは、入力データを tf.Examples としてフォーマットし、TFRecord ファイルに保存する必要があります。tf.Example データ構造と TFRecord ファイル形式はいずれも、TensorFlow を使用した効率的なデータ読み取りに対応するように設計されています。

TFRecord は、一連のバイナリ レコードを格納するシンプルな形式です。この場合、すべてのレコードに画像のバイナリ表現が含まれています。各画像は、そのクラスラベルと組み合わせて tf.Example として表されます。多数の tf.Example を 1 つの TFRecord ファイルに保存できます。また、複数の TFRecord ファイル間で大きなデータセットをシャーディングすることもできます。

詳細については、TFRecord と tf.Example をご覧ください。

画像を TFRecord に変換する

TensorFlow には、画像を JPEG から TFRecord 形式に変換するために使用できるスクリプトが用意されています。

このスクリプトは次の場合に使用できます。

  • 画像を Cloud Storage に格納する。
  • Cloud Storage 内の画像へのパスおよびそれぞれの対応するラベルを含む CSV ファイルが存在する。例:

    gs://cloud-ml-data/img/flower_photos/daisy/754296579_30a9ae018c_n.jpg,daisy
    gs://cloud-ml-data/img/flower_photos/dandelion/18089878729_907ed2c7cd_m.jpg,dandelion
    
  • これらの CSV ファイルを Cloud Storage に格納する。

次の例は、スクリプトの実行方法を示しています。

  1. スクリプトをダウンロードします。

    curl https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/jpeg_to_tf_record.py > ./jpeg_to_tf_record.py
    
  2. プロジェクト ID とバケット名の変数をまだ設定していない場合は設定します。

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
  3. 対象のデータセットについて、考えられるすべてのラベルのリストを一時ファイルに作成します。

    cat << EOF > /tmp/labels.txt
    daisy
    dandelion
    roses
    sunflowers
    tulips
    EOF
    
  4. 一般公開されている cloud-ml-data バケットおよび独自のラベルリストに含まれている花データを使用してスクリプトを実行します。

    python -m jpeg_to_tf_record.py \
           --train_csv gs://cloud-ml-data/img/flower_photos/train_set.csv \
           --validation_csv gs://cloud-ml-data/img/flower_photos/eval_set.csv \
           --labels_file /tmp/labels.txt \
           --project_id $PROJECT_ID \
           --output_dir gs://$BUCKET_NAME/flowers_as_tf_record
    

Cloud Storage バケットの権限を確認する

データを保存するには、AI Platform Training ジョブの実行に使用している Google Cloud プロジェクトの Cloud Storage バケットを使用します。それ以外の場合は、データが保存されている Cloud Storage バケットへのアクセス権を AI Platform Training に付与します。

必須の入力形式

組み込みの画像オブジェクト検出アルゴリズムを使用してトレーニングするには、次のフィールドを含む tf.Example として画像データを構造化する必要があります。

  • image/encoded は、文字列としてエンコードされた RAW 画像です。

  • image/object/class/label は、対応する画像の整数ラベルのリストです(ボックスごとに 1 つのラベル)。

    データセットに使用される整数ラベルのセットは、1 から始まる連続したシーケンスにする必要があります。たとえば、データセットに 5 つのクラスがある場合、各ラベルは範囲 [1, 5] 内の整数でなければなりません。

  • image/object/bbox/xmin は、対応する画像の正規化された左側の x 座標のリストです(ボックスごとに 1 つの座標)。各座標は [0, 1] の範囲内にする必要があります。

  • image/object/bbox/xmax は、対応する画像の正規化された右側の x 座標のリストです(ボックスごとに 1 つの座標)。各座標は [0, 1] の範囲内にする必要があります。

  • image/object/bbox/ymin は、対応する画像の正規化された上側の y 座標のリストです(ボックスごとに 1 つの座標)。各座標は [0, 1] の範囲内にする必要があります。

  • image/object/bbox/ymaxは、対応する画像の正規化された下側の y 座標のリストです(ボックスごとに 1 つの座標)。各座標は [0, 1] の範囲内にする必要があります。

次の例は、2 つの境界ボックスを含む画像の tf.Example の構造を示しています。最初のボックスのラベルは 1、左上隅は正規化された座標 (0.1, 0.4)、右下隅は正規化された座標 (0.5, 0.8) です。2 つ目のボックスのラベルは 2 で、左上隅は正規化された座標 (0.3, 0.5)、右下隅は正規化された座標 (0.4, 0.7) です。

{
    'image/encoded': '<encoded image data>',
    'image/object/class/label': [1, 2],
    'image/object/bbox/xmin': [0.1, 0.3],
    'image/object/bbox/xmax': [0.5, 0.4],
    'image/object/bbox/ymin': [0.4, 0.5],
    'image/object/bbox/ymax': [0.8, 0.7]
}

この tf.Example 形式は、TFRecord オブジェクト検出スクリプトで使用されるものと同じです。

最適な SavedModel を出力として取得する

トレーニング ジョブが完了したら、そのジョブの送信時に jobDir として指定した Cloud Storage バケットに TensorFlow SavedModel が書き込まれます。SavedModel は jobDir/model に書き込まれます。たとえば、ジョブを gs://your-bucket-name/your-job-dir に送信した場合、SavedModel は gs://your-bucket-name/your-job-dir/model に書き込まれます。

ハイパーパラメータ調整を有効にしている場合は、トレーニング プロセスの中で最も精度が高かった TensorFlow SavedModel が返されます。たとえば、2,500 トレーニング ステップで構成されるトレーニング ジョブを送信し、2,000 ステップにおける精度が最も高かった場合、その特定の時点で保存された TensorFlow SavedModel が返されます。

AI Platform Training の各トライアルでは、最も精度が高い TensorFlow SavedModel が Cloud Storage バケット内の個別のディレクトリに書き込まれます。例: gs://your-bucket-name/your-job-dir/model/trial_{trial_id}

出力される SavedModel のシグネチャは次のようになります。

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['encoded_image'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: encoded_image_string_tensor:0
    inputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: key:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['detection_boxes'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100, 4)
        name: detection_boxes:0
    outputs['detection_classes'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100)
        name: detection_classes:0
    outputs['detection_scores'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100)
        name: detection_scores:0
    outputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Identity:0
    outputs['num_detections'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1)
        name: num_detections:0
  Method name is: tensorflow/serving/predict

入力:

  • encoded_image: RAW(デコードされていない)画像バイト。tf.Example に格納される image/encoded と同じです。
  • key: 予測入力の文字列値の識別子。この値は出力 key に渡されます。バッチ予測において予測出力を入力にマッピングするのに役立ちます。

出力:

  • num_detections: 検出された境界ボックスの数。
  • detection_boxes: 検出境界ボックスの相対([0,1] の値)座標([ymin, xmin, ymax, xmax])のリスト。
  • detection_classes: detection_boxes における各検出ボックスの予測クラス(整数)ラベルのリスト。
  • detection_scores: detection_boxes における各検出ボックスの scores のリスト。
  • key: 出力キー。

予測出力の例を次に示します。

{u'detection_classes': [1.0, 3.0, 3.0, ...],
u'key': u'test_key',
u'num_detections': 100.0,
u'detection_scores': [0.24401935935020447, 0.19375669956207275, 0.18359294533729553, ...]]}

構成例

gcloud を使用してジョブを送信する場合は、マシンタイプとハイパーパラメータ調整仕様の config.yaml ファイルを作成する必要があります。Google Cloud Console を使用する場合は、このファイルを作成する必要はありません。トレーニング ジョブの送信方法をご覧ください。

次のサンプル config.yaml ファイルは、トレーニング ジョブ用の TPU リソースを割り当てる方法を示しています。

cat << EOF > config.yaml
trainingInput:
  scaleTier: CUSTOM
  masterType: n1-standard-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: NVIDIA_TESLA_P100
      count: 1
  workerType:  cloud_tpu
  workerConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    tpuTfVersion: 1.14
    acceleratorConfig:
      type: TPU_V2
      count: 8
  workerCount: 1
EOF

次に、config.yaml ファイルを使用して、トレーニング ジョブを送信します。

ハイパーパラメータ調整構成

ハイパーパラメータ調整を使用するには、ハイパーパラメータ調整構成をマシン構成と同じ config.yaml ファイルに含めます。

各ハイパーパラメータの簡単な説明については、Google Cloud Console 内で確認できます。より包括的な説明については、組み込みの画像オブジェクト検出アルゴリズムのリファレンスをご覧ください。

次のサンプル config.yaml ファイルは、トレーニング ジョブ用の TPU リソースを割り当てる方法を示しています。また、ハイパーパラメータ調整構成が含まれています。

cat << EOF > config.yaml
trainingInput:
  # Use a cluster with many workers and a few parameter servers.
  scaleTier: CUSTOM
  masterType: n1-standard-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: NVIDIA_TESLA_P100
      count: 1
  workerType:  cloud_tpu
  workerConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: TPU_V2
      count: 8
  workerCount: 1
  # The following are hyperparameter configs.
  hyperparameters:
   goal: MAXIMIZE
   hyperparameterMetricTag: "AP"
   maxTrials: 6
   maxParallelTrials: 3
   enableTrialEarlyStopping: True
   params:
   - parameterName: initial_learning_rate
     type: DOUBLE
     minValue: 0.001
     maxValue: 0.1
     scaleType: UNIT_LOG_SCALE
EOF

画像オブジェクト検出トレーニング ジョブを送信する

このセクションでは、組み込みの画像オブジェクト検出アルゴリズムを使用したトレーニング ジョブを送信する方法について説明します。

Console

アルゴリズムを選択する

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

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

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

  3. [新しいトレーニング ジョブの作成] ページで、[画像オブジェクト検出] を選択し、[次へ] をクリックします。

トレーニング データと検証データを選択する

  1. [トレーニング データ] のプルダウン ボックスで、1 つのファイルを使用するか、複数のファイルを使用するかを指定します。

    • 1 つのファイルを使用する場合は、[GCS バケットに格納されている単一ファイルを使用する] を選択したままにします。
    • 複数のファイルを使用する場合は、[1 つの Cloud Storage ディレクトリに保存されている複数のファイルを使用する] を選択します。
  2. [ディレクトリ パス] で [参照] をクリックします。右パネルで、トレーニング データをアップロードしたバケットの名前をクリックし、ファイルに移動します。

    複数のファイルを選択する場合は、[ワイルドカードの名前] にワイルドカード文字を入力します。パスが正しいことを確認できるように、下に [Complete GCS path] が表示されます。

  3. [検証データ] のプルダウン ボックスで、1 つのファイルを使用するか、複数のファイルを使用するかを指定します。

    • 1 つのファイルを使用する場合は、[GCS バケットに格納されている単一ファイルを使用する] を選択したままにします。
    • 複数のファイルを使用する場合は、[1 つの Cloud Storage ディレクトリに保存されている複数のファイルを使用する] を選択します。
  4. [ディレクトリ パス] で [参照] をクリックします。右パネルで、トレーニング データをアップロードしたバケットの名前をクリックし、ファイルに移動します。

    複数のファイルを選択する場合は、[ワイルドカードの名前] にワイルドカード文字を入力します。パスが正しいことを確認できるように、下に [Complete GCS path] が表示されます。

  5. [出力ディレクトリ] に、AI Platform Training によってトレーニング ジョブからの出力が保存される Cloud Storage バケットへのパスを入力します。Cloud Storage バケットのパスを直接入力するか、[参照] ボタンをクリックしてパスを選択します。

    ストレージを整理するため、このトレーニング ジョブ用の新しいディレクトリを Cloud Storage バケットに作成します。これは [参照] ペインで行うことができます。

    [次へ] をクリックします。

アルゴリズム引数を設定する

アルゴリズム固有の各引数には、ハイパーパラメータ調整なしのトレーニング ジョブのデフォルト値が表示されます。アルゴリズム引数でハイパーパラメータ調整を有効にする場合は、最小値と最大値を指定する必要があります。

すべてのアルゴリズム引数の詳細については、Google Cloud Console 内のリンクをたどって、組み込みの画像オブジェクト検出のリファレンスをご覧ください。

ジョブを送信する

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

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

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

gcloud

  1. ジョブの環境変数を設定します。

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
    # Specify the same region where your data is stored
    REGION="YOUR_REGION"
    
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region $REGION
    
    # Set Cloud Storage paths to your training and validation data
    # Include a wildcard if you select multiple files.
    TRAINING_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/train-*.tfrecord"
    VALIDATION_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/eval-*.tfrecord"
    
    # Specify the Docker container for your built-in algorithm selection
    IMAGE_URI="gcr.io/cloud-ml-algos/image_object_detection:latest"
    
    # Variables for constructing descriptive names for JOB_ID and JOB_DIR
    DATASET_NAME="coco"
    ALGORITHM="object_detection"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}"
    DATE="$(date '+%Y%m%d_%H%M%S')"
    
    # Specify an ID for this job
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Specify the directory where you want your training outputs to be stored
    JOB_DIR="gs://${BUCKET_NAME}/algorithm_training/${JOB_ID}"
    
  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=22500 \
      --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
    

次のステップ