眉山网站设计友情链接是什么

当前位置: 首页 > news >正文

眉山网站设计,友情链接是什么,高性能网站建设进阶…,我国的课程一般通过一、本文介绍 本文记录的是利用GsConv优化YOLOv9的颈部网络。深度可分离卷积#xff08;DSC#xff09;在轻量级模型中被广泛使用#xff0c;但其在计算过程中会分离输入图像的通道信息#xff0c;导致特征表示能力明显低于标准卷积#xff08;SC#xff09;#xff0c…一、本文介绍 本文记录的是利用GsConv优化YOLOv9的颈部网络。深度可分离卷积DSC在轻量级模型中被广泛使用但其在计算过程中会分离输入图像的通道信息导致特征表示能力明显低于标准卷积SC而GsConv采用混合策略使DSC的输出通过打乱特征更接近SC从而优化模型的性能。本文利用GsConvSlim Neck改进YOLOv9的颈部网络使其在提升特征表示能力的同时降低计算成本和内存占用。 专栏目录YOLOv9改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进方向 专栏地址YOLOv9改进专栏——以发表论文的角度快速准确的找到有效涨点的创新点 文章目录 一、本文介绍二、GsConv介绍2.1、设计原理2.2、优势 三、GSConv的实现代码四、添加步骤4.1 修改common.py4.1.1 基础模块 4.2 修改yolo.py 五、yaml模型文件5.1 模型改进⭐ 六、成功运行结果 二、GsConv介绍 Slim-neck by GSConv 实时检测器架构的轻量级设计 GsConv是一种新的轻量级卷积技术其设计原理、优势如下 2.1、设计原理 为了减轻深度神经网络的高计算成本许多轻量级模型使用深度可分离卷积(DSC)来减少参数和浮点运算FLOPs但深度可分离卷积的缺点是在计算过程中分离了输入图像的通道信息导致特征表示能力低于标准卷积(SC)。为了缓解DSC的固有缺陷GsConv采用了一种混合策略通过对SC和DSC生成的特征进行打乱shuffle使DSC的输出尽可能接近SC。具体来说GsConv使用SC通道密集卷积生成的特征渗透到DSC生成的特征的每一部分通过均匀混合来允许SC的信息充分混合到深度可分离卷积的输出中从而尽可能地保留特征之间的隐藏连接。 Slim-neck结构 2.2、优势 精度提升通过添加DSC层和打乱操作增强了非线性表达能力从而使轻量级卷积的表示能力尽可能接近SC在精度上有显著提升。计算成本降低GSConv在保持较低时间复杂度的情况下能以更少的计算成本捕获更多的空间和通道特征。适应性强GSConv灵活且易于适应可根据需要添加简单的辅助分支来完成特定设计进一步扩展其应用范围。例如可以添加坐标编码辅助分支来优化检测精度或者在辅助分支上使用大核大小的DSC来解决浅网络难以捕获足够感受野的问题。 论文https://arxiv.org/pdf/2206.02424 源码https://github.com/AlanLi1997/Slim-neck-by-GSConv 三、GSConv的实现代码 GSConv模块的实现代码如下 def autopad(k, pNone, d1):Pads kernel to same output shape, adjusting for optional dilation; returns padding size.k: kernel, p: padding, d: dilation.if d 1:k d * (k - 1) 1 if isinstance(k, int) else [d * (x - 1) 1 for x in k] # actual kernel-sizeif p is None:p k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-padreturn pclass Conv(nn.Module):# Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)default_act nn.SiLU() # default activationdef init(self, c1, c2, k1, s1, pNone, g1, d1, actTrue):Initializes a standard convolution layer with optional batch normalization and activation.super().init()self.conv nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groupsg, dilationd, biasFalse)self.bn nn.BatchNorm2d(c2)self.act self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()def forward(self, x):Applies a convolution followed by batch normalization and an activation function to the input tensor x.return self.act(self.bn(self.conv(x)))def forward_fuse(self, x):Applies a fused convolution and activation function to the input tensor x.return self.act(self.conv(x))class DWConv(Conv):Depth-wise convolution.def init(self, c1, c2, k1, s1, d1, actTrue): # ch_in, chout, kernel, stride, dilation, activationInitialize Depth-wise convolution with given parameters.super().init(c1, c2, k, s, gmath.gcd(c1, c2), dd, actact)class GSConv(nn.Module):# GSConv https://github.com/AlanLi1997/slim-neck-by-gsconvdef init(self, c1, c2, k1, s1, pNone, g1, d1, actTrue):super().init()c c2 // 2self.cv1 Conv(c1, c_, k, s, p, g, d, Conv.defaultact)self.cv2 Conv(c, c, 5, 1, p, c, d, Conv.default_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.size()b_n b * n // 2y x2.reshape(bn, 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)class GSConvns(GSConv):# GSConv with a normative-shuffle https://github.com/AlanLi1997/slim-neck-by-gsconvdef init(self, c1, c2, k1, s1, pNone, g1, actTrue):super().init(c1, c2, k, s, p, g, actTrue)c c2 // 2self.shuf nn.Conv2d(c_ * 2, c2, 1, 1, 0, biasFalse)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, k3, s1, e0.5):super().init()c_ int(c2*e)# for lightingself.convlighting nn.Sequential(GSConv(c1, c, 1, 1),GSConv(c_, c2, 3, 1, actFalse))self.shortcut Conv(c1, c2, 1, 1, actFalse)def forward(self, x):return self.convlighting(x) self.shortcut(x)class GSBottleneckns(GSBottleneck):# GS Bottleneck https://github.com/AlanLi1997/slim-neck-by-gsconvdef init(self, c1, c2, k3, s1, e0.5):super().init(c1, c2, k, s, e)c int(c2*e)# for lightingself.convlighting nn.Sequential(GSConvns(c1, c, 1, 1),GSConvns(c, c2, 3, 1, actFalse))class GSBottleneckC(GSBottleneck):# cheap GS Bottleneck https://github.com/AlanLi1997/slim-neck-by-gsconvdef init(self, c1, c2, k3, s1):super().init(c1, c2, k, s)self.shortcut DWConv(c1, c2, k, s, actFalse)class VoVGSCSP(nn.Module):# VoVGSCSP module with GSBottleneckdef init(self, c1, c2, n1, shortcutTrue, g1, e0.5):super().init()c int(c2 * e) # hidden channelsself.cv1 Conv(c1, c, 1, 1)self.cv2 Conv(c1, c, 1, 1)self.gsb nn.Sequential(*(GSBottleneck(c, c, e1.0) for _ in range(n)))self.res Conv(c, c, 3, 1, actFalse)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), dim1))class VoVGSCSPns(VoVGSCSP):def init(self, c1, c2, n1, shortcutTrue, g1, e0.5):super().init(c1, c2, n, shortcut, g, e)c int(c2 * e) # hidden channelsself.gsb nn.Sequential(*(GSBottleneckns(c, c, e1.0) for _ in range(n)))class VoVGSCSPC(VoVGSCSP):# cheap VoVGSCSP module with GSBottleneckdef init(self, c1, c2, n1, shortcutTrue, g1, e0.5):super().init(c1, c2)c_ int(c2 * 0.5) # hidden channelsself.gsb GSBottleneckC(c, c, 1, 1) 四、添加步骤 4.1 修改common.py 此处需要修改的文件是models/common.py common.py中定义了网络结构的通用模块我们想要加入新的模块就只需要将模块代码放到这个文件内即可。 4.1.1 基础模块 模块改进方法直接加入GSConv模块。 将上方的实现代码粘贴到common.py文件夹下GSConv模块添加后如下 注意❗在4.2小节中的yolo.py文件中需要声明的模块名称为GSConv和VoVGSCSP。 4.2 修改yolo.py 此处需要修改的文件是models/yolo.py yolo.py用于函数调用我们只需要将common.py中定义的新的模块名添加到parse_model函数下即可。 GSConv模块以及VoVGSCSP模块添加后如下 五、yaml模型文件 5.1 模型改进⭐ 在代码配置完成后配置模型的YAML文件。 此处以models/detect/yolov9-c.yaml为例在同目录下创建一个用于自己数据集训练的模型文件yolov9-c-gsconv.yaml。 将yolov9-c.yaml中的内容复制到yolov9-c-gsconv.yaml文件下修改nc数量等于自己数据中目标的数量。 此处是将YOLOv9的颈部网络修改成GSConvSlim Neck原因是 为了加速预测的计算CNN中的馈送图像几乎必须在Backbone中经历类似的转换过程空间信息逐步向通道传输。并且每次特征图的空间宽度和高度压缩和通道扩展都会导致语义信息的部分丢失。密集卷积计算最大限度地保留了每个通道之间的隐藏连接而稀疏卷积则完全切断了这些连接。 GSConv尽可能地保留这些连接。但是如果在模型的所有阶段都使用它模型的网络层会更深深层会加剧对数据流的阻力显著增加推理时间。当这些特征图走到Neck时它们已经变得细长通道维度达到最大宽高维度达到最小不再需要进行变换。因此更好的选择是仅在Neck使用GSConv。在这个阶段使用GSConv处理concatenated feature maps刚刚好冗余重复信息少不需要压缩注意力模块效果更好。 使用VoV-GSCSP模块则降低了计算和网络结构的复杂性但保持了足够的精度。

