ラベル付きデータのエクスポート

ラベル付け作業が完了したら、ExportData を呼び出してアノテーション付きデータセットを Google Cloud Storage バケットにエクスポートできます。

ExportData は、それぞれの行が各画像(画像分類タスクの場合)または各画像境界ボックスに対応した .csv ファイル、または json ファイル(テキスト エンティティ抽出タスクの場合)を返します。

  • 画像分類タスクの出力形式: ,image_url,label_1,label_2,...

  • 画像境界ボックスタスクの出力形式: ,image_url,label,0.1,0.1,,,0.3,0.3,,

    4 つの点は左上、右上、右下、左下の順に並んでいます。2 番目と 4 番目の点は任意です。各点は x,y のペアで表されます。

    各行は 1 つの境界ボックスに対応します。1 つの画像に複数のボックスがある場合、行は複数になります。

  • 画像の境界ポリゴンタスクと有向境界ボックスタスクの出力形式は ,image_url,label,0.1,0.1,,,0.3,0.3,,,0.6,0.6,,... になります。

    閉じたポリゴンの各点は、2 つの空の csv 列で区切られた x,y 点で表されます。最後のペアは最初のペアに接続し、閉じたポリゴンを形成します。各行は 1 つのポリゴンに対応します。

  • 画像ポリライン タスクの出力形式は ,image_url,label,0.1,0.1,,,0.3,0.3,,,0.6,0.6,,... になります。

    上記のポリゴンに似ていますが、最後のペアは最初のペアに接続せず、ポリラインを形成します。各行は 1 つのポリラインに対応します。

  • 画像セグメンテーション タスクの場合、出力は次の形式の json ファイルになります。 { Annotation_colors { "0x000000": {display_name: "dog"} "0x111111": {display_name: "cat"} } image_bytes: "jpeg_encoded_colormap_bytes" }

  • 動画分類タスクの出力形式は ,video_url,label,segment_start_time,segment_end_time になります。

  • 動画オブジェクト検出タスクの出力形式は ,video_url,label,timestamp,0.1,0.1,,,0.3,0.3,, になります。

    4 つの点は左上、右上、右下、左下の順に並んでいます。2 番目と 4 番目の点は任意です。各点は x,y のペアで表されます。各行は 1 つの境界ボックスに対応します。

  • 動画オブジェクト トラッキング タスクの出力形式は ,video_url,label,instance_id,timestamp,0.1,0.1,,,0.3,0.3,, になります。

    4 つの点は左上、右上、右下、左下の順に並んでいます。2 番目と 4 番目の点は任意です。各点は x,y のペアで表されます。各行は 1 つの境界ボックスに対応します。

  • 動画イベントタスクの出力形式は ,video_url,label,segment_start_time,segment_end_time になります。

  • テキスト分類タスクの出力形式は ,text_url,label_l になります。

  • テキスト分類タスク + 感情の出力形式は ,text_url,label_l,sentiment になります。

  • テキスト エンティティ抽出タスクの場合は .json ファイルを返します。形式は AutoML NL の入力と同じです。 { "annotations": [ { "text_extraction": { "text_segment": { "end_offset": number, "start_offset": number } }, "display_name": string }, ... ], "text_snippet": {"content": string} }

ExportData は長時間実行オペレーションです。レスポンスでオペレーション ID が返されます。以降は、このオペレーション ID を指定して GetOperation を呼び出すことで、オペレーションのステータスを取得できます。

コマンドライン

次の環境変数を設定します。

  1. Google Cloud プロジェクト ID を示す PROJECT_ID 変数。
  2. データセットの ID を示す DATASET_ID 変数。データセットの ID はデータセットの作成時にレスポンスで返されます。この ID は完全なデータセット名の一番最後の部分です。

    projects/project-id/locations/us-central1/datasets/dataset-id
  3. アノテーション付きデータセット リソース名の ID を示す ANNOTATED_DATASET_ID 変数。リソース名の形式は次のとおりです。

    projects/project-id/locations/us-central1/datasets/dataset-id/annotatedDatasets/annotated-dataset-id
  4. 結果を格納する Cloud Storage バケットの URI を示す STORAGE_URI 変数。

アノテーション結果をリクエストする curl コマンドは、画像セグメンテーションの場合を除き、次のようになります。

curl -X POST \
   -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
   -H "Content-Type: application/json" \
   https://datalabeling.googleapis.com/v1beta1/projects/${PROJECT_ID}/datasets/${DATASET_ID}:exportData \
   -d '{
     "annotatedDataset": "${ANNOTATED_DATASET_ID}",
     "outputConfig": {
       "gcsDestination: "${STORAGE_URI}",
       "mimeType": "text/csv"
     }
   }'

