YOLOv5改进 | 注意力机制 | 添加SimAM注意力机制【全网独家+附完整代码】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡

压缩和激励模块(SE)以及空间通道注意力模块(CBAM)的注意力机制取得了巨大成功。本文介绍了一种简单而有效的替代模块,即简单注意力模块(SimAM)。SimAM模块是一个即插即用的模块,无需额外的模态参数。在本文中,给大家带来的教程是在原来的主干网络添加SimAM注意力机制。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址 YOLOv5改进+入门——持续更新各种有效涨点方法 点击即可跳转

目录

1.原理

2. SimAM的代码实现

2.1 将SimAM添加到YOLOv5中

2.2 新增yaml文件

2.3 注册模块

2.4 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6.总结


1.原理

官方论文:SIMPLE ATTENTION MODULE BASED SPEAKER VERIFICATION WITH ITERATIVE NOISY LABEL DETECTION——点击即可跳转

官方代码SimAM代码官方仓库——点击即可挑战

SimAM(Simple Attention Module)是一种轻量级的注意力机制,旨在增强神经网络的表示能力,而不会显著增加计算开销。它通过对特征图进行自适应加权,来提高网络对关键特征的关注度。下面是对SimAM的详细讲解。

SimAM的基本概念

SimAM的基本思想是使用一个简单的模块来捕捉特征图中的重要信息。与其他复杂的注意力机制(如SE模块、CBAM等)相比,SimAM通过引入一个自适应加权机制,实现了高效的特征增强。

SimAM的实现

SimAM的实现可以概括为以下几个步骤:

  1. 输入特征图: 输入特征图记为\mathbf{X},形状为C \times H \times W ,其中 C 是通道数, H 和 W 是特征图的高度和宽度。

  2. 计算通道均值: 计算每个通道的均值 \mu_c,公式如下:\mu_c = \frac{1}{HW} \sum_{i=1}^{H} \sum_{j=1}^{W} \mathbf{X}_{c, i, j}

  3. 计算通道方差: 计算每个通道的方差 ( \sigma_c^2 ),公式如下:\sigma_c^2 = \frac{1}{HW} \sum_{i=1}^{H} \sum_{j=1}^{W} (\mathbf{X}_{c, i, j} - \mu_c)^2

  4. 计算加权参数: 计算加权参数( \alpha_c )( \beta_c )\alpha_c = \frac{\mu_c}{\sigma_c^2 + \epsilon} \beta_c = \frac{1}{\sigma_c^2 + \epsilon} 其中,\epsilon 是一个很小的常数,用于避免除零错误。

  5. 计算注意力权重: 计算每个像素位置的注意力权重 \mathbf{A}_{c, i, j} ,公式如下: \mathbf{A}_{c, i, j} = \alpha_c (\mathbf{X}_{c, i, j} - \mu_c) + \beta_c

  6. 应用注意力权重: 将注意力权重应用到原始特征图上,得到增强后的特征图 \mathbf{Y}\mathbf{Y}_{c, i, j} = \mathbf{X}_{c, i, j} \cdot \mathbf{A}_{c, i, j}

SimAM的优点

  1. 计算开销低: SimAM不引入额外的卷积层或全连接层,计算量相对较低。

  2. 易于实现: SimAM的实现相对简单,可以很容易地嵌入到现有的卷积神经网络中。

  3. 有效性: 实验表明,SimAM在提高网络性能方面表现出色,能够显著提高图像分类、目标检测等任务的准确性。

总结

SimAM是一种简洁有效的注意力机制,通过自适应加权显著提升神经网络的特征表示能力。其低计算开销和易于实现的特点,使得它在各种计算机视觉任务中具有广泛的应用前景。

2. SimAM的代码实现

2.1 将SimAM添加到YOLOv5中

关键步骤一: 将下面代码粘贴到/projects/yolov5-6.1/models/common.py文件中

import torch
import torch.nn as nn

class SimAM(torch.nn.Module):
    def __init__(self, channels = None, e_lambda = 1e-4):
        super(SimAM, self).__init__()

        self.activaton = nn.Sigmoid()
        self.e_lambda = e_lambda

    def __repr__(self):
        s = self.__class__.__name__ + '('
        s += ('lambda=%f)' % self.e_lambda)
        return s

    @staticmethod
    def get_module_name():
        return "simam"

    def forward(self, x):

        b, c, h, w = x.size()
        
        n = w * h - 1

        x_minus_mu_square = (x - x.mean(dim=[2,3], keepdim=True)).pow(2)
        y = x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim=[2,3], keepdim=True) / n + self.e_lambda)) + 0.5

        return x * self.activaton(y)

 SimAM(Simple Attention Module)的主要流程:

主要流程

  1. 输入特征图

    • 首先,SimAM接收一个输入特征图,该特征图具有多个通道,每个通道包含一个二维的空间特征(高度和宽度)。

  2. 计算通道均值

    • 对每个通道计算其所有像素的平均值。这个均值反映了该通道整体的强度水平。

  3. 计算通道方差

    • 计算每个通道的方差,反映该通道内像素值的变化程度。方差越大,说明该通道内的像素值变化越大。

  4. 计算加权参数

    • 使用计算出的均值和方差来生成两个加权参数。第一个参数(通常称为(\alpha))表示相对于均值的权重,第二个参数(通常称为(\beta))表示基础权重。

  5. 计算注意力权重

    • 利用加权参数和输入特征图,计算每个像素的位置的注意力权重。这个权重表示了该位置在特征图中的重要性。

  6. 应用注意力权重

    • 将计算出的注意力权重应用到输入特征图的每个像素位置上。具体而言,每个像素值乘以其对应的注意力权重,从而得到增强后的特征图。

