使用内置图片对象检测算法进行训练

使用 AI Platform Training 中的内置算法进行训练时,您无需编写任何训练代码即可提交数据集并训练模型。本页面介绍了内置图片对象检测算法的工作原理和使用方法。

概览

内置的图片对象检测算法使用训练和验证数据集连续训练模型,然后输出在训练作业过程中生成的最准确的 SavedModel。您还可以使用超参数调节来获得最佳模型准确度。导出的 SavedModel 可直接用于本地预测,也可部署到 AI Platform Prediction 以用于生产环境服务。

限制

图片内置算法支持使用单个 CPU、GPU 或 TPU 进行训练。生成的 SavedModel 适用于在 CPU 和 GPU 上应用。

使用内置图片对象检测算法进行训练时不支持以下功能

支持的机器类型

以下是系统支持的 AI Platform Training 容量层级和机器类型

  • BASIC 规模层级
  • BASIC_TPU 规模层级
  • CUSTOM 规模层级和 AI Platform Training 所支持的任何 Compute Engine 机器类型
  • CUSTOM 规模层级和以下任何旧版机器类型
    • standard
    • large_model
    • complex_model_s
    • complex_model_m
    • complex_model_l
    • standard_gpu
    • standard_p100
    • standard_v100
    • large_model_v100
    • complex_model_m_gpu
    • complex_model_l_gpu
    • complex_model_m_p100
    • complex_model_m_v100
    • complex_model_l_v100
    • TPU_V2(8 个核心)

授权 Cloud TPU 访问项目

请按照以下步骤为 Google Cloud 项目所关联的 Cloud TPU 服务账号名称授权:

  1. 通过调用 projects.getConfig 获取 Cloud TPU 服务账号名称。示例:

    PROJECT_ID=PROJECT_ID
    
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
        https://ml.googleapis.com/v1/projects/$PROJECT_ID:getConfig
    
  2. 保存 API 返回的 serviceAccountProjecttpuServiceAccount 字段的值。

  3. 初始化 Cloud TPU 服务账号:

    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
      -H "Content-Type: application/json" -d '{}'  \
      https://serviceusage.googleapis.com/v1beta1/projects/<serviceAccountProject>/services/tpu.googleapis.com:generateServiceIdentity
    

现在,将该 Cloud TPU 服务账号添加为项目的成员,并为其授予 Cloud ML Service Agent 角色。在 Google Cloud 控制台中或使用 gcloud 命令完成以下步骤:

控制台

  1. 登录 Google Cloud 控制台,然后选择您正在使用 TPU 的项目。
  2. 选择 IAM 和管理 > IAM
  3. 点击添加按钮向项目添加成员。
  4. 成员文本框中输入 TPU 服务账号。
  5. 点击角色下拉列表。
  6. 启用 Cloud ML Service Agent 角色 (Service Agent > Cloud ML Service Agent)。

gcloud

  1. 设置包含项目 ID 和 Cloud TPU 服务账号的环境变量:

    PROJECT_ID=PROJECT_ID
    SVC_ACCOUNT=your-tpu-sa-123@your-tpu-sa.google.com.iam.gserviceaccount.com
    
  2. ml.serviceAgent 角色授予 Cloud TPU 服务账号:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member serviceAccount:$SVC_ACCOUNT --role roles/ml.serviceAgent
    

如需详细了解如何为服务账号授予角色,请参阅 IAM 文档

设置输入数据的格式以用于训练

内置的图片对象检测算法要求输入数据的格式为 tf.Examples,并保存在 TFRecord 文件中。tf.Example 数据结构和 TFRecord 文件格式均旨在通过 TensorFlow 高效读取数据。

TFRecord 格式是一种用于存储一系列二进制记录的简单格式。 在本例中,所有记录都包含图片的二进制表示形式。每个图片及其类别标签都表示为 tf.Example。您可以将多个 tf.Example 保存到单个 TFRecord 文件中。您还可以将一个大型数据集分片到多个 TFRecord 文件中。

详细了解 TFRecord 和 tf.Example

将图片转换为 TFRecord 格式

要将图片转换为获取预测结果所需的格式,请按照 TensorFlow Model Garden 的指南来准备用于对象检测的输入

检查 Cloud Storage 存储桶权限

要存储数据,请使用用于运行 AI Platform Training 作业的同一 Google Cloud 项目中的 Cloud Storage 存储桶。否则,需要向 AI Platform Training 授予对存储数据的 Cloud Storage 存储桶的访问权限

要求的输入格式

若要使用内置的图片对象检测算法进行训练,您的图片数据的结构必须为 tf.Example,其中包含以下字段:

  • image/encoded 是编码为字符串的原始图片。

  • image/object/class/label 是相应图片的整数标签列表(每个框一个标签)。

    用于数据集的整数标签集必须是从 1 开始的连续序列。例如,如果您的数据集有五个类,则每个标签必须是区间 [1, 5] 中的一个整数。

  • image/object/bbox/xmin 是对应图片的归一化左 x 坐标的列表(每个框一个坐标)。每个坐标都必须在区间 [0, 1] 中。

  • image/object/bbox/xmax 是对应图片的归一化右 x 坐标的列表(每个框一个坐标)。每个坐标都必须在区间 [0, 1] 中。

  • image/object/bbox/ymin 是对应图片的归一化上 y 坐标的列表(每个框一个坐标)。每个坐标都必须在区间 [0, 1] 中。

  • image/object/bbox/ymax 是对应图片的归一化下 y 坐标的列表(每个框一个坐标)。每个坐标都必须在区间 [0, 1] 中。

