教程:使用 Model Builder 检测图像中的停车标志

了解如何使用 ML.NET Model Builder 和 Azure 机器学习生成物体检测模型,以检测和定位图像中的停车标志。

在本教程中,你将了解:

  • 准备和了解数据
  • 创建 Model Builder 配置文件
  • 选择方案
  • 选择训练环境
  • 加载数据
  • 定型模型
  • 评估模型
  • 使用预测模型

先决条件

有关先决条件和安装说明列表,请访问模型生成器安装指南

Model Builder 对象检测概述

对象检测是计算机视觉问题。 虽然与图像分类密切相关,但是对象检测以更精细的比例执行图像分类。 对象检测用于定位图像中的实体并对其进行分类。 物体检测模型通常使用深度学习和神经网络进行训练。 有关详细信息,请参阅深度学习与机器学习

如果图像包含多个不同类型的对象,请使用对象检测。

显示图像分类与对象分类的屏幕截图。

对象检测的一些用例包括:

  • 自动驾驶汽车
  • 机器人
  • 人脸检测
  • 工作区安全性
  • 对象计数
  • 活动识别

此示例将创建一个 C# .NET Core 控制台应用程序,该应用程序使用通过 Model Builder 生成的机器学习模型来检测图像中的停车标志。 有关本教程中的源代码,可以从 dotnet/machinelearning-samples GitHub 存储库中找到。

准备和了解数据

停车标志数据集包含从 Unsplash 下载的 50 个图像,每个图像都至少包含一个停车标志。

新建一个 VoTT 项目

  1. 下载数据集(其中包含 50 个停车标志图像),然后进行解压缩。

  2. 下载 VoTT(视觉对象标记工具)。

  3. 打开 VoTT,选择“新建项目”。

    VoTT 主屏幕

  4. 在“项目设置”中,将“显示名称”更改为“StopSignObjDetection”。

  5. 更改安全令牌,以生成新的安全令牌。

  6. 在“源连接”旁边,选择“添加连接”。

  7. 在“连接设置”中,将源连接的显示名称更改为“StopSignImages”,并选择“本地文件系统”作为提供程序。 对于“文件夹路径”,请选择包含 50 个训练图像的 Stop-Signs 文件夹,然后选择“保存连接”。

    VoTT“新建连接”对话框

  8. 在“项目设置”中,将“源连接”更改为 StopSignImages(刚创建的连接)。

  9. 将“目标连接”也更改为 StopSignImages。 “项目设置”现在应类似于以下屏幕截图:

    VoTT“项目设置”对话框

  10. 选择“保存项目”。

添加标记并为图像添加标签

现在,你应该会看到一个窗口,其中左侧是所有训练图像的预览图像,中间是所选定图像的预览图像,右侧是标记列。 此屏幕是标记编辑器。

  1. 选择“标记”工具栏中的第一个(加号形状)图标,以添加新标记。

    VoTT“新建标记”图标

  2. 将标记命名为“Stop-Sign”,然后在键盘上按 Enter 键

    VoTT 新标记

  3. 单击并拖动鼠标,围绕图像中的每个停车标志绘制一个矩形。 如果无法使用光标绘制矩形,请尝试从顶部的工具栏中选择“绘制矩形”工具,或使用键盘快捷键 R

  4. 绘制矩形后,选择在前面的步骤中创建的 Stop-Sign 标记,将此标记添加到边界框。

  5. 单击数据集中下一个图像的预览图像,重复此过程。

  6. 继续对每个图像中的每一个停车标志执行步骤 3-4。

    VoTT 为图像添加批注

导出 VoTT JSON

为所有训练图像添加标签后,可以导出文件,以便 Model Builder 使用它进行训练。

  1. 选择左侧工具栏中的第四个图标(框中包含斜箭头的图标),以转到“导出设置”。

  2. 将“提供程序”保留为 VoTT JSON。

  3. 将“资产状态”更改为“仅带标记的资产”。

  4. 取消选中“包括图像”。 如果包括图像,则训练图像将复制到生成的导出文件夹,此操作并不必要。

  5. 选择“保存导出设置”。

    VoTT“导出设置”

  6. 返回到“标记编辑器”(形状类似功能区的左侧工具栏中的第二个图标)。 在顶部工具栏中,选择“导出项目”图标(最后一个图标,形状类似包含箭头的框),或使用键盘快捷键 Ctrl+E

    VoTT“导出”按钮

