Attention机制用于图像

Attention

一、在图像处理中,注意力机制分为空间、通道注意力。

  • 空间注意力机制:相对于一个层\(H*W\)而言,关注其中重要(权重高)的特征点
  • 通道注意力机制:可以将\( C*H*W \)通过平均池化将\(H*W\)浓缩为1*1,最终形成\(1*1*C\)线性特征向量,进而关注其中重要的通道(权重高)

二、常用的注意力机制模块

  • SENet模块
    1.介绍:这里是单独使用通道注意力机制。2017年提出的SENet是最后一届ImageNet竞赛的冠军,其实现示意图如下所示。对于SENet模块,其重点是获得输入进来的特征层的每一个通道C的权值。利用SENet,我们可以让网络关注它最需要关注的通道。Attention机制用于图像_第1张图片
    2.代码实现(pytorch)

    import torch
    from torch import nn
    
    class senet(nn.Module):
      def __init__(self, channel, ratio=16):
          super(senet, self).__init__()
          self.avg_pool = nn.AdaptiveAvgPool2d(1) # 全局平均池化操作,将H*W降维为1*1
          self.fc = nn.Sequential( # 两个线性层
              nn.Linear(channel, channel // ratio, False),
              nn.ReLU(),
              nn.Linear(channel // ratio, channel, False),
              nn.Sigmoid(),
          )
    
      def forward(self, x):
          b, c, h, w = x.size()
          # b, c, h, w -> b, c, 1, 1 -> b, c
          avg = self.avg_pool(x).view(b, c)
    
          # b, c -> b, c //ratio -> b, c -> b, c, 1, 1
          fc = self.fc(avg).view(b, c, 1, 1)
          print(fc)
          # 注意,这里的张量相乘是必须要两个张量的维度是对应相同才行,不同部分只能是1。
          # 例如此处的是:2*512*26*26和2*512*1*1张量之间的乘积
          # torch.Size([4, 4, 2])可以和torch.Size([4, 1, 1])乘积
          return x * fc
    
    model = senet(512)
    print(model)
    inputs = torch.ones([2, 512, 26, 26])
    outputs = model(inputs)
    # print(outputs)
    
  • CBAM模块
    1.概要介绍:这里是将通道注意力机制和空间注意力机制结合使用。效果比SENet好,其实现示意图如下所示。Attention机制用于图像_第2张图片
    2.具体介绍:将通道注意力机制和空间注意力机制分别展开。
    通道注意力机制:示意图如下,首先将输入的特征图\(C*H*W\)分别对每个通道的\(H*W\)进行最大池化和平均池化处理,生成一维张量\(C*1*1\);之后分别通过线性层Shared MLP(和SENet一样,第一层对C降维,第二层恢复成输入时的C维);最后将通过线性层的两者相加并通过\(Sigmoid\)函数得到通道注意力输出结果\(M_c\)。Attention机制用于图像_第3张图片
    空间注意力机制:示意图如下,首先对经过通道注意力机制优化后的特征图进行通道的平均池化和最大值池化操作,让通道转化为1,即将\(C*H*W\)转化为\(1*H*W\);之后将最大池化和平均池化的结果进行堆叠,得到\(2*H*W\);最后利用通道数为1的卷积层调整通道数为1(H和W不变)并取\(Sigmoid\)函数得到每个特征点的权重,得到空间注意力机制输出结果\(M_s\)Attention机制用于图像_第4张图片
    3.代码实现(pytorch)

你可能感兴趣的:(Attention机制用于图像)