天天看点

YOLO算法改进Backbone系列之:ParC-Net

作者:Nuist目标检测

最近视觉transformer开始显示出令人印象深刻的结果,其性能明显优于基于大卷积的模型。然而,在移动设备或资源受限设备的小型模型领域,卷积神经网络在性能和模型复杂性方面仍然具有自身的优势。本文提出了ParC-Net,这是一种纯粹基于卷积神经网络的骨干模型,通过将视觉transformer的优点融合到卷积神经网络中,进一步增强了这些优点。具体来说,我们提出了位置感知循环卷积(ParC),这是一种轻量级的卷积算子,它具有全局接受场,同时产生与局部卷积一样的位置敏感特征。我们将parc和squeeze-exictation点结合在一起,形成了一个类似于metaformer的模型块,该模型块进一步具有类似于transformer的注意机制。

上述模块可以以即插即用的方式替代卷积网络或transformer中的相关模块。实验结果表明,在常见的视觉任务和数据集上,所提出的ParC-Net在参数更少、推理速度更快的情况下,取得了比流行的轻量级卷积神经网络和基于视觉transformer的模型更好的性能。在ImageNet-1k上,ParC-Net使用约500万个参数实现了78.6%的top-1准确率,节省了11%的参数和13%的计算成本,但与MobileViT相比,准确率提高了0.2%,推理速度提高了23%(基于ARM的瑞芯RK3288),与DeIT相比,仅使用0.5个参数,准确率提高了2.7%。在MS-COCO对象检测和PASCAL VOC分割任务上,ParC-Net也表现出较好的性能。源代码可在https: //github.com/hkzhang91/ParC-Net

背景:ViTs和ConvNets都是必不可少的:

(1)从应用角度来看,ViTs和ConvNets都有各自的优点和缺点。ViT模型通常具有较好的性能,但通常存在计算成本高且难以训练的问题。与ViTs相比,ConvNets的性能可能会有所下降,但仍有一些独特的优势。例如,ConvNets有更好的硬件支持,并且易于训练。

(2)从信息处理的角度来看,ViT和ConvNets都有各自的特点。ViT擅长提取全局信息,利用注意力机制在输入数据的驱动下提取不同位置的信息。ConvNets专注于局部关系的建模,并且通过归纳偏差具有很强的先验。

本文贡献:

(1)为了克服传统卷积感知域有限的限制,我们提出了位置感知循环卷积(ParC),其中使用基实例内核和位置嵌入策略分别处理输入大小变化和向输出特征图注入位置信息。我们将提出的ParC和传统的卷积运算结合起来提取局部-全局特征,提高了提取的精度

(2)我们提出了ParC-Net,一个纯ConvNet的移动和边缘计算应用。本文提出的ParCNet继承了ConvNet和ViT的优点。据我们所知,这是第一次尝试结合ConvNets和vit的优势来设计轻量级的ConvNet

(3)我们将提出的ParC-Net应用于三个视觉任务。与基线模型相比,本文提出的ParC-Net在三个任务上都取得了更好的性能,同时具有更少的参数、更低的计算成本和更高的推理速度

自注意从整个空间位置学习全局特征,而卷积从局部接受野收集信息。本文提出了位置感知循环卷积(ParC),ParC有两种类型,一种是垂直方向的ParC (ParC- v),另一种是水平方向的ParC (ParC- h)。ParC-V和ParC-H的接受野分别覆盖同一列和同一行的所有像素。联合使用ParC-V和ParC-H可以从所有输入像素中提取全局特征。

YOLO算法改进Backbone系列之:ParC-Net

上面介绍了ParC块,这是一个基本的块,可以插入到大多数现有的模型中。目前如下图所示,现有的混合结构基本可以分为三种主要结构,分别是串联结构、并联结构和分叉结构。对于ParC_Net 的搭建,作者直接基于MobileViT,采用了分叉结构完成了网络的搭建。具体而言,作者保留了MobileViT中浅层具有局部感受野的MobileNetV2结构,而将网络深层的ViT block替换成了ParC block,使网络变成了一个pure ConvNet。

YOLO算法改进Backbone系列之:ParC-Net

在YOLOv5项目中添加ParC_Net模型作为Backbone使用的教程:

(1)将YOLOv5项目的models/yolo.py修改parse_model函数以及BaseModel的_forward_once函数

YOLO算法改进Backbone系列之:ParC-Net
YOLO算法改进Backbone系列之:ParC-Net

(2)在models/backbone(新建)文件下新建ParC_convnext.py,添加如下的代码:

YOLO算法改进Backbone系列之:ParC-Net

(3)在models/yolo.py导入模型并在parse_model函数中修改如下(先导入文件):

YOLO算法改进Backbone系列之:ParC-Net

(4)在model下面新建配置文件:yolov5_ParC_convnext.yaml

YOLO算法改进Backbone系列之:ParC-Net

(5)运行验证:在models/yolo.py文件指定--cfg参数为新建的yolov5_ParC_convnext.yaml

YOLO算法改进Backbone系列之:ParC-Net

继续阅读