cbam——即插即用的注意力模块(附代码)(代码片段)

Billie使劲学 Billie使劲学     2023-04-05     684

关键词:

论文:CBAM: Convolutional Block Attention Module

代码: code

目录

前言

1.什么是CBAM?

(1)Channel attention module(CAM)

(2)Spatial attention module(SAM)

(3)CAM和SAM组合形式

2.消融实验

(1)Channel attention

(2)Spatial attention

(3)Channel attention+spatial attention

3.图像分类

4.目标检测

5.CBAM可视化

6.Pytorch 代码实现

总结


前言

CBAM( Convolutional Block Attention Module )是一种轻量级注意力模块的提出于2018年,它可以在空间维度和通道维度上进行Attention操作。论文在Resnet和MobileNet上加入CBAM模块进行对比,并针对两个注意力模块应用的先后进行实验,同时进行CAM可视化,可以看到Attention更关注目标物体。

1.什么是CBAM?

CBAM(Convolutional Block Attention Module)是轻量级的卷积注意力模块,它结合了通道和空间的注意力机制模块。

上图可以看到,CBAM包含CAM(Channel Attention Module)和SAM(Spartial Attention Module)两个子模块,分别进行通道和空间上的Attention。这样不只能够节约参数和计算力,并且保证了其能够做为即插即用的模块集成到现有的网络架构中去。

由上图所示,有输入、通道注意力模块、空间注意力模块和输出组成。输入特征,然后是通道注意力模块一维卷积,将卷积结果乘原图,将CAM输出结果作为输入,进行空间注意力模块的二维卷积,再将输出结果与原图相乘。

(1)Channel attention module(CAM)

通道注意力模块通道维度不变,压缩空间维度。该模块关注输入图片中有意义的信息(分类任务就关注因为什么分成了不同类别)。

图解:将输入的feature map经过两个并行的MaxPool层和AvgPool层,将特征图从C*H*W变为C*1*1的大小,然后经过Share MLP模块,在该模块中,它先将通道数压缩为原来的1/r(Reduction,减少率)倍,再扩张到原通道数,经过ReLU激活函数得到两个激活后的结果。将这两个输出结果进行逐元素相加,再通过一个sigmoid激活函数得到Channel Attention的输出结果,再将这个输出结果乘原图,变回C*H*W的大小。

通道注意力公式:

CAM与SEnet的不同之处是加了一个并行的最大池化层,提取到的高层特征更全面,更丰富。论文中也对为什么如此改动做出了解释。

AvgPool & MaxPool对比实验

在channel attention中,表1对于pooling的使用进行了实验对比,发现avg & max的并行池化的效果要更好。这里也有可能是池化丢失的信息太多,avg&max的并行连接方式比单一的池化丢失的信息更少,所以效果会更好一点。

(2)Spatial attention module(SAM)

 空间注意力模块空间维度不变,压缩通道维度。该模块关注的是目标的位置信息

图解:将Channel Attention的输出结果通过最大池化和平均池化得到两个1*H*W的特征图,然后经过Concat操作对两个特征图进行拼接,通过7*7卷积变为1通道的特征图(实验证明7*7效果比3*3好),再经过一个sigmoid得到Spatial Attention的特征图,最后将输出结果乘原图变回C*H*W大小。

空间注意力公式:

(3)CAM和SAM组合形式

通道注意力和空间注意力这两个模块能够以并行或者串行顺序的方式组合在一块儿,关于通道和空间上的串行顺序和并行作者进行了实验对比,发现先通道再空间的结果会稍微好一点。具体实验结果如下:

由表三可以看出,基于ResNet网络,两个Attention模块按Channel Attention + Spatial Attention的顺序效果会更好一些。

2.消融实验

(1)Channel attention
首先是不同的通道注意力结果比较,平均池化、最大池化和两种联合使用并使用共享MLP来进行推断保存参数,结果如下:

首先,参数量和内存损耗差距不大,而错误率的提高,显然两者联合的方法更优。

(2)Spatial attention

对比7*7卷积核和3*3卷积核的效果,结果7*7卷积核效果更好

(3)Channel attention+spatial attention

对比SEnet、CAM和SAM并行、SAM+CAM和CAM+SAM的效果,最终CAM+SAM效果最好 。

3.图像分类

再数据集ImageNet-1K上使用ResNet网络进行对比实验

4.目标检测

数据集:MS COCO和VOC 2007
如下表所示:
MS COCO上,CBAM在识别任务上泛化性能较基线网络有了显著提高。。

如下表:
VOC 2007中,采用阶梯检测框架,并将SE和CBAM应用于检测器。CBAM极大的改善了所有强大的基线与微不足道的额外参数。

