ARM-CPU150FPS | PicoDet助力移动端达到超实时检测(强烈建议工程人员学习)(一)

本文涉及的产品
文件存储 NAS,50GB 3个月
简介: ARM-CPU150FPS | PicoDet助力移动端达到超实时检测(强烈建议工程人员学习)(一)

1简介


目标检测被广泛应用于许多计算机视觉任务中,包括自主驾驶、机器人视觉、智能交通、工业质量检测、目标跟踪等。

两阶段模型通常会带来更高的性能。然而,这种消耗计算资源的网络限制了部署的需求。为了克服这一问题,轻量级物体检测器的研究越来越受到关注,旨在设计高效的物体检测。

YOLO系列的目标检测器已经流行起来,因为它们只是考虑资源约束的一小部分工作。与两阶段模型相比,YOLO系列具有更高的效率和高精度。但是,YOLO系列没有解决以下问题:

  1. 采用不同的数据集需要手动重新设计Anchor boxes;
  2. 由于生成的Anchor 多为负值,容易导致正、负样本不平衡问题。

近年来,许多工作都致力于开发更高效的探测器体系结构,如Anchor-Free检测器。

FCOS解决了Ground-truth标签内的重叠问题。与其他Anchor-Free检测器相比,不存在复杂的超参数调节。然而,大多数Anchor-Free检测器都是大型检测器;

在少数情况下,NanoDet和YOLOX-Nano是Anchor-Free检测器和移动检测器。问题是轻量Anchor-Free检测器通常不能很好地平衡精度和效率。因此,在这项工作中,受到FCOS和GFL的启发,作者提出了一种改进的移动友好和高精度Anchor-Free探测器,名为PP-PicoDet。总的来说,主要贡献如下:

  1. 采用CSP结构构建CSP-PAN作为Neck。CSP-PAN通过1×1卷积对Neck各分支的输入通道数进行统一,显著提高了特征提取能力,减少了网络参数。将3 × 3深度可分卷积扩大到5 × 5深度可分卷积,以扩大感受野;
  2. 标签分配策略是目标检测的关键。这里使用SimOTA动态标签分配策略,并优化了一些计算细节。具体地说,使用了Varifocal Loss (VFL)和GIoU Loss来计算cost matrix ,在不降低效率的前提下提高了精度;
  3. 进一步对ShuffleNetV2网络结构进行了改进,提出了一种新的Backbone,即Enhanced ShuffleNet (ESNet),其性能优于ShuffleNetV2;
  4. 提出了一种改进的一次性神经网络检测方法体系结构搜索(NAS) Pipeline,以自动找到最优的体系结构进行目标检测。直接在检测数据集上训练SuperNet,这带来了显著的计算节省和检测优化。本文的NAS方法生成的模型实现了更好的效率和准确性权衡。

2相关工作


目标检测是一项经典的计算机视觉挑战,旨在识别图像或视频中的目标类别和目标位置。现有的目标检测器,可以分为2类:

  • Anchor-Based检测器
  • Anchor-Free的检测器

两阶段检测器通常是基于Anchor的,从图像生成区域建议,然后从区域建议生成最终的边界框。为了提高目标定位的精度,FPN融合了多尺度的高级语义特征。两阶段探测器对目标定位精度较高,但在CPU或ARM设备上难以实现实时检测。

单阶段目标探测器也是基于Anchor的,具有较好的速度和精度平衡,因此在实践中得到了广泛的应用。SSD是用于检测多尺度物体的方法,虽然对小物体比较友好,但在精确度上没有竞争力。同时,YOLO系列(YOLOv1除外)在精度和速度上都表现良好。但是,它并没有解决在前面分析的一些问题。

Anchor-Free检测器的目的是消除Anchor Box,这是目标检测的一个重要改进。

  • YOLOv1的主要思想是将图像分割成多个网格,然后在靠近物体中心的点上预测BBox。
  • CornorNet检测边界框的一对角,而不将Anchor Box设计为先验框。
  • CenterNet放弃左上角和右下角,直接检测中心点。
  • FCOS首先以逐像素预测的方式重新制定目标检测,并提出中心分支。

Anchor-Free检测器解决了Anchor-Based检测器的一些问题,降低了存储成本,并提供了更精确的BBox计算。

之后的工作从不同方面进一步改进了目标检测器。ATSS提出了一种自适应训练样本选择,根据目标的统计特征自动选择正样本和负样本。Generalized Focal Loss  (GFL)消除FCOS中的“中心”分支,将质量估计融合到类预测向量中,形成定位质量和分类的联合表示。

在移动端目标检测领域,人们一直致力于实现更准确、更高效的目标检测:

  • 通过YOLOv4的压缩编译协同设计,YOLObile实现了移动端的实时物体检测。
  • PP-YOLOTiny采用MobileNetV3 Backbone和基于PP-YOLO的TinyFPN结构。
  • NanoDet使用ShuffleNetV2作为Backbone,使模型更轻,并使用ATSS和GFL提高精度;
  • YOLOX-Nano是目前YOLOX系列中最轻的结构,使用动态标签分配策略SimOTA在可接受的参数内实现最佳性能。

