• YOLOv9改进策略 | 添加注意力篇 | LSKAttention大核注意力机制助力极限涨点 (附多个位置添加教程)


     一、本文介绍 

    本文给大家带来的改进机制是LSKAttention大核注意力机制应用于YOLOv9。它的主要思想是将深度卷积层的2D卷积核分解为水平和垂直1D卷积核,减少了计算复杂性和内存占用。接着,我们介绍将这一机制整合到YOLOv9的方法,以及它如何帮助提高处理大型数据集和复杂视觉任务的效率和准确性。本文还将提供代码实现细节和使用方法展示这种改进对目标检测等方面的效果。通过实验YOLOv5在整合LSKAttention机制后,亲测mAP有显著提高(下面会附上改进LSKAttention机制和基础版本的结果对比图)。

    专栏地址:YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

    目录

     一、本文介绍 

    二、LSKAttention的机制原理 

    三、LSKAttention的核心代码

    四、手把手教你将LSKAttention添加到你的网络结构中

    4.1 LSKAttention添加步骤

    4.1.1 修改一

    4.1.2 修改二

    4.1.3 修改三 

    4.1.4 修改四

    4.2 LSKAttention的yaml文件和训练截图

    4.2.1 LSKAttention的yaml版本一(推荐)

    4.2.2 LSKAttention的yaml版本二

    4.2.3 LSKAttention的yaml版本三

    4.3 LSKAttention的训练过程截图 

    五、本文总结


    二、LSKAttention的机制原理 

    论文地址:官方论文地址

    代码地址:官方代码地址

    《Large Separable Kernel Attention》这篇论文提出的LSKAttention的机制原理是针对传统大核注意力(Large Kernel Attention,LKA)模块在视觉注意网络(Visual Attention Networks,VAN)中的应用问题进行的改进。LKA模块在处理大尺寸卷积核时面临着高计算和内存需求的挑战。LSKAttention通过以下几个关键步骤和原理来解决这些问题:

    1. 核分解:LSKAttention的核心创新是将传统的2D卷积核分解为两个1D卷积核。首先,它将一个大的2D核分解成水平(横向)和垂直(纵向)的两个1D核。这样的分解大幅降低了参数数量和计算复杂度。

    2. 串联卷积操作:在进行卷积操作时,LSKAttention首先使用一个1D核对输入进行水平方向上的卷积,然后使用另一个1D核进行垂直方向上的卷积。这两步卷积操作串联执行,从而实现了与原始大尺寸2D核相似的效果。

    3. 计算效率提升:由于分解后的1D卷积核大大减少了参数的数量,LSKAttention在执行时的计算效率得到显著提升。这种方法特别适用于处理大尺寸的卷积核,能够有效降低内存占用和计算成本。

    4. 保持效果:虽然采用了分解和串联的策略,LSKAttention仍然能够保持类似于原始LKA的性能。这意味着在处理图像的关键特征(如边缘、纹理和形状)时,LSKAttention能够有效地捕捉到重要信息。

    5. 适用于多种任务:LSKAttention不仅在图像分类任务中表现出色,还能够在目标检测、语义分割等多种计算机视觉任务中有效应用,显示出其广泛的适用性。

    总结:LSKAttention通过创新的核分解和串联卷积策略,在降低计算和内存成本的同时,保持了高效的图像处理能力,这在处理大尺寸核和复杂图像数据时特别有价值。

    上图展示了在不同大核分解方法和核大小下的速度-精度权衡。在这个比较中,使用了不同的标记来代表不同的核大小,并且以VAN-Tiny作为对比的模型。从图中可以看出,LKA的朴素设计(LKA-trivial)以及在VAN中的实际设计,在核大小增加时会导致更高的GFLOPs(十亿浮点运算次数)。相比之下,论文提出的LSKA(Large Separable Kernel Attention)-trivial和VAN中的LSKA在核大小增加时显著降低了GFLOPs,同时没有降低性能 

    上图展示了大核注意力模块不同设计的比较,具体包括:

    1. LKA-trivial:朴素的2D大核深度卷积(DW-Conv)与1×1卷积结合(图a)。
    2. LSKA-trivial:串联的水平和垂直1D大核深度卷积与1×1卷积结合(图b)。
    3. 原始LKA设计:在VAN中包括标准深度卷积(DW-Conv)、扩张深度卷积(DW-D-Conv)和1×1卷积(图c)。
    4. 提出的LSKA设计:将LKA的前两层分解为四层,每层由两个1D卷积层组成(图d)。其中,N代表Hadamard乘积,k代表最大感受野,d代表扩张率​​。

    个人总结:提出了一种创新的大型可分离核注意力(LSKA)模块,用于改进卷积神经网络(CNN)。这种模块通过将2D卷积核分解为串联的1D核,有效降低了计算复杂度和内存需求。LSKA模块在保持与标准大核注意力(LKA)模块相当的性能的同时,显示出更高的计算效率和更小的内存占用。


    三、LSKAttention的核心代码

    使用方式看章节四

    1. import torch
    2. import torch.nn as nn
    3. def autopad(k, p=None, d=1): # kernel, padding, dilation
    4. # Pad to 'same' shape outputs
    5. if d > 1:
    6. k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] # actual kernel-size
    7. if p is None:
    8. p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad
    9. return p
    10. class Conv(nn.Module):
    11. # Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)
    12. default_act = nn.SiLU() # default activation
    13. def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):
    14. super().__init__()
    15. self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)
    16. self.bn = nn.BatchNorm2d(c2)
    17. self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()
    18. def forward(self, x):
    19. return self.act(self.bn(self.conv(x)))
    20. def forward_fuse(self, x):
    21. return self.act(self.conv(x))
    22. class LSKA(nn.Module):
    23. def __init__(self, dim, k_size):
    24. super().__init__()
    25. self.k_size = k_size
    26. if k_size == 7:
    27. self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 3), stride=(1,1), padding=(0,(3-1)//2), groups=dim)
    28. self.conv0v = nn.Conv2d(dim, dim, kernel_size=(3, 1), stride=(1,1), padding=((3-1)//2,0), groups=dim)
    29. self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 3), stride=(1,1), padding=(0,2), groups=dim, dilation=2)
    30. self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(3, 1), stride=(1,1), padding=(2,0), groups=dim, dilation=2)
    31. elif k_size == 11:
    32. self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 3), stride=(1,1), padding=(0,(3-1)//2), groups=dim)
    33. self.conv0v = nn.Conv2d(dim, dim, kernel_size=(3, 1), stride=(1,1), padding=((3-1)//2,0), groups=dim)
    34. self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 5), stride=(1,1), padding=(0,4), groups=dim, dilation=2)
    35. self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(5, 1), stride=(1,1), padding=(4,0), groups=dim, dilation=2)
    36. elif k_size == 23:
    37. self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 5), stride=(1,1), padding=(0,(5-1)//2), groups=dim)
    38. self.conv0v = nn.Conv2d(dim, dim, kernel_size=(5, 1), stride=(1,1), padding=((5-1)//2,0), groups=dim)
    39. self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 7), stride=(1,1), padding=(0,9), groups=dim, dilation=3)
    40. self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(7, 1), stride=(1,1), padding=(9,0), groups=dim, dilation=3)
    41. elif k_size == 35:
    42. self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 5), stride=(1,1), padding=(0,(5-1)//2), groups=dim)
    43. self.conv0v = nn.Conv2d(dim, dim, kernel_size=(5, 1), stride=(1,1), padding=((5-1)//2,0), groups=dim)
    44. self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 11), stride=(1,1), padding=(0,15), groups=dim, dilation=3)
    45. self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(11, 1), stride=(1,1), padding=(15,0), groups=dim, dilation=3)
    46. elif k_size == 41:
    47. self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 5), stride=(1,1), padding=(0,(5-1)//2), groups=dim)
    48. self.conv0v = nn.Conv2d(dim, dim, kernel_size=(5, 1), stride=(1,1), padding=((5-1)//2,0), groups=dim)
    49. self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 13), stride=(1,1), padding=(0,18), groups=dim, dilation=3)
    50. self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(13, 1), stride=(1,1), padding=(18,0), groups=dim, dilation=3)
    51. elif k_size == 53:
    52. self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 5), stride=(1,1), padding=(0,(5-1)//2), groups=dim)
    53. self.conv0v = nn.Conv2d(dim, dim, kernel_size=(5, 1), stride=(1,1), padding=((5-1)//2,0), groups=dim)
    54. self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 17), stride=(1,1), padding=(0,24), groups=dim, dilation=3)
    55. self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(17, 1), stride=(1,1), padding=(24,0), groups=dim, dilation=3)
    56. self.conv1 = nn.Conv2d(dim, dim, 1)
    57. def forward(self, x):
    58. u = x.clone()
    59. attn = self.conv0h(x)
    60. attn = self.conv0v(attn)
    61. attn = self.conv_spatial_h(attn)
    62. attn = self.conv_spatial_v(attn)
    63. attn = self.conv1(attn)
    64. return u * attn
    65. class Bottleneck(nn.Module):
    66. # Standard bottleneck
    67. def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): # ch_in, ch_out, shortcut, groups, expansion
    68. super().__init__()
    69. c_ = int(c2 * e) # hidden channels
    70. self.cv1 = Conv(c1, c_, 1, 1)
    71. self.cv2 = Conv(c_, c2, 3, 1, g=g)
    72. self.Attention = LSKA(c2, 11)
    73. self.add = shortcut and c1 == c2
    74. def forward(self, x):
    75. return x + self.Attention(self.cv2(self.cv1(x))) if self.add else self.Attention(self.cv2(self.cv1(x)))
    76. class C3_LSKA(nn.Module):
    77. # CSP Bottleneck with 3 convolutions
    78. def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansion
    79. super().__init__()
    80. c_ = int(c2 * e) # hidden channels
    81. self.cv1 = Conv(c1, c_, 1, 1)
    82. self.cv2 = Conv(c1, c_, 1, 1)
    83. self.cv3 = Conv(2 * c_, c2, 1) # optional act=FReLU(c2)
    84. self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))
    85. def forward(self, x):
    86. return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))


    四、手把手教你将LSKAttention添加到你的网络结构中

    4.1 LSKAttention添加步骤

    4.1.1 修改一

    首先我们找到如下的目录'yolov9-main/models',然后在这个目录下在创建一个新的目录然后这个就是存储改进的仓库,大家可以在这里新建所有的改进的py文件,对应改进的文件名字可以根据你自己的习惯起(不影响任何但是下面导入的时候记住改成你对应的即可),然后将LSKAttention的核心代码复制进去。

     


    4.1.2 修改二

    然后在新建的目录里面我们在新建一个__init__.py文件(此文件大家只需要建立一个即可),然后我们在里面添加导入我们模块的代码。注意标记一个'.'其作用是标记当前目录。

    ​​


    4.1.3 修改三 

    然后我们找到如下文件''models/yolo.py''在开头的地方导入我们的模块按照如下修改->

    (如果你看了我多个改进机制此处只需要添加一个即可,无需重复添加)

    注意的添加位置要放在common的导入上面!!!!!

    ​​​​​


    4.1.4 修改四

    然后我们找到''models/yolo.py''文件中的parse_model方法,按照如下修改->

    1. elif m in {LSKA}:
    2. c2 = ch[f]
    3. args = [c2, *args]

    到此就修改完成了,复制下面的ymal文件即可运行。


    4.2 LSKAttention的yaml文件和训练截图

    下面推荐几个版本的yaml文件给大家,大家可以复制进行训练,但是组合用很多具体那种最有效果都不一定,针对不同的数据集效果也不一样,我不可能每一种都做实验,所以我下面推荐了几种我自己认为可能有效果的配合方式,你也可以自己进行组合。


    4.2.1 LSKAttention的yaml版本一(推荐)

    下面的添加LSKAttention是我实验结果的版本,我仅在大目标检测层的输出添加了一个LSKAttention模块,就涨点了0.05左右,所以大家可以在中等和小目标检测层都添加LSKAttention模块进行尝试,下面的yaml文件我会给大家推荐。

    1. # YOLOv9
    2. # parameters
    3. nc: 80 # number of classes
    4. depth_multiple: 1 # model depth multiple
    5. width_multiple: 1 # layer channel multiple
    6. #activation: nn.LeakyReLU(0.1)
    7. #activation: nn.ReLU()
    8. # anchors
    9. anchors: 3
    10. # YOLOv9 backbone
    11. backbone:
    12. [
    13. [-1, 1, Silence, []],
    14. # conv down
    15. [-1, 1, Conv, [64, 3, 2]], # 1-P1/2
    16. # conv down
    17. [-1, 1, Conv, [128, 3, 2]], # 2-P2/4
    18. # elan-1 block
    19. [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 3
    20. # conv down
    21. [-1, 1, Conv, [256, 3, 2]], # 4-P3/8
    22. # elan-2 block
    23. [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 5
    24. # conv down
    25. [-1, 1, Conv, [512, 3, 2]], # 6-P4/16
    26. # elan-2 block
    27. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 7
    28. # conv down
    29. [-1, 1, Conv, [512, 3, 2]], # 8-P5/32
    30. # elan-2 block
    31. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 9
    32. ]
    33. # YOLOv9 head
    34. head:
    35. [
    36. # elan-spp block
    37. [-1, 1, SPPELAN, [512, 256]], # 10
    38. # up-concat merge
    39. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    40. [[-1, 7], 1, Concat, [1]], # cat backbone P4
    41. # elan-2 block
    42. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 13
    43. # up-concat merge
    44. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    45. [[-1, 5], 1, Concat, [1]], # cat backbone P3
    46. # elan-2 block
    47. [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 16 (P3/8-small)
    48. [-1, 1, LSKA, []], # 17 添加一行我们的改进机制
    49. # conv-down merge
    50. [-1, 1, Conv, [256, 3, 2]],
    51. [[-1, 13], 1, Concat, [1]], # cat head P4
    52. # elan-2 block
    53. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 20 (P4/16-medium)
    54. [-1, 1, LSKA, []], # 21 添加一行我们的改进机制
    55. # conv-down merge
    56. [-1, 1, Conv, [512, 3, 2]],
    57. [[-1, 10], 1, Concat, [1]], # cat head P5
    58. # elan-2 block
    59. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 24 (P5/32-large)
    60. [-1, 1, LSKA, []], # 25 添加一行我们的改进机制
    61. # routing
    62. [5, 1, CBLinear, [[256]]], # 26
    63. [7, 1, CBLinear, [[256, 512]]], # 27
    64. [9, 1, CBLinear, [[256, 512, 512]]], # 28
    65. # conv down
    66. [0, 1, Conv, [64, 3, 2]], # 29-P1/2
    67. # conv down
    68. [-1, 1, Conv, [128, 3, 2]], # 30-P2/4
    69. # elan-1 block
    70. [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 31
    71. # conv down fuse
    72. [-1, 1, Conv, [256, 3, 2]], # 32-P3/8
    73. [[26, 27, 28, -1], 1, CBFuse, [[0, 0, 0]]], # 33
    74. # elan-2 block
    75. [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 34
    76. [-1, 1, LSKA, []], # 35 添加一行我们的改进机制
    77. # conv down fuse
    78. [-1, 1, Conv, [512, 3, 2]], # 36-P4/16
    79. [[27, 28, -1], 1, CBFuse, [[1, 1]]], # 37
    80. # elan-2 block
    81. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 38
    82. [-1, 1, LSKA, []], # 39 添加一行我们的改进机制
    83. # conv down fuse
    84. [-1, 1, Conv, [512, 3, 2]], # 40-P5/32
    85. [[28, -1], 1, CBFuse, [[2]]], # 41
    86. # elan-2 block
    87. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 42
    88. [-1, 1, LSKA, []], # 43 添加一行我们的改进机制
    89. # detect
    90. [[35, 39, 43, 17, 21, 25], 1, DualDDetect, [nc]], # DualDDetect(A3, A4, A5, P3, P4, P5)
    91. ]


    4.2.2 LSKAttention的yaml版本二

    添加的版本二具体那种适合你需要大家自己多做实验来尝试。

    1. # YOLOv9
    2. # parameters
    3. nc: 80 # number of classes
    4. depth_multiple: 1 # model depth multiple
    5. width_multiple: 1 # layer channel multiple
    6. #activation: nn.LeakyReLU(0.1)
    7. #activation: nn.ReLU()
    8. # anchors
    9. anchors: 3
    10. # YOLOv9 backbone
    11. backbone:
    12. [
    13. [-1, 1, Silence, []],
    14. # conv down
    15. [-1, 1, Conv, [64, 3, 2]], # 1-P1/2
    16. # conv down
    17. [-1, 1, Conv, [128, 3, 2]], # 2-P2/4
    18. # elan-1 block
    19. [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 3
    20. # conv down
    21. [-1, 1, Conv, [256, 3, 2]], # 4-P3/8
    22. # elan-2 block
    23. [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 5
    24. # conv down
    25. [-1, 1, Conv, [512, 3, 2]], # 6-P4/16
    26. # elan-2 block
    27. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 7
    28. # conv down
    29. [-1, 1, Conv, [512, 3, 2]], # 8-P5/32
    30. # elan-2 block
    31. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 9
    32. ]
    33. # YOLOv9 head
    34. head:
    35. [
    36. [-1, 1, LSKA, []], # 添加一行我们的改进机制
    37. # elan-spp block
    38. [-1, 1, SPPELAN, [512, 256]], # 11
    39. # up-concat merge
    40. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    41. [[-1, 7], 1, Concat, [1]], # cat backbone P4
    42. # elan-2 block
    43. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 14
    44. # up-concat merge
    45. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    46. [[-1, 5], 1, Concat, [1]], # cat backbone P3
    47. # elan-2 block
    48. [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 17 (P3/8-small)
    49. # conv-down merge
    50. [-1, 1, Conv, [256, 3, 2]],
    51. [[-1, 14], 1, Concat, [1]], # cat head P4
    52. # elan-2 block
    53. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 20 (P4/16-medium)
    54. # conv-down merge
    55. [-1, 1, Conv, [512, 3, 2]],
    56. [[-1, 11], 1, Concat, [1]], # cat head P5
    57. # elan-2 block
    58. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 23 (P5/32-large)
    59. # routing
    60. [5, 1, CBLinear, [[256]]], # 24
    61. [7, 1, CBLinear, [[256, 512]]], # 25
    62. [9, 1, CBLinear, [[256, 512, 512]]], # 26
    63. # conv down
    64. [0, 1, Conv, [64, 3, 2]], # 27-P1/2
    65. # conv down
    66. [-1, 1, Conv, [128, 3, 2]], # 28-P2/4
    67. # elan-1 block
    68. [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 29
    69. # conv down fuse
    70. [-1, 1, Conv, [256, 3, 2]], # 30-P3/8
    71. [[24, 25, 26, -1], 1, CBFuse, [[0, 0, 0]]], # 31
    72. # elan-2 block
    73. [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 32
    74. # conv down fuse
    75. [-1, 1, Conv, [512, 3, 2]], # 33-P4/16
    76. [[25, 26, -1], 1, CBFuse, [[1, 1]]], # 34
    77. # elan-2 block
    78. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 35
    79. # conv down fuse
    80. [-1, 1, Conv, [512, 3, 2]], # 36-P5/32
    81. [[26, -1], 1, CBFuse, [[2]]], # 37
    82. # elan-2 block
    83. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 38
    84. # detect
    85. [[32, 35, 38, 17, 20, 23], 1, DualDDetect, [nc]], # DualDDetect(A3, A4, A5, P3, P4, P5)
    86. ]

     


    4.2.3 LSKAttention的yaml版本三

    1. # YOLOv9
    2. # parameters
    3. nc: 80 # number of classes
    4. depth_multiple: 1 # model depth multiple
    5. width_multiple: 1 # layer channel multiple
    6. #activation: nn.LeakyReLU(0.1)
    7. #activation: nn.ReLU()
    8. # anchors
    9. anchors: 3
    10. # YOLOv9 backbone
    11. backbone:
    12. [
    13. [-1, 1, Silence, []],
    14. # conv down
    15. [-1, 1, Conv, [64, 3, 2]], # 1-P1/2
    16. # conv down
    17. [-1, 1, Conv, [128, 3, 2]], # 2-P2/4
    18. # elan-1 block
    19. [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 3
    20. # conv down
    21. [-1, 1, Conv, [256, 3, 2]], # 4-P3/8
    22. # elan-2 block
    23. [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 5
    24. # conv down
    25. [-1, 1, Conv, [512, 3, 2]], # 6-P4/16
    26. # elan-2 block
    27. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 7
    28. # conv down
    29. [-1, 1, Conv, [512, 3, 2]], # 8-P5/32
    30. # elan-2 block
    31. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 9
    32. ]
    33. # YOLOv9 head
    34. head:
    35. [
    36. # elan-spp block
    37. [-1, 1, SPPELAN, [512, 256]], # 10
    38. [-1, 1, LSKA, []], # 11 添加一行我们的改进机制
    39. # up-concat merge
    40. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    41. [[-1, 7], 1, Concat, [1]], # cat backbone P4
    42. # elan-2 block
    43. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 14
    44. # up-concat merge
    45. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    46. [[-1, 5], 1, Concat, [1]], # cat backbone P3
    47. # elan-2 block
    48. [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 17 (P3/8-small)
    49. # conv-down merge
    50. [-1, 1, Conv, [256, 3, 2]],
    51. [[-1, 14], 1, Concat, [1]], # cat head P4
    52. # elan-2 block
    53. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 20 (P4/16-medium)
    54. # conv-down merge
    55. [-1, 1, Conv, [512, 3, 2]],
    56. [[-1, 11], 1, Concat, [1]], # cat head P5
    57. # elan-2 block
    58. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 23 (P5/32-large)
    59. # routing
    60. [5, 1, CBLinear, [[256]]], # 24
    61. [7, 1, CBLinear, [[256, 512]]], # 25
    62. [9, 1, CBLinear, [[256, 512, 512]]], # 26
    63. # conv down
    64. [0, 1, Conv, [64, 3, 2]], # 27-P1/2
    65. # conv down
    66. [-1, 1, Conv, [128, 3, 2]], # 28-P2/4
    67. # elan-1 block
    68. [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 29
    69. # conv down fuse
    70. [-1, 1, Conv, [256, 3, 2]], # 30-P3/8
    71. [[24, 25, 26, -1], 1, CBFuse, [[0, 0, 0]]], # 31
    72. # elan-2 block
    73. [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 32
    74. # conv down fuse
    75. [-1, 1, Conv, [512, 3, 2]], # 33-P4/16
    76. [[25, 26, -1], 1, CBFuse, [[1, 1]]], # 34
    77. # elan-2 block
    78. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 35
    79. # conv down fuse
    80. [-1, 1, Conv, [512, 3, 2]], # 36-P5/32
    81. [[26, -1], 1, CBFuse, [[2]]], # 37
    82. # elan-2 block
    83. [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 38
    84. # detect
    85. [[32, 35, 38, 17, 20, 23], 1, DualDDetect, [nc]], # DualDDetect(A3, A4, A5, P3, P4, P5)
    86. ]

     


    4.3 LSKAttention的训练过程截图 

    下面是添加了 LSKAttention的训练截图。

    大家可以看下面的运行结果和添加的位置所以不存在我发的代码不全或者运行不了的问题大家有问题也可以在评论区评论我看到都会为大家解答(我知道的)。

    ​​

    ​​​​​​


    五、本文总结

    到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv9改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

    希望大家阅读完以后可以给文章点点赞和评论支持一下这样购买专栏的人越多群内人越多大家交流的机会就更多了。  

    专栏地址:YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

    ​​​

  • 相关阅读:
    【MicroPython ESP8266】配网示例
    linux centos出现No space left on device解决方案
    苹果手机照片如何导入电脑?无损快速的传输办法分享!
    Acwing.4382 快速打字(双指针)
    【Python机器学习】利用AdaBoost元算法提高分类性能——基于数据集多重抽样的分类器
    K8S安装过程八:Kubernetes Master 节点安装
    CodeForces 570D Tree Requests
    多表操作(外键)
    SpringCloud中服务间通信方式以及Ribbon、Openfeign组件的使用
    ELK 使用 metricbeat监控数据
  • 原文地址:https://blog.csdn.net/java1314777/article/details/138201602