[YOLOv7/YOLOv5系列改进NO.44]融入适配GPU的轻量级 G-GhostNet

文章目录

  • 前言
  • 一、解决问题
  • 二、基本原理
  • 三、​添加方法
  • 四、总结


前言

作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv7的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。由于出到YOLOv7,YOLOv5算法2020年至今已经涌现出大量改进论文,这个不论对于搞科研的同学或者已经工作的朋友来说,研究的价值和新颖度都不太够了,为与时俱进,以后改进算法以YOLOv7为基础,此前YOLOv5改进方法在YOLOv7同样适用,所以继续YOLOv5系列改进的序号。另外改进方法在YOLOv5等其他算法同样可以适用进行改进。希望能够对大家有帮助。
具体改进办法请关注后私信留言!关注免费领取深度学习算法学习资料!


一、解决问题

之前出了很多轻量化网络的方法,包括C-GhostNet网络融入,替换原yolo算法中的主干特征提取网络,都或多或少取得一定效果,本次博客分享将G-GhostNet网络融入,GhostNet 可以在准确性和 GPU 延迟之间获得更好的权衡,实现轻量化实时快速检测的目的。

二、基本原理

由于内存和计算资源有限,在移动设备上部署卷积神经网络(CNN)很困难。我们的目标是通过利用特征图中的冗余,为包括CPU和GPU在内的异构设备设计高效的神经网络,这在神经架构设计中很少被研究。对于类似CPU的设备,我们提出了一种新的CPU高效Ghost(C-Ghost)模块,以从廉价操作中生成更多的特征图。基于一组内在特征图,我们以低廉的成本应用一系列线性变换来生成许多重影特征图,这些重影特征可以充分反映内在特征的信息。提出的C-Ghost模块可以作为即插即用组件来升级现有的卷积神经网络。C-Ghost瓶颈被设计为堆叠C-Ghost模块,然后可以轻松地构建轻量级C-GhostNet。我们进一步考虑GPU设备的高效网络。在构建阶段不涉及太多GPU低效操作(例如,深度卷积)的情况下,我们建议利用阶段特征冗余来模拟GPU高效Ghost(g-Ghost)阶段结构。一个阶段中的特征分为两部分,其中第一部分使用原始块进行处理,其中用于生成固有特征的输出通道较少,另一部分通过利用阶段冗余使用廉价操作生成。在基准测试上进行的实验证明了所提出的C-Ghost模型和G-Ghost阶段的有效性。
在这里插入图片描述在这里插入图片描述

三、​添加方法

第一步:确定添加的位置,作为即插即用的注意力模块,可以添加到YOLOv7网络中的任何地方。

第二步:common.py构建模块。部分代码如下,关注文章末尾,私信后领取。

