CBAM: Convolutional Block Attention Module

CBAM: Convolutional Block Attention Module

网址:https://arxiv.org/pdf/1807.06521.pdf

Introduction

本文主要工作:

        1))改进了se-net中学习channel权重的方式

        2)提出一种学习空间位置重要性的方法

方法的出发点:

        1)当前学习channel权重的方法多采用average pooling,本文同时使用average和max poling,增强空间特征的表达;

        2)空间attention机制中,本文希望区别出不同位置的重要性关系。

Method

1.CBAM的主要结构

CBAM: Convolutional Block Attention Module

2.channel attention

为了得到通道维度的attention,我们先要在空间维度进行squeeze(具体参照SE-Net)操作,使空间h*w的特征降维到1*1。如何聚合空间维度的特征?长期以来大家都适用average pooling,但我们认为也可以使用max-pooling来进一步区分特征。

具体步骤:同时使用average-pooling和max-pooling聚合空间维度特征,产生两个空间维度描述符:CBAM: Convolutional Block Attention Module,随后经MLP(2层fc+**+sigmoid层,和SE-Net相同,只是squeeze操作多了一步max pooling),为每个通道产生权重,最后将权重与原始未经channel attention相乘,公式:

CBAM: Convolutional Block Attention Module CBAM: Convolutional Block Attention Module

如果之前理解过SE-Net,这一部分看起来还是很简单的~

3)spatial attention

同样采用max和average pooling操作,但是在channel维度执行,为了使原始特征中c维的通道数,降到1维度,从而学习空间attention。公式:

CBAM: Convolutional Block Attention Module

直接上这部分代码:

CBAM: Convolutional Block Attention Module

对于输入的特征x,先经self.compress()操作,也就是对应的ChannelPool,具体看ChannelPool,发现就是在dim=1(channel维度)执行了max和mean操作,然后又在channel维度concat两次操作的输出。随后执行卷积,因为上面的concat会使输出特征的channel是原始特征channel的两倍,所以这里的卷积有channel维度下降的作用。最后经sigmoid为每个空间点得到0-1之间的权重分数。

3)结合空间和channel attention

作者认为顺序链接两个attention效果最好,但两者的先后顺序值得探究。

4)将CBAM接在resnet中

是接在了每个block的残差分支中:

CBAM: Convolutional Block Attention Module

experiment

1)channel attention中average和max操作的结果

CBAM: Convolutional Block Attention Module

2)空间attenion中不同操作的组合

CBAM: Convolutional Block Attention Module

3)channel和空间attention的衔接

CBAM: Convolutional Block Attention Module

个人理解:

ucf101上实验了一下,效果不明显,涨点微小。可能是我个人的问题....也可能是任务不同吧