本文介绍了在微控制器上进行单帧目标检测的可行性研究。类似于YOLO的单帧目标检测器广泛使用,但由于其复杂性主要在更大的基于GPU的平台。 作者提出了μYOLO,可以在Cortex-M型微控制器上使用,如OpenMV H7 R2,在分类128x128 RGB图像时,可以实现约3.5 FPS,同时使用不到800 KB的Flash和不到350 KB的RAM。 此外,作者还分享了三种不同的目标检测任务实验结果,分析了μYOLO在这些任务上的准确性。μYOLO是一种用于微控制器的单帧目标检测算法,可以用于像OpenMV H7 R2这样的基于Cortex-M的微控制器。 据其分类128x128 RGB图像的实验结果,可以看到μYOLO可实现约3.5 FPS的速度,同时只需要不到800 KB的Flash和不到350 KB的RAM。这些结果表明,μYOLO在微控制器上进行单帧目标检测具有可行性。
计算机视觉中的目标检测描述了首先找出,即回归,一个边界框,然后对场景中的物体进行分类的第一个步骤。早期的解决这个问题的问题的方法使用一个滑动窗口,在图像上 evenly 地点对地查看 [4] 或者像区域CNNs(R-CNNs) [5] 那样在先用一些区域 Proposal 算法之后分别解决这两个问题。现今,这些方法大部分由单张图像检测器(SSDs),其中最突出的是YOLO [8]。它们能够在使用只有一个CNN的极高效解决检测任务,因此不需要独立的区域 Proposal 阶段。然而,尽管SSD高效,因此提供了巨大的潜力用于节能的实时目标检测,但在边缘设备上的部署至今还主要针对较大的嵌入式平台,如Jetson Xavier [9, 1]等,而在资源受限的微控制器上进行目标检测的可行性仍然是一个开放的话题。
作者提出了YOLO,优化用于在Cortex-M基础的微控制器上使用,并展示正在进行中的工作的初步结果。通过作者的工作,作者旨在评估在资源受限的微控制器上进行目标检测的可行性和局限性,尽管这些资源限制非常严重(通常小于1-2MB的Flash和小于1MB的RAM)。为了满足这些限制,作者将输入图像分辨率降低到128x128像素,显著减少了 Backbone 网络的可训练参数,并将每单元的网格大小和边界框预测器与原始YOLO架构相比降低。在接下来的部分中,作者将展示一个在Cortex-M7基础的OpenMV H7 R2微控制器上部署YOLO的方法,同时实现了每秒3.5帧,在480MHz下运行,需要的Flash小于800KB,RAM小于350KB。
本文余下的部分如下所述:首先,在第2节中,作者讨论了YOLO的结构。其次,在第3节中,作者提出了三个目标检测任务的结果,其中两个是从COCO数据集[7]子集得出的,另一个使用自录的数据集。基于目前获取的结果,作者分析了YOLO的性能,提供了错误分析,并讨论了作者的方法的局限性。第4节得出结论。
YOLO(You Only Look Once)的基本思想是通过单次前向传播使用单一深度神经网络解决目标检测任务。为了实现这一目标,YOLO由一个卷积神经网络(CNN) Backbone 和支持检测Head组成,检测Head通常包含线性层,以网格为基础对每个网格单元进行预测。对于每个网格单元,检测Head提出一个大小为的分类预测向量和解框,解框由一个置信度得分、相对于网格左上角的中心点和相对于图像大小的尺寸组成。
μYOLO的 Backbone 由单一卷积和7个深度可分卷积组成,具体架构请见表1。作者选择深度可分卷积是为了最小化可训练参数。μYOLO的分类头有两个线性层,输出与原始YOLO论文相似,大小为。作者的实验表明,考虑到目标平台的资源限制和输入图像的低空间分辨率(128),和是最佳折衷。作者使用ReLU作为激活函数,但在原始YOLO论文中使用的batch normalization方式代替了dropout层。
作者使用μYOLO的 Backbone 模型在Caltech-256数据集[6]上进行预训练,该数据集是一个256类图像分类问题。作者使用μYOLO的 Backbone 模型达到Top-1精度38%和Top-5精度61%,尽管低于其他大规模分类模型,但在μYOLO的 Backbone 模型的容量较小且Caltech-256中类别数量庞大的情况下,仍然合理。
为了进一步减小μYOLO的规模,作者在训练过程中使用逐步渐进剪枝方案(如[10]中的范数启发式),在剪枝后进行8位定量化。作者没有使用量化感知的训练,因为作者早期发现对于作者的应用场景,量化训练并不能提供明显的改进。为了自动化这些步骤并将生成的模型转换为可部署的C代码,作者将[3]中描述的压缩和部署 Pipeline 应用到模型中。
作者评估了 YOLO 在三个检测任务上的性能:
(1)人检测,(2)车辆检测(卡车、公交车、轿车、自行车、摩托车),这两个任务都源于微软 COCO 数据集 [7],以及(3)在小型冰箱中进行玩具杂货检测(水、牛奶、巧克力牛奶、橙汁),该数据集是作者自己录制的。对于所有任务,作者使用了输入分辨率为 ,并在训练过程中对所有训练样本进行仿射变换、亮度、饱和度和色相调整,以防止过拟合。作者使用 stochastic gradient descent (SGD) 算法进行训练,学习率为 0.001,动量因子为 0.9,权重衰减为 0.005。在训练的最后100个epoch中,作者每20个epoch进行一次迭代剪枝。此外,由于输入分辨率较低,作者删除了变为小于12x12像素的 GT 框。
作者在所有三个检测任务上呈现了平均精确度为交并比(IoU)阈值的0.5时的均值平均精确度(mAP),见图2。作者用不同的种子对所有任务重复训练了三次。总体观察到,YOLO在冰箱检测任务上的mAP分数显著高于其他两个任务(人类检测任务的平均值为27.7%,车辆检测任务的平均值为12.3%)。由于剪枝,冰箱任务的mAP在训练的最后100个周期中出现轻微下降,但是没有明显的下降,参见蓝色的曲线。
作者认为,如图2中所示的三个不同任务中观测到表现强烈的性能差异主要是由于数据集中的不同场景深度和复杂性,以及低输入分辨率共同作用的结果,这使得在背景中特别难以检测和区分小的目标。为了检验这个假设,作者在车辆任务的简化版本上训练了YOLO,并在不同的输入图像分辨率和最大绑定框数量的情况下来做 GT 值,参见图2。为了处理更大的输入图像分辨率,作者将YOLO的第一卷积层 Kernel 大小增加到7,并增加了后续两个分离卷积的填充到2。对于较小的图像分辨率,作者在检测Head线性层的神经元数量减少。
从图2中,作者可以看到,在所有测试的输入图像分辨率下,YOLO在简化的车辆检测任务上比在不受限版本上的mAP显著更高,有趣的是,虽然选择极小的输入分辨率对实现精度有负面的影响,参见蓝色的曲线与其他三个曲线的比较,增加图像分辨率并未改变观测到的mAP,它始终收敛到50%,参见红色、橙色和绿色曲线。通过比较这三个曲线,作者甚至能够观察到,图像分辨率越大,训练期的收敛速度越慢。因此,作者得出结论,尽管场景的整体复杂性以及目标大小与图像大小之间的关系对YOLO的性能有重大影响,但图像分辨率增加并不影响。同时考虑内存消耗,请参见表3,输入分辨率为128x128被认为是最佳折衷方案。
此外,为了更好地直观地了解YOLO的工作效果,作者在三个不受限制的检测任务的验证数据集的子集上提供了定性结果,见图3。作者注意到,在观察定性结果时,图1中不同检测任务之间的的明显差异并不那么明显。通常,在所有任务中,YOLO预测的边界框相对准确,只有少数错误分类。作者观察到的最主要错误来源是,YOLO在检测到实时目标时失败,尤其是当它们被局部的遮挡或位于背景更深的地方。
为了更深入地探究观察到的现象,作者在冰箱和车辆任务验证数据集上计算了YOLO的混淆矩阵,如图4所示。每个混淆矩阵都表示了不同类别预测边界框与验证集提供的实际 GT 边界框的对比情况,即行(预测框)与列( GT 框)的对比。因此,如果一个预测框的置信度高于50%,那么它就是一个“非背景”的预测框,如果它与对应的 GT 框之间的IoU高于50%,那么它就是正确的预测。这意味着矩阵的对角线包含正确预测的边界框,而上面的和下面的三角形矩阵包含错误。更具体地说,每个矩阵的最后一行表示假阴性,最后一行表示假阳性,所有其他字段表示正确检测的边界框的误分类。
将图3(a)与图3(b)和图3(c)进行比较,作者发现YOLO在验证集上最常见的可观察到的错误是假阴性,即YOLO“忽略”了存在的物体。其他错误,如错误分类正确检测的物体,或错误地检测到一个不存在物体的物体,即假阳性,要少得多。然而,作者认为,这些影响在不受约束的车辆检测任务中更为明显,如图3(b),而不是受约束的车辆和不受约束的冰箱检测任务,如图3(a)和图3(c)所示。根据这些观察,作者提出,在图3(b)中作者发现的较高假阴性数主要是由于YOLO的低输入分辨率与多层场景的复杂性(物体重叠和部分遮挡)相结合所致,它们在COCO数据集中占主导地位。相比之下,冰箱任务或简化的车辆任务较为简单,这使得YOLO可以实现更高的0.5mAP得分,主要是由于假阴性较少。
要在OpenMV H7微控制器上部署μYOLO,作者使用了文献[3]中描述的流水线。表2和表3详细列出了内存消耗和性能的详细分解。表2中的Flash消耗和明显的性能变化是由于输出特征图的大小依赖于类别数量,从而改变输出层中的神经元数量。此外,表3中可以看到,μYOLO处理的输入图像大小对内存消耗和性能有巨大影响。尤其是在内存消耗上,由于μYOLO与地面真相的IoU在检测阈值下增加,所以在大输入图像分辨率下使用μYOLO在OpenMV H7微控制器上的使用变得不可行。
除了改变输入图像分辨率外,还可以通过剪枝来控制FPS和mAP(均方平均精确率)之间的权衡。在初始实验和采用激进的剪枝时间表下,作者能够达到8 FPS,但代价是mAP(均方平均精确率)显著降低。由于3.5 FPS可能对某些检测应用来说过低,因此作者考虑在模型性能和精确度之间进一步探索权衡作为未来的研究。
作者提出了μYOLO,这是一个基于YOLO的单次目标检测模型,可以在没有硬件加速的微控制器平台上部署,其内存占用小于800 Kb的Flash和350 Kb的RAM。
作者在三个不同的目标检测任务上展示了正在进行的结果,并对μYOLO在这些任务上可以达到的准确性进行了深入分析。作者还分享了在基于Cortex-M7的"OpenMV H7 R2"微控制器上部署μYOLO的结果,作者在三个任务上的性能约为每秒3.5帧。
[1].YOLO: Towards Single-Shot Object Detection on Microcontrollers.