CV中的attention机制之(cSE,sSE,scSE)

论文
代码

SE模块的博文链接

提出scSE模块论文的全称是:《Concurrent Spatial and Channel ‘Squeeze & Excitation’ in Fully Convolutional Networks 》。这篇文章对SE模块进行了改进,提出了SE模块的三个变体cSE、sSE、scSE,并通过实验证明了了这样的模块可以增强有意义的特征,抑制无用特征。实验是基于两个医学上的数据集MALC Dataset和Visceral Dataset进行实验的。

语义分割模型大部分都是类似于U-Net这样的encoder-decoder的形式,先进行下采样,然后进行上采样到与原图一样的尺寸。其添加SE模块可以添加在每个卷积层之后,用于对feature map信息的提炼。具体方案如下图所示:

然后开始分别介绍由SE改进的三个模块,首先说明一下图例:

1、下面是cSE模块:

这个模块类似BAM模块里的Channel attention模块,通过观察这个图就很容易理解其实现方法,具体流程如下:

1、将feature map通过global average pooling方法从[C, H, W]变为[C, 1, 1]

2、然后使用两个1×1×1卷积进行信息的处理,最终得到C维的向量

3、然后使用sigmoid函数进行归一化,得到对应的mask

4、最后通过channel-wise相乘,得到经过信息校准过的feature map

