AutoML Vision API を使用して画像にラベルを付ける

このクイックスタートでは、以下のプロセスを順を追って説明します。

  • 境界ボックスとラベルを含む画像のリスト(CSV ファイル)を Google Cloud Storage にコピーする。
  • AutoML Vision Object Detection を使用してデータセットを作成し、モデルをトレーニングしてデプロイする。

このクイックスタートでは、cURL コマンドを使用して AutoML Vision API にリクエストを送信します。ここで説明する手順はすべてユーザー インターフェースでも行うことができます。詳しくは、クイックスタート: ユーザー インターフェースの使用をご覧ください。UI または API の使用方法については、入門ガイドをご覧ください。

始める前に

プロジェクトを設定する

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

    gcloud init
  4. Google Cloud プロジェクトを作成または選択します。

    • Google Cloud プロジェクトを作成する

      gcloud projects create PROJECT_ID
    • 作成した Google Cloud プロジェクトを選択します。

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

  6. AutoML and Cloud Storage API を有効にします。

    gcloud services enable storage-component.googleapis.comautoml.googleapis.comstorage-api.googleapis.com
  7. Google Cloud CLI をインストールします。
  8. gcloud CLI を初期化するには:

    gcloud init
  9. Google Cloud プロジェクトを作成または選択します。

    • Google Cloud プロジェクトを作成する

      gcloud projects create PROJECT_ID
    • 作成した Google Cloud プロジェクトを選択します。

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

  11. AutoML and Cloud Storage API を有効にします。

    gcloud services enable storage-component.googleapis.comautoml.googleapis.comstorage-api.googleapis.com
  12. 環境変数 PROJECT_IDプロジェクト ID に設定します。
    export PROJECT_ID=PROJECT_ID
    AutoML API 呼び出しとリソース名には、プロジェクト ID が含まれています。環境変数 PROJECT_ID は、ID の指定に便利です。

データセットの準備

このクイックスタートでは、Open Images Dataset V4 から作成したデータセットを使用します。一般公開されている Salads のデータセットは gs://cloud-ml-data/img/openimage/csv/salads_ml_use.csv にあります。

CSV 形式は次のとおりです。

TRAINING,gs://cloud-ml-data/img/openimage/3/2520/3916261642_0a504acd60_o.jpg,Salad,0.0,0.0954,,,0.977,0.957,,
VALIDATION,gs://cloud-ml-data/img/openimage/3/2520/3916261642_0a504acd60_o.jpg,Seafood,0.0154,0.1538,,,1.0,0.802,,
TEST,gs://cloud-ml-data/img/openimage/3/2520/3916261642_0a504acd60_o.jpg,Tomato,0.0,0.655,,,0.231,0.839,,
データセット画像の例
3916261642_0a504acd60_o.jpg

各行は、大きな画像内にローカライズされたオブジェクトに対応し、各オブジェクトはテスト、トレーニング、検証データとして指定されます。ここに含まれる 3 行は、gs://cloud-ml-data/img/openimage/3/2520/3916261642_0a504acd60_o.jpg で使用可能な同じ画像内にある 3 つの異なるオブジェクトを示しています。各行には、Baked goods または Cheese ラベルを持つ他の行に加えて、SaladSeafoodTomato という異なるラベルがあります。

左上と右下の頂点で、各画像の境界ボックスが指定されます。

  • (0,0)が左上の頂点に対応します。
  • (1,1)が右下の頂点に対応します。

上記の最初の行の場合、Salad ラベル付きオブジェクトの左上の頂点の(x、y)座標は(0.0,0.0954)であり、オブジェクトの右下の頂点の座標は(0.977,0.957)です。

CSV ファイルの形式と有効なデータセットの最小要件の詳細については、トレーニング データの準備をご覧ください。


データセットの作成とトレーニング データのインポート

curl コマンドは、gcloud auth print-access-token コマンドを使用して Google アカウントのアクセス トークンを取得します。

ベータ版リリースでは、実際の場所に関係なく、リージョンとして us-central1 を使用します。

データセットを作成する

次の curl コマンドを使用して、選択した表示名で新しいデータセットを作成します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json" \
"https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/datasets" -d '{
    "display_name": "DISPLAY_NAME",
    "image_object_detection_dataset_metadata": {
    }
}'

以降の手順で必要になるデータセットの相対 ID(IOD5491013845671477445 など)が返されます。

{
  "name": "projects/PROJECT_ID/locations/us-central1/datasets/IOD5491013845671477445",
  "displayName": "DISPLAY_NAME",
  "createTime": "2018-10-29T15:45:53.353442Z",
  "imageObjectDetectionDatasetMetadata": {}
}

データをインポートする

