有一些其他理论先暂时不讲了,直奔今天的主题
视觉注意力机制
视觉注意力机制根据 关注域 的不同,可分为三大类:空间域、通道域、混合域
空间域:将图片中的 空间域信息 做对应的 变换,从而将关键得信息提取出来。对空间进行掩码的生成,进行打分,代表是 Spatial Attention Module
// 设特征图 HWC,空间注意力是学习到一个 HxW 的权重,即每个像素一个权重,C个通道共用该权重;
通道域:类似于给每个通道一个权重,来代表 该通道 与关键信息的相关程度。对通道生成掩码,进行打分,代表是 Channel Attention Module、SENet
// 设特征图 HWC,通道注意力是学习到一个长度为 C 的向量,每个通道上的像素点权重相同,仔细想想这是什么概念?
// 由于每个通道像素点权重相同,通道注意力通常会把一个通道内的信息直接做 全局平均池化,而忽略每个通道内的局部信息;
混合域:即 空间域 和 通道域 的融合,代表是 BAM,CBAM
空间域忽略了通道域的信息,将每个通道中的图片特征做同等处理,缺点是将空间域方法局限在原始图片特征提取阶段,而忽略了不同通道代表的不同特征;
通道域 - SENet
通道注意力在图像分类方面的典型应用就是 SENet
Squeeze-and-Excitation Networks;
由Momenta公司所作并发于2017CVPR,论文中的SENet赢得了ImageNet最后一届(ImageNet 2017)的图像识别冠军,SENet主要是学习了channel之间的相关性,筛选出了针对通道的注意力,稍微增加了一点计算量,但是效果比较好。
论文地址 https://arxiv.org/abs/1709.01507
官方代码地址 https://github.com/hujie-frank/SENet
Pytorch实现代码 https://github.com/moskomule/senet.pytorch
原理图如下
今天心情不好,少写点废话
第一个方块 X 没用,就是个 特征图;
第二个方块 U 作为 SENet 的输入;
Sequeeze:对 U 每个通道做 全局平均池化,生成一个 1x1xC 的 fm,这个 fm 具有全局感受野; 【空白长条】
Exciation:对 Sequeeze 输出的 1x1xC,经过 两个全连接 的神经网络,也就是 两层神经网络,第二层神经元个数为 C,给每个 通道 一个 预测值,即权重; 【彩色长条】
// 资料里说利用的 lstm 中的 门机制,其实 就是 sigmoid 把 Exciation 的输出限制到 0-1,权重嘛,而 lstm 中的门就是用的 sigmoid;
特征重标定:第三个方块,U x Wc = X‘,这个 X’ 就是 带注意力机制 的 特征图, Scale 就是利用权重缩放特征;
下面这个公式就是全局平均池化,没啥看的
下面是 GoogleNet 和 ResNet 加入 SENet 的网络结构,也没啥说的
上图只是作者的尝试,实际上 SENet 可以放到任何网络内
Pytorch 实现
class SELayer(nn.Module): def __init__(self, channel, reduction=16): super(SELayer, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction, bias=False), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel, bias=False), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y.expand_as(x)
通道域 - ECAnet
Efficient Channel Attention for Deep Convolutional Neural Networks,高效的通道注意力 深度卷积网络;
SENet 的提出引发了 注意力机制 的广泛研究,
ECAnet 就是作者在 SENet 上进行的改进,提出了一种 轻量级 的 通道注意力模块,
作者从 SE模块 中 维度缩减 (第一个FC) 和 跨通道信息交互 (2个FC)两方面入手,证明了 维度缩减 对 通道注意力机制 的预测带来了副作用,其对捕获所有通道的依赖关系是低效且不必要的,
于是作者提出了一种 不降维 的局部跨通道交互策略,该策略可通过一维卷积有效实现,进一步,作者又提出了一种自适应选择一维卷积核大小的方法,以确定局部跨信道交互的覆盖率;
论文地址 https://arxiv.org/abs/1910.03151
代码地址 https://github.com/BangguWu/ECANet
网络结构
∣x∣ odd的意思为选择最近的奇数; γ = 2 , b = 1
Pytorch 代码
有啥不懂的看代码吧,其实没啥,有时候事很小,作用很大,就看你认事还是认作用
import torch from torch import nn from torch.nn.parameter import Parameter class eca_layer(nn.Module): """Constructs a ECA module. Args: channel: Number of channels of the input feature map k_size: Adaptive selection of kernel size """ def __init__(self, channel, k_size=3): super(eca_layer, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): # x: input features with shape [b, c, h, w] b, c, h, w = x.size() # feature descriptor on the global spatial information y = self.avg_pool(x) # Two different branches of ECA module y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1) # Multi-scale information fusion y = self.sigmoid(y) return x * y.expand_as(x)
混合域 - CBAM
Convolutional Block Attention Module;
论文地址 https://arxiv.org/pdf/1807.06521.pdf
论文(2018)提出了一种轻量的注意力模块,结合了 通道域 和 空间域 的注意力机制,效果好于 SENet;
论文在 ResNet 和 MobileNet 等经典结构上添加了 CBAM 模块并进行对比分析,同时也进行了可视化,发现 CBAM 更关注识别目标物体,这也使得 CBAM 具有更好的解释性
CBAM 是一个 卷积块 注意力模型,即插即用,block 结构如下
可以看到 CBAM 实际上是 Channel Attention Module(CAM) 和 Spatial Attention Module(SAM) 的串行结构;
具体结构如下图
通道注意力 对每个fm 分别进行 最大池化 和 平均池化,然后通过 共享一个的 MLP多层感知器,得到两个 长度为 C 的列表,相加,sigmoid;
空间注意力 是在 通道维度上 分别进行 最大池化 和 平均池化,生成 HxWx2 的fm,然后接一个 卷积网络,卷积大小7x7,一个卷积核,生成 HxWx1 的fm,sigmoid;
参考资料:
https://blog.csdn.net/mrjkzhangma/article/details/106178250 【CV中的Attention机制】基础篇-视觉注意力机制和SENet
https://zhuanlan.zhihu.com/p/102035721 【CV中的Attention机制】SENet中的SE模块
https://blog.csdn.net/m0_46646835/article/details/120526262 SEnet 通道注意力机制
https://www.jianshu.com/p/4340b5f48b4a SENet 简书 挺全的,有兴趣的可以看看
https://www.jianshu.com/p/69b1548974d5 2020-CVPR-通道注意力超强改进-ECANet
https://zhuanlan.zhihu.com/p/153112149 通道注意力超强改进,轻量模块ECANet来了!即插即用,显著提高CNN性能|已开源
https://blog.csdn.net/qq_19784349/article/details/107107432 【论文阅读笔记】ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks
https://blog.csdn.net/Roaddd/article/details/114646354 【注意力机制】CBAM详解
https://zhuanlan.zhihu.com/p/96966170 CBAM--卷积层中的注意力模块 有 Pytroch 代码
https://www.jianshu.com/p/4fac94eaca91 【论文解读】用于卷积神经网络的注意力机制 有 tf 代码
那个可爱研究生的视频和代码
https://github.com/bubbliiiing/yolov4-tiny-pytorch
https://www.bilibili.com/video/BV1rL4y1n7p3?p=2&spm_id_from=pageDriver