以下示例显示了包含两个边界框的图片的 tf.Example 结构。第一个框的标签为 1,其左上角位于归一化坐标 (0.1, 0.4) 处,其右下角位于归一化坐标 (0.5, 0.8) 处。第二个框的标签为 2,其左上角位于归一化坐标 (0.3, 0.5) 处,右下角位于归一化坐标 (0.4, 0.7) 处。

{
    'image/encoded': '<encoded image data>',
    'image/object/class/label': [1, 2],
    'image/object/bbox/xmin': [0.1, 0.3],
    'image/object/bbox/xmax': [0.5, 0.4],
    'image/object/bbox/ymin': [0.4, 0.5],
    'image/object/bbox/ymax': [0.8, 0.7]
}

tf.Example 格式遵循 TFRecord 对象检测脚本中使用的格式。

获取最佳 SavedModel 作为输出

训练作业完成后,AI Platform Training 会将 TensorFlow SavedModel 写入您在提交作业时指定为 jobDir 的 Cloud Storage 存储桶。SavedModel 写入 jobDir/model。例如,如果您将作业提交到 gs://your-bucket-name/your-job-dir,则 AI Platform Training 会将 SavedModel 写入 gs://your-bucket-name/your-job-dir/model

如果您启用了超参数调节,AI Platform Training 会返回在训练过程中获得的具有最高准确度的 TensorFlow SavedModel。例如,如果您提交的训练作业包含 2500 个训练步骤,且准确度在 2000 个步骤时最高,您会获得从该特定点保存的 TensorFlow SavedModel。

每次 AI Platform Training 试验都会将具有最高准确度的 TensorFlow SavedModel 写入其在您的 Cloud Storage 存储分区内的专属目录中。例如 gs://your-bucket-name/your-job-dir/model/trial_{trial_id}

输出 SavedModel 的签名是:

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['encoded_image'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: encoded_image_string_tensor:0
    inputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: key:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['detection_boxes'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100, 4)
        name: detection_boxes:0
    outputs['detection_classes'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100)
        name: detection_classes:0
    outputs['detection_scores'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100)
        name: detection_scores:0
    outputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Identity:0
    outputs['num_detections'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1)
        name: num_detections:0
  Method name is: tensorflow/serving/predict

输入:

  • encoded_image:原始(未解码)图片字节。这与 tf.Example 中存储的 image/encoded 相同。
  • key:预测输入的字符串值标识符。此值会传递给输出 key。在批量预测中,这有助于将预测输出映射到输入。

输出:

  • num_detections:检测到的边界框的数量。
  • detection_boxes:检测边界框的相对([0,1] 中的值)坐标 ([ymin, xmin, ymax, xmax]) 的列表。
  • detection_classesdetection_boxes 中每个检测框的预测类别(整数)标签的列表。
  • detection_scoresdetection_boxes 中每个检测框的 scores 的列表。
  • key:输出键。

以下是预测输出的示例:

{u'detection_classes': [1.0, 3.0, 3.0, ...],
u'key': u'test_key',
u'num_detections': 100.0,
u'detection_scores': [0.24401935935020447, 0.19375669956207275, 0.18359294533729553, ...]]}

配置示例

如果您使用 gcloud 提交作业,则需要针对机器类型和超参数调节规范创建 config.yaml 文件。如果您使用 Google Cloud 控制台,则无需创建此文件。了解如何提交训练作业

以下示例 config.yaml 文件展示了如何为训练作业分配 TPU 资源:

cat << EOF > config.yaml
trainingInput:
  scaleTier: CUSTOM
  masterType: n1-standard-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: NVIDIA_TESLA_P100
      count: 1
  workerType:  cloud_tpu
  workerConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    tpuTfVersion: 1.14
    acceleratorConfig:
      type: TPU_V2
      count: 8
  workerCount: 1
EOF

接下来,使用 config.yaml 文件来提交训练作业

超参数调节配置

如需使用超参数调节,请将超参数调节配置添加到与机器配置相同的 config.yaml 文件中。

您可以在 Google Cloud 控制台中找到每个超参数的简要说明,还可以在内置图片对象检测算法参考文档中查看更全面的说明。

以下示例 config.yaml 文件展示了如何为训练作业分配 TPU 资源,并包含超参数调节配置:

cat << EOF > config.yaml
trainingInput:
  # Use a cluster with many workers and a few parameter servers.
  scaleTier: CUSTOM
  masterType: n1-standard-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: NVIDIA_TESLA_P100
      count: 1
  workerType:  cloud_tpu
  workerConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: TPU_V2
      count: 8
  workerCount: 1
  # The following are hyperparameter configs.
  hyperparameters:
   goal: MAXIMIZE
   hyperparameterMetricTag: "AP"
   maxTrials: 6
   maxParallelTrials: 3
   enableTrialEarlyStopping: True
   params:
   - parameterName: initial_learning_rate
     type: DOUBLE
     minValue: 0.001
     maxValue: 0.1
     scaleType: UNIT_LOG_SCALE