データセットにトレーニング データをインポートします。importData コマンドは、入力としてデータセットの URI を使用します。ここでは、Salads データセットが保存された一般公開の Google Cloud Storage のアドレスを提供します。この処理には 30 分ほどかかる場合があります。

  • DATASET_ID は、データセットのデータセット識別子(表示名ではない)に置き換えます。例: IOD5491013845671477445
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/datasets/DATASET_ID:importData \
-d '{
  "input_config": {
    "gcs_source": {
       "input_uris": [
         "gs://cloud-ml-data/img/openimage/csv/salads_ml_use.csv"
        ]
    }
  }
}'

オペレーションの相対 ID(IOD1555149246326374411 など)が返されます、この ID は、オペレーションのステータスを取得する際に使用します。

{
  "name": "projects/PROJECT_NUMBER/locations/us-central1/operations/IOD1555149246326374411",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.automl.v1beta1.OperationMetadata",
    "createTime": "2018-10-29T15:56:29.176485Z",
    "updateTime": "2018-10-29T15:56:29.176485Z",
    "importDataDetails": {}
  }
}

インポート オペレーションのステータスを取得する

データのインポート オペレーションのステータスを取得するには、curl コマンドを実行します。

  • OPERATION_ID は、データのインポート オペレーションで返されたオペレーション ID で置き換えます。
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/operations/OPERATION_ID

インポート オペレーションが完了するまでに時間がかかることがあります。インポート タスクが完了すると、次の例のように、オペレーションのステータスが done: true と表示されます。エラーは発生していません。

このリクエストに対しては、データセットのインポートに関する警告も返されます。この警告の例を示すため、このデータセットにエラーを追加しました。このオペレーションで警告を表示すると、データ内のエラーを探しやすくなります。

{
  "name": "projects/PROJECT_NUMBER/locations/us-central1/operations/IOD1555149246326374411",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.automl.v1beta1.OperationMetadata",
    "createTime": "2018-10-29T15:56:29.176485Z",
    "updateTime": "2018-10-29T16:10:41.326614Z",
    "importDataDetails": {}
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.protobuf.Empty"
  }
}

データセットのリストを取得する

データセットのリストを取得するには、次のコマンドを使用します。

curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/datasets

出力は次のようになります。

{
  "datasets": [
    {
      "name": "projects/PROJECT_NUMBER/locations/us-central1/datasets/DATASET_ID1",
      "displayName": "DISPLAY_NAME1",
      "createTime": "2018-10-29T15:45:53.353442Z",
      "exampleCount": 227,
      "imageObjectDetectionDatasetMetadata": {}
    },
    {
      "name": "projects/PROJECT_NUMBER/locations/us-central1/datasets/DATASET_ID2",
      "displayName": "DISPLAY_NAME2",
      "createTime": "2018-10-24T21:06:05.390059Z",
      "exampleCount": 227,
      "imageObjectDetectionDatasetMetadata": {}
    }
  ]
}

モデルのトレーニング

モデルをトレーニングするアプリケーションを開始する

データセットを作成し、トレーニング データをデータセットにインポートしたら、カスタムモデルをトレーニングできます。

次の curl コマンドを実行し、モデルをトレーニングします。

  • DATASET_ID は、データセットのデータセット識別子(表示名ではない)に置き換えます。
  • DISPLAY_NAME は、モデルに選択した名前に置き換えます。
  • image_object_detection_model_metadata.model_type を指定します。レイテンシや精度を最適化するには、次の 2 つの方法があります。
    • cloud-low-latency-1 - トレーニングのレイテンシを最適化します。
    • cloud-high-accuracy-1 - トレーニングの精度を最適化します。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/models -d '{
  "datasetId": "DATASET_ID",
  "displayName": "DISPLAY_NAME",
  "image_object_detection_model_metadata": {},
}'

モデルのトレーニング オペレーションの ID(たとえば、IOD5644417707978784777)を取得する必要があります。これは、トレーニング オペレーションのステータスを取得する際に使用されます。

{
  "name": "projects/PROJECT_NUMBER/locations/us-central1/operations/IOD5644417707978784777",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.automl.v1beta1.OperationMetadata",
    "createTime": "2018-10-29T16:41:23.902167Z",
    "updateTime": "2018-10-29T16:41:23.902167Z",
    "createModelDetails": {}
  }
}

トレーニング プロセスが完了するまでに数時間かかることがあります。

モデル トレーニング オペレーションのステータスを取得する

モデルのトレーニング オペレーションのステータスを確認するには、次の curl コマンドを実行します。

  • OPERATION_ID をトレーニング オペレーションのオペレーション ID に置き換えます。
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/operations/OPERATION_ID

出力は次のようになります。オペレーションが完了すると、done: true が表示されます。エラーはありません。


{
  "name": "projects/PROJECT_NUMBER/locations/us-central1/operations/IOD5644417707978784777",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.automl.v1beta1.OperationMetadata",
    "createTime": "2018-10-24T22:08:23.327323Z",
    "updateTime": "2018-10-24T23:41:18.452855Z",
    "createModelDetails": {}
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.automl.v1beta1.Model",
    "name": "projects/PROJECT_NUMBER/locations/us-central1/models/IOD5644417707978784777"
  }
}

