• 注意力机制【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)

    通道域 - 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

  • 相关阅读:
    Linux_RHEV虚拟化_基础理论&KVM
    Linux_RHEV虚拟化_基础理论&KVM
    Python Module_openpyxl_处理Excel表格
    HDFS QJM原理分析
    HDFS QJM原理分析
    现阶段为什么国内程序员无法很好的参与到开源社区?
    现阶段为什么国内程序员无法很好的参与到开源社区?
    一致性哈希环的理论实现
    一致性哈希环的理论实现
    HDFS RBF支持多目标集群的挂载映射
  • 原文地址:https://www.cnblogs.com/yanshw/p/16010525.html
Copyright © 2020-2023  润新知