此导出操作将在 Stop-Sign-Images 文件夹中新建一个名为 vott-json-export 的文件夹,并将在此新文件夹中生成名为 StopSignObjDetection-export 的 JSON 文件。 在后续步骤中使用 Model Builder 训练对象检测模型时,你将使用此 JSON 文件。

创建控制台应用程序

在 Visual Studio 中,创建一个名为 StopSignDetection 的 C# .NET Core 控制台应用程序。

创建 mbconfig 文件

  1. 在“解决方案资源管理器”中,右键单击 StopSignDetection 项目,然后选择“添加”>“机器学习模型...”打开 Model Builder UI。
  2. 在对话框中,将 Model Builder 项目命名为 StopSignDetection,然后单击“添加” 。

选择方案

对于此示例,方案为对象检测。 在 Model Builder 的“方案”步骤中,选择“对象检测”方案。

Visual Studio 中的“模型生成器”向导

如果在方案列表中看不到“对象检测”,则可能需要更新 Model Builder 的版本

选择训练环境

目前,Model Builder 仅支持使用 Azure 机器学习来训练对象检测模型,因此默认情况下会选择 Azure 训练环境。

Azure 训练环境选择

若要使用 Azure ML 训练模型,必须从 Model Builder 创建 Azure ML 试验。

Azure ML 试验是一种封装一次或多次机器学习训练运行的配置和结果的资源。

若要创建 Azure ML 试验,首先需要在 Azure 中配置环境。 若要运行试验,需要具备以下条件:

  • Azure 订阅
  • 工作区:一种 Azure ML 资源,可集中放置训练运行过程中创建的所有 Azure ML 资源和项目。
  • 计算:Azure 机器学习计算是基于云的 Linux VM,用于训练。 详细了解 Model Builder 支持的计算类型

设置 Azure ML 工作区

配置环境:

  1. 选择“设置工作区”按钮。

  2. 在“新建试验”对话框中,选择你的 Azure 订阅。

  3. 选择现有的工作区或新建一个 Azure ML 工作区。

    新建工作区时,将预配以下资源:

    • Azure 机器学习工作区
    • Azure 存储
    • Azure Application Insights
    • Azure 容器注册表
    • Azure Key Vault

    因此,此过程可能需要几分钟的时间。

  4. 选择现有计算,或创建新的 Azure ML 计算。 此过程可能需要几分钟时间。

  5. 保留默认试验名称,选择“创建”。

    Azure 工作区“设置”对话框

你已创建第一个试验,并已在工作区中注册该试验名称。 如果任何后续运行使用相同的试验名称,则该运行将记录为同一试验的一部分。 否则会创建新试验。

对配置满意后,选择 Model Builder 中的“下一步”按钮,以转到“数据”步骤。

加载数据

在 Model Builder 的“数据”步骤中,选择你的训练数据集。

重要

Model Builder 目前仅接受由 VoTT 生成的 JSON 格式。

  1. 选择“输入”部分内的按钮,并使用文件资源管理器查找 StopSignObjDetection-export.json,该内容应位于 Stop-Signs/vott-json-export 目录中。

    Model Builder“数据”步骤

  2. 数据在“数据预览”中正确显示时,选择“下一步”,以转到“训练”步骤。

定型模型

下一步是训练模型。

在 Model Builder“训练”屏幕中,选择“开始训练”按钮。

此时,数据将上传到 Azure 存储,训练过程在 Azure ML 中开始。

训练过程需要一定的时间,并且根据所选计算的大小和数据量,所需时间可能会有所不同。 第一次在 Azure 中对模型进行训练时,由于必须预配资源,训练时间可能稍长。 对于这个包含 50 个图像的示例而言,训练大约需要 16 分钟。

可以在 Visual Studio 中选择“监视 Azure 门户中的当前运行”链接,以在 Azure 机器学习门户中跟踪运行进度。

训练完成后,选择“下一步”按钮,转到“评估”步骤。

