简单高效的模型小挂件——CBAM

论文传送门: CBAM: Convolutional Block Attention Module
代码(Pytorch): https://github.com/Jongchan/attention-module

Content

Introduction
Convolutional Block Attention Module

Experiment

Conclusion

Introduction

卷积神经网络发展到现在, 各路大佬主要在网络的三个重要的维度发光发热——深度(depth), 宽度(width), 基数(cardinality*). VGG通过不断堆叠多个相同的模块获得深层网络; ResNet 巧妙地通过 residual blocks 和 skip connection 构造出更深的网络; 而 GoogLeNet 注意到了 width 这个重要的因素; Xception 和ResNext 则是不断增加网络的 cardinality. 后者不仅能减少参数, 还能拥有比前两者更好的表达能力. 这次作者则从另一个截然不同的角度 attention 提出了 CBAM 这个可以在模型中即插即用的小模块.
cardinality*: 这个概念在 ResNeXt 的论文中被提出, 定义为the size of the set of transformations, 在 ResNext 中指其 block 的分支数量.

在这里插入图片描述

这是一篇 ECCV2018 的的论文, CBAM 即是 Convolutional Block Attention Module, 分别通过 channel 和 spatial 两个轴增强特征图中的有用特征, 并且抑制无用特征, 从而告诉模型应该注意哪个区域. 人在第一眼接触图像时, 视觉系统并不会马上处理全局的信息, 而是会选择性地关注一些突出的局部信息. 比如一张小狗躺在草地上的照片, 人第一眼看去不会发现草地上哪根草是竖起来的, 哪根是弯下去的, 而是会选择性地先观察哪只小狗长什么样. 所以 attention 的设计合情合理.
先前的 Residual Attention Network 使用了 encoder-decoder 方式的 attention 模块重定义 feature map (就像食品再加工那样), 不但性能很好, 还有不错的鲁棒性. 而 CBAM 则是通过从 channel 和 spatial 两个维度分解上面的过程得到的, 且能做到在其他网络中即插即用.

Convolutional Block Attention Module

先设 feature map 为 F ϵ R C ∗ H ∗ W F \epsilon R^{C *H*W} FϵRCHW , CBAM依次推断出一个一维 attention map: M c ϵ R C ∗ 1 ∗ 1 M_c \epsilon R^{C*1*1} McϵRC11 和一个二维的 spatial map: M c ϵ R 1 ∗ H ∗ W M_c \epsilon R^{1*H*W} McϵR1HW, 整体的数学公式为:
在这里插入图片描述

两条公式分别是 channel attention 和 spatial attention 操作. 其中 ⨂ \bigotimes 表示 element-wise multiplication , 即对应元素相乘. 这个也很好理解, 重要的区域给他乘一个大一点的数, 不重要的就乘一个小一点的数. F F F 经过重定义后得到 F ′ ′ F'' F. 接下来分开看下 channel 和 spatial 两个维度的具体操作.

在这里插入图片描述

Channel attention module

channel attention 主要关注输入特征图中 ‘what’ is meaningful , 并且计算其各个 channel 之间的内在关系. 为了集成每个channel 上的空间信息, 对 input feature F F F 使用了常规的 average-pooling 并得到 F a v g c F^c_{avg} Favgc; 同时为了获得 object 更精细的特征而使用常规 max-pooling 并得到 F m a x c F^c_{max} Fmaxc. 如上图, 接着将 F a v g c F^c_{avg} Favgc F m a x c F^c_{max} Fmaxc 接入一个 shared network 中, 由只有一层隐藏层的多层感知机(MLP)构成. 为减少参数, 将 Shared MLP 的中间那层的大小设为 R C / r ∗ 1 ∗ 1 R^{C/r*1*1} RC/r11 (r 是一个衰减比率). 然后将经过 Shared MLP 后的 n e w _ F a v g c new\_F^c_{avg} new_Favgc n e w _ F m a x c new\_F^c_{max} new_Fmaxc 进行 element-wise summation (对应元素相加)得到 Channel Attention. channel attention map 表示的其实是特征图的各个 channel 之间的内在关系, 即哪些 channel 是值得关注的, 哪些 channel 是应该忽略的. 整个流程用公式表示为:
在这里插入图片描述

Spatial attention module

spatial attention 探讨的则是在空间层面 feature map 的内在关系, 即哪些区域是重要的, 哪些是不重要的, 算是 channel attention 的互补方法. 算法上要更简单些, 为了得到 feature map 的通道信息, 先同时沿着 channel axis 对其进行 average-pooling 和 max-pooling 操作分别得到 F a v g s ϵ R 1 ∗ H ∗ W F^s_{avg} \epsilon R^{1*H*W} FavgsϵR1HW F m a x s ϵ R 1 ∗ H ∗ W F^s_{max} \epsilon R^{1*H*W} FmaxsϵR1HW, 然后将二者 concatenate, 接着经过一个标准卷积层就得到了, spatial attention map. 公式表示为:
在这里插入图片描述

Arrangement of attention modules

经实验, 作者发现将 channel attention 和 spatial attention 级联的性能会比并行的好, 且在级联时把 channel attention 放在前面效果会更好.
在这里插入图片描述

Experiment

