不定期读一篇Paper之CBAM

不定期读一篇Paper之CBAM

前言

​   本论文针对先前对通道注意力或者空间注意力机制,提出了一个简单又有效的注意力机制模块,该模块既注意关注通道方面,使得网络知道“what”,又针对空间方面,使得网络知道"where",两面进行调整。此外,CBAM是一个轻量化且通用的模块,它可以被整合到任何CNN架构的网络中,并且可以进行端对端的训练。

框架

​   CBAM有两个注意力模块:通道和空间,它们按照次序通道->空间,当然理论上也可以平行或空间->通道的连接方法,但是,作者在实验上证明通道->空间的次序连接的性能较好。下图是连接关系图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ejyznrv-1585816623883)(./imgs/module.png)]

​ 下面首先针对通道和空间子模块进行分析。

  • 通道注意力模块(what)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tGAf2Mdm-1585816623884)(./imgs/channel.png)]

    ​   首先,由于特征图中,不同通道feature map刻画特征不同,所以,通道注意力机制关注对于一张图片中有意义的"what"。在计算方面,输入一个特征图F,分别在空间上进行最大池化和平均池化,保持通道维度不变,然后分别送入一个共享的全连接网络,,最后把通过共享全连接两个模块相加后,送入Sigmoid函数中,得到通道注意力模块。

    Pytorch代码

    class ChannelAttention(nn.Module):
        
        def __init__(self, in_planes, rotio = 16):
            """
            in_planes : 输入通道
            rotio : 缩减率
            """
            
            super(ChannelAttention, self).__init__()
            self.avg_pool = nn.AdaptiveAvgPool2d(1)
            self.max_pool = nn.AdaptiveMaxPool2d(1)
            
            self.shareMLP = 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):
            avgout = self.shareMLP(self.avg_pool(x))
            maxout = self.shareMLP(self.max_pool(x))
            
            return self.Sigmoid(avgout + maxout)
    

    可视化模块结构

    ----------------------------------------------------------------
            Layer (type)               Output Shape         Param #
    ================================================================
     AdaptiveAvgPool2d-1             [1, 256, 1, 1]               0
                Conv2d-2              [1, 16, 1, 1]           4,096
                  ReLU-3              [1, 16, 1, 1]               0
                Conv2d-4             [1, 256, 1, 1]           4,096
     AdaptiveMaxPool2d-5             [1, 256, 1, 1]               0
                Conv2d-6              [1, 16, 1, 1]           4,096
                  ReLU-7              [1, 16, 1, 1]               0
                Conv2d-8             [1, 256, 1, 1]           4,096
               Sigmoid-9             [1, 256, 1, 1]               0
    ================================================================
    
  • 空间注意力模块(where)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FWWwbqul-1585816623885)(./imgs/spatial.png)]

    ​   为了与通道注意力互补,空间注意力模块主要关注“where”的部分。为了计算首先,使用了全局最大池化和全局平均池化在保持H和W不变的情况下针对通道进行池化,让后,把两个结果拼接后,送入一个标准的卷积层,最后,通过sigmoid函数,得到空间注意力模块。

    Pytorch代码

    class SpatialAttention(nn.Module):
        
        def __init__(self, kernel_size = 7):
            
            super(SpatialAttention, self).__init__()
            assert kernel_size in (3, 7)
            padding = 3  if kernel_size == 7 else 1 
            
            self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
            self.sigmoid = nn.Sigmoid()
            
        def forward(self, x):
            
            # 平均池化(在通道上进行均值,且保持四个维度)
            avgout = t.mean(x, dim = 1, keepdim = True)
            
            # 最大池化(在通道上进行最大值,且保持四个维度)
            maxout, _ = t.max(x, dim = 1, keepdim = True)
            
            # 拼接
            x = t.cat([avgout, maxout], dim=1)
            x = self.conv(x)
            
            return self.sigmoid(x)
    

    可视化模块结构

    ----------------------------------------------------------------
            Layer (type)               Output Shape         Param #
    ================================================================
                Conv2d-1           [1, 1, 224, 224]              98
               Sigmoid-2           [1, 1, 224, 224]               0
    ===============================================================
    

实验

​    作者在不同的网络中加入了CBAM模块,都证明其能有效的提升网络的性能和准确率,下图是作者在ResNet50加入SE模块和CBAM模块,进行Grad-CAM可视化的结果,其中p值代表所输入图像中的目标在最后的softmax中判别为该类的可能性。由下图,可以看出,加入CBAM模块后,网络注意力更加的全面,并且其判别准确率显著的提升。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zB3c6Jdo-1585816623886)(./imgs/热力图.png)]

结论

​   CBAM是一个非常好的注意力模块,融合空间和通道信息,使我们让网络关注输入图像的“what”和“where”两个方面的信息,当然由于其通用性,其可以嵌入任何CNN网络中,且效果明显,所以个人认为这是一篇不错的paper。最后,本文在表述上难免有不准确的地方,建议感兴趣的可以读原文。

参考

论文地址

pytorch 代码(非官方)

【CV中的Attention机制】易于集成的Convolutional Block Attention Module(CBAM模块)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一维CBAM的Keras实现示例代码: ```python from keras.layers import Input, Dense, Conv1D, Activation, Multiply, Add, GlobalAveragePooling1D, Reshape from keras.models import Model import keras.backend as K def cbam_block(cbam_feature, ratio=8): # 通道注意力机制 channel_feature = GlobalAveragePooling1D()(cbam_feature) channel_feature = Reshape((1, cbam_feature.shape[2]))(channel_feature) channel_feature = Dense(units=cbam_feature.shape[2] // ratio, activation='relu', kernel_initializer='he_normal', use_bias=True, bias_initializer='zeros')(channel_feature) channel_feature = Dense(units=cbam_feature.shape[2], activation='sigmoid', kernel_initializer='he_normal', use_bias=True, bias_initializer='zeros')(channel_feature) channel_feature = Reshape((1, cbam_feature.shape[2]))(channel_feature) cbam_feature = Multiply()([cbam_feature, channel_feature]) # 空间注意力机制 spatial_feature = Conv1D(filters=1, kernel_size=7, padding='same', activation='sigmoid', kernel_initializer='he_normal', use_bias=False)(cbam_feature) cbam_feature = Multiply()([cbam_feature, spatial_feature]) return cbam_feature inputs = Input(shape=(None, 128)) # 假设输入是长度为128的一维信号 x = Conv1D(filters=64, kernel_size=3, padding='same')(inputs) x = cbam_block(x) x = Conv1D(filters=64, kernel_size=3, padding='same')(x) x = cbam_block(x) x = Conv1D(filters=128, kernel_size=3, padding='same')(x) x = cbam_block(x) outputs = Dense(units=10, activation='softmax')(x) # 假设输出是10个类别的概率 model = Model(inputs=inputs, outputs=outputs) ``` 其中,`cbam_block`函数实现了一维CBAM模块。在该函数中,首先实现了通道注意力机制,计算通道维度上的平均值,然后通过两个全连接层计算出通道注意力权重,最后将该权重与输入特征相乘得到加强后的特征。接着实现了空间注意力机制,通过卷积层计算出每个位置的空间注意力权重,同样将该权重与输入特征相乘得到加强后的特征。最后将通道注意力和空间注意力的结果相乘得到最终的特征。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值