开始使用内置图片对象检测算法

借助 AI Platform Training 中的内置算法,您可以提交训练数据、选择算法,以及让 AI Platform Training 为您处理预处理和训练作业,而无需为训练应用编写任何代码。利用内置图片算法,您只需进行极少的配置即可在 TPU 上进行训练。 生成的 TensorFlow SavedModel 可在 CPU 和 GPU 上运行。

概览

在本教程中,您无需编写任何代码即可训练图片对象检测模型。您可以将 COCO 数据集提交给 AI Platform Training 进行训练,然后在 AI Platform Training 上部署该模型以获取预测结果。生成的模型对复杂日常场景图片中的常见对象进行分类。

准备工作

如需通过命令行完成本教程的学习,请使用 Cloud Shell 或已安装 Cloud SDK 的任何环境。

完成以下步骤以设置 GCP 帐号,启用所需的 API,然后安装并激活 Cloud SDK:

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 AI Platform Training & Prediction and Compute Engine API。

    启用 API

  5. 安装并初始化 Cloud SDK
  6. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  7. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  8. 启用 AI Platform Training & Prediction and Compute Engine API。

    启用 API

  9. 安装并初始化 Cloud SDK

授权 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 Console 中或使用 gcloud 命令完成以下步骤:

控制台

  1. 登录到 Google Cloud Console,然后选择您要在其中使用 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 文档

设置

