教程:使用 AutoML 和 Python 训练物体检测模型

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

本教程介绍如何将 Azure 机器学习自动化 ML 与 Azure 机器学习 CLI 扩展 v2 或 Azure 机器学习 Python SDK v2 配合使用来训练对象检测模型。 此对象检测模型标识图像是否包含对象,例如罐、纸箱、牛奶瓶或水瓶。

自动化 ML 接受训练数据和配置设置,并自动循环访问不同特征规范化/标准化方法、模型和超参数设置的组合,以达到最佳模型。

在本教程中使用 Python SDK 编写代码并学习以下任务:

  • 下载和转换数据
  • 训练自动化机器学习物体检测模型
  • 为模型指定超参数值
  • 执行超参数扫描
  • 部署模型
  • 直观呈现检测结果

先决条件

  • 要使用 Azure 机器学习,你需要一个工作区。 如果没有工作区,请完成创建开始使用所需的资源以创建工作区并详细了解如何使用它。

    重要

    如果 Azure 机器学习工作区配置了托管虚拟网络,则可能需要添加出站规则以允许访问公共 Python 包存储库。 有关详细信息,请参阅应用场景:访问公共机器学习包

  • 使用 Python 3.10 或更高版本。

  • 下载并解压缩 odFridgeObjects.zip 数据文件。 数据集以 Pascal VOC 格式批注,其中每个图像对应于 XML 文件。 每个 XML 文件都包含有关其相应图像文件所在位置的信息,还包含有关边界框和对象标签的信息。 若要使用此数据,首先需要将其转换为所需的 JSONL 格式,如 automl-image-object-detection-task-fridge-items.ipynb 笔记本中的 将下载的数据转换为 JSONL 部分所示。

  • 使用计算实例完成本教程,而无需进一步安装。 (请参阅 创建计算实例。)或者安装 CLI 或 SDK 以使用自己的本地环境。

    适用于:Azure CLI ml 扩展 v2(当前)

    还可以在 GitHub 上的 azureml-examples 存储库中找到本教程。 如果要在本地环境中运行它,请安装并 设置 CLI(v2), 并确保安装 ml 扩展。

计算目标设置

注意

若要尝试 无服务器计算,请跳过此步骤并转到 试验设置

首先需要设置用于自动化 ML 模型训练的计算目标。 用于图像任务的自动化 ML 模型需要 GPU SKU。

本教程使用 NCsv3 系列(具有 V100 GPU),因为这种类型的计算目标使用多个 GPU 来加快训练速度。 此外,还可以设置多个节点,以在优化模型的超参数时利用并行度。

以下代码使用四个节点创建大小Standard_NC24s_v3的 GPU 计算。

适用于:Azure CLI ml 扩展 v2(当前)

请创建一个具有以下配置的 .yml 文件。

$schema: https://azuremlschemas.azureedge.net/latest/amlCompute.schema.json 
name: gpu-cluster
type: amlcompute
size: Standard_NC24s_v3
min_instances: 0
max_instances: 4
idle_time_before_scale_down: 120

若要创建计算,请使用.yml文件、工作区名称、资源组和订阅 ID 的路径运行以下 CLI v2 命令。

az ml compute create -f [PATH_TO_YML_FILE] --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

试验设置

可以使用实验来跟踪模型训练作业。

适用于:Azure CLI ml 扩展 v2(当前)

可以使用密钥提供试验名称 experiment_name

experiment_name: dpv2-cli-automl-image-object-detection-experiment

直观呈现输入数据

准备好 JSONL(JSON Lines)格式的输入图像数据后,可以直观显示图像的真实边界框。 若要执行此操作,请确保你已安装 matplotlib

%pip install --upgrade matplotlib

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.patches as patches
from PIL import Image as pil_image
import numpy as np
import json
import os

