データセットの作成

データセットとは、ラベル付け担当者にラベルを付けてもらうデータ項目を集めたものです。データセットには、カスタムモデルのトレーニングに使用するために分類または分析するコンテンツの種類の代表的なサンプルが含まれています。

データセットの主な作成手順は次のとおりです。

  1. データ項目を Google Cloud Platform バケットにアップロードします。
  2. データ項目のリストを含むカンマ区切り値(CSV)ファイルを作成し、同じ Google Cloud Platform バケットにアップロードします。
  3. データセット リソースを作成します。
  4. データ項目をデータセット リソースにインポートします。

プロジェクト内に複数のデータセットを作成し、それぞれを異なる AI Platform Data Labeling Service リクエストに使用できます。また、使用可能なデータセットのリストを取得する、不要になったデータセットを削除する、などの操作もできます。詳細については、データセットのリソースページをご覧ください。

ラベルの付いていないデータをステージングする

データセットを作成する最初のステップは、ラベルを付けるデータ項目を、対象のプロジェクト用に作成した Google Cloud Platform バケット(始める前にを参照)にアップロードすることです。

Data Labeling Service では、4 種類のデータのラベル付けがサポートされています。以下の各セクションを展開して、それぞれのデータ種類に求められる質の高いデータ項目とはどのようなものであるかをご覧ください。

入力 CSV ファイルを作成する

サンプルデータ項目に加えて、すべてのデータを列挙したカンマ区切り値(CSV)ファイルも作成する必要があります。

画像、動画、テキストデータの場合、CSV ファイルの各行は 1 つのサンプルデータ項目の場所(プロジェクトの Google Cloud Storage バケット内の場所)に対応します。テキストデータ項目では、各ファイルの内容が読み込まれて 1 つのデータ項目とみなされます。次に例を示します。

gs://my_project_bucket/image1.png
gs://my_project_bucket/image2.png
gs://my_project_bucket/image3.png
gs://my_project_bucket/image4.png

この CSV ファイルを、データ項目を含む同じ Google Cloud Storage バケットにアップロードします。CSV ファイルのファイル名に決まりはありませんが、ファイルは UTF-8 でエンコードする必要があり、拡張子は必ず .csv とします。

データセット リソースを作成する

次のステップは、データ項目を最終的に保持するデータセット リソースを作成することです。新しく作成したデータセットは、次のステップでデータ項目をインポートするまで空のままです。

ウェブ UI

Data Labeling Service UI を使用してデータセットを作成し、同じページからそこに項目をインポートします。

  1. Data Labeling Service UI を開きます。

    [データセット] ページに、現在のプロジェクトでこれまでに作成されたデータセットのステータスが表示されます。

    別のプロジェクトのデータセットを追加するには、タイトルバーの右上にあるプルダウン リストからプロジェクトを選択します。

  2. タイトルバーにある [作成] ボタンをクリックします。

  3. [新しいデータセット] ページで、データセットの名前と説明を入力します。

  4. [データセット タイプ] プルダウン リストから、このデータセットにアップロードするデータ項目の種類(画像、動画、テキストのいずれか)を選択します。

  5. [csv ファイルの場所] ボックスに、入力 CSV ファイルのフルパスを入力します。

    CSV ファイルは、その中に列挙されているデータ項目と同じ Google Cloud Storage バケットに存在する必要があります。

  6. [作成] をクリックします。

    [データセット] ページに戻ります。ドキュメントがインポートされている間、データセットのステータスは「処理中」になります。このプロセスにかかる時間はデータ項目 1,000 件あたり約 10 分ですが、それより前後する場合もあります。

    405 エラーが返された場合は、一度にアップロードするドキュメントの数を減らしてください。やり直す前にページを更新する必要があります。

コマンドライン

次の例では、test_dataset という名前のデータセットを作成します。新しく作成したデータセットには、項目をインポートするまでデータは含まれません。

コマンドのレスポンスから新しいデータセットの "name" をメモしておきます。これはデータセットへの項目のインポートなどの操作で使用します。

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 \
   -d '{
     "dataset": {
     "displayName": "test_dataset",
     "description": "dataset for curl commands testing",
     },
   }'

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

{
  "name": "projects/data-labeling-codelab/datasets/5c897e1e_0000_2ab5_9159_94eb2c0b4daa",
  "displayName": "test_dataset",
  "description": "dataset for curl commands testing",
  "createTime": "2019-03-14T03:11:50.926475415Z"
}

Python

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

def create_dataset(project_id):
  """Creates a dataset for the given Google Cloud project."""
  from google.cloud import datalabeling_v1beta1 as datalabeling
  client = datalabeling.DataLabelingServiceClient()

  formatted_project_name = client.project_path(project_id)

  dataset = datalabeling.types.Dataset(
      display_name='YOUR_ANNOTATION_SPEC_SET_DISPLAY_NAME',
      description='YOUR_DESCRIPTION')

  response = client.create_dataset(formatted_project_name, dataset)

  # The format of resource name: project_id/{project_id}/datasets/{dataset_id}
  print('The dataset resource name: {}\n'.format(response.name))
  print('Display name: {}'.format(response.display_name))
  print('Description: {}'.format(response.description))
  print('Create time:')
  print('\tseconds: {}'.format(response.create_time.seconds))
  print('\tnanos: {}'.format(response.create_time.nanos))

Java

このサンプルコードを実行するには、あらかじめ Java クライアント ライブラリをインストールしておく必要があります。
import com.google.cloud.datalabeling.v1beta1.CreateDatasetRequest;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceClient;
import com.google.cloud.datalabeling.v1beta1.Dataset;
import java.io.IOException;

class CreateDataset {

  // Create a dataset that is initially empty.
  static void createDataset(String projectId) {
    // String projectId = "YOUR_PROJECT_ID";

    try (DataLabelingServiceClient dataLabelingServiceClient = DataLabelingServiceClient.create()) {
      String formattedProjectName = DataLabelingServiceClient.formatProjectName(projectId);

      Dataset dataset = Dataset.newBuilder()
          .setDisplayName("YOUR_DATASET_DISPLAY_NAME")
          .setDescription("YOUR_DESCRIPTION")
          .build();

      CreateDatasetRequest createDatasetRequest = CreateDatasetRequest.newBuilder()
          .setParent(formattedProjectName)
          .setDataset(dataset)
          .build();

      Dataset createdDataset = dataLabelingServiceClient.createDataset(createDatasetRequest);

      System.out.format("Name: %s\n", createdDataset.getName());
      System.out.format("DisplayName: %s\n", createdDataset.getDisplayName());
      System.out.format("Description: %s\n", createdDataset.getDescription());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

データ項目をデータセットにインポートする

データセットを作成したら、CSV ファイルを使用してデータ項目をデータセットにインポートできます。

ウェブ UI

Data Labeling Service UI では、データセットの作成とデータセットへの項目のインポートを同じページから行います。データセットの作成をご覧ください。

  1. Data Labeling Service UI を開きます。

    [データセット] ページに、現在のプロジェクトでこれまでに作成されたデータセットのステータスが表示されます。

    別のプロジェクトのデータセットを追加するには、タイトルバーの右上にあるプルダウン リストからプロジェクトを選択します。

  2. タイトルバーにある [作成] ボタンをクリックします。

  3. [新しいデータセット] ページで、データセットの名前と説明を入力します。

  4. [データセット タイプ] プルダウン リストから、このデータセットにアップロードするデータ項目の種類(画像、動画、テキストのいずれか)を選択します。

  5. [csv ファイルの場所] ボックスに、入力 CSV ファイルのフルパスを入力します。

    CSV ファイルは、その中に列挙されているデータ項目と同じ Google Cloud Storage バケットに存在する必要があります。

  6. [作成] をクリックします。

    [データセット] ページに戻ります。ドキュメントがインポートされている間、データセットのステータスは「処理中」になります。このプロセスにかかる時間はデータ項目 1,000 件あたり約 10 分ですが、それより前後する場合もあります。

    405 エラーが返された場合は、一度にアップロードするドキュメントの数を減らしてください。やり直す前にページを更新する必要があります。

コマンドライン

  • DATASET_ID は、データセット作成時のレスポンスからメモしておいたデータセットの ID に置き換えます。この ID は完全なデータセット名の一番最後の部分です(projects/{project-id}/locations/us-central1/datasets/{dataset-id})。

  • CSV_FILE は、入力 CSV ファイルのフルパスに置き換えます。

    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}:importData \
       -d '{
         "inputConfig": {
           "dataType": "IMAGE",
           "gcsSource": {
              "inputUri": "${CSV_FILE}",
              "mimeType": "text/csv",
            }
           },
       }'
    

    出力は次のようになります。オペレーション ID を使用して、タスクのステータスを取得できます。例については、オペレーションのステータスの取得をご覧ください。

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

Python

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

def import_data(dataset_resource_name, data_type, input_gcs_uri):
  """Imports data to the given Google Cloud project and dataset."""
  from google.cloud import datalabeling_v1beta1 as datalabeling
  client = datalabeling.DataLabelingServiceClient()

  gcs_source = datalabeling.types.GcsSource(
      input_uri=input_gcs_uri, mime_type='text/csv')

  image_csv_input_config = datalabeling.types.InputConfig(
      data_type=data_type, gcs_source=gcs_source)

  response = client.import_data(dataset_resource_name, image_csv_input_config)

  # The format of resource name: project_id/{project_id}/datasets/{dataset_id}
  print('Dataset resource name: {}\n'.format(response.result().dataset))

Java

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

class ImportData {

  // Import data to an existing dataset.
  static void importData(String datasetName, String gcsSourceUri) {
    // String datasetName = DataLabelingServiceClient.formatDatasetName(
    //     "YOUR_PROJECT_ID", "YOUR_DATASETS_UUID");
    // String gcsSourceUri = "gs://YOUR_BUCKET_ID/path_to_data";

    try (DataLabelingServiceClient dataLabelingServiceClient = DataLabelingServiceClient.create()) {
      GcsSource gcsSource = GcsSource.newBuilder()
          .setInputUri(gcsSourceUri)
          .setMimeType("text/csv")
          .build();

      InputConfig inputConfig = InputConfig.newBuilder()
          .setDataType(DataType.IMAGE) // DataTypes: AUDIO, IMAGE, VIDEO, TEXT
          .setGcsSource(gcsSource)
          .build();

      ImportDataRequest importDataRequest = ImportDataRequest.newBuilder()
          .setName(datasetName)
          .setInputConfig(inputConfig)
          .build();

      OperationFuture<ImportDataOperationResponse, ImportDataOperationMetadata> operation =
          dataLabelingServiceClient.importDataAsync(importDataRequest);

      ImportDataOperationResponse response = operation.get();

      System.out.format("Imported items: %d\n", response.getImportCount());
    } catch (IOException | InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
  }
}