ラベル付け担当者向けの指示の作成

ここでいう「指示」とは、データにラベルを適用する方法についての情報をラベル付け担当者に与えるものを指します。指示には、ラベルが付けられたサンプルデータやその他の明示的な説明を含める必要があります。

AI Platform Data Labeling Service では PDF 指示がサポートされています。

  • PDF 指示。PDF 指示では、ポジティブ サンプルとネガティブ サンプルやそれぞれのケースの説明など、詳細な説明を提供できます。また、特に画像境界ボックスや動画オブジェクト トラッキングなどの複雑な作業を求める場合には、PDF 指示を作成すると役立ちます。

1 つのプロジェクトに複数の指示セットを含めることができ、それぞれを別の Data Labeling Service リクエストに使用できます。使用可能な指示のリストを取得して、不要な指示を削除することもできます。詳細については、指示のリソースページをご覧ください。

適切な指示を設計する

適切な指示を与えることは、ヒューマン ラベリングで良好な結果を得るために最も重要な要素です。ユースケースを最もよく知っているのはサービス利用者自身であり、サービス利用者がラベル付け担当者にどうしてほしいかを知らせる必要があります。適切な指示を作成するためのガイドラインを以下に示します。

  • ラベル付け担当者はドメインに関する知識を持っていません。サービス利用者のユースケースに精通していない人でも、どのような区別が求められているかを容易に理解できる必要があります。

  • 指示があまりにも長くならないようにします。ラベル付け担当者が 20 分以内に読んで理解できるのが理想的です。

  • データのラベル付け方法の詳細に加えて、タスクのコンセプトも説明する必要があります。たとえば、境界ボックスのタスクを依頼する場合は、境界ボックスをどのように描画するかを説明します。対象だけを厳密に囲むか、または大まかに囲むか、対象物が複数ある場合はそれらすべてを 1 つの大きな境界ボックスで囲むか、または複数の小さな境界ボックスで 1 つずつ囲むかを指示します。

  • 作成する指示に対応するラベルセットがある場合は、そのセットに含まれるすべてのラベルについて指示を記載します。指示に記載したラベルの名前は、ラベルセットに含まれる名前と一致している必要があります。

  • 一般に、適切な指示を作成するには何度か繰り返すことが必要です。まず小さなデータセットのラベル付けをリクエストし、返された結果に基づいて指示内容を調整することをおすすめします。

適切な指示ファイルには次のセクションが含まれています。

  • ラベルのリストと説明: 使用するすべてのラベルを列挙し、各ラベルの意味を説明します。
  • サンプル: ラベルごとに少なくとも 3 つのポジティブ サンプルと 1 つのネガティブ サンプルを含めます。これらのサンプルでさまざまなケースをカバーします。
  • エッジケースをカバーします。できるだけ多くのエッジケースを明確にします。そうすると、ラベル付け担当者がラベルを解釈する必要がなくなります。たとえば、人を境界ボックスで囲むよう求める場合は、次のことを明確にすることをおすすめします。
    • 複数の人がいる場合、1 人ずつボックスで囲む必要があるか。
    • 人混みに遮られた人を囲む必要はあるか。
    • 画像に一部だけ写っている人を囲む必要はあるか。
    • 写真や絵の中の人を囲む必要はあるか。
  • アノテーションを追加する方法を説明します。例:
    • 境界ボックスの場合、対象だけを厳密に囲むか、または大まかに囲むか。
    • テキスト エンティティ抽出の場合、対象エンティティの開始位置と終了位置はどのように判断するか。
  • ラベルの説明。2 つのラベルが似ている場合や混同しやすい場合は例を挙げて違いを明確にします。

指示を作成する

PDF 指示

以下の例では、PDF 指示の内容を説明します。ラベル付け担当者は作業を開始する前にこの指示を読みます。

PDF 指示 1

PDF 指示 2

指示を作成する際、Google スライドを作成してからそれを PDF ファイルとしてエクスポートできます。

指示をプロジェクトに追加する

ウェブ UI

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

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

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

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

  3. [新しい指示] ページで、指示ファイルの名前と説明を入力します。

  4. [データの種類] プルダウンから、ラベル付け担当者がラベルを適用するデータ項目の種類(画像、動画、テキストのいずれか)を選択します。

  5. [手順の場所] セクションで、指示ファイルのフルパスを入力します。

    PDF 指示ファイルを指定する必要があります。このファイルは、データセットとラベルセットと同じ Google Cloud Storage バケットに存在している必要があります。

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

    [手順] 一覧ページに戻ります。インポートされている間、指示のステータスは「処理中」になります。

コマンドライン

