Edge ImpulseFOMO目标检测
来源:https://docs.edgeimpulse.com/tutorials/end-to-end/object-detection-centroids
使用 FOMO 在微控制器上实时检测、计数和跟踪目标,速度为 MobileNet SSD 的 30 倍,RAM 占用可低于 200 KB。
FOMO(Faster Objects, More Objects,意为“更快地检测更多目标”)是一种面向资源受限设备的目标检测新方法。这一突破性算法首次将实时目标检测、跟踪和计数能力带到了微控制器上。FOMO 的运行速度为 MobileNet SSD 的 30 倍,并且可以在不足 200 KB 的 RAM 中运行。本教程将介绍如何使用 FOMO 对车辆进行计数,进而估算停车位占用情况。
直接使用现成项目:如果希望跳过配置过程,可以克隆一个已准备好的 Edge Impulse 项目,其中包含数据集、Impulse 处理流程和训练完成的模型。
FOMO 的限制
- FOMO 不输出边界框,而是通过目标的中心点(质心)给出位置,因此无法直接获得目标的尺寸。
- 当各个目标的大小相近时,FOMO 的效果更好。
- 目标之间不宜过于靠近;提高输入图像的分辨率可以改善这一问题。
如果项目需要获取目标的尺寸,请参阅常规的目标检测教程。
1. 前提条件
你需要一台受支持的设备。如果没有这些设备,也可以使用 Uploader(上传工具)上传已有数据集,或将手机作为采集设备连接到 Edge Impulse。完成本教程后,可以将训练好的机器学习模型导出为 C++ 库或 WebAssembly 包,并在自己的设备上运行。
2. 构建数据集
采集数据
可以通过以下设备和方式采集数据:
- 通过 Studio 采集图像:适用于 Raspberry Pi 4 和 Jetson Nano。
- 使用手机采集图像。
- 使用配有摄像头的受完整支持的开发板采集图像。
也可以使用其他摄像头拍摄图像,再进入 Studio 的 Data acquisition(数据采集) 页面,单击 Upload(上传) 图标直接上传;或者使用 Edge Impulse 命令行工具中的 Uploader(上传工具)。
采集完成后,需要对数据进行标注。进入 Data acquisition(数据采集) 页面,确认数据已经显示,然后单击 Labeling queue(标注队列) 开始标注。
标注数据
为什么输入标注仍然使用边界框? 虽然 FOMO 在推理时输出的是目标中心点,但为了与其他模型兼容,训练图像仍采用边界框标注。因此,在端到端流程的多个环节中,FOMO 会在后台完成边界框与分割图之间的转换,包括比较两种表示中的目标集合,以进行性能分析和评分。
所有采集到的图像都会进入标注队列,等待标注。只需拖动鼠标,在目标周围画出边界框,再输入类别标签即可。不过,当图像数量很多时,逐张手动标注会变得繁琐且耗时。为简化这一过程,Edge Impulse 提供了 3 种 AI 辅助标注方法:
- 使用 YOLOv5:适用于待标注目标属于 COCO 数据集中常见物体类别的情况。
- 使用自己训练的模型:适用于已有模型的类别与当前任务相近的情况。
- 使用目标跟踪:适用于目标大小相近,并且同一目标在相邻图像或视频帧中重复出现的情况。
本例中的 car(汽车)属于 COCO 数据集的类别,因此使用 YOLOv5 预训练模型加快标注。先打开 Label suggestions(标签建议) 下拉菜单,再选择 Classify using YOLOv5(使用 YOLOv5 分类)。
使用 YOLOv5 进行 AI 辅助标注。
在原文所示的示例中,YOLOv5 已经能够辅助标注超过 90% 的车辆,无须逐个手动画框。
重新划分训练集与测试集
为了验证模型效果,需要预留一部分数据,通常约占 20%,不参与训练,只用于测试。这部分数据称为测试集。使用 Data collected(已采集数据) 面板上方的两个按钮,可以在训练集与测试集之间切换。如果此前通过开发板采集数据,测试集可能仍为空。此时可以进入 Dashboard > Perform train/test split(仪表板 > 划分训练集/测试集) 进行划分。
3. 设计 Impulse
FOMO 的一个优势是采用全卷积结构,输入图像只需满足宽高比要求,因此与常规的目标检测方法相比,使用起来更加灵活。本教程采用 96×96 像素的图像;只要输入图像为正方形,也可以使用其他分辨率。
进入 Create impulse(创建 Impulse),将图像宽度和高度均设为 96,将 Resize mode(缩放模式) 设为 Fit shortest axis(按短边适配),再添加 Images(图像) 与 Object Detection (Images)(目标检测:图像) 模块。最后单击 Save Impulse(保存 Impulse)。
输入图像尺寸为 96×96 像素。
配置处理模块
单击左侧菜单中的 Images(图像),配置处理模块。页面上方显示原始数据,可以通过下拉菜单选择其他文件;右侧显示处理结果。可以在 RGB(彩色)与 Grayscale(灰度)模式之间切换。设置完成后,单击 Save parameters(保存参数)。
配置处理模块。
随后进入 Feature generation(特征生成) 页面。在这里将完成以下操作:
- 调整所有图像的尺寸。
- 使用处理模块处理全部数据。
- 为整个数据集生成三维可视化结果。
- 单击 Generate features(生成特征) 开始处理。
处理完成后,将加载 Feature explorer(特征浏览器),以图表形式呈现整个数据集。图像数据的维度很高,例如这里每张灰度图像包含 96×96×1=9216 个特征,因此在可视化之前需要先进行降维。在本例中,9216 维特征被压缩到 2 维,再根据相似程度呈现出聚类分布,如下方特征浏览器所示。
特征浏览器。
配置 FOMO 目标检测模型
所有数据处理完成后,就可以开始训练 FOMO 模型。模型以图像作为输入,以中心点的形式给出检测到的目标。本例中,模型输出的是图像中车辆的中心位置。
FOMO 可与各类 MobileNetV2 模型配合使用。根据目标设备的计算资源,可以选择较大或较小的宽度系数 alpha。FOMO 也支持迁移学习,不过基础模型需要针对 FOMO 进行训练。与常规 SSD 网络相比,FOMO 需要学习的参数很少,因此网络更小,训练也更快。这些特点使 FOMO 能够适用于从小型微控制器到功能完整的网关乃至 GPU 的多种平台。
进入 Object detection(目标检测) 页面,单击 Choose a different model(选择其他模型),然后选择一个 FOMO 模型,如下图所示。
选择 FOMO 模型。
请先将 学习率设为 0.001,再单击 Start training(开始训练)。训练完成后,训练输出下方会显示准确率等数值。至此,FOMO 目标检测模型训练完成。
训练结果。
从上述训练结果可以看出,FOMO 使用 F1 分数(F1 Score) 作为主要评估指标,而 SSD MobileNetV2 使用平均精度均值(mAP)。仅使用 mAP 这一项指标,有时不足以全面了解模型表现,尤其是在类别不均衡的数据集中,单个汇总指标难以充分反映每个类别的识别情况。将 F1 分数与混淆矩阵结合起来,可以同时观察精确率与召回率之间的平衡,以及模型在各个类别上的表现。
4. 验证模型
模型训练完成后,需要使用测试数据检验效果。采集数据时已经将数据划分为训练集和测试集,模型只使用训练集进行训练,因此可以利用未参与训练的测试集,评估模型在实际场景中的表现。这有助于检查模型是否过度适应训练数据,出现过拟合。
进入 Model Testing(模型测试) 页面,选择 Classify all(对全部样本进行分类)。
模型测试结果。
原文示例的训练数据较少,训练轮数也不多,仍取得了 84.62% 的准确率,后续还可以进一步改进。若要查看详细分类结果,进入 Live Classification(实时分类) 页面,选择一张测试图像。单击样本旁的三点菜单,再选择 Show classification(显示分类结果)。也可以在这里直接从开发板采集新的数据。
实时分类结果
实时分类:并排显示。
在原文的测试图像中,实际共有 18 辆车,模型检测到了其中的 16 辆,表现较好。默认情况下,界面会并排显示图像和检测结果;也可以切换到叠加模式,将预测结果直接显示在原始图像上进行比较。
实时分类结果的叠加模式
实时分类:叠加显示。该模式将模型检测结果叠加到原始图像上,便于直接对照预测结果与图像中的实际内容。
结果汇总表
FOMO 分类结果的汇总表,用于概括模型在某个样本文件上的表现,例如 Parking_data_2283.png.2tk8c1on。表格包含以下字段:
- CATEGORY(类别):指标名称、目标类别或类别标签,例如
car。 - COUNT(计数):检测结果的数量信息,例如检测到 7 个
car目标。 - INFO(说明):解释 F1 分数、精确率和召回率等性能指标,帮助判断模型检测的准确程度和整体效果。
表中的评估指标:
- F1 Score(F1 分数):77.78%,综合衡量精确率与召回率。
- Precision(精确率):100.00%,表示模型给出的检测结果中,正确结果所占的比例。
- Recall(召回率):63.64%,表示所有实际目标中,被模型成功检测出的比例。
显示选项
右下角的控件可以控制真实标注和模型预测结果的显示,便于分析模型表现。
预测结果控件: 可按以下方式筛选模型预测结果:
- Show All(显示全部):显示所有检测结果及其置信度。
- Show Correct Only(仅显示正确结果):重点查看正确的预测结果。
- Show incorrect only(仅显示错误结果):定位真实标注中未被检测出的目标。
真实标注控件: 控制原始标注的显示,以便与模型预测结果直接比较。
- Show All(显示全部):显示全部真实标注。
- Hide All(隐藏全部):隐藏全部真实标注。
- Show detected only(仅显示已检测目标):突出显示被模型检测到的真实目标标注。
- Show undetected only(仅显示未检测目标):找出模型漏检的真实目标标注。
5. 在设备上运行模型
完成 Impulse 的设计、训练和验证后,就可以将模型部署到设备上。模型在设备本地运行,无须联网,有助于降低延迟,并尽可能减少功耗。Edge Impulse 可以将完整的 Impulse,包括预处理步骤、神经网络权重和分类代码,打包为一个 C++ 库或模型文件,集成到嵌入式软件中。
在 Linux 设备上运行 Impulse
在终端中运行 edge-impulse-linux-runner。该命令会构建并下载模型,然后在开发板上运行。如果计算机与开发板位于同一网络中,还可以直接查看开发板传回的摄像头画面和分类结果。终端中会显示类似以下内容:
Want to see a feed of the camera and live classification in your browser? Go to http://192.168.8.117:4912
这条提示会给出浏览器访问地址。打开该地址,即可查看 Impulse 的运行情况!
在 Raspberry Pi 4 上运行 FOMO 目标检测。
在受完整支持的 MCU 上运行 Impulse
进入 Deployment(部署) 页面,在 Build firmware(构建固件) 区域选择与开发板兼容的固件并下载。
为 Arduino Portenta H7 编译固件。
按照提供的说明将固件烧录到开发板,然后打开终端,运行 edge-impulse-run-impulse --debug 命令:
在终端中通过 Edge Impulse 命令行工具运行 Impulse。
终端还会显示一个网址,在浏览器中打开后即可查看图像流和运行结果:
Want to see a feed of the camera and live classification in your browser? Go to http://192.168.8.117:4912
使用生成的 Arduino 库运行 Impulse
如果希望使用 Arduino 库运行模型,进入 Studio 的 Deployment(部署) 页面,在 Create Library(创建库) 区域选择 Arduino Library(Arduino 库),下载为当前项目生成的库。打开 Arduino IDE,依次选择 Sketch > Include Library > Add .Zip(项目 > 加载库 > 添加 ZIP 库),导入刚下载的文件。具体操作请按照 Arduino 库使用指南执行。随后打开 Examples(示例)> Examples from custom library(自定义库中的示例),选择该库。将 Portenta_H7_camera 示例程序上传到 Portenta,再打开串口监视器查看结果。
使用 Arduino 库运行 FOMO 模型。
将模型集成到自己的应用程序
恭喜,你已经通过 FOMO 为传感器加入了目标检测能力!模型训练完成后,就可以将 Impulse 集成到自己边缘设备的固件中。请参阅将模型部署为 C++ 库,或查阅 Edge Impulse for Linux 文档。其中提供 Node.js、Python、Go 和 C++ SDK,使用少量代码即可完成集成,让模型在受支持的边缘设备上运行。
这里还有一个检测到目标后通过 Twilio 发送短信的示例。
如果希望继续学习,可以阅读连续动作识别或图像分类教程。当然,也欢迎尝试自己的项目构想。Edge Impulse 支持从各种传感器采集数据,通过自定义处理模块提取特征,并使用学习模块灵活构建机器学习流程。
期待看到你的作品!🚀