注意力机制BAM和CBAM详细解析(附代码)

  • 论文题目①:BAM: Bottleneck Attention Module
  • 论文题目②:CBAM:CBAM: Convolutional Block Attention Module

Bottlenet attention Module(BAM)

依据

人看东西时不可能把注意力放在所有的图像上,会把焦点目光聚集在图像的重要物体上。因此,作者提出了BAM注意力机制,仿照人的眼睛聚焦在图像几个重要的点上。

BAM介绍

在这项工作中,我们把重心放在了Attention对于一般深度神经网络的影响上,我们提出了一个简单但是有效的Attention模型—BAM,它可以结合到任何前向传播卷积神经网络中,我们的模型通过两个分离的路径 channel和spatial, 得到一个Attention Map。
注意力机制BAM和CBAM详细解析(附代码)

BAM具体结构

对于给定的feature mapFRCHWF\in R^{C*H*W},BAM可以得到一个3D的Attention map M(F)RCHWM(F)\in R^{C*H*W},计算refine feature map F'
F=F+FM(F)F′=F+F⊗M(F),其中是逐元素相乘。

M(F)=σ(Mc(F)+Ms(F))M(F) =σ(Mc(F)+Ms(F))

其中,Mc(F)RCMc(F)\in R^{C}是通道注意力;Ms(F)RHWMs(F)\in R^{H*W}是空间注意力。

channel attention branch

Mc(F)=BN(MLP(AvgPool(F)))=BN(W1(W0AvgPool(F)+b0)+b1)Mc(F) = BN(MLP(AvgPool(F))) = BN(W1(W0AvgPool(F)+b0)+b1)

其中W0RC/rC,b0Rr/C,W1RC/rC,b1RCW_{0}\in R^{C/r*C},b_{0}\in R^{r/C},W_{1}\in R^{C/r*C},b_{1}\in R^{C}

spatial attention branch

Ms(F)=BN(f311(f233(f133(f011(F)))))M_{s}(F)=BN(f_{3}^{1*1}(f_{2}^{3*3}(f_{1}^{3*3}(f_{0}^{1*1}(F)))))
其中,f是卷积操作,1* 1表示filter size为1,其它类似。BN是batch normalization;3* 3是dilated convolution,即空洞卷积。

两种attention的结合方式

由一系列的实验可得,element-wise summation即逐元素相加perform是最好的。最后再通过sigmoid函数。具体可以参照下图:

注意力机制BAM和CBAM详细解析(附代码)

Convolutional Block Attention Module(CBAM)

简介

作者提出了一个简单但有效的注意力模块 CBAM,给定一个中间特征图,我们沿着空间和通道两个维度依次推断出注意力权重,然后与原特征图相乘来对特征进行自适应调整。 由于 CBAM 是一个轻量级的通用模块,它可以无缝地集成到任何 CNN 架构中,额外开销忽略不计,并且可以与基本 CNN 一起进行端到端的训练。 在不同的分类和检测数据集上,将 CBAM 集成到不同的模型中后,模型的表现都有了一致的提升,展示了其广泛的可应用性。

CBAM总体视图

注意力机制BAM和CBAM详细解析(附代码)

CBAM结构介绍

作者将注意力过程分为两个独立的部分,通道注意力模块和空间注意力模块。这样不仅可以节约参数和计算力,而且保证了其可以作为即插即用的模块集成到现有的网络架构中去。

通道注意力模块

特征的每一个通道都代表着一个专门的检测器,因此,通道注意力是关注什么样的特征是有意义的。为了汇总空间特征,作者采用了全局平均池化和最大池化两种方式来分别利用不同的信息。
Mc(F)=σ(MLP(AvgPool(F))+MLP(MaxPool(F)))=σ(W1(W0(FavgC))+(W1(W0(FmaxC))) Mc(F) = σ(MLP(AvgPool(F)) + MLP(MaxPool(F))) =\sigma (W_{1}(W_{0}(F_{avg}^{C}))+(W_{1}(W_{0}(F_{max}^{C})))
输入是一个 H×W×C 的特征 F,我们先分别进行一个空间的全局平均池化和最大池化得到两个 1×1×C 的通道描述。接着,再将它们分别送入一个两层的神经网络,第一层神经元个数为 C/r,**函数为 Relu,第二层神经元个数为 C。这个两层的神经网络是共享的。然后,再将得到的两个特征相加后经过一个 Sigmoid **函数得到权重系数 Mc。最后,拿权重系数和原来的特征 F 相乘即可得到缩放后的新特征。

空间注意力模块

在通道注意力模块之后,我们再引入空间注意力模块来关注哪里的特征是有意义的。
Ms(F)=σ(f77([AvgPool(F),MaxPool(F)]))=σ(f77([FavgS;FmaxS])) M_{s}(F)=\sigma (f^{7*7}([AvgPool(F),MaxPool(F)]))=\sigma (f^{7*7}([F_{avg}^{S};F_{max}^{S}]))

与通道注意力相似,给定一个 H×W×C 的特征 F‘,我们先分别进行一个通道维度的平均池化和最大池化得到两个 H×W×1 的通道描述,并将这两个描述按照通道拼接在一起。然后,经过一个 7×7 的卷积层,**函数为 Sigmoid,得到权重系数 Ms。最后,拿权重系数和特征 F’ 相乘即可得到缩放后的新特征。

注意力机制BAM和CBAM详细解析(附代码)

两个注意力通道组合形式

通道注意力和空间注意力这两个模块可以以并行或者顺序的方式组合在一起,但是作者发现顺序组合并且将通道注意力放在前面可以取得更好的效果。

实验结果

CBAM与ResNet网络结构组合

注意力机制BAM和CBAM详细解析(附代码)
注意力机制BAM和CBAM详细解析(附代码)

CBAM可视化

注意力机制BAM和CBAM详细解析(附代码)

利用 Grad-CAM 对不同的网络进行可视化后,可以发现,引入 CBAM 后,特征覆盖到了待识别物体的更多部位,并且最终判别物体的概率也更高,这表明注意力机制的确让网络学会了关注重点信息。

BAM在目标检测

注意力机制BAM和CBAM详细解析(附代码)

结论(CBAM和BAM)

由上述及论文更多实验结果表明,不管是引入BAM还是引入CBAM都能提高目标检测和物体分类的精度,因此可以在神经网络中引入这一机制,而且花费的计算开销和参数大小都比较少。

代码解析及开源地址

https://github.com/Jongchan/attention-module

可对照着代码看注意力机制的详细过程,会有一个更好的理解。