class GGhostRegNet(nn.Module):def __init__(self, block, layers, widths, num_classes=1000, zero_init_residual=True,group_width=1, replace_stride_with_dilation=None,norm_layer=None):super(GGhostRegNet, self).__init__()if norm_layer is None:norm_layer = nn.BatchNorm2dself._norm_layer = norm_layerself.inplanes = 32self.dilation = 1if replace_stride_with_dilation is None:# each element in the tuple indicates if we should replace# the 2x2 stride with a dilated convolution insteadreplace_stride_with_dilation = [False, False, False, False]if len(replace_stride_with_dilation) != 4:raise ValueError("replace_stride_with_dilation should be None ""or a 4-element tuple, got {}".format(replace_stride_with_dilation))self.group_width = group_widthself.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=3, stride=2, padding=1,bias=False)self.bn1 = norm_layer(self.inplanes)self.relu = nn.ReLU(inplace=True)self.layer1 = self._make_layer(block, widths[0], layers[0], stride=2,dilate=replace_stride_with_dilation[0])self.inplanes = widths[0]if layers[1] > 2:self.layer2 = Stage(block, self.inplanes, widths[1], group_width, layers[1], stride=2,dilate=replace_stride_with_dilation[1], cheap_ratio=0.5) else:      self.layer2 = self._make_layer(block, widths[1], layers[1], stride=2,dilate=replace_stride_with_dilation[1])self.inplanes = widths[1]self.layer3 = Stage(block, self.inplanes, widths[2], group_width, layers[2], stride=2,dilate=replace_stride_with_dilation[2], cheap_ratio=0.5)self.inplanes = widths[2]if layers[3] > 2:self.layer4 = Stage(block, self.inplanes, widths[3], group_width, layers[3], stride=2,dilate=replace_stride_with_dilation[3], cheap_ratio=0.5) else:self.layer4 = self._make_layer(block, widths[3], layers[3], stride=2,dilate=replace_stride_with_dilation[3])self.avgpool = nn.AdaptiveAvgPool2d((1, 1))self.dropout = nn.Dropout(0.2)self.fc = nn.Linear(widths[-1] * block.expansion, num_classes)for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)):nn.init.constant_(m.weight, 1)nn.init.constant_(m.bias, 0)def _make_layer(self, block, planes, blocks, stride=1, dilate=False):norm_layer = self._norm_layerdownsample = Noneprevious_dilation = self.dilationif dilate:self.dilation *= stridestride = 1if stride != 1 or self.inplanes != planes:downsample = nn.Sequential(conv1x1(self.inplanes, planes, stride),norm_layer(planes),)layers = []layers.append(block(self.inplanes, planes, stride, downsample, self.group_width,previous_dilation, norm_layer))self.inplanes = planesfor _ in range(1, blocks):layers.append(block(self.inplanes, planes, group_width=self.group_width,dilation=self.dilation,norm_layer=norm_layer))return nn.Sequential(*layers)def _forward_impl(self, x):# See note [TorchScript super()]x = self.conv1(x)x = self.bn1(x)x = self.relu(x)x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.dropout(x)x = self.fc(x)return xdef forward(self, x):return self._forward_impl(x)

第三步:yolo.py中注册GGhost模块。
第四步:修改yaml文件,本文以修改backbone为例,将原C3模块后加入该模块。
第五步:将train.py中改为本文的yaml文件即可,开始训练。

四、总结

结 果:本人在遥感数据集上进行实验,有涨点效果。需要请关注留言。

预告一下:下一篇内容将继续分享深度学习算法相关改进方法。有兴趣的朋友可以关注一下我,有问题可以留言或者私聊我哦

PS:该方法不仅仅是适用改进YOLOv5,也可以改进其他的YOLO网络以及目标检测网络,比如YOLOv7、v6、v4、v3,Faster rcnn ,ssd等。


最后,有需要的请关注私信我吧。关注免费领取深度学习算法学习资料!

YOLO系列算法改进方法 | 目录一览表
💡🎈☁️1. 添加SE注意力机制
💡🎈☁️2.添加CBAM注意力机制
💡🎈☁️3. 添加CoordAtt注意力机制
💡🎈☁️4. 添加ECA通道注意力机制
💡🎈☁️5. 改进特征融合网络PANET为BIFPN
💡🎈☁️6. 增加小目标检测层
💡🎈☁️7. 损失函数改进
💡🎈☁️8. 非极大值抑制NMS算法改进Soft-nms
💡🎈☁️9. 锚框K-Means算法改进K-Means++
💡🎈☁️10. 损失函数改进为SIOU
💡🎈☁️11. 主干网络C3替换为轻量化网络MobileNetV3
💡🎈☁️12. 主干网络C3替换为轻量化网络ShuffleNetV2
💡🎈☁️13. 主干网络C3替换为轻量化网络EfficientNetv2
💡🎈☁️14. 主干网络C3替换为轻量化网络Ghostnet
💡🎈☁️15. 网络轻量化方法深度可分离卷积
💡🎈☁️16. 主干网络C3替换为轻量化网络PP-LCNet
💡🎈☁️17. CNN+Transformer——融合Bottleneck Transformers
💡🎈☁️18. 损失函数改进为Alpha-IoU损失函数
💡🎈☁️19. 非极大值抑制NMS算法改进DIoU NMS
💡🎈☁️20. Involution新神经网络算子引入网络
💡🎈☁️21. CNN+Transformer——主干网络替换为又快又强的轻量化主干EfficientFormer
💡🎈☁️22. 涨点神器——引入递归门控卷积(gnConv)
💡🎈☁️23. 引入SimAM无参数注意力
💡🎈☁️24. 引入量子启发的新型视觉主干模型WaveMLP(可尝试发SCI)
💡🎈☁️25. 引入Swin Transformer
💡🎈☁️26. 改进特征融合网络PANet为ASFF自适应特征融合网络
💡🎈☁️27. 解决小目标问题——校正卷积取代特征提取网络中的常规卷积
💡🎈☁️28. ICLR 2022涨点神器——即插即用的动态卷积ODConv
💡🎈☁️29. 引入Swin Transformer v2.0版本
💡🎈☁️30. 引入10月4号发表最新的Transformer视觉模型MOAT结构
💡🎈☁️31. CrissCrossAttention注意力机制
💡🎈☁️32. 引入SKAttention注意力机制
💡🎈☁️33. 引入GAMAttention注意力机制
💡🎈☁️34. 更换激活函数为FReLU
💡🎈☁️35. 引入S2-MLPv2注意力机制
💡🎈☁️36. 融入NAM注意力机制
💡🎈☁️37. 结合CVPR2022新作ConvNeXt网络
💡🎈☁️38. 引入RepVGG模型结构
💡🎈☁️39. 引入改进遮挡检测的Tri-Layer插件 | BMVC 2022
💡🎈☁️40. 轻量化mobileone主干网络引入
💡🎈☁️41. 引入SPD-Conv处理低分辨率图像和小对象问题
💡🎈☁️42. 引入V7中的ELAN网络
💡🎈☁️43. 结合最新Non-local Networks and Attention结构

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

