使用 AI Platform Training 中的内置算法进行训练时,您无需编写任何训练代码即可提交数据集并训练模型。本页面介绍了内置图片对象检测算法的工作原理和使用方法。
概览
内置的图片对象检测算法使用训练和验证数据集连续训练模型,然后输出在训练作业过程中生成的最准确的 SavedModel。您还可以使用超参数调节来获得最佳模型准确度。导出的 SavedModel 可直接用于本地预测,也可部署到 AI Platform Prediction 以用于生产环境服务。
限制
图片内置算法支持使用单个 CPU、GPU 或 TPU 进行训练。生成的 SavedModel 适用于在 CPU 和 GPU 上应用。
使用内置图片对象检测算法进行训练时不支持以下功能:
- 分布式训练。如需在 AI Platform Training 上运行 TensorFlow 分布式训练作业,您必须创建一个训练应用。
- 多 GPU 训练。内置算法一次只使用一个 GPU。要在一台机器上充分利用多个 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 服务账号名称授权:
通过调用
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
保存 API 返回的
serviceAccountProject
和tpuServiceAccount
字段的值。初始化 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
命令完成以下步骤:
控制台
- 登录 Google Cloud 控制台,然后选择您要使用 TPU 的项目。
- 选择 IAM 和管理 > IAM。
- 点击添加按钮向项目添加成员。
- 在成员文本框中输入 TPU 服务账号。
- 点击角色下拉列表。
- 启用 Cloud ML Service Agent 角色 (Service Agent > Cloud ML Service Agent)。
gcloud
设置包含项目 ID 和 Cloud TPU 服务账号的环境变量:
PROJECT_ID=PROJECT_ID SVC_ACCOUNT=your-tpu-sa-123@your-tpu-sa.google.com.iam.gserviceaccount.com
将
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_classes
:detection_boxes
中每个检测框的预测类别(整数)标签的列表。detection_scores
:detection_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
提交图片对象检测训练作业
本部分介绍如何提交使用内置图片对象检测算法的训练作业。
控制台
选择算法
转到 Google Cloud 控制台中的 AI Platform Training“作业”页面:
点击新建训练作业按钮。从下方显示的选项中,点击内置算法训练。
在创建新的训练作业页面上,选择图片对象检测 (image object detection),然后点击下一步。
选择训练和验证数据
在训练数据下的下拉框中,指定您要使用单个文件还是多个文件:
- 对于单个文件,请选择“使用 GCS 存储分区中的单个文件”(Use single file in a GCS bucket" selected)。
- 对于多个文件,请选择“使用存储在一个 Cloud Storage 目录中的多个文件”。
对于目录路径,请点击浏览。在右侧面板中,点击您将训练数据上传到的存储分区的名称,然后导航到您的文件。
如果您要选择多个文件,请将通配符放入通配符名称。下面显示了“完整的 GCS 路径”,可帮助您确认路径是否正确。
在验证数据下的下拉框中,指定您要使用单个文件还是多个文件:
- 对于单个文件,请选择“使用 GCS 存储分区中的单个文件”(Use single file in a GCS bucket" selected)。
- 对于多个文件,请选择“使用存储在一个 Cloud Storage 目录中的多个文件”。
对于目录路径,请点击浏览。在右侧面板中,点击您将训练数据上传到的存储分区的名称,然后导航到您的文件。
如果您要选择多个文件,请将通配符放入通配符名称。下面显示了“完整的 GCS 路径”,可帮助您确认路径是否正确。
在输出目录中,输入您希望 AI Platform Training 用于存储训练作业输出的 Cloud Storage 存储分区的路径。您可以直接填写 Cloud Storage 存储分区路径,或点击浏览按钮来选择。
为了便于管理,请在 Cloud Storage 存储分区中为此训练作业创建一个新目录。您可以在浏览窗格中执行此操作。
点击下一步。
设置算法参数
在未进行超参数调节的情况下,每个算法特定的参数都会显示训练作业的默认值。如果您对某个算法参数启用了超参数调节,则必须指定其最小值和最大值。
如需详细了解所有算法参数,请点击 Google Cloud 控制台中的链接,并参阅内置图片对象检测参考文档,以了解详情。
提交作业
在作业设置标签页上,执行以下操作:
- 输入唯一作业 ID。
- 输入可用区域(例如“us-central1”)。
- 如需选择机器类型,请在容量层级部分选择“CUSTOM”。
此时,系统会显示一个提供自定义集群规范的部分。
- 对于主机器类型,请选择可用的机器类型。
- 如果希望使用 TPU,请将工作器类型设置为 cloud_tpu。 “工作器计数”默认为 1。
点击完成,提交训练作业。
gcloud
为作业设置环境变量:
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}"
提交作业:
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
成功提交作业后,您可以使用以下
gcloud
命令查看日志:gcloud ai-platform jobs describe $JOB_ID gcloud ai-platform jobs stream-logs $JOB_ID
后续步骤
- 了解如何将您自己的数据集与 TFRecord 对象检测脚本结合使用。
- 请参阅内置图片对象检测参考文档,了解所有不同的参数。