简单高效的模型小挂件——CBAM

论文传送门: CBAM: Convolutional Block Attention Module
代码(Pytorch): https://github.com/Jongchan/attention-module

Content

Introduction
Convolutional Block Attention Module

Experiment

Conclusion

Introduction

卷积神经网络发展到现在, 各路大佬主要在网络的三个重要的维度发光发热——深度(depth), 宽度(width), 基数(cardinality*). VGG通过不断堆叠多个相同的模块获得深层网络; ResNet 巧妙地通过 residual blocks 和 skip connection 构造出更深的网络; 而 GoogLeNet 注意到了 width 这个重要的因素; Xception 和ResNext 则是不断增加网络的 cardinality. 后者不仅能减少参数, 还能拥有比前两者更好的表达能力. 这次作者则从另一个截然不同的角度 attention 提出了 CBAM 这个可以在模型中即插即用的小模块.
cardinality*: 这个概念在 ResNeXt 的论文中被提出, 定义为the size of the set of transformations, 在 ResNext 中指其 block 的分支数量.

在这里插入图片描述

这是一篇 ECCV2018 的的论文, CBAM 即是 Convolutional Block Attention Module, 分别通过 channel 和 spatial 两个轴增强特征图中的有用特征, 并且抑制无用特征, 从而告诉模型应该注意哪个区域. 人在第一眼接触图像时, 视觉系统并不会马上处理全局的信息, 而是会选择性地关注一些突出的局部信息. 比如一张小狗躺在草地上的照片, 人第一眼看去不会发现草地上哪根草是竖起来的, 哪根是弯下去的, 而是会选择性地先观察哪只小狗长什么样. 所以 attention 的设计合情合理.
先前的 Residual Attention Network 使用了 encoder-decoder 方式的 attention 模块重定义 feature map (就像食品再加工那样), 不但性能很好, 还有不错的鲁棒性. 而 CBAM 则是通过从 channel 和 spatial 两个维度分解上面的过程得到的, 且能做到在其他网络中即插即用.

Convolutional Block Attention Module

先设 feature map 为 F ϵ R C ∗ H ∗ W F \epsilon R^{C *H*W} FϵRCHW , CBAM依次推断出一个一维 attention map: M c ϵ R C ∗ 1 ∗ 1 M_c \epsilon R^{C*1*1} McϵRC11 和一个二维的 spatial map: M c ϵ R 1 ∗ H ∗ W M_c \epsilon R^{1*H*W} McϵR1HW, 整体的数学公式为:
在这里插入图片描述

两条公式分别是 channel attention 和 spatial attention 操作. 其中 ⨂ \bigotimes 表示 element-wise multiplication , 即对应元素相乘. 这个也很好理解, 重要的区域给他乘一个大一点的数, 不重要的就乘一个小一点的数. F F F 经过重定义后得到 F ′ ′ F'' F. 接下来分开看下 channel 和 spatial 两个维度的具体操作.

在这里插入图片描述

Channel attention module

channel attention 主要关注输入特征图中 ‘what’ is meaningful , 并且计算其各个 channel 之间的内在关系. 为了集成每个channel 上的空间信息, 对 input feature F F F 使用了常规的 average-pooling 并得到 F a v g c F^c_{avg} Favgc; 同时为了获得 object 更精细的特征而使用常规 max-pooling 并得到 F m a x c F^c_{max} Fmaxc. 如上图, 接着将 F a v g c F^c_{avg} Favgc F m a x c F^c_{max} Fmaxc 接入一个 shared network 中, 由只有一层隐藏层的多层感知机(MLP)构成. 为减少参数, 将 Shared MLP 的中间那层的大小设为 R C / r ∗ 1 ∗ 1 R^{C/r*1*1} RC/r11 (r 是一个衰减比率). 然后将经过 Shared MLP 后的 n e w _ F a v g c new\_F^c_{avg} new_Favgc n e w _ F m a x c new\_F^c_{max} new_Fmaxc 进行 element-wise summation (对应元素相加)得到 Channel Attention. channel attention map 表示的其实是特征图的各个 channel 之间的内在关系, 即哪些 channel 是值得关注的, 哪些 channel 是应该忽略的. 整个流程用公式表示为:
在这里插入图片描述

Spatial attention module

spatial attention 探讨的则是在空间层面 feature map 的内在关系, 即哪些区域是重要的, 哪些是不重要的, 算是 channel attention 的互补方法. 算法上要更简单些, 为了得到 feature map 的通道信息, 先同时沿着 channel axis 对其进行 average-pooling 和 max-pooling 操作分别得到 F a v g s ϵ R 1 ∗ H ∗ W F^s_{avg} \epsilon R^{1*H*W} FavgsϵR1HW F m a x s ϵ R 1 ∗ H ∗ W F^s_{max} \epsilon R^{1*H*W} FmaxsϵR1HW, 然后将二者 concatenate, 接着经过一个标准卷积层就得到了, spatial attention map. 公式表示为:
在这里插入图片描述

Arrangement of attention modules

经实验, 作者发现将 channel attention 和 spatial attention 级联的性能会比并行的好, 且在级联时把 channel attention 放在前面效果会更好.
在这里插入图片描述

Experiment

作者选择在 ImageNet-1K 上验证分类性能, 在 MS COCO 和 VOC 2007 上验证检测性能.

Image Classification on ImageNet-1K在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这几个实验都验证了上面算法设计思路的正确性.
在这里插入图片描述
在这里插入图片描述

MS COCO and VOC 2007 Object Detection

在这里插入图片描述

Conclusion

从人眼视觉的注意力机制出发, 作者设计了一个 convolutional bottleneck attention module (CBAM) 对特征进行增强或者抑制, 提高了模型的特征表达能力 . CBAM 由 channel attention module 和 spatial attention module 级联构成, 在提升模型性能的同时还保持了较小的开销.