【论文笔记】独属于CV的注意力机制CBAM-Convolutional Block Attention Module

news2024/9/24 3:29:08

目录

写在前面

一、基数和宽度

二、通道注意力模块(Channel Attention Module)

三、空间注意力模块(Spatial Attention Module)

四、CBAM(Convolutional Block Attention Module)

五、总结


写在前面

        CBAM论文地址:https://arxiv.org/abs/1807.06521

        CBAM(Convolutional Block Attention Module)是2018年被提出的,不同于ViT的Attention,CBAM是为CNN量身定做的Attention模块,实现简单、效果好,你值得拥有。

        为了提高CNN的性能,我们可以从深度(depth)、宽度(width)和基数(cardinality)三个方面入手。深度很好理解,就是模型的层数,层数越多模型越深。下面说一说基数和宽度的区别。

一、基数和宽度

基数(cardinality):指的是并行分支的数量。

宽度(width):指每一层卷积的卷积核数量(即输出特征图的通道数)。

举个GoogLeNet的例子:

        GoogLeNet 的设计中,Inception模块通过组合多个不同大小的卷积核(例如 1x1、3x3、5x5)和池化操作来提取不同尺度的特征。

        增加“宽度”的效果: 我们有一个 Inception 模块,包含 1x1、3x3 和 5x5 的卷积层,以及一个 3x3 的最大池化层。如果我们在该 Inception 模块中增加每个卷积操作的通道数,例如将 1x1 卷积层的输出通道数从 32 增加到 64,将 3x3 卷积层的输出通道数从 64 增加到 128,这种操作就增加了网络的“宽度”。增加“宽度”意味着每个 Inception 模块可以提取更多的特征信息,但同时也增加了计算成本。

        增加基数: 如果我们将每个卷积和池化操作进一步拆分为多个组,例如在每个卷积操作中使用组卷积(group convolution),那么这些并行组卷积操作的数量就类似于增加了“基数”。每个组卷积操作都是一个独立的路径,这些路径的数量增加就代表了基数的增加。基数不仅节省了参数的总数,而且比深度和宽度这两个因素具有更强的表示能力。

        可以看下图,蓝色的线表示模型的基数,红色的数字表示宽度。

        CBAM由两个顺序的子模块组成:通道注意力模块(Channel Attention Module)和空间注意力模块(Spatial Attention Module)。CAM解决的问题是重要的信息是什么(‘what’ is meaningful given an input image)、SAM解决重要的信息在哪里(‘where’ is an informative part)。这两个模块都使用了增加基数的方式,提升模型的表达能力。

二、通道注意力模块(Channel Attention Module

        我们知道CNN的每个通道可以提取不同的特征(也就是Feature Map),通道注意力模块(Channel Attention Module)的主要作用是自适应地调整和增强输入Feature Map中每个通道的重要性。它通过学习每个通道对于当前任务的重要性权重,从而对不同通道进行加权,增强关键信息的表达,同时抑制不相关或冗余的特征。这种机制能够使神经网络更高效地利用信息,提高模型的性能和表达能力。

        通俗的说,CAM就是判断每个Feature Map的重要程度。即下图中相同颜色的部分会有一个标记重要程度的权重。

        CAM使用并行的平均池化和最大池化,每个池化分别经过两个卷积模块,然后相加经过sigmoid得到注意力概率图,公式如下:

        其中σ为Sigmoid型函数,MLP这里使用的是两个卷积层,权重W_0W_1是共享的。

        公式不直观,示意图如下,假设输入是一个32通道244x244的Feature Map,输出是32x1x1,表示32个Feature Map的重要程度。

        使用pooling可以捕获每个通道特征的强度。平均池化(Average Pooling) 能够捕获每个通道的整体激活分布信息。它反映了一个通道中所有特征点的平均响应,能够平滑地代表特征的整体强度。最大池化(Max Pooling) 捕获的是特征图中的最强激活信号。它能够突出特征图中最显著的特征,强调特征中的极端值。

        平均池化提供了特征分布的全局性信息,而最大池化提供了最显著特征的信息。通过结合这两种池化方法,通道注意力模块能够更好地理解哪些特征通道在给定输入图像中最重要。

        两种池化之后的卷积层共享参数,而且两个卷积层的中间维度使用in_planes//16,最大限度的减少参数,因为注意力模块只提供一个注意力概率图,提取特征并不是它的首要任务,所以不需要太多参数。

        代码示例:

class ChannelAttention(nn.Module):
    def __init__(self, in_planes):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
           
        self.fc = 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):
        avg_out = self.fc(self.avg_pool(x))
        max_out = self.fc(self.max_pool(x))
        out = avg_out + max_out
        return self.sigmoid(out)

        