CV顶刊!IJCV2022:G-GhostNet

GhostNet再升级,GPU上大显身手的G-GhostNet 作者设计出相比C-Ghost更适用于GPU等设备的G-Ghost,在实际延迟与性能之间取得了良好的权衡。Source Code 1、摘要 本文针对网络部署时面临的内存和资源有限的问题,提出两种不同的Ghost模块&#…

免费OCR图像识别文字识别API

免费OCR图像识别文字识别API 一、OCR图像识别文字识别二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、温馨提示 一、OCR图像识别文字识别 光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别…

nginx-获取客户端IP地址

上有服务器与客户端中间是有nginx代理服务器的,上游服务器如何获取客户端真实ip地址? nginx代理服务器设置X-Forwarded-For的header参数,代理服务器通过remote_addr获取客户端ip地址,将ip地址写入nginx代理服务器的X-Forwarded-Fo…

企业使用CRM如何统一销售流程管理?

销售流程我们可以理解为,销售人员从寻找潜在客户到最终达成交易的一系列步骤。很多企业通过CRM系统来进行销售流程管理,提高销售效率,实现销售目标。下面我们就来说说,CRM如何进行销售流程管理。 制定统一的销售流程:…

Git基本操作(Idea版)

第一次发布项目(本地->远程) 方式一 通过push的方式推送本地库到远程库(远程已创建好仓库) 这种方式需要提前创建好仓库。 右键点击项目,可以将当前分支的内容 push 到 GitHub 的远程仓库中。 注意&#xff1a…

推荐两个杀毒软件测试网站

VirScan - 多引擎文件在线检测平台 VirusTotal 软件发布前查一下毒还是很有必要的

vue拖拽div盒子实现上下拖动互换

vue拖拽div盒子实现上下拖动互换 <div v-for"(item, index) in formList" :key"index" draggable"true"dragstart"handleDragStart($event, item)"dragenter"handleDragEnter($event, item)"dragover.prevent"han…

深入理解Reactor模型的原理与应用

1、什么是Reactor模型 Reactor意思是“反应堆”&#xff0c;是一种事件驱动机制。 和普通函数调用的不同之处在于&#xff1a;应用程序不是主动的调用某个 API 完成处理&#xff0c;而是恰恰相反&#xff0c;Reactor逆置了事件处理流程&#xff0c;应用程序需要提供相应的接口并…

继域名解析后------------我的网页进不去了!!!(修复方法)

昨天域名解析之后&#xff0c;今天来公司上班发现公司网页进不去了&#xff0c;好在现在是平台升级维护期间&#xff0c;没什么业务。统计过后&#xff0c;发现有一半的公司员工登录不进去。这一半能登陆上的同事所使用的网络是500M电信宽带&#xff0c;而我们这边登录不上的都…

html打开d盘文件,为什么ie浏览器打不开c/d盘的html文件,直接跳出保存

