人工智能在视觉领域有两类非常常见的任务,一是分类,二是目标检测。
分类:判断图片属于哪个分类,比如分类是猫还是狗。
目标检测:用于找到图片中的多个不同目标的位置、数量和尺寸。
在之前的视频教程中,我们讲解了如何使用OpenMV4 Plus在线训练神经网络进行不同物体的分类,它可以实时判断我们OpenMV视野中的图像是否是某个物体,比如人脸是否佩戴口罩,但无法输出人脸或者口罩的位置坐标、以及人脸的数量。
由于目标检测比分类复杂很多,计算量大很多,所以在单片机领域很罕见。OpenMV的主控MCU是STM32H7,如今,我们OpenMV上面增加了一个新的功能,可以在单片机上运行类似目标检测的任务,性能非常亮眼。

今天我们将为大家讲解训练演示实际马路环境中的交通标志检测,检测我们实际道路中的交通标志,比如禁止鸣笛、禁止停车、限速80等,而不是实验室无干扰环境。
你可以在以下地址查看整个项目内容,所有代码和模型都包括在内:https://book.openmv.cc/project/traffic-sign.html
众所周知,实际环境非常复杂,尤其是道路环境,干扰项很多,我们用手机等设备采集实际环境中交通标志的图片,使用我们OpenMV合作伙伴EdgeImpulse在线网站训练模型,大概标注了270张图片,训练时间只需要10分钟,训练得到的模型的F1 score准确度可以达到92%,在OpenMV上的运行帧率达到了10帧,效果非常流畅并且准确度也比较高。
大家可以根据我们的视频教程,训练任何你想要检测的目标,比如不同的数字、不同的水果、不同的标志物、不同的零件、甚至任何特定的不规则目标等,都可以训练识别得到特定目标的数量、坐标以及物体种类名称等。
注意:本集视频教程讲解的神经网络目标点检测功能,不仅适用于OpenMV4 H7 Plus,也支持OpenMV4 H7,因为训练好的FOMO目标点检测模型并不大,效果很好并且只有几十KB,即使OpenMV4 H7运行内存比plus小,我们也可以训练稍微小一点的模型在OpenMV4上运行。
下面为大家简要的介绍一下原理:
OpenMV上面的FOMO目标点检测的主要设计决策基于这样一种想法,因为许多对象检测问题实际上并不需要对象的大小,而只需要它们在图像中的位置。一旦我们知道了物体的位置,我们就可以进行后续的操作,比如OpenMV控制小车向识别到的目标运动、无人机定点降落、控制机械臂抓取特定目标物体等。
FOMO模型是EdgeImpulse针对单片机环境特殊设计的一个模型,和常规的目标检测不一样的是,它只能检测到多个目标的位置和数量,而无法获得具体尺寸。
FOMO模型底层原理非常简单灵活。它首先把图像分块,每块8x8像素。如果是96x96分辨率的图像,那么就是12x12的单元格。如果是360*360的图像,那么就是40*40的单元格。然后在每个单元格上独立地运行图像分类。
与 YOLO V5 或 MobileNet SSD 相比,FOMO 在大量的小对象上的表现要好得多。FOMO目标点检测比 MobileNet SSD 快30倍。
如果要进行检测的对象具有相似的大小,比如你要识别的标志物尺寸基本相差不大,而不是一个极大的物体和一个极小的物体,FOMO 的效果会更好。
OpenMV使用EdgeImpulse在线训练神经网络目标点检测,主要分为以下几个步骤:采集并上传图像数据集、标注目标、训练、测试模型、部署。
*采集图像数据集:对我们实际要识别的环境中的特定物体,进行图像的拍摄采集。我们在什么环境中识别,我们就在什么环境中采集实际图像,实际训练环境和实际检测环境基本一致,这样效果会更好。
*标注目标:将我们数据集中的每一个要检测的目标,框出来并对应好目标的名称,以方便后续的训练,检测目标位置及目标名称。
*训练模型:标注完成之后,按照我们设计好的卷积神经网络参数进行模型的训练。
*测试模型:我们根据训练好的模型进行测试,如果效果不好就相应的增加训练集或者调整训练参数,继续训练,直到我们得到满意的模型。
*部署:我们将训练好的模型文件,放到OpenMV内置的U盘里运行就可以啦~
下面为大家演示一下具体的过程:
01、采集并上传图像数据集
一、首先我们登录网站edgeimpulse.com,选择“登录”,输入新建的项目名称,选择“Images”—“Classify multiple objects”

二、选择上传图像。关于图像的数据集有几种方式可以获得:
1. 通过OpenMV IDE实时采集图像。使用OpenMV IDE里面的工具—“ 数据集编辑器 ”,新建数据集实时采集图像,具体可以看我们之前视频教程物体分类口罩识别。

2. 用网络下载的图片或者是手机实际拍摄的图片。最好与你实际检测的环境一致。我们准备了四五百张禁止停车、禁止鸣笛以及限速80等交通标志的图像,每张图都是实际道路上采集的,这个数据集可以在我们的GitHub以及教程网站下载。
02、标注目标
每个分类都上传100张左右的图片,上传完图片之后就要进行图像的标注,把我们要识别的物体的位置以及分类标出来。


03、训练模型
设计训练的参数,将分辨率改成128*128,设置的参数全部选择默认的就可以,点击保存。

生成features,三种颜色分别代表三种标志。

设置目标检测训练参数。训练轮数默认是60轮,学习率0.001,验证集的比例20%,选择数据增强打勾,迁移学习的模型我们可以选择默认的MobileNetV2 0.35或者MobileNetV2 0.1。(注意:不能使用SSD,SSD在OpenMV上是运行不了的。)
选择开始训练。训练完成后得到的神经网络模型 F1 Score 为 91.2%,我们可以保存当前的版本。

选择存储,填写一下你的描述,选择保存。

04、部署模型
导出训练好的模型文件。只导出library就可以,选择OpenMV,点击Build,就会开始部署导出模型。

它会自动下载我们导出来的模型,这边就是我们训练的300张图片的模型,这样我们整个的训练就完成了。

05、运行模型
在OpenMV上运行模型:
连接OpenMV Plus,将训练好的三个文件存入OpenMV内置U盘,将 ei_object_detection.py 文件在OpenMV IDE中打开。点击运行,在串行终端里面会显示运行的结果。


该功能在OpenMV4上也可以运行。由于OpenMV4没有外置的SDRAM,内存小一些,我们可以通过缩小模型体积,使其能在OpenMV4上运行。
有两个方法可以减小模型的体积:
一、减小训练的分辨率,将128*128的分辨率改成96*96。
二、修改使用的迁移学习模型,将MobileNetV2 0.35改成MobileNetV2 0.1。
最后将训练好的新文件放到OpenMV4里面运行就可以。
以上就是我们的目标点检测教程。期待你的成果!

基于OpenMV的AI哨兵:重点场所未关自动提醒
自动判断重点场所门是否长时间未关闭,并及时提醒。

人员越界即警报,OpenMV诠释“安全边界感”
通过虚拟警戒线识别人员或设备越界行为。

“AI城管”来咯,基于OpenMV构建占道经营自动识别系统
自动识别占道经营行为,辅助城市日常治理。

煤气罐乱放?利用OpenMV自动触发危险预警
自动识别煤气罐违规摆放位置,提前发现燃气安全隐患。

带电作业没戴绝缘手套?OpenMV即刻警报!
自动识别作业人员是否佩戴绝缘手套,辅助安全作业。

运用OpenMV智能摄像头,实时识别铝板表面缺陷
在线识别铝板表面划痕、凹陷等缺陷,辅助质量管控。