import torch
import torch.nn as nnclass cSE(nn.Module):def __init__(self, in_channels):super().__init__()self.avgpool = nn.AdaptiveAvgPool2d(1)self.Conv_Squeeze = nn.Conv2d(in_channels,in_channels // 2,kernel_size=1,bias=False)self.Conv_Excitation = nn.Conv2d(in_channels // 2,in_channels,kernel_size=1,bias=False)self.norm = nn.Sigmoid()def forward(self, U):z = self.avgpool(U)  # shape: [bs, c, h, w] to [bs, c, 1, 1]z = self.Conv_Squeeze(z)  # shape: [bs, c/2, 1, 1]z = self.Conv_Excitation(z)  # shape: [bs, c, 1, 1]z = self.norm(z)return U * z.expand_as(U)if __name__ == "__main__":bs, c, h, w = 10, 3, 64, 64in_tensor = torch.ones(bs, c, h, w)c_se = cSE(c)print("in shape:", in_tensor.shape)out_tensor = c_se(in_tensor)print("out shape:", out_tensor.shape)

2、接下来是sSE模块:

上图是空间注意力机制的实现,与BAM中的实现确实有很大不同,实现过程变得很简单,具体分析如下:

1、直接对feature map使用1×1×1卷积, 从[C, H, W]变为[1, H, W]的features
2、然后使用sigmoid进行激活得到spatial attention map
3、然后直接施加到原始feature map中,完成空间的信息校准

NOTE: 这里需要注意一点,先使用1×1×1卷积,后使用sigmoid函数,这个信息无法从图中直接获取,需要理解论文。

import torch
import torch.nn as nnclass sSE(nn.Module):def __init__(self, in_channels):super().__init__()self.Conv1x1 = nn.Conv2d(in_channels, 1, kernel_size=1, bias=False)self.norm = nn.Sigmoid()def forward(self, U):q = self.Conv1x1(U) # U:[bs,c,h,w] to q:[bs,1,h,w]q = self.norm(q)return U * q # 广播机制if __name__ == "__main__":bs, c, h, w = 10, 3, 64, 64in_tensor = torch.ones(bs, c, h, w)s_se = sSE(c)print("in shape:", in_tensor.shape)out_tensor = s_se(in_tensor)print("out shape:", out_tensor.shape)

3、scSe模块

可见就如他的名字一样,scSE就是将sSE和cSE相加起来而已。

代码:

import torch
import torch.nn as nnclass sSE(nn.Module):def __init__(self, in_channels):super().__init__()self.Conv1x1 = nn.Conv2d(in_channels, 1, kernel_size=1, bias=False)self.norm = nn.Sigmoid()def forward(self, U):q = self.Conv1x1(U)  # U:[bs,c,h,w] to q:[bs,1,h,w]q = self.norm(q)return U * q  # 广播机制class cSE(nn.Module):def __init__(self, in_channels):super().__init__()self.avgpool = nn.AdaptiveAvgPool2d(1)self.Conv_Squeeze = nn.Conv2d(in_channels, in_channels // 2, kernel_size=1, bias=False)self.Conv_Excitation = nn.Conv2d(in_channels//2, in_channels, kernel_size=1, bias=False)self.norm = nn.Sigmoid()def forward(self, U):z = self.avgpool(U)# shape: [bs, c, h, w] to [bs, c, 1, 1]z = self.Conv_Squeeze(z) # shape: [bs, c/2]z = self.Conv_Excitation(z) # shape: [bs, c]z = self.norm(z)return U * z.expand_as(U)class scSE(nn.Module):def __init__(self, in_channels):super().__init__()self.cSE = cSE(in_channels)self.sSE = sSE(in_channels)def forward(self, U):U_sse = self.sSE(U)U_cse = self.cSE(U)return U_cse+U_sseif __name__ == "__main__":bs, c, h, w = 10, 3, 64, 64in_tensor = torch.ones(bs, c, h, w)sc_se = scSE(c)print("in shape:",in_tensor.shape)out_tensor = sc_se(in_tensor)print("out shape:", out_tensor.shape)

下面是作者给出的对比结果:

参考自(GaintpandaCV)

CV中的attention机制之(cSE,sSE,scSE)相关推荐

  1. 深入理解CV中的Attention机制之SE模块

    CV中的Attention机制汇总(一):SE模块 Squeeze-and-Excitation Networks 论文链接:Squeeze-and-Excitation Networks 1. 摘要 ...

  2. CV中的Attention机制总结

    CV中的Attention机制 注意力机制 CV中的注意力机制 卷积神经网络中常用的Attention 视觉注意力机制在分类网络中的应用 SE-Net(CVPR 2017) ECA-Net(CVPR ...

  3. 通道注意力机制 cnn keras_【CV中的Attention机制】简单而有效的CBAM模块

    前言: CBAM模块由于其使用的广泛性以及易于集成得到很多应用.目前cv领域中的attention机制也是在2019年论文中非常火.这篇cbam虽然是在2018年提出的,但是其影响力比较深远,在很多领 ...

  4. 一文深入浅出cv中的Attention机制

    在深度学习领域中,存在很多专业名词,第一次看的时候总会很懵逼-后面慢慢看得时候才会有那么感觉,但是总觉得差点意思.今天我们要说的一个专业名词,就叫做Attention机制! 1. 直观理解Attent ...

  5. 【CV中的Attention机制】模块梳理合集

    文章目录 0. 总述 1. SENet(CVPR18) 2. SKNet(CVPR19) 3. CBAM(ECCV18)&BAM(BMVC18)&scSE(MICCAI18) 4. N ...

  6. 【从零开始学习YOLOv3】7. 教你在目标检测中添加Attention机制

    前言:[从零开始学习YOLOv3]系列越写越多,本来安排的内容比较少,但是在阅读代码的过程中慢慢发掘了一些新的亮点,所以不断加入到这个系列中.之前都在读YOLOv3中的代码,已经学习了cfg文件.模型 ...

  7. 万字长文解析CV中的注意力机制(通道/空间/时域/分支注意力)

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[transformer综述]获取2022最新ViT综述论文! 注意 ...

  8. 「NLP」 聊聊NLP中的attention机制

    https://www.toutiao.com/i6716536091681227267/ 本篇介绍在NLP中各项任务及模型中引入相当广泛的Attention机制.在Transformer中,最重要的 ...

  9. 理解LSTM/RNN中的Attention机制

    转自:http://www.jeyzhang.com/understand-attention-in-rnn.html,感谢分享! 导读 目前采用编码器-解码器 (Encode-Decode) 结构的 ...

最新文章

  1. LOJ2586 APIO2018 选圆圈
  2. 数据结构与算法笔记(七)—— 选择排序
  3. android显示服务器端文件夹,Android上传文件到服务端并显示进度条
  4. springcloud 创建子父项目_idea搭建springCloud----搭建父子项目(二)
  5. Windows Azure 云计算服务: 怎样按需选择并计算它将花费多少钱呢?
  6. redis-3.2.9安装
  7. python怎么设置notebook_JupyterNotebook设置Python环境的方法步骤
  8. 初次注册使用Tushare Pro报错问题
  9. android 带边框的arc,极细边框(1px边框)实现方式
  10. mongodb笔记 getting started
  11. Hugging Face Course-Introduction学习小记 (part1)
  12. 台达伺服控制器接线图_【工控项目分享】台达ASDA-AB系列伺服驱动器——内部位置控制...
  13. 基于CNN卷积神经网络实现手势识别
  14. Java Jsp+mysql实现企业财务管理系统(普通职工/管理员 员工、公司资产、经营、费用管理)
  15. Java计算文章多少字_java计算中文字数的代码实例
  16. [渝粤教育] 温州职业技术学院 纳税筹划 参考 资料
  17. python如何设置画布开始位置_Python绘图篇——Turtle库详解(一)
  18. 渲染TA实战:冰面效果制作分享
  19. 一个屌丝程序猿的人生(十)
  20. 视频教程-【无废话课程】Maya软件初级教学UV拆分基础入门【字幕版】-Maya

热门文章

  1. 如何在CSDN编辑器(Markdown编辑器)中输入数学符号
  2. 差分算法和遗传算法的区别
  3. Linux开源镜像地址下载
  4. STM32单片机启动流程分析
  5. 福布斯公布最新全球富豪排行榜 盖茨退居第二
  6. k线形态-T字线形态
  7. TCP三次握手以及UDP相关知识
  8. 单机小游戏大本营 经典流行 百种游戏 还不赶紧收藏
  9. WIN10 自动切换夜间模式
  10. Ubuntu下的log日志查看器