def plot_ground_truth_boxes(image_file, ground_truth_boxes):
    # Display the image
    plt.figure()
    img_np = mpimg.imread(image_file)
    img = pil_image.fromarray(img_np.astype("uint8"), "RGB")
    img_w, img_h = img.size

    fig,ax = plt.subplots(figsize=(12, 16))
    ax.imshow(img_np)
    ax.axis("off")

    label_to_color_mapping = {}

    for gt in ground_truth_boxes:
        label = gt["label"]

        xmin, ymin, xmax, ymax =  gt["topX"], gt["topY"], gt["bottomX"], gt["bottomY"]
        topleft_x, topleft_y = img_w * xmin, img_h * ymin
        width, height = img_w * (xmax - xmin), img_h * (ymax - ymin)

        if label in label_to_color_mapping:
            color = label_to_color_mapping[label]
        else:
            # Generate a random color. If you want to use a specific color, you can use something like "red."
            color = np.random.rand(3)
            label_to_color_mapping[label] = color

        # Display bounding box
        rect = patches.Rectangle((topleft_x, topleft_y), width, height,
                                 linewidth=2, edgecolor=color, facecolor="none")
        ax.add_patch(rect)

        # Display label
        ax.text(topleft_x, topleft_y - 10, label, color=color, fontsize=20)

    plt.show()

def plot_ground_truth_boxes_jsonl(image_file, jsonl_file):
    image_base_name = os.path.basename(image_file)
    ground_truth_data_found = False
    with open(jsonl_file) as fp:
        for line in fp.readlines():
            line_json = json.loads(line)
            filename = line_json["image_url"]
            if image_base_name in filename:
                ground_truth_data_found = True
                plot_ground_truth_boxes(image_file, line_json["label"])
                break
    if not ground_truth_data_found:
        print("Unable to find ground truth information for image: {}".format(image_file))

通过使用上述帮助函数,你可以对任何给定的图像运行以下代码来显示边界框。

image_file = "./odFridgeObjects/images/31.jpg"
jsonl_file = "./odFridgeObjects/train_annotations.jsonl"

plot_ground_truth_boxes_jsonl(image_file, jsonl_file)

上传数据并创建 MLTable

若要使用数据进行训练,请将其上传到 Azure 机器学习工作区的默认 Blob 存储,并将其注册为资产。 注册数据的好处包括:

  • 可以轻松地与团队的其他成员共享。
  • 元数据的版本管理(位置、说明等)。
  • 世系跟踪。

适用于:Azure CLI ml 扩展 v2(当前)

请创建一个具有以下配置的 .yml 文件。

$schema: https://azuremlschemas.azureedge.net/latest/data.schema.json
name: fridge-items-images-object-detection
description: Fridge-items images Object detection
path: ./data/odFridgeObjects
type: uri_folder

若要将图像作为数据资产上传,请使用.yml文件、工作区名称、资源组和订阅 ID 的路径运行以下 CLI v2 命令。

az ml data create -f [PATH_TO_YML_FILE] --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

下一步是根据 JSONL 格式的数据创建一个 MLTable,如以下示例所示。 MLTable 将数据打包到易耗型对象中,用于训练。

paths:
  - file: ./train_annotations.jsonl
transformations:
  - read_json_lines:
        encoding: utf8
        invalid_lines: error
        include_path_column: false
  - convert_column_types:
      - columns: image_url
        column_type: stream_info

适用于:Azure CLI ml 扩展 v2(当前)

以下配置从 MLTable 创建训练和验证数据。

target_column_name: label
training_data:
  path: data/training-mltable-folder
  type: mltable
validation_data:
  path: data/validation-mltable-folder
  type: mltable

配置物体检测试验

若要为与映像相关的任务配置自动化 ML 作业,请创建特定于任务的 AutoML 作业。

适用于:Azure CLI ml 扩展 v2(当前)

注意

若要使用 无服务器计算,请将行 compute: azureml:gpu-cluster 替换为以下代码:

resources:
 instance_type: Standard_NC24s_v3
 instance_count: 4
task: image_object_detection
primary_metric: mean_average_precision
compute: azureml:gpu-cluster

适用于图像任务的自动超参数扫描 (AutoMode)