5.CBAM可视化

本文利用Grad CAM对不一样的网络进行可视化后,能够发现,引入 CBAM 后,特征覆盖到了待识别物体的更多部位,而且最终判别物体的几率也更高,这表示注意力机制的确让网络学会了关注重点信息。

6.Pytorch 代码实现

代码实现

import torch
import torch.nn as nn


class CBAMLayer(nn.Module):
    def __init__(self, channel, reduction=16, spatial_kernel=7):
        super(CBAMLayer, self).__init__()

        # channel attention 压缩H,W为1
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.avg_pool = nn.AdaptiveAvgPool2d(1)

        # shared MLP
        self.mlp = nn.Sequential(
            # Conv2d比Linear方便操作
            # nn.Linear(channel, channel // reduction, bias=False)
            nn.Conv2d(channel, channel // reduction, 1, bias=False),
            # inplace=True直接替换,节省内存
            nn.ReLU(inplace=True),
            # nn.Linear(channel // reduction, channel,bias=False)
            nn.Conv2d(channel // reduction, channel, 1, bias=False)
        )

        # spatial attention
        self.conv = nn.Conv2d(2, 1, kernel_size=spatial_kernel,
                              padding=spatial_kernel // 2, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        max_out = self.mlp(self.max_pool(x))
        avg_out = self.mlp(self.avg_pool(x))
        channel_out = self.sigmoid(max_out + avg_out)
        x = channel_out * x

        max_out, _ = torch.max(x, dim=1, keepdim=True)
        avg_out = torch.mean(x, dim=1, keepdim=True)
        spatial_out = self.sigmoid(self.conv(torch.cat([max_out, avg_out], dim=1)))
        x = spatial_out * x
        return x

x = torch.randn(1,1024,32,32)
net = CBAMLayer(1024)
y = net.forward(x)
print(y.shape)

总结

  1. CBAM中作者对两个注意力机制使用的先后顺序做了实验,发现通道注意力在空间注意力之前效果最好。
  2. 作者在实验中应用了grad-CAM来可视化feature map,是个非常有用的可视化手段,在图像分类任务中可以观察feature map的特征,解释了为什么模型将原图分类到某一类的结果。
  3. 加入CBAM模块不一定会给网络带来性能上的提升,受自身网络还有数据等其他因素影响,甚至会下降。如果网络模型的泛化能力已经很强,而你的数据集不是benchmarks而是自己采集的数据集的话,不建议加入CBAM模块。CBAM性能虽然改进的比SE高了不少,但绝不是无脑加入到网络里就能有提升的。也要根据自己的数据、网络等因素综合考量。

即插即用安全验证模块-使用pam模块(代码片段)

可插入式验证模块(PAM)。可插入式验证木块。应用程序调用libpam函数来验证和授权用户。libpam基于应用程序的PAM配置文件做检测。可以通过libc在NSS中检查。共享的,动态可配置代码。文档:/usr/share/doc/pam-<version>/#man-kpam_... 查看详情

第一个不支持即插即用的nt式helloworld驱动

1.安装好驱动包2.编写源代码Sources文件和makefile文件##源代码/*********************************文件名称:Driver.h*作者:左飞*完成日期:2016-9-4*********************************/#pragmaonce//保证头文件只被编译一次#ifdef__cplusplusextern"C"//兼容C代码{ 查看详情

如何让即插即用的 WPF 应用程序创建 SQL 数据库? [关闭]

】如何让即插即用的WPF应用程序创建SQL数据库?[关闭]【英文标题】:HowtomakeaplugandplayWPFappcreateaSQLdatabase?[closed]【发布时间】:2020-11-2212:22:15【问题描述】:我目前正在学习WPF,目的是为朋友制作一个简单的应用程序。此应用程... 查看详情

如何为高度解耦、即插即用的复杂组件构建 Redux?

】如何为高度解耦、即插即用的复杂组件构建Redux?【英文标题】:HowtostructureReduxforahighlyde-coupled,plug-n-playcomplexcomponent?【发布时间】:2018-04-1012:49:16【问题描述】:我对Redux很陌生,想在我的应用程序中使用它,但我在Redux部分... 查看详情

深度学习中的即插即用模块pdf下载

《卷积神经网络中的即插即用模块》是首发于GiantPandaCV公众号的电子书教程,欢迎关注其微信公众号:链接:https://pan.baidu.com/s/1Tzrcs-6XmObawb19Q68iOw提取码:os3g部分目录:  查看详情

《最新开源随插即用》sam自增强注意力深度解读与实践(附代码及分析)(代码片段)

...码讲解、代码实操和训练、优化部署技巧。今天更新一篇注意力的最新文章,附带代码,就在上周开源的代码࿰ 查看详情

分享一个即插即用的私藏缓动动画js小算法

二、即插即用的缓动小算法原理如下:假设要从数值A变化到数值B,如果是线性运动,则每次移动距离是一样;如果是缓动,每次移动距离不一样。那如何才能不一样呢?很简单,按比例移动就可以。例如:每次移动剩余距离的... 查看详情

打包基于 JavaScript 的即插即用应用程序

】打包基于JavaScript的即插即用应用程序【英文标题】:PackagingJavaScriptbasedplugandplayapplication【发布时间】:2017-04-1223:09:36【问题描述】:我正在尝试构建一个即插即用的基于Web的应用程序,我应该能够与多个其他Web应用程序(使... 查看详情

改进yolov5系列:10.最新hornet结合yolo应用首发!|eccv2022出品,多种搭配,即插即用|backbone主干递归门控卷积的高效高阶空间交互(代码片段)

...ackbone特征主干】、【Neck特征融合】、【Head检测头】、【注意力机制】、【IoU损失函数】、【NMS】、【Loss计算方式】、【自注意 查看详情

cvpr‘2023即插即用系列!|biformer:通过双向路由注意力构建高效金字塔网络架构(代码片段)

...周知,Transformer相比于CNNs的一大核心优势便是借助自注意力机制的优势捕捉长距离上下文依赖。正所谓物极必反,在原始的Transformer架构设计中,这种结构虽然在一定程度上带来了性能上的提升,但却会引起两个... 查看详情

改进yolov7系列:最新结合即插即用ca(coordinateattention)注意力机制(适用于yolov5),cvpr2021顶会助力分类检测涨点!(代码片段)

...模块来构建不同的YOLO目标检测模型。论文所提的Coordinate注意力很简单,可以灵活地插入到经典的移动网络中,而且几乎没有计算开销。大量实验表明,Coordinate注意力不仅有益于ImageNet分类,而且更有趣的是,... 查看详情

将即插即用设备映射到 PCI 插槽 ID,C#

】将即插即用设备映射到PCI插槽ID,C#【英文标题】:MappingPlugNPlayDevicestoPCISlotIDs,C#【发布时间】:2017-06-0918:18:42【问题描述】:我有一定数量的外部设备,我们称它们为事物。每个事物都通过插入PCI插槽的PnP卡与计算机连接。每... 查看详情

linuxtogo:制作随身携带、即插即用的linux系统

...USB驱动器中启动并运行?下面我将教大家制作随身携带、即插即用的Linux操作系统。(把当前系统移植到移动硬盘上)为什么需要这个功能呢?硬件:软件:Linux发行版自带的工具如gpartedgrubcp制作Linux启动盘的制作分为以下几个... 查看详情

yolov5改进之加入cbam,se,eca,ca,simam,shuffleattention,criss-crossattention,crisscrossattention多种注意力机制(代码片

...到的yolov5网络为6.1版本(6.0-6.2均适用)yolov5加入注意力机制模块的三个标准步骤(适用于本文中的任何注意力机制)1.common.py中加入注意力机制模块2.yolo.py中增加对应的注意力机制关键字3.yaml文件中添加相应模块... 查看详情

yolox改进之一:添加cbamseeca注意力机制(代码片段)

...智能AI算法工程师 解决问题:本文以加入CBAM双通道注意力机制为例,可以让网络更加关注待检测目标,提高检测效果,解决复杂环境背景下容易错漏检的情况。添加方法:第一步:确定添加的位置,... 查看详情

《最新开源随插即用》sam自增强注意力深度解读与实践(附代码及分析)(代码片段)

...码讲解、代码实操和训练、优化部署技巧。今天更新一篇注意力的最新文章,附带代码,就在上周开源的代码,我觉得还是凑合的一份工作,可圈可点,我把他优秀的东西分析一下,看看大家能不能拿过来... 查看详情

《最新开源随插即用》sam自增强注意力深度解读与实践(附代码及分析)(代码片段)

...码讲解、代码实操和训练、优化部署技巧。今天更新一篇注意力的最新文章,附带代码,就在上周开源的代码,我觉得还是凑合的一份工作,可圈可点,我把他优秀的东西分析一下,看看大家能不能拿过来... 查看详情

yolov8-gradcam热力图可视化即插即用不需要对源码做任何修改!(代码片段)

...给大家带来yolov8-gradcam热力图可视化,这个可视化是即插即用,不需要对源码做任何修改喔!给您剩下的不少麻烦!代码链接:yolo-gradcam里面还有yolov5和v7的热力图可视化代码,也是即插即用,不需要对... 查看详情