注意力机制【2】- CV中的注意力机制


有一些其他理论先暂时不讲了,直奔今天的主题 

视觉注意力机制

视觉注意力机制根据 关注域 的不同,可分为三大类:空间域、通道域、混合域

空间域:将图片中的 空间域信息 做对应的 变换,从而将关键得信息提取出来。对空间进行掩码的生成,进行打分,代表是 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)

混合域 - 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://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