Slim-Neck by GSConv

paper:Slim-neck by GSConv: A better design paradigm of detector architectures for autonomous vehicles

official implementation:https://github.com/alanli1997/slim-neck-by-gsconv

背景

目标检测是计算机视觉中一个重要的下游任务。对于车载边缘计算平台,一个较大的模型难以实现实时检测的要求。大量的深度可分离卷积(depth-wise separable convolution, DSC)层建立轻量级模型又不能达到足够的精度。而且DSC的缺陷也很明显:输入图像的通道信息在计算过程中被分离开来。如1(a)(b)分别展示了标准卷积(SC, standard convolution)和DSC的计算过程。这一缺陷导致DSC的特征提取和融合能力比SC要低得多。

实际上,许多轻量模型都提出了一些方法来缓解DSC的固有缺陷:MobileNets使用大量的1x1卷积来融合独立计算的通道信息;ShuffleNets使用“channel shuffle”操作进行通道信息的交互;GhostNets使用减半的SC来保留通道之间的信息交互。但1x1卷积占用了更多的计算资源,使用channel shuffle的效果仍然不如SC,而GhostNet或多或少的又回到了SC的道路上。

许多轻量网络都使用类似的思想来设计基本架构:从网络的开始到结束只使用DSC。但DSC的缺陷在backbone中被放大了,无论是用于分类还是检测。

本文的创新点

  • 本文提出了一种新的轻量级卷积方法,即GSConv。该方法使卷积计算的输出尽可能接近SC,并降低了计算成本。
  • 本文为自动驾驶的检测架构提供了一个设计范式,即标准backbone和slim-neck。
  • 本文验证了各种广泛使用的trick在GSConv-Slim-Neck Detector上的有效性,为该领域的研究提供了参考。

方法介绍

GSConv

作者认为标准卷积SC和深度可分离卷积DSC可以一起使用。仅通过shuffle深度可分离卷积的输出通道得到的特征图仍然是"depth-wise separated",为了使DSC的输出尽可能接近SC,作者提出了一种新的方法GSConv,它是一种将SC、DSC、shuffle混合到一起的卷积。如图2所示,我们通过shuffle操作将SC得到的信息permeate到DSC生成信息的每个部分中。shuffle是一种统一的混合策略。这种方法将来自SC的信息完全混合到DSC的输出中,通过均匀地交换不同通道上的局部特征信息,而无需附加操作。

图3展示了SC、DSC和GSConv的可视化结果,可以看出GSConv的特征图明显更类似于SC,而不是DSC。

 

在轻量级模型上,我们只使用GSConv层代替SC层就显著提高了精度;在其他模型中,当我们在backbone中使用SC并在neck中使用GSConv时,模型的精度非常接近原模型;如果加上一些trick,精度和速度都超过了原模型。采用GSConv的slim-neck最大限度地减少了DSC缺陷对模型的负面影响,并有效地利用了DSC的好处。

Why GSConv

在CNN中,输入图片总是在backbone中经历类似的转换过程:空间信息一步一步的转换到通道,每次空间维度的压缩(宽度和高度)和通道维度的扩展都会导致语义信息的部分丢失。通道密集channel-dense的卷积计算最大限度的保留了通道之间的隐藏连接,而通道稀疏channel-sparse的卷积完全切断了这些连接。GSConv以较低的时间复杂度尽可能的保留这些连接。通常,卷积的时间复杂度用FLOPs来表示,则SC(channle-dense convolution)、DSC(channel-sparse convolution)和GSConv的时间复杂度表示如下 

其中 \(W\) 是输出特征图的宽度,\(H\) 是输出特征图的高度,\(K_{1}\cdot K_{2}\) 是卷积核大小,\(C_{1}\) 是每个卷积核的通道数也是输入特征图的通道数,\(C_{2}\) 是输出特征图的通道数。实验中的表3展示了5种不同卷积block对模型性能的贡献。

GSConv的优点对轻量级检测模型更为明显,这得益于通过增加DSC和shuffle而增强的非线性表达能力。但如果在模型的各个阶段都使用GSConv,网络会变得更深,加剧对data flow的阻力并显著增加推理时间。当特征图到neck部分时,它们已经变得足够细了(通道达到最大,宽度和深度达到最小),转换也变得适中。因此更好的选择是只在neck部分使用GSConv(slim-neck + standard backbone)。在这个阶段使用GSConv处理拼接的特征图正合适:冗余的重复信息更少也不需要再压缩,注意力模块在这里也效果更好,例如SPP和CA。

The Slim-neck

作者研究了提高CNN学习能力的一些方法如DenseNet、VoVNet、CSPNet,然后根据这些方法的理论设计了slim-neck的结构。作者设计slim neck来减少计算复杂度和推理时间同时保持精度。GSConv完成了降低计算复杂度的任务,而减少推理时间和保持精度的任务需要新的模型。

The element modules of the slim-neck