作者选择在 ImageNet-1K 上验证分类性能, 在 MS COCO 和 VOC 2007 上验证检测性能.

Image Classification on ImageNet-1K在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这几个实验都验证了上面算法设计思路的正确性.
在这里插入图片描述
在这里插入图片描述

MS COCO and VOC 2007 Object Detection

在这里插入图片描述

Conclusion

从人眼视觉的注意力机制出发, 作者设计了一个 convolutional bottleneck attention module (CBAM) 对特征进行增强或者抑制, 提高了模型的特征表达能力 . CBAM 由 channel attention module 和 spatial attention module 级联构成, 在提升模型性能的同时还保持了较小的开销.

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要为现有的CSPDarknet模型增加CBAM,你需要进行以下步骤: 1. 安装必要的库:首先需要安装pytorch、numpy和opencv-python这些库。可以使用pip install来安装这些库。 2. 导入必要的库:导入pytorch、numpy、cv2、torchvision.models中的cspdarknet53以及自定义的CBAM模块代码。 3. 加载预训练模型:使用torchvision.models中的cspdarknet53模型,并加载预训练权重。 4. 修改模型结构:在CSPDarknet模型中插入CBAM模块。可以在CSPDarknet模型的每个stage中的各个residual block之间插入CBAM模块。 5. 训练模型:使用修改后的模型进行训练,并测试其性能。 以下是一个示例代码: ```python import torch import torch.nn as nn import numpy as np import cv2 from torchvision.models import cspdarknet53 # 导入CBAM模块代码 from cbam import CBAM # 加载预训练模型 model = cspdarknet53(pretrained=True) # 在模型中插入CBAM模块 model.layer1[-1].cv3.cbam = CBAM(32) model.layer2[-1].cv3.cbam = CBAM(64) model.layer3[-1].cv3.cbam = CBAM(128) model.layer4[-1].cv3.cbam = CBAM(256) model.layer5[-1].cv3.cbam = CBAM(512) model.layer6[-1].cv3.cbam = CBAM(1024) # 训练模型 # ... ``` 在这个示例代码中,我们导入了pytorch、numpy、cv2和cspdarknet53模型,并从自定义的CBAM模块代码中导入CBAM。然后,我们加载预训练模型,并在每个stage的最后一个residual block之后插入CBAM模块。最后,我们使用修改后的模型进行训练。 ### 回答2: 要为现有的CSPDarknet模型增加CBAM,首先需要了解CSPDarknet和CBAM的原理。 CSPDarknet是一种卷积神经网络架构,其核心思想是将特征图分为两部分,一部分直接进行卷积操作,另一部分进行跨通道信息的特征融合,以提高网络的效率和准确性。 CBAM(Convolutional Block Attention Module)是一种用于增强卷积神经网络性能的注意力机制模块。它包含两个关键部分:通道注意力机制(Channel Attention Module)和空间注意力机制(Spatial Attention Module)。通道注意力机制用于对特征图的不同通道进行自适应的加权,而空间注意力机制则用于对特征图的不同空间位置进行自适应的加权。 为了将CBAM添加到CSPDarknet模型中,可以在CSPDarknet的后续卷积块之前加入CBAM模块。首先,在每个卷积块的输出后增加一个通道注意力机制模块,用于对特征图的通道进行加权。然后,在通道注意力机制之后增加一个空间注意力机制模块,用于对特征图的空间位置进行加权。 具体来说,可以在CSPDarknet模型代码的相应位置插入CBAM模块的代码。这个模块的实现可以参考CBAM的相关论文或开源代码。在启用CBAM模块后,需要重新训练模型,即使用带有CBAM的CSPDarknet架构进行数据训练和验证。最后,可以使用训练得到的模型进行目标检测等任务。 通过添加CBAM注意力机制,可以使模型能够自适应地加权特征图的通道和空间信息,从而提高模型的准确性和鲁棒性。 ### 回答3: 要为现有的CSPDarknet模型增加CBAM(Channel Attention and Spatial Attention Mechanism)可以按照以下步骤进行: 首先,了解CBAM的原理和实现方式。CBAM是一种注意力机制,通过在通道和空间上对特征图进行注意力的加权融合来提升模型性能。它包括两个部分:通道注意力模块和空间注意力模块。 接下来,在CSPDarknet模型中增加CBAM。在模型结构中,可以在合适的位置插入CBAM模块。可以根据模型的结构和任务需求来决定插入的位置。一般来说,插入在骨干网络的不同层级可以提供更好的性能改进。 然后,根据CBAM的结构进行具体实现。在通道注意力模块中,可以使用全局平均池化层和全连接层来计算通道重要性权重。对于空间注意力模块,可以使用一些二维卷积和池化层来计算不同空间位置的重要性权重。 最后,在训练阶段,将CBAM模块添加到CSPDarknet模型中,并根据需要对模型进行微调。可使用具有标签的训练数据集进行模型训练,并进行适当的超参数调整和优化算法选择来提高模型的性能。 总的来说,为CSPDarknet模型增加CBAM可以通过插入相应模块实现,并通过训练来获得更好的性能。这样的改进可以提高模型对于通道和空间特征的关注程度,以获得更好的图像分析和识别能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值