手工设计的技术很大程度上依赖于专业的知识和繁琐的试验。近年来,NAS在发现和优化网络架构(如MobileNetV3、EfficientNet和Mnasnet)方面显示了很有前景的结果。因此,NAS可以是一个很好的选择,以产生一个更好的效率-精度平衡的检测器。一键式NAS方式通过共享相同的权重来节省计算资源。近年来,许多Oneshot NAS都在进行图像分类,如ENAS、SMASH等。

据作者所知,很少有人尝试开发用于物体探测的NAS。NAS-FPN用于搜索特征金字塔网络。DetNas第一次在ImageNet上训练SuperNet Backbone,然后在COCO上对SuperNet Backbone进行微调。MobileDets使用了NAS,并提出了一个扩展的搜索空间系列,以在移动设备上实现更好的延迟与精度的平衡。


3本文方法


首先展示NAS的搜索方法可以得到具有较好性能的Backbone,这有助于提高准确性和减少延迟。然后,提供了Neck和Head模块的增强策略。最后,描述了标签分配策略和其他进一步提高性能的策略。

3.1 Better Backbone

1、手工设计

经过多次实验发现ShuffleleNetV2在移动设备上比其他网络更稳定。为了进一步提高ShuffleleNetV2的性能,作者采用了PPLCNet的一些方法来增强网络结构,并建立了一个新的Backbone,即Enhanced ShuffleNet (ESNet)。图3详细描述了ESNet的ES块。SE模块很好地权衡了网络通道以获得更好的特性。因此,在所有块中添加SE模块。

image.png

与MobileNetV3一样,SE模块的2层激活函数分别为ReLU和H-Sigmoid。Channel Shuffle提供了ShuffleNetV2通道的信息交换,但也会导致融合特性的丢失。为了解决这个问题,增加了depthwise卷积和pointwise卷积,在stride=2时整合不同的通道信息(图3a)。

GhostNet的作者提出了一种新的Ghost模块,可以用更少的参数生成更多的特征图,以提高网络的学习能力。作者将Ghost模块添加到stride=1的块中,以进一步增强ESNet的性能(图3b)。

2、结构搜索

首次提出了目标检测器的one-shot搜索方法。由于不同任务之间的差距,配备了高性能分类Backbone的物体检测器可能不是最佳选择。这里不寻找更好的分类器,而是直接在检测数据集上训练和搜索检测SuperNet,这大大节省了计算量,优化了检测效果。

该搜索框架由2个步骤组成:

  1. 在检测数据集上训练One-shot SuperNet,
  2. 在训练后的SuperNet上使用进化算法(EA)进行架构搜索。

为了方便,在这里简单地使用通道搜索Backbone。具体来说,作者提供灵活的比率选项,以选择不同的通道比率。作者在[0.5,0.675,0.75,0.875,1]中随机粗略地选择比率。例如,0.5表示宽度按完整模型的0.5缩放。通道数可被8整除,可以提高硬件设备上的推理速度。

因此,首先用每个阶段块的通道数训练完整的模型,而不是使用原始模型中的通道数。所有的比例选项也可以保持通道数被8整除。所选的比率适用于每个块中的所有可读卷积。所有输出通道固定为完整模型。

为了避免繁琐的超参数调优,作者修复了架构搜索中的所有原始设置。对于训练策略,采用sandwich rule对最大子模型和最小子模型进行抽样,每个训练迭代随机抽样6个子模型。在训练策略中没有更多的额外trick,如蒸馏,因为不同的技术对不同的模型执行不一致,特别是检测任务。最后,在ImageNet数据集上对选定的架构进行再训练,然后在COCO上进行训练。

3.2 CSP-PAN和Detector Head

CSP结构广泛应用于YOLOv4和YOLOX Neck部分。这里也使用PAN结构获取多级特征图,使用CSP结构进行相邻特征图之间的特征连接和融合。在原有的CSP-PAN中,每个输出特征映射中的通道都与来自Backbone的输入保持一致。

对于移动端来说,通道数大的结构具有昂贵的计算成本。本文通过使用1×1卷积来解决这个问题。然后通过CSP结构使用自顶向下和自底向上的特征融合。缩小的特征导致更低的计算成本和无损的准确性。

此外,在CSP-PAN的顶部添加一个特征图scale以检测更多的目标。同时,除1×1卷积外,所有卷积都是深度可分离卷积。深度可分卷积通过5×5卷积扩展感受野。这种结构以更少的参数带来了相当大的精度提高。具体的结构如图2所示。

在detector head使用深度可分卷积和5×5卷积来扩展感受野。深度可分卷积的个数可以设置为2,4或更多。

总体网络结构如图2所示。Neck和Head都有4个scale branches。保持head的通道数与neck模块一致,并将分类和回归分支coupled起来。YOLOX使用了一个decoupled  head,通道数更少,同时可以提高准确性。本文的coupled head在不减少通道数量的情况下性能更好,参数和推理速度与decoupled  head几乎相同。