我们修改了 COCO 数据集,以便在本教程中使用,并将其托管在公开 Cloud Storage 存储分区 (gs://cloud-samples-data/ai-platform/built-in/image/coco/) 中。

控制台

选择算法

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

    AI Platform Training“作业”页面

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

  3. 训练作业的创建分为四个步骤。第一步是训练算法。选择图片对象检测 (image object detection),然后点击下一步

训练数据

  1. 训练数据部分,选择示例数据集的训练数据,该数据集托管在我们的公开 Cloud Storage 存储分区中:

    1. 选择使用存储在一个 Cloud Storage 目录中的多个文件

    2. 目录路径部分,填入“cloud-samples-data/ai-platform/built-in/image/coco/”

    3. 通配符名称部分,填入“train*”以选择该目录中的所有训练文件。

    4. 完整的 GCS 路径 (Complete GCS path) 部分显示如下:“gs://cloud-samples-data/ai-platform/built-in/image/coco/train*”

  2. 验证数据部分,选择示例数据集的验证数据,该数据集托管在我们的公开 Cloud Storage 存储分区中:

    1. 选择使用存储在一个 Cloud Storage 目录中的多个文件

    2. 目录路径部分,填入“cloud-samples-data/ai-platform/built-in/image/coco/”

    3. 通配符名称部分,填入“val*”以选择该目录中的所有验证文件。

    4. 完整的 GCS 路径 (Complete GCS path) 部分显示如下:“gs://cloud-samples-data/ai-platform/built-in/image/coco/val*”

  3. 指定您的 Cloud Storage 存储分区中的所需输出目录,以供 AI Platform Training 用来存储经过训练的模型、检查点和其他训练作业输出。您可以填写存储分区中的确切路径,或使用浏览按钮来选择路径。

gcloud

为您的项目 ID、Cloud Storage 存储分区、指向训练数据的 Cloud Storage 路径以及算法选择设置环境变量。

AI Platform Training 内置算法位于 Container Registry 中托管的 Docker 容器中。

PROJECT_ID="YOUR_PROJECT_ID"
BUCKET_NAME="YOUR_BUCKET_NAME"
REGION="us-central1"

gcloud config set project $PROJECT_ID
gcloud config set compute/region $REGION

# Set paths to the training and validation data.
TRAINING_DATA_PATH="gs://cloud-samples-data/ai-platform/built-in/image/coco/train*"
VALIDATION_DATA_PATH="gs://cloud-samples-data/ai-platform/built-in/image/coco/val*"

# Specify the Docker container for your built-in algorithm selection.
IMAGE_URI="gcr.io/cloud-ml-algos/image_object_detection:latest"

提交训练作业

如需提交作业,您必须指定一些基本训练参数,以及一些与图片对象检测算法相关的基本参数。

训练作业的常规参数:

训练作业参数
参数 说明
job-id 训练作业的唯一 ID。提交训练作业后,您可以使用此参数查找训练作业状态的日志。
job-dir AI Platform Training 在训练作业成功完成后用来保存训练文件的 Cloud Storage 路径。
scale-tier 指定用于训练的机器类型。使用 BASIC 选择仅使用一台机器的配置。
master-image-uri Container Registry URI,用于指定训练作业要使用的 Docker 容器。将容器用于先前定义为 IMAGE_URI 的内置图片对象检测算法。
region 指定用于运行训练作业的可用区域。在本教程中,您可以使用区域 us-central1

内置图片对象检测算法专用参数:

算法参数
参数 说明
training_data_path 用于训练的 TFRecord 路径模式的路径。
validation_data_path 用于验证的 TFRecord 路径模式的路径。
pretrained_checkpoint_path 预训练的检查点的路径。您可以使用一些已发布的检查点。
num_classes 训练/验证数据中的类别数。
max_steps 训练作业将运行的步数。
train_batch_size 每个训练步要使用的图片数。
num_eval_images 用于评估的图片总数。
如果为 0,则 validation_data_path 中的所有图片都将用于评估。
learning_rate_decay_type 训练期间使用的学习速率衰减方法。
warmup_learning_rate 预热阶段开始时的学习速率。
warmup_steps 需要在预热阶段运行的步数,或预热阶段的长度(以步为单位)。 训练作业在预热阶段使用 warmup_learning_rate。当预热阶段结束时,训练作业使用 initial_learning_rate
initial_learning_rate 预热阶段完成后的初始学习速率。
stepwise_learning_rate_steps 学习速率衰减类型为阶梯式时学习速率的衰减/变化步。
例如,100,200 表示学习速率将在第 100 步和第 200 步发生变化(相对于 stepwise_learning_rate_levels)。请注意,只有在将 learning_rate_decay_type 设置为“阶梯式”时,才会遵循此参数的设置。
stepwise_learning_rate_levels 学习速率衰减类型为阶梯式时每步的学习速率值。请注意,只有在将 learning_rate_decay_type 设置为“阶梯式”时,才会遵循此参数的设置。
image_size 用于训练的图片大小(宽度和高度)。
optimizer_type 用于训练的优化器。应为以下项之一:
{momentum, adam, adadelta, adagrad, rmsprop}
optimizer_arguments 优化器的参数。这是以英文逗号分隔的“名称=值”对列表。该参数必须与 optimizer_type 兼容。示例:
  • 对于 Momentum 优化器,该参数接受 momentum=0.9。如需了解详情,请参阅 tf.train.MomentumOptimizer
  • 对于 Adam 优化器,该参数可以是 beta1=0.9,beta2=0.999。 如需了解详情,请参阅 tf.train.AdamOptimizer
  • 对于 RMSProp 优化器,该参数可以是 decay=0.9,momentum=0.1,epsilon=1e-10。 如需了解详情,请参阅 RMSPropOptimizer
fpn_type 多级特征金字塔网络 (FPN) 类型。 必须为 {fpn, nasfpn} 之一。
resnet_depth ResNet 骨干的深度。 必须为 {18,34,50,101,152,200} 之一。
max_num_bboxes_in_training 用于训练的建议边界框数量上限。
max_num_bboxes_in_prediction 在预测输出中使用的建议边界框数量上限。
bbox_aspect_ratios 表示在每个级别添加的宽高比锚点的基本锚点的大小缩放。数字表示宽高比。例如,“1.0,2.0,0.5”在每个缩放级别添加三个锚点。
nms_iou_threshold 关于非最大抑制的 IOU,决定边界框是否重叠的阈值。
nms_score_threshold 用于决定何时根据分数移除边界框的阈值。
focal_loss_alpha 焦点损失 alpha(平衡参数)值。
focal_loss_gamma 焦点损失 gamma(聚焦参数)值。
aug_scale_min 图片增强过程中应用的最小缩放。其值介于 [0, 1.0] 之间。
aug_scale_max 图片增强过程中应用的最大缩放。其值介于 [1.0, inf] 之间。
aug_rand_hflip 布尔值。如果设置为 True,该设置使用随机水平翻转增强训练。

如需所有其他图片对象检测算法标志的详细列表,请参阅内置图片对象检测参考文档

控制台

算法参数

算法参数标签页的第一部分中,按如下所示填入值:

  • 类别数 (Number of classes):91
  • 步数上限 (Max steps):15000
  • 训练批次大小 (Train batch size):64
  • 评估图片数 (Number of evaluation images):5000

算法参数标签页的模型部分 (Model Section) 中,执行以下操作:

  1. 预训练的检查点路径 (Pretrained checkpoint path) 部分,填入 gs://cloud-samples-data/ai-platform/built-in/image/pretrained_checkpoints/detection/

  2. 将所有其他字段保留为默认设置,然后点击下一步

作业设置

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

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

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

gcloud

  1. 使用 gcloud 提交训练作业之前,请先设置训练作业和算法的所有参数:

    DATASET_NAME="coco"
    ALGORITHM="object_detection"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}_model"
    
    # Give a unique name to your training job.
    DATE="$(date '+%Y%m%d_%H%M%S')"
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Make sure you have access to this Cloud Storage bucket.
    JOB_DIR="gs://${BUCKET_NAME}/algorithms_training/${MODEL_NAME}/${DATE}"
    
  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=15000 \
      --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
    

