计算机视觉中的注意力模块———CBAM

本文介绍CBAM(卷积块注意模块),一种用于增强卷积神经网络表现力的attention机制。CBAM通过channel和spatial两个维度自适应地精炼特征映射,能够轻松集成到任意CNN架构中。文中详细解释了其工作原理,并提供了PyTorch实现代码。

CBAM: Convolutional Block Attention Module

本篇文章录用于ECCV2018:CBAM:卷积块注意模块
论文地址:https://arxiv.org/pdf/1807.06521.pdf
非官方代码实现:https://github.com/Youngkl0726/Convolutional-Block-Attention-Module/blob/master/CBAMNet.py
摘要:

本文提出了卷积attention模块,一种简单而有效的前馈卷积神经网络attention模块。给定一个中间特征映射,我们的模块沿着channel和spatial这两个不同的维度按顺序输入attention映射,然后将attention映射乘以输入特征映射以进行自适应特征细化。因为CBAM是一个轻量级的通用模块,所以它可以无缝地集成到任何CNN架构中,具有可以忽略不计的开销,并且可以与基本的CNN一起进行端到端训练。我们通过对ImageNet-1K分类数据集、MSCOCO和VOC2007检测数据集的广泛实验验证了我们的CBAM。我们的实验表明,对不同模型的分类和检测性能的一致改进,证明了CBAM的广泛适用性。

Contribution

作者说明这篇文章中主要有以下三个贡献:

  • 提出了一个有效的attention模块CBAM,可以有效的提高CNN的表达能力;
  • 通过广泛的消融研究来验证attention模块的有效性;
  • 通过引入我们的轻量级CBAM模块,验证了各种网络的性能,在多个基准(Image Net-1K、MSCOCO和VOC2007)上性能有了很大的提高。
Attention mechanism

这里总结了2017年发表的3篇论文

  1. Wang, F., Jiang, M., Qian, C., Yang, S., Li, C., Zhang, H., Wang, X.,
    Tang, X.: Residual attention network for image classification. arXiv preprint
    arXiv:1704.06904 (2017)
  2. Hu, J., Shen, L., Sun, G.: Squeeze-and-excitation networks. arXiv preprint
    arXiv:1709.01507 (2017)
  3. Chen, L., Zhang, H., Xiao, J., Nie, L., Shao, J., Chua, T.S.: Sca-cnn: Spatial and
    channel-wise attention in convolutional networks for image captioning. In: Proc.
    of Computer Vision and Pattern Recognition (CVPR). (2017)
CBMA模块

在这里插入图片描述
在这里插入图片描述

用Pytorch代码表示:


import torch
import torch.nn as nn

class CBAM_Module(nn.Module):

    def __init__(self, channels, reduction):
        super(CBAM_Module, self).__init__()
        # 定义全局avg池化,输出的通道数output_size = 1,即输出channel =  1
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        # 定义全局max池化。输出的通道数output_size = 1,即输出channel = 1
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        # 定义两层的感知机MLP,中间含有一个线性激活函数relu
        # reduction表示的是压缩feature map通道的倍数
        self.fc1 = nn.Conv2d(channels, channels // reduction, kernel_size=1,
                             padding=0)
        self.relu = nn.ReLU(inplace=True)
        self.fc2 = nn.Conv2d(channels // reduction, channels, kernel_size=1,
                             padding=0)
        # 线性激活sigmod得到最后的通道注意力
        self.sigmoid_channel = nn.Sigmoid()
        ## 压缩通道数
        self.conv_after_concat = nn.Conv2d(2,1,kernel_size=3,stride=1,padding=1)
        self.sigmoid_spatial = nn.Sigmoid()

    def forward(self, x):  # exsample x.size() = [8,128,64,64]
        # Channel attention module
        module_input = x
        # avg全局池化+MLP
        avg = self.avg_pool(x)     # [8,128,1,1]
        avg = self.fc1(avg)     # reduction= 16 [8,8,1,1]
        avg = self.relu(avg)   # [8,8,1,1]
        avg = self.fc2(avg)   # [8,128,1,1]
        
        # max全局池化+MLP
        mx = self.max_pool(x)   # [8,128,1,1]
        mx = self.fc1(mx)    # reduction= 16 [8,8,1,1]
        mx = self.relu(mx)  # [8,8,1,1]
        mx = self.fc2(mx)   # [8,128,1,1]
        # 元素加法
        x = avg + mx
        ## 线性激活
        x = self.sigmoid_channel(x)

		# Spatial attention module
        # module_input表示输入特征图,x表示根据channel attention模块得到的channel-refined 特征图
        x = module_input * x
        module_input = x 
        ## avg pool 不是全局的,调用torch.mean
        avg = torch.mean(x, 1, True)
        ## max pool 不是全局的,调用torch.max
        mx, _ = torch.max(x, 1, True)
        # 在dim=1 上进行拼接
        x = torch.cat
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值