导读
之前介绍了 CBAM 模块,可以方便的添加到自己的网络模型中,代码比较简单容易理解。CBAM 模块的实现是通过先后施加通道注意力和空间注意力完成信息的提炼。今天介绍的这篇文章也是来自 CBAM 团队,可以理解为空间注意力机制和通道注意力机制的并联,但是具体实现与 CBAM 有较大差别,虽然代码量相对而言比较大,实际表达的内容并不复杂。
BAM
BAM 全程是 bottlenect attention module,与 CBAM 很相似的起名,还是 CBAM 的团队完成的作品。CBAM 被 ECCV18 接收,BAM 被 BMVC18 接收。CBAM 可以看做是通道注意力机制和空间注意力机制的串联(先通道后空间),BAM 可以看做两者的并联。
这个模块之所以叫 bottlenect 是因为这个模块放在 DownSample 也就是 pooling layer 之前,如下图所示:
由于该论文与CBAM 模块的理论部分极为相似,下边直接进行算法实现部分。
2. 通道部分的实现
看上去代码要比 CBAM 中的 ChannelAttention 模块要多很多,贴上 ChannelAttention 代码方便对比:
首先讲 ChannelGate 的处理流程:
- 使用 avg_pool2d 测试
其效果与 AdaptiveAvgPool2d(1) 是一样的。
- 然后经过 gate_c 模块,里边先经过 Flatten 将其变为 [batch size, channel] 形状的 tensor, 然后后边一大部分都是 Linear 模块,进行线性变换。(ps: 虽然代码看上去多,但是功能很简单)这个部分与 SE 模块有一点相似,但是可以添加多个 Linear 层,蕴含的信息要更丰富一点。
- 最终按照输入 tensor x 的形状进行扩展,得到关于通道的注意力。
然后讲一下与 CBAM 中的 channel attention 的区别:
- CBAM 中使用的是先用 adaptiveAvgPooling,然后进行卷积实现的通道处理;BAM 使用的也是 adaptiveAvgPooling, 然后进行多个 Linear 线性变换,得到 channel attention。其实关于用 1×1 卷积和 Linear 层实现,在 feature map 尺寸为 1×1 的时候,两者从数学原理上讲,没有区别。
- CBAM 中激活函数使用 sigmoid, BAM 中的通道部分使用了 ReLU,还添加了 BN 层。
3. 空间注意力机制
这里可以看出,代码量相比 CBAM 中的 spatial attention 要大很多,依然进行对比:
这个部分空间注意力处理就各有特色了,先说一下 BAM 中的流程:
- 先经过一个 conv+bn+relu 模块,通道缩进,信息进行压缩。
- 然后经过了多个 dilated conv+bn+relu 模块,空洞率设置为 4(默认)。
- 最后经过一个卷积,将通道压缩到 1。
- 最终将其扩展为 tensor x 的形状。
区别在于:
- CBAM 中通过通道间的 max,avg 处理成通道数为 2 的 feature, 然后通过卷积 + Sigmoid 得到最终的 map
- BAM 中则全部通过卷积或者空洞卷积完成信息处理,计算量更大一点, 但是融合了多感受野,信息更加丰富。
4. BAM 融合
最终融合很简单,需要注意的就是两者是相乘的,并且使用了 sigmoid 进行归一化。
本文暂时没有评论,来添加一个吧(●'◡'●)