了解作业目录

训练作业成功完成后,AI Platform Training 会在您的 Cloud Storage 存储分区中创建经过训练的模型,以及其他一些工件。您可以在 JOB_DIR 中找到以下目录结构:

  • model/(亦包含 deployment_config.yaml 文件的 TensorFlow SavedModel 目录
    • saved_model.pb
    • deployment_config.yaml
  • eval/
    • events.out.tfevents.[timestamp].cmle-training-[timestamp]
    • events.out.tfevents...
  • variables/
    • variables.data-00000-of-00001
    • variables.index

作业目录还包含各种模型检查点文件。

确认您的 JOB_DIR 中的目录结构与上述结构相同:

gsutil ls -a $JOB_DIR/*

部署经过训练的模型

AI Platform Training 使用模型和版本资源来组织经过训练的模型。AI Platform Training 模型是存放机器学习模型版本的容器。

如需部署模型,请在 AI Platform Training 中创建模型资源,创建该模型的版本,然后使用所创建的模型和版本请求在线预测。

如需详细了解如何将模型部署到 AI Platform Training,请参阅如何部署 TensorFlow 模型

Console

  1. 作业页面上,您可以找到包含所有训练作业的列表。点击您刚刚提交的训练作业的名称(“object_detection”或您使用的作业名称)。

  2. 作业详情页面上,您可以查看作业的整体进度,也可以点击查看日志,更详细地查看进度。

  3. 如果作业成功,顶部会显示部署模型按钮。点击部署模型

  4. 选择部署为新模型,然后输入模型名称,如“algorithms_object_detection_model”。然后,点击确认

  5. 创建版本页面上,输入版本名称(如“v1”),并将所有其他字段保留为默认设置。点击保存

gcloud

使用内置图片对象检测算法的训练过程会生成一个 deployment_config.yaml 文件,这让您可以更轻松地在 AI Platform Training 上部署模型进行预测。

  1. 将该文件复制到本地目录并查看其内容:

    gsutil cp $JOB_DIR/model/deployment_config.yaml .
    cat deployment_config.yaml
    

    您的 deployment_config.yaml 文件应类似于以下内容:

    deploymentUri: gs://BUCKET_NAME/algorithms_training/coco_object_detection/model
    framework: TENSORFLOW
    labels:
      global_step: '1000'
      job_id: coco_object_detection_20190227060114
    runtimeVersion: '1.14'
    
  2. 在 AI Platform Training 中创建模型和版本:

    gcloud ai-platform models create $MODEL_NAME --regions $REGION
    
    # Create a model and a version using the file above.
    VERSION_NAME="v_${DATE}"
    
    gcloud ai-platform versions create $VERSION_NAME \
      --model $MODEL_NAME \
      --config deployment_config.yaml
    

    版本创建过程需要几分钟时间才能完成。

获取在线预测结果

请求预测时,您需要确保输入数据为 JSON 格式。

  1. 下载训练工件文件:

    gsutil cp $JOB_DIR/artifacts/* .
    
  2. 为一张图片准备预测输入。

    要使用 gcloud 命令行工具发送在线预测请求,请将每个实例写入以换行符分隔的 JSON 文件中的行中,如以下示例所示。

    在终端运行以下命令,为您可以发送到 AI Platform Prediction 的单个实例创建输入:

    以下 Python 脚本使用 base64 对单张图片进行编码,设置其格式以用于预测,添加实例键,并将结果写入名为 prediction_instances.json 的文件:

    import json
    import base64
    import tensorflow as tf
    
    IMAGE_URI='gs://cloud-samples-data/ai-platform/built-in/image/tutorial_examples/coco_sample.jpeg'
    
    with tf.gfile.Open(IMAGE_URI, 'rb') as image_file:
      encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
    
    image_bytes = {'b64': str(encoded_string)}
    instances = {'image_bytes': image_bytes, 'key': '1'}
    with open("prediction_instances.json","w") as f:
      f.write(json.dumps(instances))
    
  3. 发送预测请求:

    gcloud ai-platform predict --model $MODEL_NAME \
     --version $VERSION_NAME \
     --json-instances prediction_instances.json
    

对于在图片中检测到的每个对象,预测输出包括类别、分数和边界框的位置。

关于数据

Microsoft Common Objects in Context (COCO) 数据集是一种大规模的对象检测、细分和字幕数据集。

后续步骤