画像セグメンテーション データをエクスポートする場合、curl コマンドは次のようになります。

curl -X POST \
   -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
   -H "Content-Type: application/json" \
   https://datalabeling.googleapis.com/v1beta1/projects/${PROJECT_ID}/datasets/${DATASET_ID}:exportData \
   -d '{
     "annotatedDataset": "${ANNOTATED_DATASET_ID}",
     "outputConfig": {
       "gcsFolderDestination: "${STORAGE_URI}"
     }
   }'

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

{
  "name": "projects/data-labeling-codelab/operations/5c73dd6b_0000_2b34_a920_883d24fa2064",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.data-labeling.v1beta1.ExportDataOperationResponse",
    "dataset": "projects/data-labeling-codelab/datasets/5c73db3d_0000_23e0_a25b_94eb2c119c4c"
  }
}

Python

このサンプルコードを実行するには、あらかじめ Python クライアント ライブラリをインストールしておく必要があります。

def export_data(dataset_resource_name, annotated_dataset_resource_name,
                export_gcs_uri):
  """Exports a dataset from the given Google Cloud project."""
  from google.cloud import datalabeling_v1beta1 as datalabeling
  client = datalabeling.DataLabelingServiceClient()

  gcs_destination = datalabeling.types.GcsDestination(
      output_uri=export_gcs_uri, mime_type='text/csv')

  output_config = datalabeling.types.OutputConfig(
      gcs_destination=gcs_destination)

  response = client.export_data(dataset_resource_name,
                                annotated_dataset_resource_name, output_config)

  print('Dataset ID: {}\n'.format(response.result().dataset))
  print('Output config:')
  print('\tGcs destination:')
  print('\t\tOutput URI: {}\n'.format(
      response.result().output_config.gcs_destination.output_uri))

Java

このサンプルコードを実行するには、あらかじめ Java クライアント ライブラリをインストールしておく必要があります。
import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceClient;
import com.google.cloud.datalabeling.v1beta1.ExportDataOperationMetadata;
import com.google.cloud.datalabeling.v1beta1.ExportDataOperationResponse;
import com.google.cloud.datalabeling.v1beta1.ExportDataRequest;
import com.google.cloud.datalabeling.v1beta1.GcsDestination;
import com.google.cloud.datalabeling.v1beta1.LabelStats;
import com.google.cloud.datalabeling.v1beta1.OutputConfig;
import java.io.IOException;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ExecutionException;

class ExportData {

  // Export data from an annotated dataset.
  static void exportData(String datasetName, String annotatedDatasetName, String gcsOutputUri) {
    // String datasetName = DataLabelingServiceClient.formatDatasetName(
    //     "YOUR_PROJECT_ID", "YOUR_DATASETS_UUID");
    // String annotatedDatasetName = DataLabelingServiceClient.formatAnnotatedDatasetName(
    //     "YOUR_PROJECT_ID",
    //     "YOUR_DATASET_UUID",
    //     "YOUR_ANNOTATED_DATASET_UUID");
    // String gcsOutputUri = "gs://YOUR_BUCKET_ID/export_path";

    try (DataLabelingServiceClient dataLabelingServiceClient = DataLabelingServiceClient.create()) {
      GcsDestination gcsDestination = GcsDestination.newBuilder()
          .setOutputUri(gcsOutputUri)
          .setMimeType("text/csv")
          .build();

      OutputConfig outputConfig = OutputConfig.newBuilder()
          .setGcsDestination(gcsDestination)
          .build();

      ExportDataRequest exportDataRequest = ExportDataRequest.newBuilder()
          .setName(datasetName)
          .setOutputConfig(outputConfig)
          .setAnnotatedDataset(annotatedDatasetName)
          .build();

      OperationFuture<ExportDataOperationResponse, ExportDataOperationMetadata> operation =
          dataLabelingServiceClient.exportDataAsync(exportDataRequest);

      ExportDataOperationResponse response = operation.get();

      System.out.format("Exported item count: %d\n", response.getExportCount());
      LabelStats labelStats = response.getLabelStats();
      Set<Entry<String, Long>> entries = labelStats.getExampleCountMap().entrySet();
      for (Entry<String, Long> entry : entries) {
        System.out.format("\tLabel: %s\n", entry.getKey());
        System.out.format("\tCount: %d\n\n", entry.getValue());
      }
    } catch (IOException | InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
  }
}