ラベルセットの作成

ラベルセットとは、ラベル付け担当者が画像にラベルを付けるために使用するラベルのセットです。たとえば、イヌまたはネコが含まれているかどうかで画像を分類する場合は、「Dog」と「Cat」の 2 つのラベルを含むラベルセットを作成します(実際には、後述するように、「Neither」(どちらにも該当しない)と「Both」(両方に該当する)のラベルも必要となる場合があります)。ラベルセットには最大 100 個のラベルを含めることができます。

1 つのプロジェクトに複数のラベルセットを含めることができ、それぞれ別個の Data Labeling Service リクエストに使用されます。使用可能なラベルセットの一覧を取得し、不要になったセットを削除できます。詳細については、アノテーション仕様のリソースページをご覧ください。

望ましいラベルセットの設計

質の高いラベルセットを作成するためのガイドラインを以下に示します。

  • 各ラベルの表示名を「dog」、「cat」、「building」などの意味のある言葉にします。 「label1」や「label2」のような抽象的な名前や一般的でない頭字語は使用しないでください。ラベル名の意味が明確であるほど、ラベル付け担当者がそのラベルを正確かつ一貫して適用しやすくなります。
  • ラベル同士を簡単に区別できるようにします。各データ項目に単一のラベルを適用する分類タスクでは、意味が重複するラベルを使用しないでください。
  • 分類タスクの場合は、他のどのラベルとも一致しないデータ用に、「other」または「none」という名前のラベルを含めることをおすすめします。たとえば、適用可能なラベルが「dog」と「cat」しかない場合は、すべての画像に必ずどちらかのラベルを付けなければなりません。一般に、イヌやネコ以外の画像をトレーニング データに含めると、カスタムモデルはより堅牢になります。
  • ラベル付け担当者が最も効率的かつ正確にラベル付けできるのは、ラベルセットで定義されているラベルの数が 20 個以下の場合であることに留意してください。

ラベルセット リソースを作成する

ウェブ UI

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

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

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

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

  3. [ラベルセットの作成] ページで、ラベルセットの名前と説明を入力します。

  4. [ラベル] セクションで、ラベル付け担当者がデータセットに適用する各ラベルの名前と説明を入力します。

    ラベルの名前と説明を入力したら、[ラベルを追加] をクリックしてラベルの入力行を追加します。最大 100 個のラベルを追加できます。

  5. [作成] をクリックしてアノテーション仕様セットを作成します。

    [ラベルセット] 一覧ページに戻ります。

コマンドライン

ラベルセット リソースを作成するには、すべてのラベルを JSON 形式で一覧表示して Data Labeling Service に渡します。

次の例では、2 つのラベルを持つ code_sample_label_set という名前のラベルセットを作成します。

レスポンスから得た新しいラベルセットの "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}"/annotationSpecSets \
     -d '{
       "annotationSpecSet": {
           "displayName": "code_sample_label_set",
           "description": "code sample general label set",
           "annotationSpecs": [
               {
                   "displayName": "dog",
                   "description": "label dog",
               },
               {
                   "displayName": "cat",
                   "description": "label cat",
               }
           ],
       },
    }'

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

{
  "name": "projects/data-labeling-codelab/annotationSpecSets/5c73db2d_0000_2f46_983d_001a114a5d7c",
  "displayName": "code_sample_label_set",
  "description": "code sample general label set",
  "annotationSpecs": [
    {
      "displayName": "dog",
      "description": "label dog"
    },
    {
      "displayName": "cat",
      "description": "label cat"
    }
  ]
}

Python

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

