Abstract
我们提出了卷积块注意力模块(CBAM),这是一种用于前馈卷积神经网络的简单而有效的注意力模块。 给定中间特征图,我们的模块沿着两个独立的维度(通道和空间)顺序推断注意力图,然后将注意力图乘以输入特征图以进行自适应特征细化。 由于 CBAM 是一个轻量级通用模块,因此它可以无缝集成到任何 CNN 架构中,且开销可以忽略不计,并且可以与基础 CNN 一起进行端到端训练。 我们通过在 ImageNet-1K、MS COCO 检测和 VOC 2007 检测数据集上进行大量实验来验证我们的 CBAM。 我们的实验表明,各种模型的分类和检测性能得到了持续改进,证明了 CBAM 的广泛适用性。 代码和模型将公开。
1 Introduction
卷积神经网络 (CNN) 凭借其丰富的表示能力显着提升了视觉任务的性能 [1,2,3]。 为了提高 CNN 的性能,最近的研究主要研究了网络的三个重要因素:深度、宽度和基数。
从 LeNet 架构 [4] 到 Residual-style Networks [5,6,7,8] 到目前为止,网络已经变得更深,具有丰富的表示。 VGGNet [9] 表明,堆叠具有相同形状的块可以给出公平的结果。 遵循同样的精神,ResNet [5] 将相同的残差块拓扑与跳跃连接一起堆叠起来,构建了一个极深的架构。 GoogLeNet [10]表明宽度是提高模型性能的另一个重要因素。 Zagoruyko 和 Komodakis [6] 提出增加基于 ResNet 架构的网络宽度。 他们证明,在 CIFAR 基准测试中,宽度增加的 28 层 ResNet 的性能优于具有 1001 层的极深 ResNet。 Xception [11] 和 ResNeXt [7] 提出来增加网络的基数。 他们凭经验表明,基数不仅可以节省参数总数,而且比其他两个因素(深度和宽度)具有更强的表示能力。
除了这些因素之外,我们还研究了架构设计的另一个方面,即注意力。 先前的文献[12,13,14,15,16,17]对注意力的重要性进行了广泛的研究。 注意力不仅告诉我们要关注哪里,它还提高了利益的表达。 我们的目标是通过使用注意力机制来提高表示能力:关注重要特征并抑制不必要的特征。 在本文中,我们提出了一种新的网络模块,称为“卷积块注意力模块”。 由于卷积运算通过将跨通道和空间信息混合在一起来提取信息特征,因此我们采用我们的模块来强调沿着这两个主要维度:通道和空间轴的有意义的特征。 为了实现这一目标,我们依次应用通道和空间注意模块(如图 1 所示),以便每个分支可以分别学习在通道和空间轴上关注“什么”和“在哪里”。 因此,我们的模块通过学习要强调或抑制哪些信息来有效地帮助网络内的信息流动。
在 ImageNet-1K 数据集中,我们通过插入我们的微型模块,从各种基线网络中获得了准确性的提高,揭示了 CBAM 的功效。 我们使用 grad-CAM [18] 对经过训练的模型进行可视化,并观察到 CBAEnhanced 网络比其基线网络更适合于目标对象。 然后,我们进行用户研究,以定量评估模型可解释性的改进。 我们证明,通过使用 CBAM,可以同时获得更好的性能和更好的可解释性。 考虑到这一点,我们推测性能的提升来自于对不相关杂乱的准确关注和降噪。 最后,我们在 MS COCO 和 VOC 2007 数据集上验证了目标检测的性能改进,证明了 CBAM 的广泛适用性。 由于我们精心设计了轻量级模块,因此在大多数情况下参数和计算的开销可以忽略不计。
贡献。 我们的主要贡献有三方面。
1. 我们提出了一种简单而有效的注意力模块(CBAM),可以广泛应用于提高 CNN 的表示能力。
2.我们通过广泛的消融研究验证了注意力模块的有效性。
3. 我们验证了通过插入我们的轻量级模块,各种网络的性能在多个基准(ImageNet-1K、MS COCO 和 VOC 2007)上得到了极大的提高。
2 Related Work
Network engineering
“网络工程”一直是最重要的视觉研究之一,因为精心设计的网络可以确保各种应用中显着的性能提升。 自从大规模 CNN 的成功实现以来,人们提出了多种架构[19]。 一种直观且简单的扩展方式是增加神经网络的深度[9]。 塞格迪等人[10]引入了使用多分支架构的深度Inception网络,其中每个分支都经过仔细定制。 虽然由于梯度传播的困难,深度的简单增加会趋于饱和,但 ResNet [5] 提出了一种简单的身份跳跃连接来缓解深度网络的优化问题。 基于ResNet架构,已经开发了WideResNet[6]、Inception-ResNet[8]和ResNeXt[7]等各种模型。 WideResNet [6]提出了一种具有大量卷积滤波器和减少深度的残差网络。 PyramidNet [20] 是 WideResNet 的严格概括,其中网络宽度逐渐增加。 ResNeXt [7] 建议使用分组卷积,并表明增加基数可以带来更好的分类精度。 最近,黄等人[21]提出了一种新的架构,DenseNet。 它将输入特征与输出特征迭代地连接起来,使每个卷积块能够接收来自所有先前块的原始信息。 虽然大多数最近的网络工程方法主要针对深度[19,9,10,5]、宽度[10,22,6,8]和基数[7,11]三个因素,但我们关注另一个方面,' 注意力”,人类视觉系统的奇怪方面之一。
Attention mechanism.
众所周知,注意力在人类感知中起着重要作用[23,24,25]。 人类视觉系统的一个重要特性是,人们不会尝试立即处理整个场景。 相反,人类利用一系列局部瞥见并选择性地关注显着部分,以便更好地捕捉视觉结构[26]。
最近,已经有一些尝试[27,28]结合注意力处理来提高 CNN 在大规模分类任务中的性能。 王等人 [27]提出残差注意力网络,它使用编码器解码器风格的注意力模块。 通过细化特征图,网络不仅表现良好,而且对噪声输入也具有鲁棒性。 我们没有直接计算 3d 注意力图,而是分别分解学习通道注意力和空间注意力的过程。 3D 特征图的单独注意力生成过程的计算量和参数开销要少得多,因此可以用作现有基础 CNN 架构的即插即用模块。
更接近我们的工作,胡等人[28]引入了一个紧凑的模块来利用通道间关系。 在他们的挤压和激励模块中,他们使用全局平均池化特征来计算通道方面的注意力。 然而,我们表明这些是次优特征,以便推断精细通道注意力,我们建议也使用最大池化特征。 他们还错过了空间注意力,空间注意力在决定关注“哪里”方面起着重要作用,如[29]所示。 在我们的 CBAM 中,我们基于高效的架构同时利用空间和通道注意力,并凭经验验证利用两者优于仅使用通道注意力(如 [28])。 此外,我们凭经验证明我们的模块在检测任务(MS-COCO 和 VOC)中是有效的。 特别是,我们只需将我们的模块放置在 VOC2007 测试集中现有的一次性检测器 [30] 的顶部即可实现最先进的性能。
同时,BAM [31] 采用类似的方法,将 3D 注意力图推理分解为通道和空间。 他们将 BAM 模块放置在网络的每个瓶颈处,而我们则将其插入每个卷积块。
3 Convolutional Block Attention Module
给定中间特征图 F ε RC×H×W 作为输入,CBAM 依次推断出 1D 通道注意图 Mc ε RC×1×1 和 2D 空间注意图 Ms ε R1×H×W,如图 1 所示。 整体注意力过程可以概括为:
其中 ⊗ 表示逐元素乘法。 在乘法过程中,注意力值会相应地广播(复制):通道注意力值沿空间维度广播,反之亦然。 F′′是最终的精化输出。 图2描述了每个注意力图的计算过程。 下面详细介绍各个注意力模块。
Channel attention module.
我们通过利用特征的通道间关系来生成通道注意力图。 由于特征图的每个通道都被视为特征检测器[32],因此通道注意力集中在给定输入图像的情况下“什么”是有意义的。 为了有效地计算通道注意力,我们压缩输入特征图的空间维度。 为了聚合空间信息,迄今为止普遍采用平均池化。 周等人[33]建议使用它来有效地学习目标对象的范围,Hu等人[28]在他们的注意力模块中采用它来计算空间统计。 除了之前的工作之外,我们认为最大池收集了关于独特对象特征的另一个重要线索,以推断更精细的通道注意力。 因此,我们同时使用平均池化和最大池化特征。 我们凭经验证实,利用这两个特征可以极大地提高网络的表示能力,而不是单独使用每个特征(参见第 4.1 节),这表明了我们设计选择的有效性。 下面我们描述详细操作。
我们首先使用平均池化和最大池化操作聚合特征图的空间信息,生成两个不同的空间上下文描述符:Fc avg 和 Fc max,分别表示平均池化特征和最大池化特征。 然后,这两个描述符都被转发到共享网络以生成我们的通道注意力图 Mc ∈ RC×1×1。 共享网络由具有一个隐藏层的多层感知器(MLP)组成。 为了减少参数开销,隐藏激活大小设置为 RC/r×1×1,其中 r 是缩减比率。 将共享网络应用于每个描述符后,我们使用逐元素求和来合并输出特征向量。 简而言之,通道注意力计算如下:
其中 σ 表示 sigmoid 函数,W0 ∈ RC/r×C,W1 ∈ RC×C/r。 请注意,两个输入共享 MLP 权重 W0 和 W1,并且 ReLU 激活函数后面跟着 W0。
Spatial attention module.
我们利用特征的空间关系生成空间注意力图。 与通道注意力不同,空间注意力关注的是“哪里”,这是信息性的部分,与通道注意力是互补的。 为了计算空间注意力,我们首先沿着通道轴应用平均池化和最大池化操作并将它们连接起来以生成有效的特征描述符。 沿着通道轴应用池化操作被证明可以有效地突出显示信息区域[34]。 在级联特征描述符上,我们应用卷积层来生成空间注意力图 Ms(F) ∈ RH×W,它对强调或抑制的位置进行编码。 下面我们描述详细操作。
我们通过使用两个池化操作来聚合特征图的通道信息,生成两个2D图:Fs avg ∈ R1×H×W 和 Fs max ∈ R1×H×W。 每个表示整个通道的平均池化特征和最大池化特征。 然后,它们通过标准卷积层连接和卷积,生成我们的 2D 空间注意力图。 简而言之,空间注意力计算如下:
其中σ表示sigmoid函数,f7×7表示滤波器尺寸为7×7的卷积运算。
Arrangement of attention modules.
给定输入图像,两个注意力模块(通道和空间)计算互补注意力,分别关注“什么”和“哪里”。 考虑到这一点,两个模块可以并行或顺序放置。 我们发现顺序排列比并行排列提供更好的结果。 对于顺序过程的安排,我们的实验结果表明,通道优先顺序略好于空间优先顺序。 我们将在4.1部分讨论网络工程的实验结果。
4 Experiments
我们在标准基准上评估 CBAM:用于图像分类的 ImageNet-1K; 用于物体检测的 MS COCO 和 VOC 2007。 为了进行更好的比较,我们在 PyTorch 框架 [36] 中重现了所有评估的网络 [5,6,7,35,28],并在整个实验中报告了我们重现的结果。
为了彻底评估最终模块的有效性,我们首先进行广泛的消融实验。 然后,我们验证 CBAM 优于所有没有附加功能的基线,证明了 CBAM 在不同架构以及不同任务中的普遍适用性。 人们可以将 CBAM 无缝集成到任何 CNN 架构中,并联合训练组合的 CBAM 增强网络。 图3以ResNet[5]中CBAM与ResBlock集成的示意图为例。
4.1 Ablation studies
在本小节中,我们根据经验展示了我们设计选择的有效性。 对于这项消融研究,我们使用 ImageNet-1K 数据集并采用 ResNet-50 [5] 作为基础架构。 ImageNet-1K 分类数据集 [1] 包含 120 万张用于训练的图像和 50,000 张用于使用 1,000 个对象类进行验证的图像。 我们采用与[5,37]相同的数据增强方案进行训练,并在测试时应用尺寸为224×224的单作物评估。 学习率从 0.1 开始,每 30 个 epoch 下降。 我们对网络进行 90 轮训练。 按照[5,37,38],我们报告了验证集上的分类错误。
我们的模块设计过程分为三个部分。 我们首先寻找计算通道注意力的有效方法,然后是空间注意力。 最后,我们考虑如何结合通道和空间注意力模块。 我们在下面解释每个实验的细节。
Channel attention.
我们通过实验验证,使用平均池化和最大池化特征可以实现更精细的注意力推理。 我们比较了通道注意力的 3 种变体:平均池化、最大池化以及两种池化的联合使用。 请注意,具有平均池化的通道注意模块与 SE [28] 模块相同。 此外,当使用这两个池化时,我们使用共享 MLP 进行注意力推理以保存参数,因为两个聚合通道特征都位于相同的语义嵌入空间中。 我们在本实验中仅使用通道注意力模块,并将缩减比率固定为 16。
各种池化方法的实验结果如表 1 所示。我们观察到,最大池化特征与平均池化特征一样有意义,比较了相对于基线的准确性改进。 然而,在 SE [28] 的工作中,他们只利用了平均池化特征,忽略了最大池化特征的重要性。 我们认为,对最显着部分的程度进行编码的最大池化特征可以补偿对全局统计数据进行软编码的平均池化特征。 因此,我们建议同时使用这两个功能,并对这些功能应用共享网络。 然后通过逐元素求和来合并共享网络的输出。 我们凭经验表明,我们的通道注意力方法是一种有效的方法,可以在不需要额外的可学习参数的情况下进一步提高 SE [28] 的性能。 作为一个简短的结论,我们在通道注意力模块中同时使用平均池化特征和最大池化特征,并在以下实验中减少比率为 16。
Spatial attention.
考虑到通道方面的细化特征,我们探索了一种计算空间注意力的有效方法。 设计理念与通道注意力分支对称。 为了生成 2D 空间注意力图,我们首先计算一个 2D 描述符,该描述符对所有空间位置上每个像素的通道信息进行编码。 然后,我们将一个卷积层应用于 2D 描述符,获得原始注意力图。 最终的注意力图通过 sigmoid 函数进行归一化。
我们比较了生成 2D 描述符的两种方法:使用跨通道轴的平均池化和最大池化的通道池化以及将通道维度减少为 1 的标准 1×1 卷积。此外,我们研究了内核大小在 接下来的卷积层:内核大小为3和7。在实验中,我们将空间注意模块放置在先前设计的通道注意模块之后,因为最终目标是一起使用这两个模块。
表2显示了实验结果。 我们可以观察到通道池化产生了更好的准确性,这表明显式建模的池化比可学习的加权通道池化(实现为 1 × 1 卷积)可以带来更精细的注意力推理。 在比较不同的卷积核大小时,我们发现采用较大的卷积核大小在两种情况下都会产生更好的精度。 这意味着需要广阔的视野(即大的感受野)来决定空间上重要的区域。 考虑到这一点,我们采用通道池方法和大核尺寸的卷积层来计算空间注意力。 简而言之,我们使用通道轴上的平均和最大池化特征(卷积核大小为 7)作为我们的空间注意力模块。
Arrangement of the channel and spatial attention.
在本实验中,我们比较了排列通道和空间注意子模块的三种不同方式:顺序通道空间、顺序空间通道以及两个注意模块的并行使用。 由于每个模块的功能不同,顺序可能会影响整体性能。 例如,从空间角度来看,通道注意力是全局应用的,而空间注意力是局部作用的。 此外,我们很自然地认为我们可以结合两个注意力输出来构建 3D 注意力图。 在这种情况下,两个注意力可以并行应用,然后将两个注意力模块的输出相加并用 sigmoid 函数进行归一化。
表3总结了不同注意力安排方法的实验结果。 从结果中,我们可以发现顺序生成注意力图比并行生成更精细的注意力图。 此外,通道一阶的性能略好于空间一阶。 请注意,所有排列方法都优于仅独立使用通道注意力的方法,这表明利用两种注意力至关重要,而最佳排列策略进一步提升性能。
4.2 Image Classification on ImageNet-1K
我们进行 ImageNet-1K 分类实验来严格评估我们的模块。 我们遵循第 2 节中指定的相同协议。 4.1 并在各种网络架构中评估我们的模块,包括 ResNet [5]、WideResNet [6] 和 ResNext [7]。
表 4 总结了实验结果。 使用 CBAM 的网络显着优于所有基线,这表明 CBAM 可以在大规模数据集中的各种模型上很好地泛化。 此外,带有 CBAM 的模型提高了最强方法之一——SE [28]的准确性,SE [28] 是 ILSVRC 2017 分类任务的获胜方法。 这意味着我们提出的方法是强大的,显示了新池方法的功效,该方法生成更丰富的描述符和空间注意力,有效补充通道注意力。
我们还发现,CBAM 在参数和计算方面的总体开销都很小。 这促使我们将我们提出的模块 CBAM 应用于轻量级网络 MobileNet [35]。 表 5 总结了我们基于 MobileNet 架构进行的实验结果。 我们将CBAM放置在两个模型中,基本模型和容量缩减模型(即将宽度乘数(α)调整为0.7)。 我们观察到类似的现象,如表4所示。CBAM不仅显着提高了基线的准确性,而且还有利地提高了SE的性能[28]。 这显示了CBAM在低端设备上应用的巨大潜力。
4.3 Network Visualization with Grad-CAM [18]
对于定性分析,我们使用 ImageNet 验证集中的图像将 Grad-CAM [18] 应用于不同的网络。 Grad-CAM 是最近提出的一种可视化方法,它使用梯度来计算卷积层中空间位置的重要性。 由于梯度是针对特定类别计算的,因此 Grad-CAM 结果清楚地显示了参与区域。 通过观察网络认为对预测类别重要的区域,我们尝试了解该网络如何充分利用特征。 我们将 CBAM 集成网络 (ResNet50 + CBAM) 的可视化结果与基线 (ResNet50) 和 SE 集成网络 (ResNet50 + SE) 进行比较。 图 4 展示了可视化结果。 图中还显示了目标类别的 softmax 分数
在图4中,我们可以清楚地看到CBAM集成网络的Grad-CAM掩模比其他方法更好地覆盖了目标对象区域。 也就是说,CBAM 集成网络能够很好地学习利用目标对象区域中的信息并从中聚合特征。 请注意,目标班级分数也会相应增加。
4.4 Quantitative evaluation of improved interpretability
遵循 Grad-CAM 论文中的 Sec.5.1,我们进行了基于 Grad-CAM 可视化的用户研究。 我们从 ImageNet 验证集中随机选择了 50 张使用两种方法(即基线和 CBAM)正确分类的图像。 用户研究是在 Google Forms 平台上进行的。 对于每个问题,都会向受访者显示随机排列的可视化结果。 对于可视化,显示了 Grad-CAM 值为 0.6 或更大的图像区域。 在实践中,受访者获得了每种方法的完整输入图像、真实标签和两个图像区域(见图 5)。 比较标准是“给定类别标签,哪个区域似乎更具类别歧视性?”。 受访者可以选择其中一个更好,或者两者相似。 有 50 组图像和 25 名受访者,总共 1250 票。 结果如表 6 所示。我们可以清楚地看到 CBAM 优于基线,显示出可解释性的提高。
4.5 MS COCO Object Detection
我们在 Microsoft COCO 数据集 [3] 上进行对象检测。 该数据集涉及 80k 训练图像(“2014 train”)和 40k 验证图像(“2014 val”)。 使用 0.5 到 0.95 不同 IoU 阈值的平均 mAP 进行评估。 根据 [39,40],我们使用所有训练图像以及验证图像的子集来训练我们的模型,并提供 5,000 个示例进行验证。 我们的训练代码基于 [41],我们训练网络进行 49 万次迭代,以实现快速性能验证。 我们采用 Faster-RCNN [42] 作为我们的检测方法,并采用 ImageNet 预训练的 ResNet50 和 ResNet101 [5] 作为我们的基线网络。 在这里,我们感兴趣的是通过将 CBAM 插入基线网络来提高性能。 由于我们在所有模型中使用相同的检测方法,因此增益只能归因于我们的模块 CBAM 给出的增强的表示能力。 如表 7 所示,我们观察到相对于基线的显着改进,证明了 CBAM 在其他识别任务上的泛化性能。
4.6 VOC 2007 Object Detection
我们进一步在PASCAL VOC 2007测试集上进行实验。 在本实验中,我们将 CBAM 应用于检测器,而之前的实验(表 7)将我们的模块应用于基础网络。 我们采用StairNet [30]框架,它是基于SSD [40]的最强的多尺度方法之一。 在实验中,我们在 PyTorch 平台中重现了 SSD 和 StairNet,以准确估计 CBAM 的性能改进,并分别达到 77.8% 和 78.9% mAP@.5,这高于原始论文中报告的原始精度。 然后,我们将 SE [28] 和 CBAM 放在每个分类器之前,在预测之前细化由上采样全局特征和相应局部特征组成的最终特征,强制模型自适应地仅选择有意义的特征。 我们在 VOC 2007 trainval 和 VOC 2012 trainval (“07+12”) 的并集上训练所有模型,并在 VOC 2007 测试集上进行评估。 训练周期总数为 250。我们使用 0.0005 的权重衰减和 0.9 的动量。 在所有实验中,为了简单起见,输入图像的大小固定为 300。
实验结果总结在表8中。我们可以清楚地看到,CBAM提高了具有两个骨干网络的所有强基线的准确性。 请注意,CBAM 精度的提高带来的参数开销可以忽略不计,这表明增强不是由于简单的容量增量,而是由于我们有效的特征细化。 此外,使用轻量级骨干网络[35]的结果再次表明CBAM对于低端设备来说可能是一种有趣的方法。
5 Conclusion
我们提出了卷积块注意力模块(CBAM),这是一种提高 CNN 网络表示能力的新方法。 我们通过两个独特的模块(通道和空间)应用基于注意力的特征细化,并在保持较小开销的同时实现了相当大的性能改进。 对于通道注意力,我们建议使用最大池化特征和平均池化特征,从而产生比 SE [28] 更好的注意力。 我们通过利用空间注意力进一步提高性能。 我们的最终模块(CBAM)学习什么以及在哪里强调或抑制,并有效地细化中间特征。 为了验证其功效,我们使用各种最先进的模型进行了广泛的实验,并确认 CBAM 在三个不同基准数据集上的性能优于所有基线:ImageNet1K、MS COCO 和 VOC 2007。此外,我们还可视化了该模块如何 准确推断给定的输入图像。 有趣的是,我们观察到我们的模块诱导网络正确地关注目标对象。 我们希望CBAM成为各种网络架构的重要组成部分。
code
CBAM.PyTorch/model/resnet_cbam.py at master · luuuyi/CBAM.PyTorch
class ChannelAttention(nn.Module):
def __init__(self, in_planes, ratio=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.fc = nn.Sequential(nn.Conv2d(in_planes, in_planes // 16, 1, bias=False),
nn.ReLU(),
nn.Conv2d(in_planes // 16, in_planes, 1, bias=False))
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = self.fc(self.avg_pool(x))
max_out = self.fc(self.max_pool(x))
out = avg_out + max_out
return self.sigmoid(out)
class SpatialAttention(nn.Module):
def __init__(self, kernel_size=7):
super(SpatialAttention, self).__init__()
self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, 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)
x = torch.cat([avg_out, max_out], dim=1)
x = self.conv1(x)
return self.sigmoid(x)