【深度学习注意力机制系列】—— SCSE注意力机制(附pytorch实现)

SCSE注意力模块(来自论文[1803.02579] Concurrent Spatial and Channel Squeeze & Excitation in Fully Convolutional Networks (arxiv.org))。其对SE注意力模块进行了改进,提出了cSE、sSE、scSE三个模块变体,这些模块可以增强有意义的特征,抑制无用特征。今天我们就分别讲解一下这三个注意力模块。

1、cSE模块(通道维度的SE注意力机制)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SMHvhcuu-1691560496641)(E:\学习笔记\深度学习笔记\深度学习基础知识\注意力机制\SCSE.assets\image-20230809131542884.png)]

cSE模块引入了通道注意力机制,可有效的对通道维度的特征信息进行整合增强,这一点与SE等传统通道注意力机制近似,其最大不同的是其对得到的注意力权重进行了降维再升维的操作,类似与resnet中的瓶颈结构以及Fast RCNN目标检测网络最后的全连接加速层,这种操作方式有些奇异值分解的意思,在深度学习模型中十分常见,可有效的整合通道信息,并且简化模块复杂度,减小模型计算量,提升计算速度

实现机制

  • 将特征图通过全局平均池化层将维度从[C, H, W]变为[C, 1, 1]。
  • 然后使用两个1×1卷积进行信息的处理(即降维与升维操作),最终得到C维的向量。
  • 然后使用sigmoid函数进行归一化,得到对应的权重向量文件。
  • 最后通过channel-wise与原始特征图相乘,得到经过通道信息真个校准过的特征图。

代码实现

class CSE(nn.Module):
    def __init__(self, in_channels, reduction=16):
        super(CSE, self).__init__()
        self.cSE = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(in_channels, in_channels // reduction, 1),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels // reduction, in_channels, 1),
            nn.Sigmoid(),
        )
   
    def forward(self, x):
        return x * self.cSE(x)

2、sSE模块(空间维度的SE注意力机制)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xWAJQhNS-1691560496643)(E:\学习笔记\深度学习笔记\深度学习基础知识\注意力机制\SCSE.assets\image-20230809131552369.png)]

sSE模块在特征图的空间维度展开信息增强整合,同通道维度一样,其也是通过先提取权重信息,再将权重信息同原始特征图相乘得到注意力增强效果,不过在提取权重信息时是在空间维度展开,不再是使用全局平均池化层,而是使用输出通道为1,卷积核大小为1×1 的卷积层,进行信息整合

这里我们顺便简介一下1×1卷积层的作用

改变通道数 (即升维降维)

信息整合(可实现跨通道的信息交互)

增加非线性(基于奇异值分解,结合非线性激活函数,加深模型)

实现机制

  • 将特征图通过一个输出通道为1,卷积核大小为1×1 的卷积层,得到一个维度为(1, H, W)的权重矩阵。
  • 将权重矩阵进行sigmod归一化处理,得到最终的权重矩阵。
  • 将权重矩阵同原始特征图在空间维度相乘,得到最终空间信息增强特征图结果。

代码实现

class SSE(nn.Module):
    def __init__(self, in_channels):
        super(SSE, self).__init__()
        self.sSE = nn.Sequential(nn.Conv2d(in_channels, 1, 1), nn.Sigmoid())

    def forward(self, x):
        return x * self.sSE(x)

3、scSE模块(混合维度的SE注意力机制)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o7I26uui-1691560496643)(E:\学习笔记\深度学习笔记\深度学习基础知识\注意力机制\SCSE.assets\image-20230809131630998.png)]

scSE模块是sSE模块和cSE模块的综合体,即同时对空间维度和通道维度进行信息整合增强,将两者的特征结果沿着通道维度进行相加(结果和原始特征图维度相同)。

实现机制

  • 将特征图通过cSE模块,得到特征图结果1。
  • 将特征图通过sSE模块,得到特征图结果2.
  • 将特征图结果1和2沿着通道维度相加,得到最终信息校正结果(前后特征图维度不变)。

代码实现

class SCSE(nn.Module):
    def __init__(self, in_channels, reduction=16):
        super(SCSE, self).__init__()
        self.cSE = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(in_channels, in_channels // reduction, 1),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels // reduction, in_channels, 1),
            nn.Sigmoid(),
        )
        self.sSE = nn.Sequential(nn.Conv2d(in_channels, 1, 1), nn.Sigmoid())

    def forward(self, x):
        return x * self.cSE(x) + x * self.sSE(x)
### 如何在YOLOv8中集成SCSE模块 #### 背景介绍 空间通道挤压激励(Spatial and Channel Squeeze-and-Excitation, SCSE)模块是一种有效的注意力机制,能够增强模型对于重要特征的关注度。该模块结合了空间维度和通道维度上的注意力机制,在不显著增加计算成本的情况下提升了模型性能。 #### 集成过程详解 为了将SCSE模块融入到YOLOv8架构中,需修改YOLOv8的neck部分以及backbone部分的相关层定义文件。具体操作如下: 1. **创建SCSE类** 定义一个新的Python类`SCSEModule`来实现SCSE功能。此模块接收输入张量并返回经过处理后的输出张量。 ```python import torch.nn as nn from torchvision import models class SCSEModule(nn.Module): def __init__(self, channels, reduction=16): super(SCSEModule, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc1 = nn.Conv2d(channels, channels // reduction, kernel_size=1, padding=0) self.relu = nn.ReLU(inplace=True) self.fc2 = nn.Conv2d(channels // reduction, channels, kernel_size=1, padding=0) self.sigmoid_channel = nn.Sigmoid() self.conv_after_concat = nn.Conv2d(channels * 2, channels, kernel_size=3, stride=1, padding=1) def forward(self, x): module_input = x # Channel-wise attention branch x_avg = self.avg_pool(x) x_atten_c = self.fc2(self.relu(self.fc1(x_avg))) channel_attention = self.sigmoid_channel(x_atten_c).expand_as(module_input) # Spatial-wise attention branch maxpool_spatial = nn.MaxPool2d(kernel_size=x.size()[2:]) avgout_spatial = nn.functional.mean(x, dim=1, keepdim=True) maxout_spatial = maxpool_spatial(x) spatial_attention = (avgout_spatial + maxout_spatial).sigmoid().repeat([1,x.shape[1],1,1]) refined_feature = (module_input * channel_attention) + \ (module_input * spatial_attention) output = self.conv_after_concat(torch.cat( [refined_feature, module_input], dim=1)) return output ``` 2. **调整YOLOv8 Neck结构** 编辑YOLOv8源码中的neck.py文件,找到对应的位置插入上述定义好的SCSE模块实例化语句,并将其连接至原有网络路径上适当位置处。 假设已经在项目根目录下保存了一个名为`scse_module.py`的新脚本,则可以在导入时使用它: ```python from scse_module import SCSEModule ... def _make_layer(...): ... layers.append(SCSEModule(inplanes)) ... return nn.Sequential(*layers) ``` 通过这种方式可以确保每次前向传播过程中都会应用一次SCSE变换[^1]。 3. **验证与测试** 完成以上更改后,重新训练或微调模型以观察加入新组件前后效果差异。注意监控损失曲线变化趋势及最终评估指标得分情况,从而判断优化措施的有效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卖报的大地主

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

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

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

打赏作者

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

抵扣说明:

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

余额充值