def create_annotation_spec_set(project_id):
    """Creates a data labeling annotation spec set for the given
    Google Cloud project.
    """
    from google.cloud import datalabeling_v1beta1 as datalabeling

    client = datalabeling.DataLabelingServiceClient()

    project_path = f"projects/{project_id}"

    annotation_spec_1 = datalabeling.AnnotationSpec(
        display_name="label_1", description="label_description_1"
    )

    annotation_spec_2 = datalabeling.AnnotationSpec(
        display_name="label_2", description="label_description_2"
    )

    annotation_spec_set = datalabeling.AnnotationSpecSet(
        display_name="YOUR_ANNOTATION_SPEC_SET_DISPLAY_NAME",
        description="YOUR_DESCRIPTION",
        annotation_specs=[annotation_spec_1, annotation_spec_2],
    )

    response = client.create_annotation_spec_set(
        request={"parent": project_path, "annotation_spec_set": annotation_spec_set}
    )

    # The format of the resource name:
    # project_id/{project_id}/annotationSpecSets/{annotationSpecSets_id}
    print("The annotation_spec_set resource name: {}".format(response.name))
    print("Display name: {}".format(response.display_name))
    print("Description: {}".format(response.description))
    print("Annotation specs:")
    for annotation_spec in response.annotation_specs:
        print("\tDisplay name: {}".format(annotation_spec.display_name))
        print("\tDescription: {}\n".format(annotation_spec.description))

    return response

Java

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

class CreateAnnotationSpecSet {

  // Create an annotation spec set.
  static void createAnnotationSpecSet(String projectId) throws IOException {
    // String projectId = "YOUR_PROJECT_ID";

    Map<String, String> annotationLabels = new HashMap<>();
    annotationLabels.put("label_1", "label_1_description");
    annotationLabels.put("label_2", "label_2_description");

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

      List<AnnotationSpec> annotationSpecs = new ArrayList<>();
      for (Entry<String, String> entry : annotationLabels.entrySet()) {
        AnnotationSpec annotationSpec =
            AnnotationSpec.newBuilder()
                .setDisplayName(entry.getKey())
                .setDescription(entry.getValue())
                .build();
        annotationSpecs.add(annotationSpec);
      }

      AnnotationSpecSet annotationSpecSet =
          AnnotationSpecSet.newBuilder()
              .setDisplayName("YOUR_ANNOTATION_SPEC_SET_DISPLAY_NAME")
              .setDescription("YOUR_DESCRIPTION")
              .addAllAnnotationSpecs(annotationSpecs)
              .build();

      CreateAnnotationSpecSetRequest request =
          CreateAnnotationSpecSetRequest.newBuilder()
              .setAnnotationSpecSet(annotationSpecSet)
              .setParent(projectName.toString())
              .build();

      AnnotationSpecSet result = dataLabelingServiceClient.createAnnotationSpecSet(request);

      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("Annotation Count: %d\n", result.getAnnotationSpecsCount());

      for (AnnotationSpec annotationSpec : result.getAnnotationSpecsList()) {
        System.out.format("\tDisplayName: %s\n", annotationSpec.getDisplayName());
        System.out.format("\tDescription: %s\n\n", annotationSpec.getDescription());
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

継続評価への対応

評価ジョブを作成するときは、アノテーション仕様セットを定義した CSV ファイルを指定する必要があります。

  • このファイルには、予測中にモデルが出力する可能性があるすべてのラベルが 1 行に 1 つずつ記述されている必要があります。
  • 各行では、LABEL_NAME,DESCRIPTION のように、ラベルとその説明のペアをカンマ区切りで指定します。
  • サービス利用者が評価ジョブを作成すると、この CSV ファイルのファイル名が、Data Labeling Service のバックグラウンドで作成されるアノテーション仕様セットの名前として使用されます。

たとえば、モデルが画像の動物を予測する場合、animals.csv というファイルに次の仕様を書き込みます。

bird,any animal in the class Aves - see https://en.wikipedia.org/wiki/Bird
cat,any animal in the species Felis catus (domestic cats, not wild cats) - see https://en.wikipedia.org/wiki/Cat
dog,any animal in the genus Canis (domestic dogs and close relatives) - see https://en.wikipedia.org/wiki/Canis
multiple,image contains more than one of the above
none,image contains none of the above

次に、このファイルを継続評価ジョブと同じプロジェクト内の Cloud Storage バケットにアップロードします。