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篇论文
- 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) - Hu, J., Shen, L., Sun, G.: Squeeze-and-excitation networks. arXiv preprint
arXiv:1709.01507 (2017) - 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

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