评估模型

在“评估”屏幕中,可以大致了解训练过程生成的结果,包括模型准确率。

Model Builder“评估”步骤

在此示例中,准确率显示 100%,这意味着,数据集中的图像太少,很可能会导致模型过度拟合。

可以使用“试用模型”体验,快速检查模型是否按预期工作。

选择“浏览图像”,并提供测试图像,最好是模型未在训练过程中使用的图像。

Model Builder“试用模型”

检测到的每个边界框上显示的分数表示检测到的对象的置信度。 例如,在上面的屏幕截图中,围绕停车标志的边界框上的分数表示,该模型对于检测到的对象是停车标志的确定程度为 99%。

“分数阈值”可以通过阈值滑块增加或降低,该阈值将根据分数添加和删除检测到的对象。 例如,如果阈值为 .51,则模型将仅显示置信度分数为 .51 或更高的对象。 增加阈值时,你会看到检测到的对象变少,而降低阈值时,你会看到检测到的对象变多。

如果对准确率指标不满意,尝试提高准确率的一个简单方法是使用更多的数据。 如果满意,则选择“下一步”链接,以转到 Model Builder 中的“使用”步骤 。

(可选)使用模型

此步骤将包含可用于使用模型的项目模板。 这是一个可选步骤,你可以选择最适合你对如何处理模型的需求的方法。

  • 控制台应用
  • Web API

控制台应用

将控制台应用添加到解决方案时,系统会提示你为该项目命名。

  1. 将控制台项目命名为 StopSignDetection_Console。

  2. 单击“添加到解决方案”以将项目添加到当前的解决方案中。

  3. 运行应用程序。

    该程序生成的输出应类似于下面的代码段:

    Predicted Boxes:
    
    Top: 73.225296, Left: 256.89764, Right: 533.8884, Bottom: 484.24243, Label: stop-sign, Score: 0.9970765
    

Web API

将 Web API 添加到解决方案时,系统会提示你为该项目命名。

  1. 将 Web API 项目命名为 StopSignDetection_API。

  2. 单击“添加到解决方案”以将项目添加到当前的解决方案中。

  3. 运行该应用程序。

  4. 打开 PowerShell,并输入以下代码(其中,PORT 是应用程序正在侦听的端口)。

    $body = @{
         ImageSource = <Image location on your local machine>
     }
    
     Invoke-RestMethod "https://localhost:<PORT>/predict" -Method Post -Body ($body | ConvertTo-Json) -ContentType "application/json"
    
  5. 如果成功,输出文本应如下所示。

    boxes                                      labels scores       boundingBoxes
    -----                                      ------ ------       -------------
    {339.97797, 154.43184, 472.6338, 245.0796} {1}    {0.99273646} {}
    
    • boxes 列提供检测到的对象的边界框坐标。 这里的值分别属于左坐标、上坐标、右坐标和下坐标。
    • labels 是预测标签的索引。 在本例中,值 1 是一个停止符号。
    • scores 定义模型对边界框是否属于该标签的确信度。

    注意

    (可选)将边界框坐标的大小规范化:宽 800 像素、高 600 像素。 若要在进一步的后期处理中缩放图像的边界框坐标,需要:

    1. 将上坐标和下坐标乘以原始图像高度,将左右坐标乘以原始图像宽度。
    2. 将上坐标和下坐标除以 600,将左右坐标除以 800。

    例如,给定一个原始图像,尺寸为 actualImageHeightactualImageWidth,以及一个名为 predictionModelOutput,以下代码片段展示了如何缩放 BoundingBox 坐标:

    var top = originalImageHeight * prediction.Top / 600;
    var bottom = originalImageHeight * prediction.Bottom / 600;
    var left = originalImageWidth * prediction.Left / 800;
    var right = originalImageWidth * prediction.Right / 800;
    

    图像可能具有多个边界框,因此需要向图像中的每个边界框都应用这一过程。

祝贺你! 你已成功使用 Model Builder 生成用来检测图像中停车标志的机器学习模型。 有关本教程中的源代码,可以从 dotnet/machinelearning-samples GitHub 存储库中找到。

其他资源

若要详细了解本教程中所述的主题,请访问以下资源: