你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用范围:
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 以使用自己的本地环境。
还可以在 GitHub 上的 azureml-examples 存储库中找到本教程。 如果要在本地环境中运行它,请安装并 设置 CLI(v2), 并确保安装
ml扩展。
计算目标设置
首先需要设置用于自动化 ML 模型训练的计算目标。 用于图像任务的自动化 ML 模型需要 GPU SKU。
本教程使用 NCsv3 系列(具有 V100 GPU),因为这种类型的计算目标使用多个 GPU 来加快训练速度。 此外,还可以设置多个节点,以在优化模型的超参数时利用并行度。
以下代码创建一个规格为 Standard_NC24s_v3、包含四个节点的 GPU 计算资源。
请创建一个具有以下配置的 .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
要创建该计算资源,你需要运行以下 CLI v2 命令,并传入 .yml 文件的路径、工作区名称、资源组和订阅 ID。
az ml compute create -f [PATH_TO_YML_FILE] --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]
试验设置
你可以使用试验来跟踪模型训练作业。
可以使用密钥提供试验名称 experiment_name :
experiment_name: dpv2-cli-automl-image-object-detection-experiment
直观呈现输入数据
将输入图像数据准备为 JSONL(JSON 行)格式后,你可以直观呈现图像的真实边界框。 若要执行此操作,请确保你已安装 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 存储,并将其注册为资产。 注册数据的好处包括:
- 可以轻松地与团队的其他成员共享。
- 元数据的版本管理(位置、说明等)。
- 世系跟踪。
请创建一个具有以下配置的 .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
以下配置从 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 作业。
注意
若要使用 无服务器计算,请将行 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 之间的值可能适用于许多数据集。
limits:
max_trials: 10
max_concurrent_trials: 2
然后,你可以提交作业来训练图像模型。
要提交 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 图像训练作业上的资源使用。 有关详细信息,请参阅 作业限制参数的说明。
limits:
timeout_minutes: 60
max_trials: 10
max_concurrent_trials: 2
以下代码定义搜索空间,为每种已定义的架构(YOLOv5 和 FasterRCNN ResNet50 FPN)的超参数扫描做准备。 在搜索空间中,指定 learning_rate、optimizer、lr_scheduler 等等的值范围,以便 AutoML 在尝试生成具有最佳主要指标的模型时可以从中选择。 如果未指定超参数值,则每个体系结构都使用默认值。
对于调优设置,请使用 random 采样算法通过随机采样从该参数空间中选取样本。 上述代码中指定的作业限制将自动化 ML 配置为使用这些不同的示例尝试总共 10 个试验,一次在计算目标上运行两个试验,该测试使用四个节点进行设置。 搜索空间的参数越多,查找最佳模型所需的试验次数就越多。
还使用了“Bandit 提前终止”策略。 此策略终止性能不佳的试用版。 也就是说,与性能最佳的试验相差不超过 20% 的试验。 此终止可显著节省计算资源。
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]
定义搜索空间和扫描设置后,可以使用训练数据集提交作业来训练图像模型。
若要提交 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 父作业并导航到其 “子作业 ”选项卡:
CLI example not available. Use the the Python SDK.
注册并部署模型
作业完成后,你可以注册从最佳试验(产生最佳主要指标的配置)中创建的模型。 你可以在下载后注册模型,或通过指定 azureml 路径及相应的 jobid 来注册。
获取最佳试用
CLI example not available. Use the Python SDK.
注册模型
使用 azureml 路径或本地下载的路径注册模型。
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]
注册要使用的模型后,可以使用 托管联机终结点部署它。
配置联机终结点
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: od-fridge-items-endpoint
auth_mode: key
创建终结点
现在,通过使用之前创建的 MLClient,你将在工作区中创建终结点。 此命令会启动终结点创建操作,并在终结点创建操作继续时返回确认响应。
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。
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,你将在工作区中创建部署。 此命令将启动部署创建操作,并在部署创建操作继续时返回确认响应。
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%。
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]
测试部署
CLI example not available. Use the Python SDK.
直观呈现检测结果
既然你已经对测试图像进行了评分,就可以直观呈现该图像的边界框。 为此,需要安装 Matplotlib。
CLI example not available. Use the Python SDK.
清理资源
如果计划完成其他 Azure 机器学习教程,请不要完成本部分。
如果不打算使用所创建的资源,请将其删除,以免产生任何费用。
- 在 Azure 门户中,选择左窗格中的 资源组 。
- 在资源组列表中,选择创建的资源组。
- 选择“删除资源组”。
- 输入资源组名称。 然后选择“删除”。
还可保留资源组,但请删除单个工作区。 转到工作区页,然后选择“ 删除”。
Next steps
在此自动化机器学习教程中,你已完成以下任务:
- 为实验配置了工作区并准备了数据
- 训练了自动化物体检测模型
- 为模型指定了超参数值
- 执行了超参数扫描
- 部署了模型
- 直观呈现了检测结果
请参阅哪些超参数可用于计算机视觉任务。
查看代码示例:
- 查看自动化机器学习示例的 azureml-examples 存储库中的详细代码示例和用例。 有关特定于创建计算机视觉模型的示例,请参阅具有 cli-automl-image- 前缀的文件夹。
注意
可通过 MIT 许可证下的许可使用 fridge 对象数据集。