YOLOv7 | 添加GSConv,VoVGSCSP等多种卷积,有效提升目标检测效果,代码改进(超详细)

⭐欢迎大家订阅我的专栏一起学习⭐
🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀
YOLOv5涨点专栏:http://t.csdnimg.cn/QdCj6
YOLOv7专栏: http://t.csdnimg.cn/dygOj
YOLOv8涨点专栏:http://t.csdnimg.cn/Avu8g
💡魔改网络、复现论文、优化创新💡
目录
主要想法
GSConv
GSConv代码实现
slim-neck
slim-neck代码实现
yaml文件
完整代码分享
总结
目标检测是计算机视觉中重要的下游任务。对于车载边缘计算平台来说,巨大的模型很难达到实时检测的要求。而且,由大量深度可分离卷积层构建的轻量级模型无法达到足够的精度。我们引入了一种新的轻量级卷积技术 GSConv,以减轻模型重量但保持准确性。 GSConv 在模型的准确性和速度之间实现了出色的权衡。并且,我们提供了一种设计范例,细颈,以实现探测器更高的计算成本效益。我们的方法的有效性在二十多组比较实验中得到了强有力的证明。特别是,与原始检测器相比,通过我们的方法改进的检测器获得了最先进的结果(例如,在公开数据集的Tesla T4 GPU 上以100FPS 的速度获得 70.9% mAP0.5)。
主要想法
生物大脑处理信息的强大能力和低能耗远远超出了计算机。简单地无休止地增加模型参数的数量并不能建立强大的模型。轻量化设计可以有效缓解现阶段高昂的计算成本。这个目的主要是通过深度可分离卷积(DSC)运算来减少参数量和浮点运算(FLOP)来实现的,效果很明显。然而DSC的缺点也很明显:在计算过程中输入图像的通道信息被分离。这一缺陷导致 DSC 的特征提取和融合能力比标准卷积 (SC) 低得多。
GSConv
尽管DSC有一定的优点,但DSC 的缺陷在主干中直接被放大,无论是用于图像分类还是检测。我们相信SC和DSC可以合作。我们注意到,仅通过混洗 DSC 输出通道生成的特征图仍然是“深度分离”。为了使DSC的输出尽可能接近SC,我们引入了一种新方法——SC、DSC和shuffle的混合卷积,命名为GSConv。如图所示,我们使用shuffle将SC(通道密集卷积运算)生成的信息渗透到DSC生成的信息的每个部分中。shuffle是一种统一的混合策略。该方法通过在不同通道上统一交换局部特征信息,可以将来自 SC 的信息完全混合到 DSC 的输出中,而无需任何附加功能。
GSConv代码实现
import torch
import torch.nn as nn
import math# GSConvE test
class GSConvE(nn.Module):'''GSConv enhancement for representation learning: generate various receptive-fields andtexture-features only in one Conv modulehttps://github.com/AlanLi1997/slim-neck-by-gsconv'''def __init__(self, c1, c2, k=1, s=1, g=1, act=True):super().__init__()c_ = c2 // 4self.cv1 = Conv(c1, c_, k, s, None, g, act)self.cv2 = Conv(c_, c_, 9, 1, None, c_, act)self.cv3 = Conv(c_, c_, 13, 1, None, c_, act)self.cv4 = Conv(c_, c_, 17, 1, None, c_, act)def forward(self, x):x1 = self.cv1(x)x2 = self.cv2(x1)x3 = self.cv3(x1)x4 = self.cv4(x1)y = torch.cat((x1, x2, x3, x4), dim=1)# shuffley = y.reshape(y.shape[0], 2, y.shape[1] // 2, y.shape[2], y.shape[3])y = y.permute(0, 2, 1, 3, 4)return y.reshape(y.shape[0], -1, y.shape[3], y.shape[4])def autopad(k, p=None): # kernel, padding# Pad to 'same'if p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-padreturn pclass Conv(nn.Module):# C_B_Mdef __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):super().__init__()self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = nn.Mish() if act else (act if isinstance(act, nn.Module) else nn.Identity())def forward(self, x):return self.act(self.bn(self.conv(x)))def forward_fuse(self, x):return self.act(self.conv(x))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)# shuffley = 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])class GSConvns(GSConv):# GSConv with a normative-shuffle https://github.com/AlanLi1997/slim-neck-by-gsconvdef __init__(self, c1, c2, k=1, s=1, g=1, act=True):super().__init__(c1, c2, k=1, s=1, g=1, act=True)c_ = c2 // 2self.shuf = nn.Conv2d(c_ * 2, c2, 1, 1, 0, bias=False)def forward(self, x):x1 = self.cv1(x)x2 = torch.cat((x1, self.cv2(x1)), 1)# normative-shuffle, TRT supportedreturn nn.ReLU(self.shuf(x2))class GSBottleneck(nn.Module):# GS Bottleneck https://github.com/AlanLi1997/slim-neck-by-gsconvdef __init__(self, c1, c2, k=3, s=1):super().__init__()c_ = c2 // 2# for lightingself.conv_lighting = nn.Sequential(GSConv(c1, c_, 1, 1),GSConv(c_, c2, 3, 1, act=False))self.shortcut = Conv(c1, c2, 1, 1, act=False)def forward(self, x):return self.conv_lighting(x) + self.shortcut(x)class DWConv(Conv):# Depth-wise convolution classdef __init__(self, c1, c2, k=1, s=1, act=True): # ch_in, ch_out, kernel, stride, padding, groupssuper().__init__(c1, c2, k, s, g=math.gcd(c1, c2), act=act)class GSBottleneckC(GSBottleneck):# cheap GS Bottleneck https://github.com/AlanLi1997/slim-neck-by-gsconvdef __init__(self, c1, c2, k=3, s=1):super().__init__(c1, c2, k, s)self.shortcut = DWConv(c1, c2, 3, 1, act=False)class VoVGSCSP(nn.Module):# VoVGSCSP module with GSBottleneckdef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super().__init__()c_ = int(c2 * e) # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)# self.gc1 = GSConv(c_, c_, 1, 1)# self.gc2 = GSConv(c_, c_, 1, 1)self.gsb = GSBottleneck(c_, c_, 1, 1)self.res = Conv(c_, c_, 3, 1, act=False)self.cv3 = Conv(2*c_, c2, 1) #def forward(self, x):x1 = self.gsb(self.cv1(x))y = self.cv2(x)return self.cv3(torch.cat((y, x1), dim=1))
slim-neck
此外,还研究了增强 CNN 学习能力的通用方法,例如 DensNet 、VoVNet 和 CSPNet ,然后根据这些方法的理论设计 slim-neck 的结构。我们设计了细长的颈部,以降低检测器的计算复杂性和推理时间,但保持精度。 GSConv完成了降低计算复杂度的任务,而减少推理时间并保持精度的任务需要新的模型。
GSConv的计算成本约为SC的50%(0.5+0.5C1,C1值越大,比例越接近50%),但其对模型学习能力的贡献与后者相当。基于GSConv,我们在GSConv的基础上继续引入GS瓶颈,下图(a)展示了GS瓶颈模块的结构。然后,我们使用一次性聚合方法设计跨阶段部分网络(GSCSP)模块VoV-GSCSP。图(b)(c)和(d)分别显示了我们为VoV-GSCSP提供的三种设计方案,其中(b)简单直接且推理速度更快,(c)和(d)具有功能的重用率更高。事实上,结构越简单的模块由于硬件友好而更容易被使用。下表也详细报告了VoV-GSCSP1、2、3三种结构的消融研究结果,事实上,VoVGSCSP1表现出更高的性价比。最后,我们需要灵活地使用 GSConv、GS 瓶颈和 VoV-GSCSP 这四个模块。
slim-neck代码实现
class VoVGSCSPC(VoVGSCSP):# cheap VoVGSCSP module with GSBottleneckdef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super().__init__(c1, c2, e)c_ = int(c2 * e) # hidden channelsself.gsb = GSBottleneckC(c_, c_, 3, 1)
代码都添加在common.py中
yaml文件
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Slim-neck by GSConv: A better design paradigm of detector architectures for autonomous vehicle
# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.25 # layer channel multiple
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]], # 9]# YOLOv5 v6.0 head
head:[[-1, 1, GSConv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, VoVGSCSP, [512, False]], # 13[-1, 1, GSConv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 3, VoVGSCSP, [256, False]], # 17 (P3/8-small)[-1, 1, GSConv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, VoVGSCSP, [512, False]], # 20 (P4/16-medium)[-1, 1, GSConv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, VoVGSCSP, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
完整代码分享
本代码结合了YOLOv7的官方仓库进行改进,实现了YOLOv7 + GSconv
完整代码链接如下:
链接: https://pan.baidu.com/s/1zQgPu1lxZ4Sm3HYiCW3awg?pwd=v4m4 提取码: v4m4
如果执行代码出现如下面的样例则代表替换卷积模块成功。
总结
本实验引入了一种新的轻量级卷积方法 GSConv,使深度可分离卷积达到接近普通卷积的效果并且更加高效。设计了一次性聚合模块 VoV-GSCSP 来代替普通的瓶颈模块以加速推理。此外,我们还提供轻量化的细颈设计范例。在我们的实验中,与其他轻量级卷积方法相比,GSConv 显示出更好的性能。
相关文章:
YOLOv7 | 添加GSConv,VoVGSCSP等多种卷积,有效提升目标检测效果,代码改进(超详细)
⭐欢迎大家订阅我的专栏一起学习⭐ 🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀 YOLOv5涨点专栏:http://t.csdnimg.cn/QdCj6 YOLOv7专栏: http://t.csdnimg.cn/dy…...
『运维心得』BPC-EPM-AddIn专家看过来
目录 系统版本问题 安装顺序问题 framework问题 vstor_redis问题 dll问题 一个小彩蛋 总结 最近在搞BPC,安装Office所需的EPM-AddIn的过程中,碰到了一些奇怪的问题。 查了BPC专家提供的安装说明文档,文档里要么没有提到我们碰到的问题…...
论文浅尝 | GPT-RE:基于大语言模型针对关系抽取的上下文学习
笔记整理:张廉臣,东南大学硕士,研究方向为自然语言处理、信息抽取 链接:https://arxiv.org/pdf/2305.02105.pdf 1、动机 在很多自然语言处理任务中,上下文学习的性能已经媲美甚至超过了全资源微调的方法。但是…...
Rust语言:告诉编译器允许存在未使用的代码(Rust保留未使用的实现)
Rust告诉编译器允许存在未使用的代码(Rust保留未使用的实现) Rust的Lint工具clippy clippy是一个Rust的Lint工具,旨在帮助开发者发现并改进代码中的潜在问题。它提供了许多静态代码分析的规则和建议,以提高代码质量和可读性。其中就包括检查未使用的代…...
Winform数据绑定
简介# 在C#中提起控件绑定数据,大部分人首先想到的是WPF,其实Winform也支持控件和数据的绑定。 Winform中的数据绑定按控件类型可以分为以下几种: 简单控件绑定列表控件绑定表格控件绑定 绑定基类# 绑定数据类必须实现INotifyPropertyChanged…...
DeprecationWarning: currentThread() is deprecated, use current_thread() instead
解决方案: # auto_commit not getattr(threading.currentThread(), testing, False) #阙辉注释 auto_commit not getattr(threading.current_thread(), testing, False) #阙辉新增...
2024届 C++ 刷题 笔试强训 Day 03
选择题 01 以下程序的输出结果是() #include <stdio.h> void main() {char a[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, *p;int i;i 8;p a i;printf("%s\n", p - 3); }A 6 B 6789 C ‘6’ D 789 题目解析: 题目中定义了一个…...
linux用git拉取我云端以及git处理冲突
拉取后切换一个跟云端分支(dev)一样的 git branch --set-upstream-toorigin/dev dev 之后就同步了 A在dev分支写了iii,提交 B在dev分支写了hhh,提交,冲突 怎么修改,B把云端的拉下来,随便改改就行...
Learn OpenGL 17 立方体贴图
立方体贴图 我们已经使用2D纹理很长时间了,但除此之外仍有更多的纹理类型等着我们探索。在本节中,我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型:立方体贴图(Cube Map)。 简单来说,立方体贴图就是一个包含了…...
【四 (6)数据可视化之 Grafana安装、页面介绍、图表配置】
目录 文章导航一、Grafana介绍[✨ 特性]二、安装和配置1、安装2、权限配置(账户/团队/用户)①用户管理②团队管理③账户管理④看板权限 3、首选项配置4、插件管理①数据源插件②图表插件③应用插件④插件安装方式一⑤安装方式二 三、数据源管理1、添加数…...
jvm 堆
Java虚拟机(JVM)中的堆是运行时数据区的一个主要部分,它用于存放对象实例和数组。它是所有Java线程共享的一块内存区域,是垃圾收集器管理的主要区域,因此也被称作垃圾收集堆(Garbage-Collected Heap&#x…...
Jenkins通知目标服务器拉取Harbor镜像部署
1.告诉目标服务器拉取哪个镜像 2.判断当前有没有正在运行此容器,有就删除 3.接着查看拉取的镜像目标服务器上是否已存在,有就删除 4.拉取Harbor镜像 5.运行容器 目标服务器编写脚本 创建个部署脚本 vim deploy.sh告诉目标服务器Harbor地址、仓库、镜像…...
Android 13.0 系统中framework中关于Activitity的生命周期的源码讲解
1.前言 在13.0的系统rom定制化开发中,在framework中对activitity的生命周期的掌握和了解也是非常重要的,这样有利于在启动某个app的activity的页面的时候,可以 监听到是在启动 resume stop的过程,也好进行相关的功能开发,接下来就分析下Activity的相关生命周期的代码 2.…...
常见的几个Python技术难题
大家在日常开发中有没有遇到一些难题呢?计划后面出几期专题针对性的解决。大家如果有其它问题可以在评论区给出哈。 以下是几个Python技术难题的例子: 并发和多线程编程:Python的全局解释器锁(GIL)限制了多线程的并行…...
【探索Linux】—— 强大的命令行工具 P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
阅读导航 引言一、UDP协议二、UDP网络程序模拟实现1. 预备代码⭕makefile文件⭕打印日志文件⭕打开指定的终端设备文件,并将其作为标准错误输出的目标文件描述符 2. UDP 服务器端实现(UdpServer.hpp)3. UDP 客户端实现(main函数&a…...
【MATLAB源码-第165期】基于matlab的科莫多巨蜥算法(KMA)机器人栅格路径规划,输出做短路径图和适应度曲线。
操作环境: MATLAB 2022a 1、算法描述 科莫多巨蜥算法(Komodo Mlipir Algorithm,简称KMA)是一种受到印尼科莫多岛上独特生物——科莫多巨蜥启发的创新算法。尽管这个算法的名称听起来很有趣,但实际上它并不是一个公认…...
【Linux】项目部署CPU彪高如何定位
1.查看所有CPU占比 使用top指令获取彪高进程的PID 2.输出进程的信息 ps H -eo pid,tid,%cpu | grep 1313 3.查看线程的信息 jstack tid nid都是十六进制的 4.进制转换 将 tid的十进制转为十六进制 找到nid 可以定位到具体位置 5.关闭程序 ps -ef | grep java kill -9 jav…...
第十二届蓝桥杯大赛软件赛决赛C/C++ 研究生组-纯质数
直接判断数据过大 相对而言,由2,3,5,7组成的数更少,则先筛选出由2,3,5,7组成的数,再判断这些数中的质数个数即可 #include <iostream> using namespace std; int main() {printf("1903");…...
MyBatis面试简答题
以下是一份MyBatis的高难度简答题,共20题: 请解释MyBatis中#{}和${}的区别,并举例说明它们在实际应用中的使用场景。 MyBatis的Mapper接口是如何与XML映射文件关联的? 如何在MyBatis中实现动态SQL?请列举几种常见的动态SQL元素并解释其作用。 描述MyBatis中的ResultMap的作…...
lua 中的元表
a{ age0, __tostringfunction() { }, __callfunction() { }, } b{} a.__indexa{}//将a表中的__index指向自己 setmetatable(a,b)//将b设置为a的元表; __tostring 当子表a被当做字符串使用时会调用原表b中的__tostring方法, __call 当子表a被当做字符串使用时…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