三、空间注意力模块(Spatial Attention Module

        SAM首先沿着通道轴分别使用平均池化和最大池化操作,并将它们连接起来,然后经过一个7x7的卷积层将通道数变成1,最后是Sigmoid得到结果,是一个宽高和输入一致通道数为1的概率图。

        SAM就是判断Feature Map中每个部分(像素)的重要程度,需要综合每个部分所有通道的特征。即下图中相同颜色的部分会有一个标记重要程度的权重。

公式如下:

       其中,σ表示Sigmoid函数,f^{7*7}表示大小为7×7的卷积运算。

        补充一下,这里的卷积核大小是7x7,而上面CAM的是1x1,这是因为CAM关注的是整个特征图中的全局通道信息1x1 卷积核适合这种只需在通道维度上操作的情况。SAM关注的是特征图中的局部和全局空间信息7x7 卷积核适合捕捉空间维度上的局部和全局特征。

        示意图如下,仍然假设输入是一个32通道244x244的Feature Map,输出是1x244x244。

        同时使用平均池化和最大池化的原因和CAM类似,平均池化提供了特征分布的全局性信息,而最大池化提供了最显著特征的信息。通过结合这两种池化方法,SAM能够更好地理解Feature Map中哪些区域最重要。

四、CBAM(Convolutional Block Attention Module)

        有了CAM和SAM,就剩最后一个问题,这两个模块怎么摆放,是并行放置还是顺行方式呢?作者发现顺序排列比平行排列的效果更好。下面是CBAM完整的结构图,我们随意在CBAM之前放几个卷积层:

CBAM完整的代码:

import torch
import torch.nn as nn


class ChannelAttention(nn.Module):
    def __init__(self, in_planes):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
           
        self.fc = 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):
        avg_out = self.fc(self.avg_pool(x))
        max_out = self.fc(self.max_pool(x))
        out = avg_out + max_out
        return self.sigmoid(out)


class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()

        self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv1(x)
        return self.sigmoid(x)


class DemoNet(nn.Module):
    expansion = 1

    def __init__(self, inplanes, planes, stride=1, downsample=None):
        super(DemoNet, self).__init__()
        self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=3, stride=stride, padding=1, bias=False)
        self.relu = nn.ReLU(inplace=True)
        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)

        self.ca = ChannelAttention(planes)
        self.sa = SpatialAttention()

    def forward(self, x):
        out = self.conv1(x)
        out = self.relu(out)
        out = self.conv2(out)

        out = self.ca(out) * out
        out = self.sa(out) * out

        out = self.relu(out)

        return out


if __name__ == '__main__':
    input = torch.randn(1, 3, 224, 224)
    demo_net = DemoNet(inplanes=3, planes=32)
    output = demo_net(input)
    print(output)

        这里还有一个CBAM应用到ResNet的完整例子:https://github.com/luuuyi/CBAM.PyTorch

五、总结

1.CBAM是一个轻量级和通用的模块,它可以无缝地集成到任何CNN架构中,而开销可以忽略不计,并且可以与基础CNN一起进行端到端训练;

2.通道注意力模块(Channel Attention Module)关注每个通道的Feature Map的重要程度;

3.空间注意力模块(Spatial Attention Module)关注Feature Map每个部分(像素)的重要程度;

4.CBAM由通道注意力模块和空间注意力模块两个模块组成,同时兼顾了通道与空间特征的表达,相比传统的卷积层参数更少、效果更好。

        CBAM就介绍到这里,关注不迷路(*^▽^*)

关注订阅号了解更多精品文章

交流探讨、商务合作请加微信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

调试JS代码

一、vs code调试 1.在vs code中如何进行代码调试? 首先,在vs code中配置 auto-attach,通过ctrl shift p,输入 auto-attach。设置成smart(智能)。如下图: 然后,对需要调试的语句在…

AWS子账号的创建与管理:提升安全性与灵活性

在现代云计算环境中,亚马逊网络服务(AWS)提供了强大的功能,允许用户创建和管理子账号。通过合理地使用子账号,企业可以有效地提升安全性、管理复杂性以及资源的灵活性。我们九河云一起细探讨AWS子账号的创建方法。 为什…

2-78 基于matlab-GUI的DTW算法语音识别

基于matlab-GUI的DTW算法语音识别,具有16页分析报告。能识别0-9数字,正确率90。预处理过程包括预滤波、采样和量化、分帧、加窗、预加重、端点检测等。经过预处理的语音数据进行特征参数提取。在训练阶段,将特征参数处理之后,每个…

双目相机实现物体尺寸的精准测量

双目视觉系统是一种模拟人类双眼的立体视觉原理,通过两个摄像头从不同的角度捕捉同一场景的图像,从而获取目标物体的三维信息。 目录 1,设备选型 2,双目相机测量的现实意义 2.1 技术优势 2.2 面对的挑战 2.3 发展趋势 3&am…

黑神话的大头怪幽魂很简单! 黑神话悟空幽魂打法攻略

《黑神话:悟空》已经发售了三天,玩家们也已经踏上了“天命人”的路程。不过因游戏Boss太难打成为取经路上的拦路虎,有不少玩家被幽魂挡住了脚步,并纷纷叫苦。 近日,“你希望黑神话悟空出难度调节吗”这个话题也登上微博…

