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

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

概览

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

准备工作

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

完成以下步骤以设置 GCP 账号,启用所需的 API,以及安装和激活 Google Cloud CLI。

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

授权 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 文档

设置

我们修改了 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 中的目录结构与上述结构相同:

gcloud storage ls $JOB_DIR/* --all-versions

部署经过训练的模型

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

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

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

控制台

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

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

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

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

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

gcloud

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

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

    gcloud storage 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. 下载训练工件文件:

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

    要使用 Google Cloud CLI 发送在线预测请求,请将每个实例写入以换行符分隔的 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) 数据集是一种大规模的对象检测、细分和字幕数据集。

后续步骤