GSConv的计算成本大约是SC的50%,但对模型学习能力的贡献与后者相当。作者在GSConv的基础上提出了GS bottleneck,如图4(a)所示。然后又使用one-shot aggregation(就是VoVNet,具体介绍见VoVNet(CVPR workshop 2019)原理与代码解析-CSDN博客)方法设计了cross stage partial network(GSCSP)模块,VoV-GSCSP。图4(b),(c),(d)展示了VoV-GSCSP的三种设计方案。其中(b)简单直接推理速度快,(c)(d)的特征重用率更高。

The slim-neck for the YOLO family

YOLO系列由于其高效的检测能力在工业中得到了广泛的应用。作者使用slim-neck来替换Scaled-YOLOv4l和YOLOv5l中的neck,改造后的neck和原始neck部分结构比较如下 

 

实验结果

作者在PASCAL VOC 2007+12数据集上测试了用五种不同卷积构建的YOLOv5n模型,结果如表3所示,GSConv取得了最好的结果。 

表5展示了图4中三种不同VoV-GSCSP结构的效果,可以看到,VoV-GSCSP1的性能最好且延迟最低。 

表6展示了YOLOv5n中使用不同注意力模块的实验结果。Part I中的所有模型使用slim-neck + slim-backbone的结构,Part II中的模型只使用slim-neck。作者发现使用不同的注意力模块对参数量和推理时间的影响差异不大,但对精度的影响是显著的。其中CA*3+SPPF*1在所有情况下就取得了最高的精度(关于CA的介绍见Coordinate Attention(CVPR 2021)-CSDN博客)。 此外当推理时间接近时,slim-neck的精度要远好于slim-backbone-neck结构。

代码

这里实现非常简单,就不作解释了。

class GSConv(nn.Module):# GSConv https://github.com/AlanLi1997/slim-neck-by-gsconvdef __init__(self, c1, c2, k=1, s=1, g=1, act=True):super().__init__()c_ = c2 // 2self.cv1 = Conv(c1, c_, k, s, None, g, act)self.cv2 = Conv(c_, c_, 5, 1, None, c_, act)def forward(self, x):x1 = self.cv1(x)x2 = torch.cat((x1, self.cv2(x1)), 1)# shuffle# y = x2.reshape(x2.shape[0], 2, x2.shape[1] // 2, x2.shape[2], x2.shape[3])# y = y.permute(0, 2, 1, 3, 4)# return y.reshape(y.shape[0], -1, y.shape[3], y.shape[4])b, n, h, w = x2.data.size()b_n = b * n // 2y = x2.reshape(b_n, 2, h * w)y = y.permute(1, 0, 2)y = y.reshape(2, -1, n // 2, h, w)return torch.cat((y[0], y[1]), 1)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络线性量化方法简介

可点此跳转看全篇 目录 神经网络量化量化的必要性量化方法简介线性对称量化线性非对称量化方法神经网络量化 量化的必要性 NetworkModel size (MB)GFLOPSAlexNet2330.7VGG-1652815.5VGG-1954819.6ResNet-50983.9ResNet-1011707.6ResNet-15223011.3GoogleNet271.6InceptionV38…

Singularity(五)| 容器挂载和环境

Singularity(五)| 容器挂载和环境 我们可以按照如下方式运行 Singularity 容器: singularity shell samtoolssingularity exec samtools samtools helpsingularity run samtoolssingularity exec instance://samtools 在我们逐个详解容器运行…