モデルが使用可能であることを確認する

モデル トレーニング オペレーションが正常に完了したら、次のコマンドを使用してプロジェクトのモデルを一覧表示することにより、モデルが使用可能であることを確認できます。

curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/models

モデル ID(たとえば、IOD5644417707978784778)を取得する必要があります。これは、モデルのトレーニングが完了したときにモデルの評価指標を取得する際に使用されます。出力は次のようになります。

{
  "model": [
    {
      "name": "projects/PROJECT_NUMBER/locations/us-central1/models/IOD5644417707978784778",
      "displayName": "DISPLAY_NAME",
      "datasetId": "IOD5491013845671477445",
      "createTime": "2018-10-24T23:37:00.858493Z",
      "updateTime": "2018-10-24T23:37:00.858493Z",
      "deploymentState": "DEPLOYED",
      "imageObjectDetectionModelMetadata": {
          "modelType": "cloud-low-latency-1",
          "nodeCount": "1",
          "nodeQps": 1.2987012987012987
      }
    }
  ]
}

モデルを評価する

モデルの評価が完了したら、次の curl コマンドを実行して、モデル評価指標の一覧を取得します。

  • MODEL_ID をモデル ID に置き換えます。
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/models/MODEL_ID/modelEvaluations

AutoML Vision Object Detection は、モデルが全体的にどの程度適切に機能するかを示す評価指標のセットと、モデルが特定のラベルに対してどの程度適切に機能するかを示す各ラベルの評価指標をさまざまなしきい値と一緒に提供します。

モデルをデプロイする

予測を行う前に、モデルを手動でデプロイする必要があります。

次のコマンドを使用して、モデルをデプロイします。

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "x-goog-user-project: PROJECT_ID" \
  -H "Content-Type: application/json" \
  https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/models/MODEL_ID:deploy \
  -d '{
      "imageObjectDetectionModelDeploymentMetadata": {
        "nodeCount": 2
      }
    }'

予測を行う

予測リクエストを送信する

デプロイされたモデルを使用して、次の JSON ファイルと curl コマンドを実行すると、ローカル画像で予測を行えます。

  • リクエストの JSON ファイルを predict_request.json という名前で作成し、base64 でエンコードされた画像を "imageBytes" フィールドに指定します。

predict_request.json

{
    "payload": {
        "image": {
            "image_bytes": "/9j/4QAYRXhpZgAA...base64-encoded-image...9tAVx/zDQDlGxn//2Q=="
        }
    }
}

  • MODEL_ID をモデル ID に置き換えます。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json" \
"https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/models/MODEL_ID:predict" -d @PATH_TO_JSON_FILE/predict_request.json

リクエストが成功すると、2 つの対角線上の normalizedVertices で指定された 1 つ以上の境界ボックスが返されます。識別された各境界ボックスには信頼度(score)とアノテーション(displayName)が関連付けられています。

{
  "payload": [
    {
      "imageObjectDetection": {
        "boundingBox": {
          "normalizedVertices": [
            {
              "x": 0.034553755,
              "y": 0.015524037
            },
            {
              "x": 0.941527,
              "y": 0.9912563
            }
          ]
        },
        "score": 0.9997793
      },
      "displayName": "Salad"
    },
    {
      "imageObjectDetection": {
        "boundingBox": {
          "normalizedVertices": [
            {
              "x": 0.11737197,
              "y": 0.7098793
            },
            {
              "x": 0.510878,
              "y": 0.87987
            }
          ]
        },
        "score": 0.63219965
      },
      "displayName": "Tomato"
    }
  ]
}

モデルのデプロイを解除する(省略可)

モデルがデプロイされている間は料金がかかります。このモデルのホスティング料金が発生しないようにするには、モデルのデプロイを解除します。

次のコマンドを実行して、モデルのデプロイを解除します。

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "x-goog-user-project: PROJECT_ID" \
  -H "Content-Type: application/json" \
  "https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/models/MODEL_ID:undeploy"

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、Google Cloud プロジェクトとそのリソースをまとめて削除してください。

カスタムモデルや関連するデータセットが不要になった場合は削除できます。

モデルの一覧表示

プロジェクトのモデルを識別子とともに一覧表示するには、次のコマンドを使用します。

curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/models

モデルの削除

モデルを削除するには、次のコマンドを使用します。

  • MODEL_ID をモデル ID に置き換えます。
curl -X DELETE \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/models/MODEL_ID

データセットを一覧表示する

プロジェクトのデータセットを識別子とともに一覧表示するには、次のコマンドを使用します。

curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/datasets

データセットの削除

データセットを削除するには、次のコマンドを使用します。

  • DATASET_ID をモデル ID に置き換えます。
curl -X DELETE \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json" \
https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/datasets/DATASET_ID

次のステップ