次の例では、test_spec_set_display_name という名前のラベルセットを作成します。環境変数 PROJECT_IDGCS_PDF_FILE_PATH を定義し、前者には Google Cloud プロジェクト ID を、後者には PDF 指示ファイルの Cloud Storage URI をそれぞれ指定しておく必要があります。
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}/instructions \
     -d '{
         "instruction": {
             "displayName": "curl_testing_instruction",
             "description": "instruction for curl commands testing",
             "dataType": "IMAGE",
           "pdfInstruction": {
                 "gcsFileUri": "${GCS_PDF_FILE_PATH}"
           }
         },
     }'

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

{
  "name": "projects/data-labeling-codelab/instructions/5c73dbc1_0000_23e0_a25b_94eb2c119c4c"
}

Python

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

PdfInstruction を指定する必要があります。他のデータ種類の指示の場合は、dataType を IMAGE から対応するデータの種類に置き換えます。

def create_instruction(project_id, data_type, instruction_gcs_uri):
    """Creates a data labeling PDF instruction for the given Google Cloud
    project. The PDF file should be uploaded to the project in
    Google Cloud Storage.
    """
    from google.cloud import datalabeling_v1beta1 as datalabeling

    client = datalabeling.DataLabelingServiceClient()

    project_path = f"projects/{project_id}"

    pdf_instruction = datalabeling.PdfInstruction(gcs_file_uri=instruction_gcs_uri)

    instruction = datalabeling.Instruction(
        display_name="YOUR_INSTRUCTION_DISPLAY_NAME",
        description="YOUR_DESCRIPTION",
        data_type=data_type,
        pdf_instruction=pdf_instruction,
    )

    operation = client.create_instruction(
        request={"parent": project_path, "instruction": instruction}
    )

    result = operation.result()

    # The format of the resource name:
    # project_id/{project_id}/instruction/{instruction_id}
    print(f"The instruction resource name: {result.name}")
    print(f"Display name: {result.display_name}")
    print(f"Description: {result.description}")
    print("Create time:")
    print(f"\tseconds: {result.create_time.timestamp_pb().seconds}")
    print(f"\tnanos: {result.create_time.timestamp_pb().nanos}")
    print(f"Data type: {datalabeling.DataType(result.data_type).name}")
    print("Pdf instruction:")
    print(f"\tGcs file uri: {result.pdf_instruction.gcs_file_uri}\n")

    return result

Java

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

PdfInstruction を指定する必要があります。他のデータ種類の指示の場合は、dataType を IMAGE から対応するデータの種類に置き換えます。

import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.datalabeling.v1beta1.CreateInstructionMetadata;
import com.google.cloud.datalabeling.v1beta1.CreateInstructionRequest;
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.Instruction;
import com.google.cloud.datalabeling.v1beta1.PdfInstruction;
import com.google.cloud.datalabeling.v1beta1.ProjectName;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

class CreateInstruction {

  // Create a instruction for a dataset.
  static void createInstruction(String projectId, String pdfUri) throws IOException {
    // String projectId = "YOUR_PROJECT_ID";
    // String pdfUri = "gs://YOUR_BUCKET_ID/path_to_pdf_or_csv";

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

      // There are two types of instructions: CSV (CsvInstruction) or PDF (PdfInstruction)
      PdfInstruction pdfInstruction = PdfInstruction.newBuilder().setGcsFileUri(pdfUri).build();

      Instruction instruction =
          Instruction.newBuilder()
              .setDisplayName("YOUR_INSTRUCTION_DISPLAY_NAME")
              .setDescription("YOUR_DESCRIPTION")
              .setDataType(DataType.IMAGE) // DataTypes: AUDIO, IMAGE, VIDEO, TEXT
              .setPdfInstruction(pdfInstruction) // .setCsvInstruction() or .setPdfInstruction()
              .build();

      CreateInstructionRequest createInstructionRequest =
          CreateInstructionRequest.newBuilder()
              .setInstruction(instruction)
              .setParent(projectName.toString())
              .build();

      OperationFuture<Instruction, CreateInstructionMetadata> operation =
          dataLabelingServiceClient.createInstructionAsync(createInstructionRequest);

      Instruction result = operation.get();

      System.out.format("Name: %s\n", result.getName());
      System.out.format("DisplayName: %s\n", result.getDisplayName());
      System.out.format("Description: %s\n", result.getDescription());
      System.out.format("GCS SOURCE URI: %s\n", result.getPdfInstruction().getGcsFileUri());
    } catch (IOException | InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
  }
}

プロジェクト内の指示を更新する

指示を更新するには、指示ファイルを更新してから、指示をプロジェクトに追加するの手順で指示ファイルを再アップロードします。

データラベル付けリクエストを送信すると指示ファイルのスナップショットが作成され、そのスナップショットを使用して、そのタスクによって行われるデータラベル付けの指示が与えられます。そのため、データラベル付けタスクの途中で指示を更新した場合でも、一貫性のない結果が返されることはありません。指示を更新する場合は、新しい指示を使用するために新しいデータラベル付けリクエストを送信してください。