MyBatis查询 ▎修改 ▎删除

前言: 在现代应用开发中,数据库操作是核心环节。MyBatis 作为一款灵活的持久层框架,提供了直接编写 SQL 语句的能力,避免了其他 ORM 框架可能带来的性能和功能限制。MyBatis 的查询、修改和删除操作是开发者必须掌握的基本技能。这些操作不仅…

基差、升水与贴水,股指期货市场的重要概念解析

在股指期货市场中,基差、升水和贴水是三个至关重要的概念。它们不仅影响着市场的价格动态,还对套利和套期保值者的策略制定具有重大意义。本文将详细解析这三个概念,帮助读者更好地理解期货市场的运作机制。 一、基差:现货与期货…

公司叫你写three.js 编辑器不会写,我这有思路

低代码------就是将一些复用的流程和操作进行封装简化使用,目前 web 二维 在市场上已经非常普遍,而web 三维低代码普及率并不是很高。 这是我早期创造three低代码内核的一个思维导图 开源地址 https://github.com/z2586300277/three-editor 预览查看 …

如何将ip地址随机更换

在数字化时代,‌IP地址作为网络身份的重要标识,‌其管理和使用方式对于个人和企业都具有重要意义。‌在某些场景下,‌如‌突破地域限制、‌数据抓取或隐私保护等,‌用户可能需要实现IP地址的随机更换。‌本文将深入探讨如何将IP地…

Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器

Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器 Citrix ADC - 混合多云应用交付控制器 请访问原文链接:https://sysin.org/blog/citrix-adc-13/,查看最新版。原创作品,转载请保留出处。 作者…

电脑开机之后进入emergency mode

电脑开机之后进入emergency mode 本章只针对统信系统 emergency mode 统信UOS Cannot open access to console. The root account is locked 故障现象 电脑开机之后进入emergency mode,提示Cannot open access to console. The root account is locked,按回车也无法进系…

SQLi-LABS 通关攻略【36-40】

SQLi-LABS 36关 1.本关依旧是宽字节注入 2.测试闭合方式 ?id1 //正常显示 ?id1 //显示错误 ?id1%df //显示错误 ?id1%df -- //显示正常 3.测试回显点 ?id-1%df%27…

海康二次开发学习笔记5-二次开发小技巧

二次开发小技巧 1. VM安装目录 Samples内包含C#,QT,VC应用程序 Documetnations内包含C#和C语言的帮助文档 2. 错误码 private void button4_Click(object sender, EventArgs e){try{VmSolution.Load(textBox1.Text);listBox1.Items.Add("方案加载成功.");listBox1.…

RAG 技术真的“烂大街”了吗?

大语言模型技术迅猛发展的脚步,正引领着信息检索技术进入一个新的纪元。在这一领域中, RAG 技术将传统信息检索技术与大语言模型技术相结合,为知识理解、知识获取提供了全新的解决方案。然而,尽管 RAG 在很多任务上表现出色&#…

高空抛物目标检测

高空抛物目标检测是一个技术领域,它关注于从高空向下抛掷或坠落的物体的自动识别和检测。这类目标检测在视频监控、安全防范以及事故预防中扮演着重要角色。 视频监控与分析:通过摄像头持续录制特定区域的视频,使用图像处理和机器学习技术分析…

大话C++:第1篇 C++语言概述

1 C简介 C是由C语言扩展升级而来,最早于1979年由本贾尼斯特劳斯特卢普在AT&T贝尔工作室研发。C在继承了C语言过程化程序设计特性的基础上,进一步扩充和完善了C语言,引入了面向对象的程序设计概念,如抽象数据类型、继承和多态…

HikariPool-1 - Exception during pool initialization报错解决

问题:HikariPool-1 - Exception during pool initialization 分析:由控制台的报错发现是连接数据库的问题,网上的解决方案均是在application.yaml文件加入下面的配置项 尝试过后报错并未解决 但发现刷新数据库竟然可以解决问题 最后报错未…

AI黑神话悟空游戏玩法,抓住流量,完爆一波

介绍 黑神话 悟空 这个游戏 这几天真的是太火了,本来呢 不打算写这方面的教程了,因为我自己对游戏不太感兴趣。 不过我们可以抓住这个热点,发展周边的内容来赚取收益,还是可以的。 据说5天销售了20亿,老外甚至为了玩…

短剧CPS分销系统搭建,3分钟快速了解入行短剧项目

目录 前言 : 一、第一分钟:什么是短剧项目? 二、第二分钟:短剧平台建设和短剧推广 第一种模式:搭建短剧分销cps系统: 第二种模式:自建剧场 买片源授权.需要办理广播证和icp证. 三、第三分钟:平台搭建…

NoSQL数据库-Redis集群详解及案例实现

一、 关系型数据库和 NoSQL 数据库 1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库 关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据主流的 MySQL、Oracle、MS SQL Server 和 D…