EOF

提交图片对象检测训练作业

本部分介绍如何提交使用内置图片对象检测算法的训练作业。

控制台

选择算法

  1. 转到 Google Cloud 控制台中的 AI Platform Training“作业”页面:

    AI Platform Training“作业”页面

  2. 点击新建训练作业按钮。从下方显示的选项中,点击内置算法训练

  3. 创建新的训练作业页面上,选择图片对象检测 (image object detection),然后点击下一步

选择训练和验证数据

  1. 训练数据下的下拉框中,指定您要使用单个文件还是多个文件:

    • 对于单个文件,请选择“使用 GCS 存储桶中的单个文件”(Use single file in a GCS bucket" selected)。
    • 对于多个文件,请选择“使用存储在一个 Cloud Storage 目录中的多个文件”。
  2. 对于目录路径,请点击浏览。在右侧面板中,点击您将训练数据上传到的存储桶的名称,然后导航到您的文件。

    如果您要选择多个文件,请将通配符放入通配符名称。下面显示了“完整的 GCS 路径”,可帮助您确认路径是否正确。

  3. 验证数据下的下拉框中,指定您要使用单个文件还是多个文件:

    • 对于单个文件,请选择“使用 GCS 存储桶中的单个文件”(Use single file in a GCS bucket" selected)。
    • 对于多个文件,请选择“使用存储在一个 Cloud Storage 目录中的多个文件”。
  4. 对于目录路径,请点击浏览。在右侧面板中,点击您将训练数据上传到的存储桶的名称,然后导航到您的文件。

    如果您要选择多个文件,请将通配符放入通配符名称。下面显示了“完整的 GCS 路径”,可帮助您确认路径是否正确。

  5. 输出目录中,输入您希望 AI Platform Training 用于存储训练作业输出的 Cloud Storage 存储桶的路径。您可以直接填写 Cloud Storage 存储桶路径,或点击浏览按钮来选择。

    为了便于管理,请在 Cloud Storage 存储桶中为此训练作业创建一个新目录。您可以在浏览窗格中执行此操作。

    点击下一步

设置算法参数

在未进行超参数调节的情况下,每个算法特定的参数都会显示训练作业的默认值。如果您对某个算法参数启用了超参数调节,则必须指定其最小值和最大值。

如需详细了解所有算法参数,请点击 Google Cloud 控制台中的链接,并参阅内置图片对象检测参考文档,以了解详情。

提交作业

作业设置标签页上,执行以下操作:

  1. 输入唯一作业 ID
  2. 输入可用区域(例如“us-central1”)。
  3. 如需选择机器类型,请在规模层级部分选择“CUSTOM”。 此时,系统会显示一个提供自定义集群规范的部分。
    1. 对于主机器类型,请选择可用的机器类型。
    2. 如果希望使用 TPU,请将工作器类型设置为 cloud_tpu“工作器计数”默认为 1。

点击完成,提交训练作业。

gcloud

  1. 为作业设置环境变量:

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
    # Specify the same region where your data is stored
    REGION="YOUR_REGION"
    
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region $REGION
    
    # Set Cloud Storage paths to your training and validation data
    # Include a wildcard if you select multiple files.
    TRAINING_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/train-*.tfrecord"
    VALIDATION_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/eval-*.tfrecord"
    
    # Specify the Docker container for your built-in algorithm selection
    IMAGE_URI="gcr.io/cloud-ml-algos/image_object_detection:latest"
    
    # Variables for constructing descriptive names for JOB_ID and JOB_DIR
    DATASET_NAME="coco"
    ALGORITHM="object_detection"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}"
    DATE="$(date '+%Y%m%d_%H%M%S')"
    
    # Specify an ID for this job
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Specify the directory where you want your training outputs to be stored
    JOB_DIR="gs://${BUCKET_NAME}/algorithm_training/${JOB_ID}"
    
  2. 提交作业:

    gcloud ai-platform jobs submit training $JOB_ID \
      --region=$REGION \
      --config=config.yaml \
      --job-dir=$JOB_DIR \
      -- \
      --training_data_path=$TRAINING_DATA_PATH \
      --validation_data_path=$VALIDATION_DATA_PATH \
      --train_batch_size=64 \
      --num_eval_images=500 \
      --train_steps_per_eval=2000 \
      --max_steps=22500 \
      --num_classes=90 \
      --warmup_steps=500 \
      --initial_learning_rate=0.08 \
      --fpn_type="nasfpn" \
      --aug_scale_min=0.8 \
      --aug_scale_max=1.2
    

  3. 成功提交作业后,您可以使用以下 gcloud 命令查看日志:

    gcloud ai-platform jobs describe $JOB_ID
    gcloud ai-platform jobs stream-logs $JOB_ID
    

后续步骤