YOLOv9# parameters

nc: 1 # number of classes depth_multiple: 1.0 # model depth multiple width_multiple: 1.0 # layer channel multiple #activation: nn.LeakyReLU(0.1) #activation: nn.ReLU()# anchors anchors: 3# YOLOv9 backbone backbone:[[-1, 1, Silence, []], # conv down[-1, 1, Conv, [64, 3, 2]], # 1-P1/2# conv down[-1, 1, Conv, [128, 3, 2]], # 2-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 3# avg-conv down[-1, 1, ADown, [256]], # 4-P3/8# elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 5# avg-conv down[-1, 1, ADown, [512]], # 6-P4/16# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 7可替换# avg-conv down[-1, 1, ADown, [512]], # 8-P5/32# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 9可替换]# YOLOv9 head head:[# elan-spp block[-1, 1, SPPELAN, [512, 256]], # 10# up-concat merge[-1, 1, nn.Upsample, [None, 2, nearest]],[[-1, 7], 1, Concat, [1]], # cat backbone P4# elan-2 block[-1, 1, VoVGSCSP, [512]], # 13# up-concat merge[-1, 1, nn.Upsample, [None, 2, nearest]],[[-1, 5], 1, Concat, [1]], # cat backbone P3# elan-2 block[-1, 1, VoVGSCSP, [256]], # 16 (P3/8-small)# avg-conv-down merge[-1, 1, GSConv, [256, 3, 2]],[[-1, 13], 1, Concat, [1]], # cat head P4# elan-2 block[-1, 1, VoVGSCSP, [512]], # 19 (P4/16-medium)# avg-conv-down merge[-1, 1, GSConv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5# elan-2 block[-1, 1, VoVGSCSP, [512]], # 22 (P5/32-large)# multi-level reversible auxiliary branch# routing[5, 1, CBLinear, [[256]]], # 23[7, 1, CBLinear, [[256, 512]]], # 24[9, 1, CBLinear, [[256, 512, 512]]], # 25# conv down[0, 1, Conv, [64, 3, 2]], # 26-P1/2# conv down[-1, 1, Conv, [128, 3, 2]], # 27-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 28# avg-conv down fuse[-1, 1, ADown, [256]], # 29-P3/8[[23, 24, 25, -1], 1, CBFuse, [[0, 0, 0]]], # 30 # elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 31# avg-conv down fuse[-1, 1, ADown, [512]], # 32-P4/16[[24, 25, -1], 1, CBFuse, [[1, 1]]], # 33 # elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 34# avg-conv down fuse[-1, 1, ADown, [512]], # 35-P5/32[[25, -1], 1, CBFuse, [[2]]], # 36# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 37# detection head# detect[[31, 34, 37, 16, 19, 22], 1, DualDDetect, [nc]], # DualDDetect(A3, A4, A5, P3, P4, P5)] 六、成功运行结果 分别打印网络模型可以看到GSConv模块和VoVGSCSP已经加入到模型中并可以进行训练了。 yolov9-c-gsconv from n params module arguments 0 -1 1 0 models.common.Silence [] 1 -1 1 1856 models.common.Conv [3, 64, 3, 2] 2 -1 1 73984 models.common.Conv [64, 128, 3, 2] 3 -1 1 212864 models.common.RepNCSPELAN4 [128, 256, 128, 64, 1] 4 -1 1 164352 models.common.ADown [256, 256] 5 -1 1 847616 models.common.RepNCSPELAN4 [256, 512, 256, 128, 1] 6 -1 1 656384 models.common.ADown [512, 512] 7 -1 1 2857472 models.common.RepNCSPELAN4 [512, 512, 512, 256, 1] 8 -1 1 656384 models.common.ADown [512, 512] 9 -1 1 2857472 models.common.RepNCSPELAN4 [512, 512, 512, 256, 1] 10 -1 1 656896 models.common.SPPELAN [512, 512, 256] 11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, nearest] 12 [-1, 7] 1 0 models.common.Concat [1] 13 -1 1 1779968 models.common.VoVGSCSP [1024, 512] 14 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, nearest] 15 [-1, 5] 1 0 models.common.Concat [1] 16 -1 1 578688 models.common.VoVGSCSP [1024, 256] 17 -1 1 298624 models.common.GSConv [256, 256, 3, 2] 18 [-1, 13] 1 0 models.common.Concat [1] 19 -1 1 1648896 models.common.VoVGSCSP [768, 512] 20 -1 1 1187072 models.common.GSConv [512, 512, 3, 2] 21 [-1, 10] 1 0 models.common.Concat [1] 22 -1 1 1779968 models.common.VoVGSCSP [1024, 512] 23 5 1 131328 models.common.CBLinear [512, [256]] 24 7 1 393984 models.common.CBLinear [512, [256, 512]] 25 9 1 656640 models.common.CBLinear [512, [256, 512, 512]] 26 0 1 1856 models.common.Conv [3, 64, 3, 2] 27 -1 1 73984 models.common.Conv [64, 128, 3, 2] 28 -1 1 212864 models.common.RepNCSPELAN4 [128, 256, 128, 64, 1] 29 -1 1 164352 models.common.ADown [256, 256] 30 [23, 24, 25, -1] 1 0 models.common.CBFuse [[0, 0, 0]] 31 -1 1 847616 models.common.RepNCSPELAN4 [256, 512, 256, 128, 1] 32 -1 1 656384 models.common.ADown [512, 512] 33 [24, 25, -1] 1 0 models.common.CBFuse [[1, 1]] 34 -1 1 2857472 models.common.RepNCSPELAN4 [512, 512, 512, 256, 1] 35 -1 1 656384 models.common.ADown [512, 512] 36 [25, -1] 1 0 models.common.CBFuse [[2]] 37 -1 1 2857472 models.common.RepNCSPELAN4 [512, 512, 512, 256, 1] 38[31, 34, 37, 16, 19, 22] 1 21542822 DualDDetect [1, [512, 512, 512, 256, 512, 512]] yolov9-c-gsconv summary: 850 layers, 47311654 parameters, 47311622 gradients, 219.6 GFLOPs