赞
踩
目录
一、SENet(2017ImageNet冠军模型)---通道Attention
Squeeze-and-Excitation (SE) 模块
二、SKNet(2019CVPR)---soft attention机制
四、CBAM: (Convolutional Block Attention Module)--空间(spatial)和通道(channel)的注意力机制模块)
Paper : Sequeeze-and-excitation networks
Github: Sequeeze-and-excitation networks
在深度学习领域,CNN分类网络的发展对其它计算机视觉任务如目标检测和语义分割都起到至关重要的作用,因为检测和分割模型通常是构建在CNN分类网络(称为backbone)之上。提到CNN分类网络,我们所熟知的是VGG,ResNet,Inception,DenseNet等模型,它们的效果已经被充分验证,而且被广泛应用在各类计算机视觉任务上。这里我们介绍一篇CVPR2017的文章SENet,它赢得了最后一届ImageNet 2017竞赛分类任务的冠军。重要的一点是SENet思路很简单,很容易扩展在已有网络结构中。
从卷积核的意义入手,目前很多卷积神经网络的相关工作都是通过改进网络的空间结构来优化模型。如Inception模块通过引入不同大小的卷积核来获得不同感受野上的信息。或inside-outside网络参考空间上下文信息,等等。
那么可不可以在网络中加入特征维度信息呢?
基于这一想法,诞生了Squeeze-and-Excitation Networks。
对于CNN网络来说,其核心计算是卷积算子,其通过卷积核从输入特征图学习到新特征图。从本质上讲,卷积是对一个局部区域进行特征融合,这包括空间上(H和W维度)以及通道间(C维度)的特征融合。
对于卷积操作,很大一部分工作是提高感受,即空间上融合更多特征融合,或者是提取多尺度空间信息,如Inception网络的多分支结构。对于channel维度的特征融合,卷积操作基本上默认对输入特征图的所有channel进行融合。而MobileNet网络中的组卷积(Group Convolution)和深度可分离卷积(Depthwise Separable Convolution)对channel进行分组也主要是为了使模型更加轻量级,减少计算量。而SENet网络的创新点在于关注channel之间的关系,希望模型可以自动学习到不同channel特征的重要程度。为此,SENet提出了Squeeze-and-Excitation (SE)模块,如下图所示:
SE模块首先对卷积得到的特征图进行Squeeze操作,得到channel级的全局特征,然后对全局特征进行Excitation操作,学习各个channel间的关系,也得到不同channel的权重,最后乘以原来的特征图得到最终特征。本质上,SE模块是在channel维度上做attention或者gating操作,这种注意力机制让模型可以更加关注信息量最大的channel特征,而抑制那些不重要的channel特征。另外一点是SE模块是通用的,这意味着其可以嵌入到现有的网络架构中。
SE模块的灵活性在于它可以直接应用现有的网络结构中。这里以Inception和ResNet为例。对于Inception网络,没有残差结构,这里对整个Inception模块应用SE模块。对于ResNet,SE模块嵌入到残差结构中的残差学习分支中。具体如下图所示:
同样地,SE模块也可以应用在其它网络结构,如ResNetXt,Inception-ResNet,MobileNet和ShuffleNet中。这里给出SE-ResNet-50和SE-ResNetXt-50的具体结构,如下表所示:
SE模块是非常简单的,实现起来也比较容易,这里给出PyTorch版本的实现(参考(https://github.com/moskomule/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)
对于SE-ResNet模型,只需要将SE模块加入到残差单元(应用在残差学习那一部分)就可以:
1.[Squeeze-and-Excitation Networks](https://arxiv.org/abs/1709.01507)
2.[CVPR2017 WorkShop](http://image-net.org/challenges/talks_2017/SENet.pdf)
Paper : Selective Kernel Networks
Github: Selective Kernel Networks
1. 很多网络使用了各种 Trick 来降低计算量,比如 ResNeXt,计算量大大减少,精度却略有提升。那么如果不牺牲那么多计算量,能否精度提高一些呢?比如使用大一点的 Kernel,如 5×5 的卷积提升精度;
2. 结合现在普遍使用的 Attention 操作。
加了上面两个操作之后,显然计算量会上去,于是作者再加了一个 Group Convolution 来做 trade off。
上述结构可以分为三个步骤:
Split:输入为 c×h×w 的特征图,和均表示 Group Convolution。这里使用 Group Convolution 以减少计算量。注意,这里两路 Group Convolution 使用的卷积核大小不一致,原因在于 Motivation 中说的第一点,提升精度。
Fuse:通过 Split 操作分成两路之后,再把两路结果进行融合,然后就是一个 Sequeeze and Excitation block。
Select:Select 模块把 Sequeeze and Excitation block 模块的结果通过两个 softmax 以回归出 Channel 之间的权重信息。然后把这个权重信息乘到和中。这个过程可以看做是一个 soft attention。最好把两路的特征图进行相加得到输出特征图 V。
Paper:Global Context Network
Github:Global Context Network
Paper: Convolutional Block Attention Module
Github:Convolutional Block Attention Module
论文提出了Convolutional Block Attention Module(CBAM),这是一种为卷积神将网络设计的,简单有效的注意力模块(Attention Module)。对于卷积神经网络生成的feature map,CBAM从通道和空间两个维度计算feature map的attention map,然后将attention map与输入的feature map相乘来进行特征的自适应学习。CBAM是一个轻量的通用模块,可以将其融入到各种卷积神经网络中进行端到端的训练。
对于一个中间层的feature map:,CBAM将会顺序推理出1维的channel attention map 以及2维的spatial attention map ,整个过程如下所示:
其中为element-wise multiplication,首先将channel attention map与输入的feature map相乘得到,之后计算的spatial attention map,并将两者相乘得到最终的输出。下图为CBAM的示意图:
CBAM的结构图
Channel attention module
feature map 的每个channel都被视为一个feature detector,channel attention主要关注于输入图片中什么(what)是有意义的。为了高效地计算channel attention,论文使用最大池化和平均池化对feature map在空间维度上进行压缩,得到两个不同的空间背景描述:和。使用由MLP组成的共享网络对这两个不同的空间背景描述进行计算得到channel attention map:。计算过程如下:
其中,,后使用了Relu作为激活函数。
Spatial attention module.
与channel attention不同,spatial attention主要关注于位置信息(where)。为了计算spatial attention,论文首先在channel的维度上使用最大池化和平均池化得到两个不同的特征描述和,然后使用concatenation将两个特征描述合并,并使用卷积操作生成spatial attention map 。计算过程如下:
其中,表示7*7的卷积层
下图为channel attention和spatial attention的示意图:
(上)channel attention module;(下)spatial attention module
- def cbam(inputs,reduction_ratio=0.5,name=""):
- with tf.variable_scope("cbam_"+name, reuse=tf.AUTO_REUSE):
- batch_size,hidden_num=inputs.get_shape().as_list()[0],inputs.get_shape().as_list()[3]
-
- maxpool_channel=tf.reduce_max(tf.reduce_max(inputs,axis=1,keepdims=True),axis=2,keepdims=True)
- avgpool_channel=tf.reduce_mean(tf.reduce_mean(inputs,axis=1,keepdims=True),axis=2,keepdims=True)
-
- maxpool_channel = tf.layers.Flatten()(maxpool_channel)
- avgpool_channel = tf.layers.Flatten()(avgpool_channel)
-
- mlp_1_max=tf.layers.dense(inputs=maxpool_channel,units=int(hidden_num*reduction_ratio),name="mlp_1",reuse=None,activation=tf.nn.relu)
- mlp_2_max=tf.layers.dense(inputs=mlp_1_max,units=hidden_num,name="mlp_2",reuse=None)
- mlp_2_max=tf.reshape(mlp_2_max,[batch_size,1,1,hidden_num])
-
- mlp_1_avg=tf.layers.dense(inputs=avgpool_channel,units=int(hidden_num*reduction_ratio),name="mlp_1",reuse=True,activation=tf.nn.relu)
- mlp_2_avg=tf.layers.dense(inputs=mlp_1_avg,units=hidden_num,name="mlp_2",reuse=True)
- mlp_2_avg=tf.reshape(mlp_2_avg,[batch_size,1,1,hidden_num])
-
- channel_attention=tf.nn.sigmoid(mlp_2_max+mlp_2_avg)
- channel_refined_feature=inputs*channel_attention
-
- maxpool_spatial=tf.reduce_max(inputs,axis=3,keepdims=True)
- avgpool_spatial=tf.reduce_mean(inputs,axis=3,keepdims=True)
- max_avg_pool_spatial=tf.concat([maxpool_spatial,avgpool_spatial],axis=3)
- conv_layer=tf.layers.conv2d(inputs=max_avg_pool_spatial, filters=1, kernel_size=(7, 7), padding="same", activation=None)
- spatial_attention=tf.nn.sigmoid(conv_layer)
-
- refined_feature=channel_refined_feature*spatial_attention
-
- return refined_feature
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。