データセットの作成

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

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

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

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

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

データセットを作成する最初のステップは、ラベル付けのため Cloud Storage バケットにデータ項目をアップロードすることです。バケットの作成については、始める前にをご覧ください。

Data Labeling Service では、3 種類のデータのラベル付けがサポートされています。下のセクションを展開すると、それぞれのデータ種類に求められる質の高いデータ項目とはどのようなものか確認できます。現時点では、英語のデータセットのみがラベル付けに対応しています。

画像

サポートされているファイル形式が使用されている必要があります。

  • JPEG
  • PNG

画像セグメンテーションを除き、画像のラベル付けで使用可能な最大ファイルサイズは 30 MB です。画像セグメンテーションのラベル付けの場合、最大ファイルサイズは 10 MB です。

画像の最大サイズは 1920 x 1080 です。

トレーニング用のデータは、予測を行うデータにできる限り近いものである必要があります。たとえば、ユースケースに低解像度のぼやけた画像(セキュリティ カメラの画像など)が含まれている場合、トレーニング用のデータも低解像度でぼやけた画像から構成する必要があります。一般に、複数の視点、解像度、背景を持つトレーニング画像を用意することも検討します。

モデルのトレーニングが最も効果的となるのは、最も一般的なラベルに属する画像の数が、最も一般的でないラベルに属する画像の数よりも最大で 100 倍多く存在する場合です。非常に低い頻度のラベルは削除することをおすすめします。

動画

動画は MP4 形式で、H.264、H.265、MPEG4 のコーデックを使用している必要があります。動画の最大サイズは 2 GB です。

トレーニング用のデータは、予測を行うデータにできる限り近いものである必要があります。たとえば、低解像度のぼやけた動画(防犯カメラの動画など)で予測を行う場合は、トレーニング用のデータも低解像度のぼやけた動画で構成する必要があります。一般に、視点、解像度、背景が異なる動画をトレーニング用に準備することも検討する必要があります。

ラベルあたり約 1,000 件のトレーニング用動画を用意することをおすすめします。ラベルあたりの最小の動画数は 10 件(高度なモデルでは 50 件)です。一般に、1 つの動画に複数のラベルを付けてモデルをトレーニングする場合は、ラベルあたりの必要なサンプルの数が多くなります。また、結果として得られるスコアの解釈がより難しくなります。

モデルが最もうまく機能するのは、最も一般的なラベルの動画数が、最も一般的でないラベルの動画数より多くても 100 倍を超えない場合です。非常に低い頻度のラベルは削除することをおすすめします。

テキスト

テキスト ファイルは、UTF-8 テキスト ファイルのエンコード形式にする必要があります。

各ドキュメントは個別のテキスト ファイルにする必要があります。1 つのテキスト ファイルに複数のドキュメントを含めることはできません。たとえば、テキスト ファイルの各行を独自のドキュメントとして扱うことはできません。

テキスト ファイルあたりの最大文字数は 100,000 文字です。

トレーニング用のデータには、予測を行うデータと同様に多様なものを使用します。データセットには、さまざまな長さのドキュメント、作成者の異なるドキュメント、さまざまな言い回しやスタイルを使用したドキュメントなどを含める必要があります。

ラベルあたり少なくとも 1,000 のトレーニング ドキュメントを用意することをおすすめします。ラベルあたりの最小ドキュメント数は 10 です。ただし、ラベルあたりの例を増やすことで、モデルの信頼スコアを上げることができます。特にドキュメントを分類して複数のラベルを返すモデルでは、信頼スコアが高い方が有用です。

モデルは、最も一般的なラベルのドキュメント数が、最も一般的ではないラベルのドキュメント数よりも、最大 100 倍存在する場合に最適に動作します。非常に低い頻度のラベルは削除することをおすすめします。

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

サンプルデータ項目に加えて、すべてのデータを列挙したカンマ区切り値(CSV)ファイルも作成する必要があります。CSV ファイルのファイル名に決まりはありませんが、ファイルは UTF-8 でエンコードする必要があり、拡張子は必ず .csv とします。

画像と動画のデータの場合、CSV ファイルの各行にプロジェクトの 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 ファイルの各行にテキスト ファイルの保存場所を記述します。 例:

gs://my_project_bucket/file1.txt
gs://my_project_bucket/file2.txt
gs://my_project_bucket/file3.txt
gs://my_project_bucket/file4.txt

各データファイルには、ラベルを付けるデータが含まれている必要があります。データファイルの内容は、1 つのラベル付け問題としてラベラーに表示されます。

データ項目をカタログ化した CSV ファイルを作成したら、データ項目と同じ Cloud Storage バケットにアップロードします。

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

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

ウェブ 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 = f"projects/{project_id}"

    dataset = datalabeling.Dataset(
        display_name="YOUR_DATASET_SET_DISPLAY_NAME", description="YOUR_DESCRIPTION"
    )

    response = client.create_dataset(
        request={"parent": formatted_project_name, "dataset": dataset}
    )

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

    return response

Java

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

class CreateDataset {

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

    DataLabelingServiceSettings settings =
        DataLabelingServiceSettings.newBuilder()
            .build();
    try (DataLabelingServiceClient dataLabelingServiceClient =
        DataLabelingServiceClient.create(settings)) {
      ProjectName projectName = ProjectName.of(projectId);

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

      CreateDatasetRequest createDatasetRequest =
          CreateDatasetRequest.newBuilder()
              .setParent(projectName.toString())
              .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 の場合、この手順はスキップできます。インポートは前のステップですでに完了しています。

コマンドライン

  • 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.GcsSource(input_uri=input_gcs_uri, mime_type="text/csv")

    csv_input_config = datalabeling.InputConfig(
        data_type=data_type, gcs_source=gcs_source
    )

    response = client.import_data(
        request={"name": dataset_resource_name, "input_config": csv_input_config}
    )

    result = response.result()

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

    return result

Java

このサンプルコードを実行するには、あらかじめ Java クライアント ライブラリをインストールしておく必要があります。
import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceClient;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceSettings;
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) throws IOException {
    // String datasetName = DataLabelingServiceClient.formatDatasetName(
    //     "YOUR_PROJECT_ID", "YOUR_DATASETS_UUID");
    // String gcsSourceUri = "gs://YOUR_BUCKET_ID/path_to_data";

    DataLabelingServiceSettings settings =
        DataLabelingServiceSettings.newBuilder()
            .build();
    try (DataLabelingServiceClient dataLabelingServiceClient =
        DataLabelingServiceClient.create(settings)) {
      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();
    }
  }
}

データセット内のデータ項目を表示する

インポートしたデータセット内のデータ項目を表示する手順は次のとおりです。

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

    [データセット] ページに、現在のプロジェクトのデータセットが表示されます。

  2. データセットのリストで、項目を表示するデータセットの名前をクリックします。

  3. [データセットの詳細] ページの [詳細] タブをクリックして、データセットに含まれる個々のデータ項目を表示します。