论文地址:https://arxiv.org/pdf/1807.06521.pdf
代码地址:https://github.com/Jongchan/attention-module
《CBAM: Convolutional Block Attention Module》是2018年收录于cs.CV的一篇论文,文中提出在基础网络(如ResNet)的Block块中加入Attention机制的方法,以提升图片分类和目标检测效果。
之前改进图像模型的方法常常是加大网络的深度、宽度、基数(cardinality),这些都需要占用更多的资源,而CBAM引入的Attention注意力方法增加的开销非常小。
CBAM原理
注意力机制模仿人看物体时的方法:通过简单一瞥,分析图像的重要部分,然后聚焦于该位置,而不是对画面中所有区域给予同等重视。
CBAM通过之前提取到图像的feature map,在通道channel和空间spatial分别学习了What(注意什么)和Where(注意哪儿)的Attention map。基本原理如下所示:

Channel Attention Model
从卷积网络提取的特征一般是CxHxW,其中C为通道数,W和H分别为经过卷积后得到的缩小后的图片宽高,即Input Feature,将它作为输入。CBAM依次建立了1D的通道卷积层Cx1x1,和2D的空间卷积层1xHxW。公式如下:

其中⊗表示矩阵中对应元素相乘,类似对图像的mask操作,具体方法如下图所示:

在Channel Attention部分,将每一个Channel视为一种对图片的特征提取器(每个通道从图片中提取各类特征,如纹理,样式)。此处,把每一个通道中的HxW个小块通过最大池化和平均池化压缩成单块,将这两部分分别送入同一网络Mc分别计算,Mc是含有一个隐藏层的多层感知机MLP,隐藏层大小rx1x1,r通常小于通道数,引入它为了简化计算,否则,当通道数很大时,直接用全连接网络计算量太大,由此,上图中的Mc呈漏斗形。
Mc计算公式如下:

其中σ表示sigmoid函数,W1和W0分别是MLP的两层,中间夹着隐藏层h和ReLU激活函数(c->h,h->c)。通过训练,学习到参数W1和W0。
Spatial attention module
空间层用于提取内部空间的关系,计算哪一小块应该被重点关注,该层的输入是经过Channel Attention处理的数据,同样也使用了两种池化方法,分别将多个通道的值压缩到单个通道,在Spatial层经过7x7的2维卷积,计算得到对空间的加权,具体方法如下式所示。

其中σ表示sigmoid函数,f为卷积层处理(由卷积、归一化、ReLU组成)。
与CNN网络结合
下图展示了CBAM与ResNet结合的一种方式(也可以根据不同的需求加在不同位置)。

它在Block层与ResNet相结合,注意此处将Attention加入到每一个Block里面,而不是只加在最后,CBAM也由此得名:Convolutional Block Attention Module卷积块中的注意力模型。
模型效果
对ResNet50模型分别加入了AvgPool和AvgPool后,模型大小几乎没有变化,同时可以看到模型效果的提高,下表展示了加入Channel Attention后的效果:

其中AvgPool提取平均特征,MaxPool提取了显著特征,相互结合效果最好,由于它们提取的都是同种特征,因此使用了同一网络。
使用了Spatial Attention后模型效果对比如下图所示:

Channel提取的特征相对全局化,Spatial提取的特征相对局部,Channel和Spatial模块分开处理比合并处理效果更好,处理的先后顺序理论上可以互换,实验效果是Channel放在前面效果更好一些。从下图可以看到不同组合的效果。

除了提升现有模型的能力,CBAM也增强了模型对特征的提取能力,使用Grad-CAM工具分析最后一个卷积层的输出,可以看到在目标识别任务中,不同模型标识的不同重点区域,从p值可以看到,CBAM有明显的优势:

把CBAM插入到基础网络中,目标识别效果也有提高,且性能几乎不受影响。下表展示了在COCO数据集上目标识别的提升效果。

源码
从源码中可以看到Attention层在图像处理中的具体用法:先加入Attention层的计算,然后将Attention与原有特征x进行元素相乘。BCAM的核心代码不过百行,下面摘录了其Spatial Attention部分:

其最后两行,先用sigmoid计算类似门控的值,用于过滤重要部分和次要部分,然后与具体特征数据x相乘即可,非常简单直接。该部分的完整代码请见:
https://github.com/Jongchan/attention-module/blob/master/MODELS/cbam.py
以此方式,无论是使用从图片中提取的信息作为Attention,还是使用其它额外信息作为Attention加强对图片描述都非常方便。
网友评论