满意答案 pvgpl 2014.02.05 采纳率&#xff1a;42% 等级&#xff1a;12 已帮助&#xff1a;12615人 清理一下磁盘碎片和系统垃圾。 不行就---------------- 请不要盗用我的答案!! 一号方案(新X) 注意(原创): 1.安全模式下&#xff0c;效果更好! 2. 以下所要使用的软件&#…

手把手教会你|Sockets多用户-服务器数据库编程

网络编程经常涉及数据库访问,电子商务更离不开数据库。例如用户请求股票报价、产品价格查询、网上交易等请求,服务器则需要连接对应的数据库,发送查询指令,得到数据库记录,经过处理后,发送给提出这个请求的用户。 在实际应用中,数据库经常由专门管理数据库的服务器运行。…

股票交易规则

交易时间 股票交易时要遵循 价格优先 时间优先&#xff0c;但如果同价又同时报价&#xff0c;那大单优先 具体交易时间规定&#xff1a; 每周一至周五&#xff0c;每天上午9:30至11:30&#xff0c;下午13:00至15:00&#xff0c;法定假期除外。 A股 上海交易所 集合竞价&#…

股票交易接口有没有提供试用的?

我们做量化交易&#xff0c;是需要使用工具的&#xff0c;因为量化交易交易频率很高&#xff0c;如果人工操作经历有限&#xff0c;一般是无法执行到位的&#xff0c;不过股票交易接口一般都需要收费&#xff0c;而且还不便宜&#xff0c;如果可以试用的话&#xff0c;那一定是…

股票自动委托下单html,股票怎么设置自动挂单?股票挂单的方式

股票怎么设置自动挂单?接下来小编为大家介绍。 股票挂单指在股票交易时把所要买进或卖出的股票的名称、数量、价格填写后提交给交易系统等待成交的过程。 传统网上交易下单&#xff0c;需要①从行情软件切换到委托软件&#xff0c;②输入需要买卖股票的代码&#xff0c;③输入…

基于SpringBoot实现MySQL与Redis的数据一致性

问题场景 在并发场景下&#xff0c;MySQL和Redis之间的数据不一致性可能成为一个突出问题。这种不一致性可能由网络延迟、并发写入冲突以及异常情况处理等因素引起&#xff0c;导致MySQL和Redis中的数据在某些时间点不同步或出现不一致的情况。数据一致性问题的级别可以分为三…

list(介绍与实现)

目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modififiers 1.2.6 list的迭代器失效 2. list的模拟实现 2.1 模拟实现list 2.2 list的反向迭代器 1.…

代码随想录第32天|122.买卖股票的最佳时机 II,55. 跳跃游戏 ,45. 跳跃游戏 II

122.买卖股票的最佳时机 II 122. 买卖股票的最佳时机 II 思路比较简单 class Solution {public int maxProfit(int[] prices) {int res0,sum0;for(int i0;i<prices.length-1;i){if(prices[i1]-prices[i]>0){sumprices[i1]-prices[i];}ressum>res?sum:res;}return …

笔记本重装win7旗舰版原版操作系统

正常开机的电脑&#xff1a;直接重装&#xff08;最简单&#xff0c;最快&#xff09;、Ghost重装、U盘重装、光盘重装、硬盘安装 不能正常开机的电脑&#xff1a;U盘重装、光盘重装、硬盘安装 注意&#xff1a; 1.windows7原版系统是不带任何驱动程序的&#xff0c;请事先准…

w ndows7旗舰版怎么重装系统,windows7旗舰版iso怎么安装

现在安装系统要求操作简单、方便。硬盘安装方式就是最简单、最方便的系统安装方法。保证电脑能进入系统的前提下&#xff0c;本地硬盘安装windows7旗舰版iso系统&#xff0c;能够让你快速体验新的windows7旗舰版iso系统。接下来详细讲解下安装windows7旗舰版iso系统的操作过程&…

w ndows7旗舰版网卡驱动,Ghost windows7 64位系统旗舰版网卡驱动工具推荐下载

雨林木风Ghost windows7 64位系统旗舰版网卡驱动工具可以使系统能够快速的链接网络&#xff0c;提供丰富的驱动文件&#xff0c;雨林木风Ghost windows7 64位系统旗舰版网卡驱动工具是很多的用户遇到问题都可以解决的一种工具&#xff0c;所以今天我们就来看看吧。 深度技术Gho…