文章目录
- 1.Introduction
- 2.Convolutional Block Attention Module
- Experiments
- Conclusion
论文题目:CBAM: Convolutional Block Attention Module(CBAM:卷积注意力机制)
论文链接:点击跳转
代码链接:Github
论文目的:卷积注意力模块(CBAM)是一种前馈卷积神经网络注意力模块。给定一个中间特征图,CBMA会沿着两个单独的维度(通道和空间)顺序推断注意力图,然后将注意力图乘以输入特征图进行自适应特征细化。并且,CBAM是一个轻量级的通用模块,它可以无缝集成到任何CNN架构中。
1.Introduction
计算机视觉中的注意力机制
注意力一种非常常见的能力,比如天空一只鸟飞过去的时候,往往注意力会追随着鸟儿,天空在视觉系统中,自然成为了一个背景信息。一般的神经网络识别物体是通过大量数据训练出来的能力,如一个神经网络如果见过大量的手写数字,那么这个神经网络是能够识别出一个新的手写数字代表的数值的。但这样的网络对图片的全部特征其实是等价处理的(没有前景、背景,重要、不重要之分,而仅仅特征提取整张图片进行识别),模型并不能将关注度的重点放在某一特定的区域。
事实上,注意力机制是一种让模型在处理信息时能够“集中注意力”的技术,模仿了人类的注意力过程,使模型能够聚焦于输入数据的重要部分,忽略掉不重要的细节,从而更高效且准确地提取关键信息。在模型中一般使用掩码来形成注意力机制,即,训练后的模型能将图片数据中关键的特征(需要关注的区域)通过掩码标注处理,就可认为模型具备了注意力机制。
注意力机制可分为两种:
- 软注意力机制:确定的注意力机制,完成后直接可以通过网络生成,其更加注意空间或通道。
- 强注意力机制:不确定的注意力机制,更加关注点,即图像中的每个点都有可能延伸出注意力,同时强注意力是一个随机的预测过程,更强调动态变化。强注意力机制往往通过增强学习获得。
软注意力机制可根据研究的数据分为空间域、通道域、时间域,本研究仅涉及空间域、通道域。
卷积运算本质是通过将跨通道和空间信息混合在一起来提取信息特征的,本研究提出的卷积注意力模块(CBMA)同样也强调这两个主要维度的意义特征。以下是空间域(Spatial Domain)、时间域(Channel Domain)的含义:
- 空间域:空间域指关注对象的位置特性,通过空间变换模块将原始图片中的空间信息变换到另一个空间(坐标系)中并保存。
- (a)列:原始图像。
- (b)列:通过注意力机制学习到的目标边界框信息,表明在转换时要将哪些关键信息进行保留。
- ©列:经过空间转换模块后得到的特征图,与原始输入相比,旋转的图片被复原,有噪声的区域也被略去,于是再通过©列进行识别。
- 通道域:对经过卷积得到的特征图的每一层,乘以不同的权重,表示该层表示的特征对于关键信息的关联程度和重要程度,相应的,权重越大,表示该层表示的信息对于关键信息越重要。SeNet是典型的注意力机制模型,得到一个C维卷积层后,通过挤压函数,激励函数,尺度函数,得到每一维的权重,对应乘到不同通道的值上,得到新的特征。
本研究提出的CBAM模块依次用到注意力机制的通道域和空间域模块,通过这两个模块可得到细化后的重要特征信息,而忽视无关特征,使得网络有了学习特征含义(通道域)、特征位置(空间域)的能力,也让网络在测试新图像数据时,更好地知道哪些信息需要强调,哪些信息需要抑制。CBAM机制如下:
文章三大贡献:
- 1.提出了一种简单而有效的注意力模块(CBAM),可以广泛应用于提高CNN的性能。
- 2.通过消融研究验证了注意力模块的有效性。
- 3.在多个基准模型(ImageNet-1K、MS COCO和VOC 2007)上插入了CBAM模块,证明各种网络的性能得到显著提升。
2.Convolutional Block Attention Module
由上文可知,注意力机制不仅告诉你应该关注哪里,而且还会提升关键区域的特征表达。这也与识别的目标一致,只关注重要的特征而抑制或忽视无关特征,由此提出CBAM网络(Convolutional Block Attention Module)。CBAM的执行流程为,设中间特征图为 F F F,其尺寸为 ( C , H , W ) (C,H,W) (C,H,W),表示如下:
之后,CBAM通过运算依次得到一维的通道注意力图 M c M_c Mc和二维的空间注意力图 M s M_s Ms,二者可通过以下计算分别得到经过通道注意力图细化后的特征图 F ′ F' F′和经过空间注意力图细化后的特征图 F ′ ′ F'' F′′:
其中, ⊗ ⊗ ⊗表示对应元素相乘,并且 F ′ ′ F'' F′′是在 F ′ F' F′的基础上得到的。具体查看通道域的注意力模块和空间域的注意力模块实现过程。
【通道域注意力模块】
利用特征的通道间关系来生成通道注意力图。事实上,特征图的每个通道都被视为特征检测器,通道注意力集中在给定输入图像的“什么”是有意义的。为了有效地计算通道注意力、聚合空间信息,本研究采用平均池化操作压缩了输入特征图的空间维度。
- 输入:大小为 ( C , H , W ) (C,H,W) (C,H,W)的特征图。
- 输出:大小为 ( C , 1 , 1 ) (C,1,1) (C,1,1)的通道注意力图。
- 操作:
- 1.对输入的特征图分别执行平均池化和最大值池化聚合空间信息,得到两个C维池化特征图 F a v g F_{avg} Favg和 F m a x F_{max} Fmax。
- 2.将 F a v g F_{avg} Favg和 F m a x F_{max} Fmax送入包含一个隐藏层的多层感知机MLP中,得到两个大小为 ( C , 1 , 1 ) (C,1,1) (C,1,1)的通道注意力图。为减少参数量,隐层神经元的个数为 C / r C/r C/r, r r r也被称作压缩比。
- 3.将经过MLP得到的两个通道注意力图进行对应元素相加,激活,得到最终的通道注意力图 M c M_c Mc。
平均池化、最大池化的作用:池化操作可用于聚合空间信息(即消除不必要的空间信息,缩缩小图像尺寸,更加专注通道特征),一般较为流行的是采用平均池化,但作者认为最大池化会收集到不同于平均池化的、关于不同目标特征的表示,这对于后续得到更精细的注意力通道图是有帮助的。后续实验结果也证实这一观点:
MLP的结构:本文使用只有一个隐藏层的MLP,使用 w 0 w_0 w0和 w 1 w_1 w1表示隐层权重和输出层权重,事实上二者的参数是共享的:
总之,通道注意力模块更关注的是“What”属性,也就是什么是对于后续处理有意义的。经过通道注意力模块运算后,得到的是一个 1 x 1 x C 1x1xC 1x1xC的通道注意力图,图上每一维的权重,表示该维对应的特征图层中,对于关键信息的重要程度和关联程度。
class ChannelAttention(nn.Module):"""CBAM混合注意力机制的通道注意力"""def __init__(self, in_channels, ratio=16):#ratio表压缩比super(ChannelAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.fc = nn.Sequential(全连接层nn.Linear(in_planes, in_planes // ratio, bias=False),nn.ReLU(),nn.Linear(in_planes // ratio, in_planes, bias=False))self.sigmoid = nn.Sigmoid() #对生成的通道注意力权重应用Sigmoid激活函数,将权重限制在0到1之间。def forward(self, x):avg_out = self.fc(self.avg_pool(x))max_out = self.fc(self.max_pool(x))out = avg_out + max_outout = self.sigmoid(out) #out表通道注意力图return out * x #返回F'
【空间注意力模块】
利用特征的空间关系来生成空间注意力图。与通道注意力不同,空间注意力侧重于“何处”这一信息性部分,与渠道注意力相辅相成。为了计算空间注意力,我们首先沿通道轴应用平均池和最大池操作,并将它们连接起来以生成高效的特征描述符(相当于是忽略/缩减图像的通道特征,转而专注于空间特征)。
- 输入:经过通道注意力图细化后的 F ′ F' F′,计算方式为 F ′ = M c ( F ) ⊗ F F'=M_c(F)⊗F F′=Mc(F)⊗F。
- 输出:大小为 ( 1 , H , W ) (1,H,W) (1,H,W)的空间注意力图。
- 操作:
- 1.将 F ′ F' F′沿通道方向进行最大池化和平均池化,得到两个二维的特征图 F a v g F_avg Favg和 F m a x F_max Fmax,大小均为 1 x H x W 1xHxW 1xHxW,将得到的两个特征图进行维度拼接方向的拼接(叠加),得到拼接后的特征图。
- 2.对拼接后的特征图进行7x7的卷积运算得到空间注意力图 M s M_s Ms。
沿维度通道平均池化、最大池化的作用:参考ICLR2017的论文《Paying more attention to attention: Improving the performance of convolutional neural networks via attention transfer》,认为沿着通道轴应用池化操作可以有效地突出显示含有关键信息的区域。作者的实验也支持这一观点。
总之,与通道注意力不同,空间注意力侧重于“何处”这一信息性部分,这是对前面通道注意力的补充。除此之外,两个模块可以并行或顺序放置,但通过实验发现顺序排列比平行排列的结果更好,并且顺序上通道一阶略优于空间一阶。
class SpatialAttention(nn.Module):"""CBAM混合注意力机制的空间注意力"""def __init__(self, kernel_size=7):super(SpatialAttention, self).__init__()assert kernel_size in (3, 7), 'kernel size must be 3 or 7'padding = 3 if kernel_size == 7 else 1self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = torch.mean(x, dim=1, keepdim=True) #通道上平均池化max_out, _ = torch.max(x, dim=1, keepdim=True) #通道上最大池化out = torch.cat([avg_out, max_out], dim=1) #将池化后的特征沿通道维度进行拼接,得到具有不同尺度上下文信息的特征图out = self.sigmoid(self.conv1(out)) #对生成的空间注意力权重应用Sigmoid激活函数,将权重限制在0到1之间return out*x #返回F''
Experiments
CBAM模块易与CNN网络融合,研究中将其融入到了ResNet网络中,并证明了CBAM各方面的优越性。
Conclusion
CBAM融合了注意力机制中的两种常见表示,通道域的注意力机制和空间域的注意力机制,通过将两种模块顺序组合,两者相互补充,使得网络具有了知晓“What”和“Where”的能力,即知道在哪些位置上的哪些特征,是关键且重要的信息。通过这样的方式,进一步提升了CNNs的特征提取和表示能力,而且CBAM可以无缝的嵌入各种CNNs结构中,对于计算机视觉任务有很好的表现。
总代码实现:
class CBAM(nn.Module):"""CBAM混合注意力机制"""def __init__(self, in_channels, ratio=16, kernel_size=3):super(CBAM, self).__init__()self.channelattention = ChannelAttention(in_channels, ratio=ratio)self.spatialattention = SpatialAttention(kernel_size=kernel_size)def forward(self, x):x = self.channelattention(x)x = self.spatialattention(x)return x