文章目录

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

前言

作为当前先进的深度学习目标检测算法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系列算法改进方法 | 目录一览表

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

  1. 【YOLOv7/YOLOv5系列改进NO.51】融入多分支空洞卷积结构RFB-Bottleneck改进PANet构成新特征融合网络

    文章目录 前言 一.解决问题 二.基本原理 三.​添加方法 四.总结 前言 作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的 ...

  2. 【YOLOv7/YOLOv5系列改进NO.50】超越ConvNeXt!Conv2Former:用于视觉识别的Transformer风格的ConvNet

    文章目录 前言 一.解决问题 二.基本原理 三.​添加方法 四.总结 前言 作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的 ...

  3. [YOLOv7/YOLOv5系列算法改进NO.33]引入GAMAttention注意力机制

     前 言:作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法.此后的系列文章,将重点对YOLOv7 ...

  4. [YOLOv7/YOLOv5系列算法改进NO.5]改进特征融合网络PANET为BIFPN(更新添加小目标检测层yaml)

     前      言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是在处理一些复杂背景问题的时候,还是容易出现错漏检的问题.此后的系列文章,将重点对YOLOv5的如何改 ...

  5. YOLOv8/YOLOv7/YOLOv5系列算法改进【NO.6】增加小目标检测层,提高对小目标的检测效果

    前 言:作为当前先进的深度学习目标检测算法YOLO,已经集合了大量的trick,但是在处理一些复杂检测问题的时候,还是容易出现错漏检的问题.此后的系列文章,将重点对YOLOv8.YOLOv7以及YOL ...

  6. [YOLOv7/YOLOv5系列算法改进NO.21]CNN+Transformer——主干网络替换为又快又强的轻量化主干EfficientFormer

     ​前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法.此后的系列文章,将重点对YOLOv ...

  7. [YOLOv7/YOLOv5系列算法改进NO.20]Involution新神经网络算子引入网络

    ​前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法.此后的系列文章,将重点对YOLOv5 ...

  8. [YOLOv7/YOLOv5系列算法改进NO.17]CNN+Transformer——融合Bottleneck Transformers(更新,代码已开放分享)

     ​前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法.此后的系列文章,将重点对YOLOv ...

  9. [YOLOv7/YOLOv5系列算法改进NO.7]损失函数改进

    ​前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法.此后的系列文章,将重点对YOLOv5 ...

最新文章

  1. python爬虫赚钱的经历-聊一聊,这些年我用Python爬虫挣钱的那些事
  2. VC++读写INI文件示例
  3. js打印到控制台_8个问题看你是否真的懂 JS
  4. 前端常见知识点一之HTTP
  5. 这可能是人工智能、机器学习和大数据领域覆盖最全的一份速查表
  6. 全国计算机等级考试题库二级C操作题100套(第80套)
  7. static方法不能直接访问类内的非static变量和不能调用this,super语句分析
  8. 安卓打开第二个activity就崩溃_零基础安卓开发起步(三)
  9. SharePoint 2013版本功能对比介绍
  10. [bzoj4945][Noi2017]游戏
  11. GB/T 36964-2018《软件工程 软件开发成本度量规范》国家标准正式发布...
  12. html问卷调查实验报告,网上问卷调查实验报告..doc
  13. 量子计算机怎样输入数据,量子计算入门
  14. 计算机专业网页设计周志,毕业论文(设计)周志范文.doc
  15. 续费Namecheap域名教程附如何便宜续费域名方法
  16. 深入Tensorflow Embedding,解决Tensorboard无法显示PROJECTOR问题
  17. 令人心动的HTTP知识点大全
  18. 10和100Mbps以太网
  19. 剑灵在该服务器上未获取到角色信息,白青FAQ!常见问题一网打尽
  20. What?Tomcat-竟然也算中间件?

热门文章

  1. 未能加载文件或程序集“microsoft.office.interop.excel.version=15.0.0,culture=neutral
  2. WGS84转换为三大图商(百度、高德、腾讯)坐标,Gcj02转换为WGS84
  3. Android中动态改变布局中控件的位置
  4. FlexRay™ 协议控制器 (E-Ray)-06
  5. 罗技无法使用计算机上的配置文件,如何解决Logitech键盘多媒体键无法使用的问题?...
  6. Linux hdparm命令使用方法
  7. 蓝桥杯大赛 青少年创意编程 第十三届 C++组
  8. JavaScript 惰性函数
  9. 一行Python代码,畅玩童年经典游戏~
  10. extjs4.0 支持ie8_新的ExtJS发布4.02版和3.4版,提高性能并支持IE9