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

 

视觉注意力机制

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

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