3.3 标签分配策略与损失

正样本和负样本的标签分配对目标检测有重要影响。大多数目标检测器使用固定的标签分配策略。这些策略很简单:

  • RetinaNet 通过Ground Truth和Anchor Boxes直接将正样本和负样本划分出来;
  • FCOS 以中心点在Ground Truth内部的Anchor为正样本;
  • YOLOv4 和 YOLOv5 选择Ground Truth中心点及其相邻Anchor为正样本;
  • ATSS 根据Ground Truth附近最近Anchor的统计特征来确定正、负样本。

上述标签分配策略在全局训练过程中是不变的。SimOTA是一种标签分配策略,随着培训过程的不断变化,SimOTA在YOLOX中取得了很好的效果。

本文使用SimOTA动态标签分配策略来优化训练过程:

  1. 通过中心先验确定候选区域;
  2. 计算出候选区域中预测框与Ground truth的IoU;
  3. 将每个Ground truth的最大IoU相加得出参数κ。

cost 矩阵直接计算候选区域中所有预测框和Ground truth的损失。对于每个Ground truth,选择与最小κ损失对应的Anchor作为正样本。原SimOTA采用CE损失和IoU损失的加权和来计算cost 矩阵。为了使SimOTA中的cost与目标函数保持一致,作者使用Varifocal loss和GIoU loss的加权和作为cost矩阵。GIoU损失的权重为λ,实验表明,λ为6是最好的。具体公式是:

image.png

在检测器头部,利用Varifocal loss对分类预测和质量预测进行耦合。对于回归,用GIoU损失和Distribution Focal Loss。公式如下:

image.png

在上述公式中,表示Varifocal Loss ,表示GIoU Loss,表示Distribution Focal Loss  。

3.4 其他策略

近年来,越来越多的激活函数超越了ReLU。在这些激活函数中,HSwish是Swish激活函数的简化版本,计算速度更快,移动端也比较友好。于是作者将检测器的激活函数由ReLU改为H-Swish。在保持推理时间不变的情况下,性能显著提高。

与linear step learning rate decay 不同,cosine learning rate decay是学习率的指数衰减。余弦学习速度平稳下降,有利于训练过程,特别是当Batch-Size较大时。

过多的数据增强会增加正则化效果,使训练对轻量模型的收敛更加困难。因此,在本工作中,只使用随机翻转、随机裁剪和多尺度调整来增强训练中的数据。

相关实践学习
基于ECS和NAS搭建个人网盘
本场景主要介绍如何基于ECS和NAS快速搭建个人网盘。
阿里云文件存储 NAS 使用教程
阿里云文件存储(Network Attached Storage,简称NAS)是面向阿里云ECS实例、HPC和Docker的文件存储服务,提供标准的文件访问协议,用户无需对现有应用做任何修改,即可使用具备无限容量及性能扩展、单一命名空间、多共享、高可靠和高可用等特性的分布式文件系统。 产品详情:https://www.aliyun.com/product/nas
相关文章
|
8月前
|
缓存 安全 程序员
【ARM学习】Cortex- A系列程序员学习指南
【ARM学习】Cortex- A系列程序员学习指南
298 0
|
7月前
|
存储 缓存 算法
数据结构和算法学习记录——总结顺序表和链表(双向带头循环链表)的优缺点、CPU高速缓存命中率
数据结构和算法学习记录——总结顺序表和链表(双向带头循环链表)的优缺点、CPU高速缓存命中率
70 0
|
4月前
|
Ubuntu KVM 虚拟化
基于ARM64的Qemu/KVM学习环境搭建
基于ARM64的Qemu/KVM学习环境搭建
|
4月前
|
NoSQL Ubuntu Linux
基于ARM64的Qemu/KVM学习环境搭建2
基于ARM64的Qemu/KVM学习环境搭建2
|
8月前
|
存储 算法 Linux
内存系列学习(五):ARM处理器中的Cache和Write Buffer
内存系列学习(五):ARM处理器中的Cache和Write Buffer
378 0
内存系列学习(五):ARM处理器中的Cache和Write Buffer
|
8月前
|
缓存 算法
内存系列学习(七):ARM处理器的快速上下文切换技术
内存系列学习(七):ARM处理器的快速上下文切换技术
197 0
|
8月前
|
存储 缓存 Linux
内存系列学习(六):ARM处理器存储访问一致性问题
内存系列学习(六):ARM处理器存储访问一致性问题
602 0
|
8月前
|
存储 缓存 Linux
内存系列学习(三):ARM处理器地址变换过程
内存系列学习(三):ARM处理器地址变换过程
310 0
|
8月前
|
存储 缓存 算法
内存系列学习(二):ARM处理器中CP15协处理器
内存系列学习(二):ARM处理器中CP15协处理器
162 0
|
8月前
|
存储 缓存 Linux
关于S3学习所涉及到的知识(一):per-CPU变量&kernel syscore
关于S3学习所涉及到的知识(一):per-CPU变量&kernel syscore
108 0