创建数据集

数据集是您希望人工标签添加者为其加标签的数据项的集合。 它包含您要分类或分析的代表性样本。准确添加了标签的数据集可用于训练自定义模型。

构建数据集的主要步骤如下:

  1. 将数据项上传到 Cloud Storage 存储桶。
  2. 创建一个逗号分隔值 (CSV) 文件以便为数据项编制目录,然后将它上传到同一 Cloud Storage 存储桶。
  3. 创建数据集资源
  4. 将数据项导入到数据集资源中。

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

暂存未加标签的数据

创建数据集的第一步是将数据项上传到 Cloud Storage 存储桶以便加标签。如需了解如何创建存储桶,请参阅准备工作

Data Labeling Service 支持为三种类型的数据加标签。您可以展开以下各部分,详细了解如何为每种类型提供优质的数据项。目前,只有英文数据集支持添加标签。

图片

图片必须采用受支持的文件类型:

  • JPEG
  • PNG

在除图片分割之外的所有图片加标签场景中,文件大小上限为 30MB。在图片分割加标签场景中,文件大小上限为 10MB。

图片的最大尺寸为 1920X1080。

训练数据应尽可能接近要作为预测依据的数据。例如,如果您的用例涉及模糊的低分辨率图片(例如,来自监控摄像头的图片),那么您的训练数据应由模糊的低分辨率图片组成。一般来说,您还应该考虑为训练图片提供多种角度、分辨率和背景。

如果最常见标签下的图片数量不超过最罕见标签下图片数量的 100 倍,则训练模型的效果最佳。建议移除出现频率极低的标签。

视频

视频必须采用 H.264、H.265 和 MPEG4 编解码器生成的 MP4 格式。视频大小上限为 2GB。

训练数据应尽可能接近要作为预测依据的数据。例如,如果您的用例涉及模糊的低分辨率视频(例如,来自监控摄像头的视频),那么您的训练数据应由模糊的低分辨率视频组成。一般来说,您还应该考虑为训练视频提供多种角度、分辨率和背景。

我们建议在每个标签下提供大约 1000 个训练视频。每个标签至少应有 10 个训练视频;对于高级模型,则应至少有 50 个训练视频。一般来说,每个标签下需要有更多示例,才能训练可为每个视频添加多个标签的模型,这种情况下得分也更难以解读。

如果最常见标签下的视频数量不超过最不常见标签下视频数量的 100 倍,则模型效果最佳。建议移除出现频率极低的标签。

文本

文本文件必须采用 UTF-8 文本文件编码格式。

每个文档都必须是单独的文本文件。您不能在一个文本文件中提供多个文档;例如,您不能将文本文件的每一行视为其自己的文档。

每个文本文件的字符数上限为 10 万。

尽量使您的训练数据与作为预测依据的数据一样多样。数据集需包含不同长度的文档、由不同人员撰写的文档、使用不同措辞或风格的文档等等。

我们建议为每个标签提供至少 1000 个训练文档。每个标签的文档数下限为 10。但是,您可以每个标签使用更多样本,从而提高模型的置信度分数。如果模型返回多个标签来对文档进行分类,提高置信度分数尤其有用。

如果最常见标签下的文档数量不超过最罕见标签下文档数量的 100 倍,则模型效果最佳。建议移除出现频率极低的标签。

创建输入 CSV 文件

除了样本数据项以外,您还需要创建一个为所有数据编制目录的英文逗号分隔值 (CSV) 文件。该 CSV 文件可以采用任何文件名,但必须使用 UTF-8 编码,并且文件名必须以 .csv 扩展名结尾。

对于图片和视频数据,CSV 文件中的每一行都是一个图片或视频的位置(在项目的 Google Cloud Storage 存储桶中)。例如:

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

每个数据文件都应包含您要标记的数据。 每个数据文件的内容将作为一个标签问题显示给标签添加者。

创建为数据项编制目录的 CSV 文件后,将其上传到数据项所在的 Cloud Storage 存储桶。

创建数据集资源

下一步是创建最终将保存数据项的数据集资源。您在下一步导入数据项之前,新创建的数据集是空的。

网页界面

在 Data Labeling Service 界面中,您可以从同一页面创建数据集并将数据项导入其中。

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

    数据集页面会显示之前为当前项目创建的数据集的状态。

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

  2. 点击标题栏中的创建按钮。

  3. 添加数据集页面上,为数据集输入名称和描述。

  4. 数据集类型下拉列表中,选择要上传到此数据集中的数据项类型:图片、视频或文本。

  5. CSV 文件位置框中,输入完整的输入 CSV 文件路径。

    该 CSV 文件必须与其列出的数据项位于同一个 Google Cloud Storage 存储桶中。

  6. 点击创建

    您会返回到数据集页面;您的数据集会在文档导入期间显示一个“正在进行”的状态。此过程所需的时间大约为每 1000 个数据项 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(f"The dataset resource name: {response.name}")
    print(f"Display name: {response.display_name}")
    print(f"Description: {response.description}")
    print("Create time:")
    print(f"\tseconds: {response.create_time.timestamp_pb().seconds}")
    print(f"\tnanos: {response.create_time.timestamp_pb().nanos}\n")

    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 文件将数据项导入到其中。

网页界面

在 Data Labeling Service 界面中,您可以跳过此步骤,因为导入操作已在上一步中完成。

命令行

  • 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(f"Dataset resource name: {result.dataset}\n")

    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 数据集。

  2. 在数据集列表中,点击您要查看其数据项的数据集的名称。

  3. 使用数据集详情页面的详情标签页查看该数据集中包含的各个数据项。