注意力模块集合(CBAM & BAM & DANet)
论文:Convolutional Block Attention Module & Bottleneck Attention Module ,2018 & Dual Attention Network for Scene Segmentation, cvpr,2019
BAM
介绍
文中把重心放在了Attention对于一般深度神经网络的影响上,文中提出了一个简单但有效的Attention模型-BAM,它可以结合到任何前向传播的卷积神经网络中,该模型通过两个分离的路径channel 和spatial,得到一个Attention Map.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7k2lgBfu-1606112099088)(C:\Users\Mr.fei\AppData\Roaming\Typora\typora-user-images\image-20201115212401280.png)]
两种attention的结合方式
element-wise summation
即逐元素相加perform是最好的。最后再通过sigmoid函数。具体可以参照下图:
需要注意的是图中的 **Mc(F)和Ms(F)**两者是相乘的,并且使用了sigmoid 进行归一化处理,最后得到 F ‘ ∈RC∗H∗W 的注意力特征图,然后将F’ 和 F 进行逐元素相乘,并且逐元素相加。
CBAM
简介
作者提出了一个简单但有效的模块CBAM,给定一个中间特征图,我们沿着空间和通道两个维度依次推断出注意力权重,然后与原始特征图相乘来对特征进行自适应调整。由于CBAM是一个轻量级的通用模块,可以无缝的集成到任何CNN架构中,并且可以和CNN一起进行端到端的训练,在不同的分类和检测数据集上,将CBAM 集成到不同的模型中后,模型的表现都有了一定的提升,展示了其广泛的可用性。
CBAM总体视图
作者将注意力过程分为两个独立的部分,通道注意力模块和空间注意力模块。这样不仅可以节约参数和计算力,而且保证了其可以作为即插即用的模块集成到现有的网络架构中去。
通道注意力模块
特征的每一个通道都代表着一个专门的检测器,因此,通道注意力是关注什么样的特征是有意义的。为了汇总空间特征,作者采用了全局平均池化(GlobalAvgPool)和最大池化(MaxPool)两种方式来分别利用不同的信息。
M
c
(
F
)
=
σ
(
M
L
P
(
A
v
g
P
o
o
l
(
F
)
)
+
M
L
P
(
M
a
x
P
o
o
l
(
F
)
)
)
=
σ
(
W
1
(
W
0
(
F
a
v
g
C
)
)
+
(
W
1
(
W
0
(
F
m
a
x
C
)
)
)
Mc(F)=σ(MLP(AvgPool(F))+MLP(MaxPool(F)))=σ(W 1 (W 0 (F avg C ))+(W 1 (W 0 (F max C )))
Mc(F)=σ(MLP(AvgPool(F))+MLP(MaxPool(F)))=σ(W1(W0(FavgC))+(W1(W0(FmaxC)))
输入是一个 H×W×C 的特征 F,我们先分别进行一个空间的全局平均池化和最大池化得到两个 1×1×C 的通道描述。接着,再将它们分别送入一个两层的神经网络,第一层神经元个数为 C/r,**函数为 Relu,第二层神经元个数为 C。这个两层的神经网络是共享的。然后,再将得到的两个特征相加后经过一个 Sigmoid **函数得到权重系数 Mc。最后,拿权重系数和原来的特征 F 相乘即可得到缩放后的新特征。
空间注意力模块
在通道注意力模块之后,我们再引入空间注意力模块来关注哪里的特征是有意义的。
M
s
(
F
)
=
σ
(
f
7
∗
7
(
[
A
v
g
P
o
o
l
(
F
)
,
M
a
x
P
o
o
l
(
F
)
]
)
)
=
σ
(
f
7
∗
7
(
[
F
a
v
g
S
;
F
m
a
x
S
]
)
)
M s (F)=σ(f 7∗7 ([AvgPool(F),MaxPool(F)]))=σ(f 7∗7 ([F avg S ;F max S ]))
Ms(F)=σ(f7∗7([AvgPool(F),MaxPool(F)]))=σ(f7∗7([FavgS;FmaxS]))
与通道注意力相似,给定一个 H×W×C 的特征 F‘,我们先分别进行一个通道维度的平均池化和最大池化得到两个 H×W×1 的通道描述,并将这两个描述按照通道拼接在一起。然后,经过一个**7×7 的卷积层,**函数为Sigmoid **,得到权重系数 Ms。最后,拿权重系数和特征 F’ 相乘即可得到缩放后的新特征。
通道注意力和空间注意力这两个模块可以以并行或者顺序的方式组合在一起,但是作者发现顺序组合并且将通道注意力放在前面可以取得更好的效果。
不管是引入BAM
还是引入CBAM
都能提高目标检测和物体分类的精度,因此可以在神经网络中引入这一机制,而且花费的计算开销和参数大小都比较少。
DANet
摘要
本文通过自注意力机制(self-attention)来捕获丰富的上下文依赖(rich context dependencies),提出了DANet来自适应地整合局部特征与其全局依赖关系(global dependencies),具体来说,通过引入空间(sptial)和通道(channel)维度的两种attention模块来建模语义依赖关系。Spatial attention module 将所有位置的特征的加权和来选择地聚合每个位置的特征。Channel attention module 通过整合所有的channel maps 来选择性地强调某些相互依赖的channel maps。最后通过融合两个attention module的feature 来提升语义分割的特征表达。DANet在Cityscapes, PASCAL Context和COCO Stuff数据集上取得了很好的效果。
- Contextual/Global/Long-range dependencies。18、19年的三大CV顶会文章中经常出现类似这几个词语,翻译成中文可以为上下文/全局/长依赖关系。具体来说,一张图像经过多个卷积层之后,感受野会逐渐变大,即CNN后面几层的feature map中的一个position往往包含了其周围的一些信息。然而,由于卷积操作是在局部进行的,即使经过了多层卷积,一个position也很难能够捕捉到所有position的信息,尤其是距离相对较远的。例如,一张图片左上角有一辆车,右下角有一辆相同型号和颜色的车,虽然它们在图片中的相对位置较远,但它们仍具有相似的特征。仅仅通过卷积的堆叠,左上角的汽车很难捕获到右下角的汽车,因此产生了long-range dependencies问题。该文提出的 Spatial attention module则是为了解决此问题。
- Attention机制首先是在自然语言处理中提出,后来在CV任务中也被广泛使用,概括来讲它可以emphasize和suppress某些特征,本文使用了self-attention机制,通过feature map与feature map之间的相互选择来构建similarity attention map。
介绍
为了有效实现分割任务,我们需要区分一些令人困惑的类别,并考虑具有不同外观的对象。比如"field"和"grass"在某些场景中很难区分,"cars"在马路中不同的位置有不同的尺度等等。因此增强像素级识别的特征表示能力是十分必要的。为了提高这种能力,deeplab系列和PSPNet分别用不同的空洞卷积(ASPP)和池化(PSP)来捕获多尺度信息,GCN和EncNet通过增大kernel size和引入一个encoding layer来捕获全局信息,Refinenet, U-Net等encoder-decoder结构通过融合mid-level和high-level特征来实现相同目标。但是,它们都没有利用场景中objects和stuffs之间的关系,这种关系也十分重要。
另一种方法采用recurrent neural network来解决long-range dependencies问题。但是这类方法都只能隐式地捕获全局关系,它们的有效性在很大程度上依赖于长期记忆的学习成果。
为了解决long-range dependencies问题,作者提出了DANet,网络结构如图1。在Dilated FCN上,有两个并行的attention modules,一个是position attention module,另一个是channel attention module。Position attention module通过自注意力机制来捕获feature map中任意两个position的空间依赖关系,对于任意一个position,它通过加权求和的所有位置的聚合特征进行更新,权重取决于两个position的similarity,也就是说,不管距离有多远,任意两个具有相似特征的position都可以相互促进。Channel attention module使用相似的自注意力机制来捕获任意两个channel maps之间的channel dependencies,并使用所有channel maps的加权和来更新每个channel map。最后通过融合两个模块来增强模型的特征表达能力。
作者认为,在处理复杂和多样场景时,DANet要比deeplab和PSPNet更灵活,并解释了为什么DANet好,推荐阅读下面一段论文中的原文,可以帮助读者理解作者提出的模型从哪个角度改善了性能。
总的来说,DANet的结构十分简单,相当于在dilated FCN 中加入了两个并行的attention模块。
网络结构
Backbone使用了dilated resnet,原始图像经过backbone之后得到大小为1/8原图的feature map,再经过两个并行的attention module分别从spatial和channel维度捕获long-range dependencies。最后将两个模块的信息融合得到更好的特征表达,将增强后的特征经Upsampling还原到原图大小。
Position Attention Module
上面的两个分支用于生成attention map。将feature map A(CxHxW)分别经过两个带BN和ReLU的卷积层得到feature map B(CxHxW)和C(CxHxW),并将B和C reshape成CxN(N=HxW),将转置后的C(NxC)与B(CxN)做矩阵乘法,并将结果经过softmax layer得到spatial attention map S(NxN)。第三个分支同样将A经过一个卷积曾得到feature map D(CxHxW),并reshape成CxN,将D与spatial attention map S做矩阵相乘并reshape成CxHxW得到attention后的feature map。将其乘一个scale parameter $ \alpha
并
与
原
f
e
a
t
u
r
e
m
a
p
A
做
一
个
e
l
e
m
e
n
t
−
w
i
s
e
s
u
m
操
作
得
到
最
终
输
出
。
其
中
参
数
并与原feature map A做一个element-wise sum操作得到最终输出。其中参数
并与原featuremapA做一个element−wisesum操作得到最终输出。其中参数 \alpha$初始值被设为0,并且由网络学到。
详细分析一下这个module做了什么。首先来看最上面的两个分支,即得到attention map的过程。如下图,A1,A2(在原文中代表特征图B和C)为reshape后的feature map,S为attention map。红条为一个position vector,维度为C,A1和A2每个都有N(HxW)个position。A1,A2中的红色vector做element-wise multiply再求和就得到了S中左上角的绿色方格,代表position i对position i的依赖关系。A1与A2做矩阵相乘后得到的S则代表N个position对每个position的依赖关系。
下图中,A3为原图中第三个分支reshape后的feature map。注意作者用的是S’即attention map S的转置而不是S。在矩阵S中,每一行代表position i 对每个position的依赖关系,每一列代表每个position对position i的依赖关系。现在我们需要得到考虑了所有position后的position i的特征,作者将每个position的特征信息乘上position i 对每个positon的依赖关系并求和。即A3中的红色vector(代表第一个channel map中每个position的特征信息)乘S‘中的绿色vector(代表position i对每个position的依赖关系),再求和后得到紫色方格,即考虑了每个position依赖关系后的position i的第一个channel的特征信息。
问题:
S不转置可不可以,也就是将每个position的特征信息乘上所有position对position i的依赖关系来得到考虑了全局依赖后的position i的特征信息。个人感觉好像没什么影响,后面我会做个实验看下效果有没有影响,等做完实验来更新这一块。
FLOPS计算:
按照作者给出的代码,以输入图像维度为512x512x3为例,feature map A的维度为64x64x512。
三个卷积层作者都采用了1x1卷积,out_dim为64,共需FLOPS:(64x64)x[(1x1x512)x64]x3=6M(忽略bias)
得到attention map S的过程是两个矩阵相乘(NxC)x(CxN),共需FLOPS:4096x64x4096=1G
特征图D与S‘相乘需要FLOPS:64x4096x4096=1G
其实计算量还是很大的,我认为这是这类方法有待改进的地方。
Channel Attention Module
在Channel Attention Module中,与Position Attention Module不同的是,作者没有对输入特征A做卷积,而是直接reshape。先看最下面的两个分支,先把feature map A reshape成CxN(N=HxW),再对其中一个转置得到NxC,作矩阵相乘即(CxN)x(Nxc)=CxC,经softmax之后得到了channel维度的attention map。第二个分支将A reshape成CxN,并与attention map的转置作矩阵乘法,得到attention之后的feature map(CxN),将其reshape回CxHxW,将其乘一个scale parameter $ \beta
并
与
原
f
e
a
t
u
r
e
m
a
p
A
做
一
个
e
l
e
m
e
n
t
−
w
i
s
e
s
u
m
操
作
得
到
最
终
输
出
。
其
中
参
数
并与原feature map A做一个element-wise sum操作得到最终输出。其中参数
并与原featuremapA做一个element−wisesum操作得到最终输出。其中参数\beta$初始值也被设为0,并且由网络学到。
同样地,我们深入矩阵乘法的内部来看看这个模块做了什么。如下图,A1,A2为reshape后的feature map,S为attention map。红条为一层channel map,维度为N,A1和A2每个都有C层channel map。A1,A2中的红色vector做element-wise multiply再求和就得到了S中左上角的绿色方格,代表channel map i对channel map i的依赖关系。A1与A2做矩阵相乘后得到的S则代表C个channel map对每个channel map的依赖关系。
下图中,A3为原图中第三个分支reshape后的feature map。同样作者用的是S’即attention map S的转置而不是S,在矩阵S中,每一行代表channel map i 对每层channel map的依赖关系,转置后S’的每一行代表每层channel map对channel map i 的依赖关系,但与position attention不同的是,为了得到对应的维度,S’在这里放在了矩阵乘法的左边,这样一来,相当于是作者将每层channel map对channel map i的依赖关系乘上每层channel map的特征信息并求和, 与position attention是相反的。也就是下图中S‘中的绿色vector(代表channel map i对每个channel map的依赖关系)乘上A3中的红色vector(代表第一个position的所有channel map的特征信息),再求和后得到紫色方格。
FLOPS计算:
同样,以输入图像维度为512x512x3为例,feature map A的维度为64x64x512。
得到attention map S的过程共需FLOPS:512x4096x512=1G
特征图D与S‘相乘需要FLOPS:512x512x4096=1G
与position attention module相比,只少了三个卷积层的计算量。
Attention Module Embedding with Networks
这一部分主要是介绍融合两个module的特征,作者在两个attention module得到的output后各加了一个卷积层,然后将两个特征做element-wise sum得到更好的特征表达。
实验
作者在三个分割数据集上做了实验,分别是:Cityscapes,PASCAL Context和COCO Stuff。实验配置在这里不再介绍了,可以查看论文原文。这里主要看下在Cityscapes上的ablation study。
Ablation Study for Attention Modules
作者分别以dilated-resnet50和dilated-resnet101为baseline,PAM和CAM都能使mIOU获得4%-5%的性能增益,其中PAM带来的增益略优于CAM
Ablation Study for Improvement Strategies
这部分主要是增加了一些提升mIOU的trick,比不使用任何trick增加了3.93%mIOU。
Comparing with State-of-the-art
与各种SOTA比较。
Results on PASCAL Context and COCO Stuff Dataset
在PASCAL Context和COCO Stuff数据集上和其他SOTA的比较。
????/img-blog.csdnimg.cn/20190406160310754.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Bhbmd5dW5zaGVuZw==,size_16,color_FFFFFF,t_70)