工作机制

  • 自适应加权

    • 通过计算均值和方差,自适应地调整特征图中每个像素的权重,使得重要的像素被放大,不重要的像素被抑制。

  • 计算效率

    • SimAM不需要额外的卷积操作或全连接层,因此计算开销低,适合在各种卷积神经网络中嵌入使用。

应用场景

SimAM可以用于各种计算机视觉任务,如图像分类、目标检测和语义分割等,通过增强特征图的表达能力来提升模型性能。

通过这些步骤,SimAM实现了对特征图中重要信息的有效提取和增强,提高了神经网络的注意力机制,从而提升了整体性能。

2.2 新增yaml文件

关键步骤二在下/projects/yolov5-6.1/models下新建文件 yolov5_SimAM.yaml并将下面代码复制进去

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # 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, 3, SimAM, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

温馨提示:本文只是对yolov5l基础上添加swin模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。


# YOLOv5n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
 
# YOLOv5s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
 
# YOLOv5l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
 
# YOLOv5m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
 
# YOLOv5x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.3 注册模块

关键步骤三在yolo.py中注册, 大概在260行左右添加 ‘SimAM’

2.4 执行程序

在train.py中,将cfg的参数路径设置为yolov5_SimAM.yaml的路径

建议大家写绝对路径,确保一定能找到

🚀运行程序,如果出现下面的内容则说明添加成功🚀  

3. 完整代码分享

https://pan.baidu.com/s/1E-5qdtYXVVqN3fBgHQiLVw?pwd=t7ys

提取码: t7ys

4. GFLOPs

关于GFLOPs的计算方式可以查看百面算法工程师 | 卷积基础知识——Convolution

未改进的GFLOPs

改进后的GFLOPs

5. 进阶

你能在不同的位置添加SimAM注意力机制吗?这非常有趣,快去试试吧

6.总结

SimAM(Simple Attention Module)的原理是通过计算每个通道的均值和方差来生成自适应的加权参数,这些参数用于计算每个像素位置的注意力权重。该权重反映了像素在特征图中的重要性,重要像素被放大,而不重要像素被抑制,从而增强特征图的表示能力。SimAM的优势在于其计算开销低且易于实现,可以有效地提升神经网络在各种计算机视觉任务中的性能。

### 回答1: 引入SiMaN注意力机制后,YOLOv7的参数量和计算量都有所增加。具体来说,SiMaN注意力机制引入了两个额外的可训练参数,分别用于计算注意力图的权重和偏置,这导致了参数量的增加。同时,由于要计算注意力图,需要在每个特征图上进行卷积操作,这也增加了计算量。不过,这种注意力机制可以有效地提高目标检测的性能,特别是在处理小目标时。因此,虽然参数量和计算量增加了,但是模型性能也有所提高。 ### 回答2: YOLOv7 引入了SiMaM(Scaled Maximum Attention Module)注意力机制,该注意力机制可以帮助模型更加准确地定位目标并提高检测性能。 在参数量方面,SiMaM注意力机制YOLOv7中引入了一些额外的参数。具体来说,SiMaM模块由一系列卷积层和注意力模块组成,其中注意力模块包括一些线性变换、激活函数和全局平均池化等操作,这些操作带来了一些额外的可学习参数。 在计算量方面,SiMaM注意力机制也引入了额外的计算开销。由于注意力模块包含了一些额外的卷积、线性变换和池化操作,这些操作会增加模型的计算量。因此,引入了SiMaM注意力机制后,YOLOv7的计算量相比于之前的版本会有一定的增加。 尽管引入了一定的额外参数和计算开销,但是SiMaM注意力机制YOLOv7中的应用可以有效提升目标定位的准确性和检测性能。通过对目标特征进行自适应调整和加权,SiMaM可以提高模型对目标的关注度,并使得模型更具有目标感知性。这种提升在一些复杂的场景下尤为明显,可以提高目标检测的精度和鲁棒性。 总之,尽管引入SiMaM注意力机制会带来一些额外的参数和计算开销,但是它对于YOLOv7模型的性能提升是非常有益的。在目标定位的准确性和检测性能上,SiMaM可以显著改善模型的表现,提高目标检测的准确率和可靠性。 ### 回答3: YOLOv7是YOLO系列目标检测算法的最新版本,在YOLOv7中引入了SIMAM注意力机制,以改进检测准确性。SIMAM注意力机制能够帮助模型更好地关注重要的目标区域,提升检测性能。 引入SIMAM注意力机制会对参数量和计算量产生一定程度的变化。具体来说,引入SIMAM注意力机制会增加一些额外的参数用于计算注意力权重和特征映射,因此会导致参数量的增加。这些额外的参数可以通过训练过程中学习到,以适应不同的目标检测任务。 同时,引入SIMAM注意力机制还会增加一定的计算量。因为注意力权重的计算需要额外的操作,需要对特征映射进行一定的处理和加权,从而得到更加关注目标的特征表示。这些额外的计算操作会增加模型的计算量,因此相应地会增加模型的推理时间。 然而,需要注意的是,具体的参数量和计算量增加情况与具体的实现方式和模型配置有关。在实际应用中,可以灵活调整模型结构和参数配置,以平衡模型的性能和计算资源的消耗。因此,从整体来看,引入SIMAM注意力机制可能会略微增加参数量和计算量,但可以提升模型的检测准确性。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kay_545

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值