为人工标签添加者创建说明

通过说明,添加标签的人员可了解如何将标签应用到数据。说明中应该有已带标签的样本数据和其他明确指示。

AI Platform Data Labeling Service 支持 PDF 说明:

  • PDF 说明。PDF 说明可以提供精确的指示,例如每种情况的正例和负例或相关说明。创建此类说明也更加便捷,尤其是对一些复杂的任务而言,例如图片边界框或视频对象跟踪。

一个项目可以有多组说明,每组说明用于不同的 Data Labeling Service 请求。您可获取可用说明列表,也可删除不再需要的说明。如需了解详情,请参阅说明资源页面

设计优秀说明

好的说明是获得绝佳人工标签结果的最重要因素。您的使用场景您最了解,因此您需要让添加标签的人员也了解您的需求。下面是创建优秀说明的几项准则:

  • 添加标签的人员并不具备您所在领域的相关知识。对于不熟悉您的使用场景的人来说,您要求标签添加者做出的区分应该易于理解。

  • 应避免创建过于冗长的说明。最理想的效果是标签添加者能够在 20 分钟内看完并且理解说明。

  • 说明应描述任务的概念,并详细指出如何为数据添加标签。例如,对于边界框任务,可描述您希望标签添加者如何绘制边界框。边界框应该较紧凑还是较松散?如果对象有多个实例,则标签添加者是该绘制一个大的边界框,还是该绘制多个小的边界框?

  • 如果您的说明具有对应的标签集,则应涵盖该标签集中的所有标签。说明中的标签名称应与标签集中的名称一致。

  • 为了创建优秀的说明,通常需要进行多次迭代。我们建议您先为小型数据集添加标签,然后再根据获得的结果对说明进行调整。

好的说明文件应包含以下几个部分:

  • 标签列表和描述:列出您要使用的所有标签并描述每个标签的含义。
  • 示例:对于每个标签,请提供至少 3 个正例和 1 个负例。这些示例应涵盖不同的用例。
  • 涵盖边缘用例。尽可能多地阐明边缘用例,让标签添加者无需自行解释标签。例如,如果您需要绘制人物边界框,最好能清楚地说明以下事项:
    • 如果有多个人物,您是否需要为每个人物绘制一个边界框?
    • 如果某个人被遮挡了,您是否需要为其绘制边界框?
    • 对于图片中只显示了部分身体的某个人,您是否需要绘制边界框?
    • 您是否需要为照片或绘画中的人物绘制边界框?
  • 说明如何添加注释。例如:
    • 对于边界框,您需要紧凑型还是松散型的?
    • 对于文本实体提取,相关实体应该从哪里开始、在哪里结束?
  • 阐明标签。如果两个标签相似或易于混淆,请提供示例来阐明区别。

创建说明

PDF 说明

以下示例显示了 PDF 说明可能包含的内容。在开始执行任务之前,标签添加者将查看说明。

PDF 说明 1

PDF 说明 2

您可以创建 Google 幻灯片,并将幻灯片导出为 PDF 文件来创建说明。

向项目添加说明

网页界面

  1. 打开数据标签服务界面

    说明页面会显示之前为当前项目创建的说明的状态。

    如需为其他项目添加说明,请从标题栏右上角的下拉列表中选择项目。

  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();
    }
  }
}

更新项目中的说明

如需更新说明,请按照将说明添加到项目中所述,更新说明文件,然后重新上传。

提交数据标签任务时,服务会拍摄说明文件的快照,并使用该快照指示该任务为数据添加标签。如果您在数据标签任务进行期间更新了说明,这样做可以避免服务返回不一致的结果。如果您更新了说明并且希望投入使用,请提交新的数据标签任务。