【智能算法】哈里斯鹰算法(HHO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2019年,Heidari 等人受到哈里斯鹰捕食行为启发,提出了哈里斯鹰算法(Harris Hawk Optimization, HHO)。 2.算法原理 2.1算法思想 根据哈里斯鹰特性,HHO分为探索-…

【Android】 ClassLoader 知识点提炼

1.Java中的 ClassLoader 1.1 、ClassLoader的类型 Java 中的类加载器主要有两种类型,即系统类加载器和自定义类加载器。其中系统类 加载器包括3种,分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application ClassLoader。 1.1.1.Bootstra…

鸿蒙原生应用元服务开发-WebGL网页图形库开发无着色器绘制2D图形

无着色器绘制2D图形 使用WebGL开发时&#xff0c;为保证界面图形显示效果&#xff0c;请使用真机运行。 此场景为未使用WebGL绘制的2D图形&#xff08;CPU绘制非GPU绘制&#xff09;。开发示例如下&#xff1a; 1.创建页面布局。index.hml示例如下&#xff1a; <div class…

算法学习---栈和队列算法学习

一、用栈去实现队列 1.整理思路 栈的特点&#xff1a;先进后出 队列的特点&#xff1a;先进先出 我们要用栈的先进后出&#xff0c;来模拟实现队列的先进后出。我们需要借助两个栈去实现&#xff0c;分别叫做栈1和栈2。 栈1主要是用来存储数据的&#xff0c;我们将要插入的数据…

树莓派Python环境配置:删除Python 2、默认使用Python 3及配置Python镜像源指南

树莓派Python环境配置&#xff1a;优化升级三部曲 文章目录 树莓派Python环境配置&#xff1a;优化升级三部曲前言一、查看系统预装的python版本二、卸载python2并默认python3三、删除默认python3.7并升级到python3.9四、更换树莓派上的pip系统镜像源一键更换清华源&#xff08…

LoadRunner学习:RuntimeSetting、参数化、关联、(unfinished

LoadRunner RuntimeSetting 运行时设置 在Vuser中设置Run-time Settings RunLogic&#xff1a;运行逻辑&#xff0c;决定了脚本真正执行逻辑&#xff0c; Init和End部分代码只能执行一次。决定脚本真正执行逻辑的意思是&#xff0c;在Run中的代码和Number of Iteration决定了…

灵魂指针,教给(三)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、 字符指针变量 二、数组指针变量 2.1 数组指针变量是什么 2.2 数组指针变量如何初始化 三、二维数组传参本质 四、函数…

Redis + Caffeine = 王炸!!

在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时,也能降低数据库的压力。 随着不断的发展,这一架构也产生了改进,在…

Selenium控制已运行的Edge和Chrome浏览器(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令&#xff08;1&#xff09;Edge&#xff08;2&#xff09;Chrome 2. 执行python代码&#xff08;1&#xff09;先启动浏览器后执行代码&#xff08;2&#xff09;通过代码启动浏览器 3. 爬取效果3. 完整代码共享3.1 包含Excel部分的…

【数据结构】初识二叉搜索树(Binary Search Tree)

文章目录 1. 二叉搜索树的概念2. 二叉搜索树的操作1.1 二叉搜索树的查找1.2 二叉搜索树的插入1.3 二叉搜索树的删除 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它可能是一棵空树&#xff0c;也可能是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&am…

力扣L5----- 58. 最后一个单词的长度(2024年3月11日)

1.题目 2.知识点 注1&#xff1a; lastIndexOf()它用于查找指定字符或子字符串在当前字符串中最后一次出现的位置。它的作用是从字符串的末尾向前搜索指定字符或子字符串&#xff0c;并返回其最后一次出现的位置的索引。 &#xff08;1&#xff09;例如&#xff0c;在字符串 …

Rust入门:C++和Rust动态库(dll)的相互调用

无论是C调用Rust动态库还是Rust调用C动态库&#xff0c;其操作基本都是一样地简单&#xff0c;基本和C调用C的动态库没什么区别&#xff0c;只需要列出所需要导入的函数&#xff0c;并链接到相应的lib文件即可。 这里&#xff0c;在windows中&#xff0c;我们以dll动态库为例说…

OpenCV学习笔记(一)——Anaconda下载和OpenCV的下载

OpenCV是图象识别中有巨大的应用场景&#xff0c;本篇文章以Python为基础。当初学OpenCV的时候&#xff0c;推使用在Anaconda编写代码&#xff0c;原因比较方便&#xff0c;下面我们对于Anaconda的下载过程进行演示。 Anaconda的下载 首先打开官网www.anaconda.com/download找…

数据结构---C语言栈队列

知识点&#xff1a; 栈&#xff1a; 只允许在一端进行插入或删除操作的线性表&#xff0c;先进后出LIFO 类似一摞书&#xff0c;按顺序拿&#xff0c;先放的书只能最后拿&#xff1b; 顺序栈&#xff1a;栈的顺序存储 typedef struct{Elemtype data[50];int top; }SqStack; SqS…

设计模式-行为型模式-模版方法模式

模板方法模式&#xff0c;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。[DP] 模板方法模式是通过把不变行为搬移到超类&#xff0c;去除子类中的重复代码来体现它的优势。 //首…

【Leetcode每日一题】 位运算 - 面试题 01.01. 判定字符是否唯一(难度⭐)(33)

1.题目解析 题目链接&#xff1a;面试题 01.01. 判定字符是否唯一 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于判断题目所给字符串是否存在相同字母&#xff0c;存在返回false即可&#xff0c;不存在返回true即可。 …

Caffeine缓存

本地缓存基于本地环境的内存&#xff0c;访问速度非常快&#xff0c;对于一些变更频率低、实时性要求低的数据&#xff0c;可以放在本地缓存中&#xff0c;提升访问速度 使用本地缓存能够减少和Redis类的远程缓存间的数据交互&#xff0c;减少网络 I/O 开销&#xff0c;降低这…

08 聚合函数

聚合函数 我们上一章讲到了 SQL 单行函数。实际上 SQL 函数还有一类&#xff0c;叫做聚合&#xff08;或聚集、分组&#xff09;函数&#xff0c;它是对一组数据进行汇总的函数&#xff0c;输入的是一组数据的集合&#xff0c;输出的是单个值。 1.聚合函数介绍 什么是聚合函…