在 AutoML 作业中,可以执行自动超参数扫描来查找最佳模型。 (此功能称为 AutoMode)。 仅指定实验次数。 不需要超参数搜索空间、采样方法和提前终止策略。 系统会根据试验数自动确定要扫描的超参数空间区域。 介于 10 和 20 之间的值可能适用于许多数据集。

适用于:Azure CLI ml 扩展 v2(当前)

limits:
  max_trials: 10
  max_concurrent_trials: 2

然后,你可以提交作业来训练图像模型。

适用于:Azure CLI ml 扩展 v2(当前)

要提交 AutoML 作业,请使用指向您的 .yml 文件、工作区名称、资源组和订阅 ID 的路径运行以下 CLI v2 命令。

az ml job create --file ./hello-automl-job-basic.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

适用于图像任务的手动超参数扫描

在 AutoML 作业中,可以使用参数指定模型体系结构 model_name ,并配置设置以对定义的搜索空间执行超参数扫描以查找最佳模型。

在此示例中,使用 YOLOv5 和 FasterRCNN ResNet50 FPN 训练对象检测模型,这两个模型均在 COCO 上预先训练,这是一个大规模对象检测、分段和标题数据集,其中包含数千个标签类别超过 80 个标签类别的已标记图像。

可以对已定义的搜索空间执行超参数扫描,以查找最佳模型。

作业限制

可以通过在限制设置中为作业指定timeout_minutesmax_trialsmax_concurrent_trials,来控制 AutoML 图像训练作业上的资源使用。 有关详细信息,请参阅 作业限制参数的说明

适用于:Azure CLI ml 扩展 v2(当前)

limits:
  timeout_minutes: 60
  max_trials: 10
  max_concurrent_trials: 2

以下代码定义了搜索空间,以便为定义的每个体系结构,即 YOLOv5 和 FasterRCNN ResNet50 FPN,准备超参数扫描。 在搜索空间中,指定 learning_rateoptimizerlr_scheduler 等等的值范围,以便 AutoML 在尝试生成具有最佳主要指标的模型时可以从中选择。 如果未指定超参数值,则每个体系结构都使用默认值。

对于优化设置,请使用随机采样通过采样算法从此参数空间 random 中选取样本。 上述代码中指定的作业限制将自动化 ML 配置为使用这些不同的示例尝试总共 10 个试验,一次在计算目标上运行两个试验,该测试使用四个节点进行设置。 搜索空间的参数越多,查找最佳模型所需的试验次数就越多。

还使用了“Bandit 提前终止”策略。 此策略终止性能不佳的试用版。 也就是说,未在最佳试验表现的 20% 浮动范围内的试验。 此终止可显著节省计算资源。

适用于:Azure CLI ml 扩展 v2(当前)

sweep:
  sampling_algorithm: random
  early_termination:
    type: bandit
    evaluation_interval: 2
    slack_factor: 0.2
    delay_evaluation: 6
search_space:
  - model_name:
      type: choice
      values: [yolov5]
    learning_rate:
      type: uniform
      min_value: 0.0001
      max_value: 0.01
    model_size:
      type: choice
      values: [small, medium]

  - model_name:
      type: choice
      values: [fasterrcnn_resnet50_fpn]
    learning_rate:
      type: uniform
      min_value: 0.0001
      max_value: 0.001
    optimizer:
      type: choice
      values: [sgd, adam, adamw]
    min_size:
      type: choice
      values: [600, 800]

定义搜索空间和扫描设置后,可以使用训练数据集提交作业来训练图像模型。

适用于:Azure CLI ml 扩展 v2(当前)

若要提交 AutoML 作业,请使用.yml文件、工作区名称、资源组和订阅 ID 的路径运行以下 CLI v2 命令。

az ml job create --file ./hello-automl-job-basic.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

执行超参数扫描时,可视化使用 Hyperdrive UI 尝试的不同试验可能很有用。 可以通过转到前面出现的主 AutoML 映像作业(即 Hyperdrive 父作业)的 UI 中的 “子作业 ”选项卡来访问此 UI。 然后,您可以转到这个作业的“子作业”选项卡。

或者,可以在此处直接查看 Hyperdrive 父作业并导航到其 “子作业 ”选项卡:

适用于:Azure CLI ml 扩展 v2(当前)

CLI example not available. Use the the Python SDK.

注册并部署模型

作业完成后,您可以注册从最佳实验创建的模型(这个实验的配置导致了最佳的主要指标)。 可以在下载后注册模型,或者通过指定对应的azureml路径jobid来注册模型。

获取最佳试用版

适用于:Azure CLI ml 扩展 v2(当前)

CLI example not available. Use the Python SDK.

注册模型

使用 azureml 路径或本地下载的路径注册模型。

适用于:Azure CLI ml 扩展 v2(当前)

 az ml model create --name od-fridge-items-mlflow-model --version 1 --path azureml://jobs/$best_run/outputs/artifacts/outputs/mlflow-model/ --type mlflow_model --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

注册要使用的模型后,可以使用 托管联机终结点部署它。

配置联机终结点

适用于:Azure CLI ml 扩展 v2(当前)

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: od-fridge-items-endpoint
auth_mode: key

创建终结点

通过使用之前创建的 MLClient,您将现在在工作区中创建终结点。 此命令会启动终结点创建操作,并在终结点创建操作继续时返回确认响应。

适用于:Azure CLI ml 扩展 v2(当前)

az ml online-endpoint create --file .\create_endpoint.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

还可以创建批处理终结点,用于在一段时间内对大量数据进行批量推理。 有关使用批处理终结点进行批处理推理的示例,请参阅 对象检测批处理评分 笔记本。

配置联机部署

部署是一组资源,用于承载执行实际推理的模型。 以下代码为端点创建部署。 可为部署群集使用 GPU 或 CPU VM SKU。

适用于:Azure CLI ml 扩展 v2(当前)

name: od-fridge-items-mlflow-deploy
endpoint_name: od-fridge-items-endpoint
model: azureml:od-fridge-items-mlflow-model@latest
instance_type: Standard_DS3_v2
instance_count: 1
liveness_probe:
    failure_threshold: 30
    success_threshold: 1
    timeout: 2
    period: 10
    initial_delay: 2000
readiness_probe:
    failure_threshold: 10
    success_threshold: 1
    timeout: 10
    period: 10
    initial_delay: 2000 

创建部署

MLClient使用前面创建的部署,将在工作区中创建部署。 此命令将启动部署创建操作,并在部署创建操作继续时返回确认响应。

适用于:Azure CLI ml 扩展 v2(当前)

az ml online-deployment create --file .\create_deployment.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

更新流量

默认情况下,当前部署设置为接收 0% 流量。 可以设置当前部署应接收的流量百分比。 具有一个终结点的所有部署的流量百分比之和不应超过 100%。

适用于:Azure CLI ml 扩展 v2(当前)

az ml online-endpoint update --name 'od-fridge-items-endpoint' --traffic 'od-fridge-items-mlflow-deploy=100' --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

测试部署

适用于:Azure CLI ml 扩展 v2(当前)

CLI example not available. Use the Python SDK.

直观呈现检测结果

现在,你已为测试图像评分,可以可视化图像的包围框。 为此,需要安装 Matplotlib。

适用于:Azure CLI ml 扩展 v2(当前)

CLI example not available. Use the Python SDK.

清理资源

如果计划完成其他 Azure 机器学习教程,请不要完成本部分。

如果不打算使用所创建的资源,请将其删除,以免产生任何费用。

  1. 在 Azure 门户中,选择左窗格中的 资源组
  2. 在资源组列表中,选择创建的资源组。
  3. 选择“删除资源组”
  4. 输入资源组名称。 然后选择“删除”。

还可保留资源组,但请删除单个工作区。 转到工作区页,然后选择“ 删除”。

后续步骤

在此自动化机器学习教程中,你已完成以下任务:

  • 为实验配置了工作区并准备了数据
  • 训练了自动化物体检测模型
  • 为模型指定了超参数值
  • 执行了超参数扫描
  • 部署了模型
  • 直观呈现了检测结果

注意

可通过 MIT 许可证下的许可使用 fridge 对象数据集。