当前位置: 首页 > news >正文

论文阅读(十一):CBAM: Convolutional Block Attention Module

文章目录

  • Introduction
  • Convolutional Block Attention Module
  • Experiments
  • Conclusion


  论文题目:CBAM: Convolutional Block Attention Module(CBAM:卷积注意力机制)
  论文链接:点击跳转
  代码链接:Github
  论文目的:卷积注意力模块(CBAM)是一种前馈卷积神经网络注意力模块。给定一个中间特征图,CBMA会沿着两个单独的维度(通道和空间)顺序推断注意力图,然后将注意力图乘以输入特征图进行自适应特征细化。并且,CBAM是一个轻量级的通用模块,它可以无缝集成到任何CNN架构中。

Introduction

计算机视觉中的注意力机制
  注意力一种非常常见的能力,比如天空一只鸟飞过去的时候,往往注意力会追随着鸟儿,天空在视觉系统中,自然成为了一个背景信息。一般的神经网络识别物体是通过大量数据训练出来的能力,如一个神经网络如果见过大量的手写数字,那么这个神经网络是能够识别出一个新的手写数字代表的数值的。但这样的网络对图片的全部特征其实是等价处理的(没有前景、背景,重要、不重要之分,而仅仅特征提取整张图片进行识别),模型并不能将关注度的重点放在某一特定的区域。
  事实上,注意力机制是一种让模型在处理信息时能够“集中注意力”的技术,模仿了人类的注意力过程,使模型能够聚焦于输入数据的重要部分,忽略掉不重要的细节,从而更高效且准确地提取关键信息。在模型中一般使用掩码来形成注意力机制,即,训练后的模型能将图片数据中关键的特征(需要关注的区域)通过掩码标注处理,就可认为模型具备了注意力机制。
注意力机制可分为两种:

  • 软注意力机制:确定的注意力机制,完成后直接可以通过网络生成,其更加注意空间或通道。
  • 强注意力机制:不确定的注意力机制,更加关注点,即图像中的每个点都有可能延伸出注意力,同时强注意力是一个随机的预测过程,更强调动态变化。强注意力机制往往通过增强学习获得。

软注意力机制可根据研究的数据分为空间域、通道域、时间域,本研究仅涉及空间域、通道域。

  卷积运算本质是通过将跨通道和空间信息混合在一起来提取信息特征的,本研究提出的卷积注意力模块(CBMA)同样也强调这两个主要维度的意义特征。以下是空间域(Spatial Domain)、时间域(Channel Domain)的含义:

  • 空间域:空间域指关注对象的位置特性,通过空间变换模块将原始图片中的空间信息变换到另一个空间(坐标系)中并保存。
    • (a)列:原始图像。
    • (b)列:通过注意力机制学习到的目标边界框信息,表明在转换时要将哪些关键信息进行保留。
    • ©列:经过空间转换模块后得到的特征图,与原始输入相比,旋转的图片被复原,有噪声的区域也被略去,于是再通过©列进行识别。

在这里插入图片描述

  • 通道域:对经过卷积得到的特征图的每一层,乘以不同的权重,表示该层表示的特征对于关键信息的关联程度和重要程度,相应的,权重越大,表示该层表示的信息对于关键信息越重要。SeNet是典型的注意力机制模型,得到一个C维卷积层后,通过挤压函数,激励函数,尺度函数,得到每一维的权重,对应乘到不同通道的值上,得到新的特征。

在这里插入图片描述
  本研究提出的CBAM模块依次用到注意力机制的通道域和空间域模块,通过这两个模块可得到细化后的重要特征信息,而忽视无关特征,使得网络有了学习特征含义(通道域)、特征位置(空间域)的能力,也让网络在测试新图像数据时,更好地知道哪些信息需要强调,哪些信息需要抑制。CBAM机制如下:
在这里插入图片描述
  文章三大贡献:

  • 1.提出了一种简单而有效的注意力模块(CBAM),可以广泛应用于提高CNN的性能。
  • 2.通过消融研究验证了注意力模块的有效性。
  • 3.在多个基准模型(ImageNet-1K、MS COCO和VOC 2007)上插入了CBAM模块,证明各种网络的性能得到显著提升。

Convolutional Block Attention Module

  由上文可知,注意力机制不仅告诉你应该关注哪里,而且还会提升关键区域的特征表达。这也与识别的目标一致,只关注重要的特征而抑制或忽视无关特征,由此提出CBAM网络(Convolutional Block Attention Module)。CBAM的执行流程为,设中间特征图为 F F F,其尺寸为 ( C , H , W ) (C,H,W) (C,H,W),表示如下:
在这里插入图片描述
之后,CBAM通过运算依次得到一维的通道注意力图 M c M_c Mc和二维的空间注意力图 M s M_s Ms,二者可通过以下计算分别得到经过通道注意力图细化后的特征图 F ′ F' F和经过空间注意力图细化后的特征图 F ′ ′ F'' F′′
在这里插入图片描述
其中, ⊗ ⊗ 表示对应元素相乘,并且 F ′ ′ F'' F′′是在 F ′ F' F的基础上得到的。具体查看通道域的注意力模块和空间域的注意力模块实现过程。

【通道域注意力模块】
在这里插入图片描述
  利用特征的通道间关系来生成通道注意力图。事实上,特征图的每个通道都被视为特征检测器,通道注意力集中在给定输入图像的“什么”是有意义的。为了有效地计算通道注意力、聚合空间信息,本研究采用平均池化操作压缩了输入特征图的空间维度。

  • 输入:大小为 ( C , H , W ) (C,H,W) (C,H,W)的特征图。
  • 输出:大小为 ( C , 1 , 1 ) (C,1,1) (C,1,1)的通道注意力图。
  • 操作:
    • 1.对输入的特征图分别执行平均池化和最大值池化聚合空间信息,得到两个C维池化特征图 F a v g F_{avg} Favg F m a x F_{max} Fmax
    • 2.将 F a v g F_{avg} Favg F m a x F_{max} Fmax送入包含一个隐藏层的多层感知机MLP中,得到两个大小为 ( C , 1 , 1 ) (C,1,1) (C,1,1)的通道注意力图。为减少参数量,隐层神经元的个数为 C / r C/r C/r r r r也被称作压缩比。
    • 3.将经过MLP得到的两个通道注意力图进行对应元素相加,激活,得到最终的通道注意力图 M c M_c Mc

在这里插入图片描述
平均池化、最大池化的作用:池化操作可用于聚合空间信息(即消除不必要的空间信息,缩缩小图像尺寸,更加专注通道特征),一般较为流行的是采用平均池化,但作者认为最大池化会收集到不同于平均池化的、关于不同目标特征的表示,这对于后续得到更精细的注意力通道图是有帮助的。后续实验结果也证实这一观点:

在这里插入图片描述
MLP的结构:本文使用只有一个隐藏层的MLP,使用 w 0 w_0 w0 w 1 w_1 w1表示隐层权重和输出层权重,事实上二者的参数是共享的:
在这里插入图片描述
  总之,通道注意力模块更关注的是“What”属性,也就是什么是对于后续处理有意义的。经过通道注意力模块运算后,得到的是一个 1 x 1 x C 1x1xC 1x1xC的通道注意力图,图上每一维的权重,表示该维对应的特征图层中,对于关键信息的重要程度和关联程度。

class ChannelAttention(nn.Module):"""CBAM混合注意力机制的通道注意力"""def __init__(self, in_channels, ratio=16):#ratio表压缩比super(ChannelAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.fc = nn.Sequential(全连接层nn.Linear(in_planes, in_planes // ratio, bias=False),nn.ReLU(),nn.Linear(in_planes // ratio, in_planes, bias=False))self.sigmoid = nn.Sigmoid()	#对生成的通道注意力权重应用Sigmoid激活函数,将权重限制在0到1之间。def forward(self, x):avg_out = self.fc(self.avg_pool(x))max_out = self.fc(self.max_pool(x))out = avg_out + max_outout = self.sigmoid(out)		#out表通道注意力图return out * x 				#返回F'

【空间注意力模块】
在这里插入图片描述
  利用特征的空间关系来生成空间注意力图。与通道注意力不同,空间注意力侧重于“何处”这一信息性部分,与渠道注意力相辅相成。为了计算空间注意力,我们首先沿通道轴应用平均池和最大池操作,并将它们连接起来以生成高效的特征描述符(相当于是忽略/缩减图像的通道特征,转而专注于空间特征)。

  • 输入:经过通道注意力图细化后的 F ′ F' F,计算方式为 F ′ = M c ( F ) ⊗ F F'=M_c(F)⊗F F=Mc(F)F
  • 输出:大小为 ( 1 , H , W ) (1,H,W) (1,H,W)的空间注意力图。
  • 操作:
    • 1.将 F ′ F' F沿通道方向进行最大池化和平均池化,得到两个二维的特征图 F a v g F_avg Favg F m a x F_max Fmax,大小均为 1 x H x W 1xHxW 1xHxW,将得到的两个特征图进行维度拼接方向的拼接(叠加),得到拼接后的特征图。
    • 2.对拼接后的特征图进行7x7的卷积运算得到空间注意力图 M s M_s Ms

在这里插入图片描述
沿维度通道平均池化、最大池化的作用:参考ICLR2017的论文《Paying more attention to attention: Improving the performance of convolutional neural networks via attention transfer》,认为沿着通道轴应用池化操作可以有效地突出显示含有关键信息的区域。作者的实验也支持这一观点。

  总之,与通道注意力不同,空间注意力侧重于“何处”这一信息性部分,这是对前面通道注意力的补充。除此之外,两个模块可以并行或顺序放置,但通过实验发现顺序排列比平行排列的结果更好,并且顺序上通道一阶略优于空间一阶。

class SpatialAttention(nn.Module):"""CBAM混合注意力机制的空间注意力"""def __init__(self, kernel_size=7):super(SpatialAttention, self).__init__()assert kernel_size in (3, 7), 'kernel size must be 3 or 7'padding = 3 if kernel_size == 7 else 1self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, 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)	#通道上最大池化out = torch.cat([avg_out, max_out], dim=1)		#将池化后的特征沿通道维度进行拼接,得到具有不同尺度上下文信息的特征图out = self.sigmoid(self.conv1(out))				#对生成的空间注意力权重应用Sigmoid激活函数,将权重限制在0到1之间return out*x	#返回F''

Experiments

  CBAM模块易与CNN网络融合,研究中将其融入到了ResNet网络中,并证明了CBAM各方面的优越性。

Conclusion

  CBAM融合了注意力机制中的两种常见表示,通道域的注意力机制和空间域的注意力机制,通过将两种模块顺序组合,两者相互补充,使得网络具有了知晓“What”和“Where”的能力,即知道在哪些位置上的哪些特征,是关键且重要的信息。通过这样的方式,进一步提升了CNNs的特征提取和表示能力,而且CBAM可以无缝的嵌入各种CNNs结构中,对于计算机视觉任务有很好的表现。
  总代码实现:

class CBAM(nn.Module):"""CBAM混合注意力机制"""def __init__(self, in_channels, ratio=16, kernel_size=3):super(CBAM, self).__init__()self.channelattention = ChannelAttention(in_channels, ratio=ratio)self.spatialattention = SpatialAttention(kernel_size=kernel_size)def forward(self, x):x = self.channelattention(x)x = self.spatialattention(x)return x

相关文章:

论文阅读(十一):CBAM: Convolutional Block Attention Module

文章目录 IntroductionConvolutional Block Attention ModuleExperimentsConclusion 论文题目:CBAM: Convolutional Block Attention Module(CBAM:卷积注意力机制)   论文链接:点击跳转   代码链接:Git…...

【Kubernetes】常见面试题汇总(四十八)

目录 108.考虑一家拥有非常分散的系统的跨国公司,希望解决整体代码库问题。您认为公司如何解决他们的问题? 109.我们所有人都知道从单服务到微服务的转变从开发方面解决了问题,但在部署方面却增加了问题。公司如何解决部署方面的问题&#x…...

Qt Creator安卓环境配置【筑基篇】

1.前言 由于我的Qt Creator目前就先的14版本IDE老是存在各种莫名奇妙的bug,我都已经成为官方Qt Forum官方论坛的常客了。有一说一新版本的各种设置不小心误触是真的坑死人。不说了给我小主机配置安卓环境了。小主机系统版本window11-23H,Qt-Creator版本是13.01版本…...

利用SpringBoot构建高效社区医院平台

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

【C++ 前缀和 数论】1590. 使数组和能被 P 整除|2038

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 质数、最大公约数、菲蜀定理 LeetCode 1590. 使数组和能被 P 整除 给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空)&am…...

外部引入的 JavaScript 放置位置

部引入的 JavaScript 通常有两种常见的放置位置&#xff0c;每个位置都有其优缺点&#xff0c;具体取决于页面的需求和性能优化目标&#xff1a; 1. 放在页面的 <head> 标签中 这种方式在 HTML 文档的 <head> 部分引入 JavaScript 文件。 <head><scrip…...

【tbNick专享】虚拟机域控、成员服务器、降级等管理

在 VMware 中完成四台域控服务器、一台成员服务器的创建、降级域控为成员服务器&#xff0c;并创建子域的操作。 1. 创建四台域控和一台成员服务器 1.1 在 VMware 中创建虚拟机 启动 VMware Workstation&#xff1a; 打开 VMware Workstation&#xff0c;点击 “创建新的虚拟…...

Raspberry Pi3B+之Rpanion(gst)和ffmpeg验证

Raspberry Pi3B之Rpanion-gst和ffmpeg验证 1. 源由2. 分析3. 环境搭建步骤1&#xff1a;安装镜像步骤2&#xff1a;系统更新步骤3&#xff1a;安装numpy组件步骤4&#xff1a;安装python3-picamera2组件步骤4&#xff1a;安装cv2组件步骤5&#xff1a;安装ffmpeg组件步骤6&…...

数据结构编程实践20讲(Python版)—04队列

本文目录 04 队列 QueueS1 说明S2 示例普通队列循环队列双端队列优先队列S3 问题:基于普通队列实现的打印机任务管理Python3程序S4 问题:使用循环队列管理玩家移动轨迹Python3程序S5 问题:使用双端队列来管理文档操作历史Python3程序S6 问题:使用优先队列管理车辆调度Pytho…...

Ubuntu开机进入紧急模式处理

文章目录 Ubuntu开机进入紧急模式处理一、问题描述二、解决办法参考 Ubuntu开机进入紧急模式处理 一、问题描述 Ubuntu开机不能够正常启动&#xff0c;自动进入紧急模式&#xff08;You are in emergency mode&#xff09;。具体如下所示&#xff1a; 二、解决办法 按CtrlD进…...

解决无网条件下离线安装缺失的python包

首先在有网的机器上使用conda create --name xx pythonx.x.x 命令创建一个和目标机器(无网)一样的环境 使用 下面命令 pip download opencv-python -d C:\Users\xuhaitao\Desktop\installer pip download pyinstaller -d C:\Users\xuhaitao\Desktop\installer 在目标…...

海外媒体投稿:如何运用3种国内外媒体套餐发稿突出重围?

在当今瞬息万变的经营环境中&#xff0c;突出重围营销推广是每家企业都需要思考的问题。为了能突出重围并提升影响力&#xff0c;国内外媒体套餐内容成为了一个非常受欢迎的挑选。下面我们就为大家讲解如何运用三种不同种类的国内外媒体套餐内容来推广突出重围。 2.微博营销新浪…...

Spring DI 笔记

目录 1.什么是DI? 2.依赖注入的三种⽅式 2.1属性注⼊ 2.2构造⽅法注⼊ 2.3Setter 注⼊ 2.4三种注⼊优缺点分析 3.Autowired存在问题 1.什么是DI? DI: 依赖注⼊ 依赖注⼊是⼀个过程&#xff0c;是指IoC容器在创建Bean时, 去提供运⾏时所依赖的资源&#xff0c;⽽资源指的…...

psutil库的使用说明

前言 psutil是一个跨平台的库&#xff0c;用于获取系统的进程和系统利用率&#xff08;包括 CPU、内存、磁盘、网络等&#xff09;信息。 目录 安装 应用场景 常用方法 一、系统信息相关函数 二、进程信息相关函数 三、网络信息相关函数 四、其他实用函数 使用样例 监控应…...

PMP--三模--解题--71-80

文章目录 7.成本管理--S曲线--S曲线对累计值进行监督和报告--S曲线可以同时报告成本与进度情况。适用于预测和敏捷项目。14.敏捷--信息发射源--是一种可见的实物展示其向组织内其他成员提供信息在不干扰团队的情况下即时实现知识共享。71、 [单选] 项目经理正在为刚刚进入第三次…...

iTextPDF 一个功能强大的 Java PDF 库

iTextPDF 是一个功能强大的 Java PDF 库&#xff0c;它提供了丰富的 API 用于创建和操作 PDF 文档。以下是一些 iTextPDF 的常用功能&#xff1a; 创建 PDF 文档&#xff1a;可以创建新的 PDF 文档&#xff0c;并设置页面大小、边距、背景颜色等 。 添加文本&#xff1a;在 PD…...

QT C++ 自学积累 『非技术文』

QT C 自学积累 『非技术文』 最近一段时间参与了一个 QT 项目的开发&#xff0c;使用的是 C 语法&#xff0c;很遗憾的是我之前从来没有接触过 C &#xff0c;大学没有开过这堂课&#xff0c;也没用自己学习过&#xff0c;所有说上手贼慢&#xff0c;到现在为止其实也不是很清楚…...

浅谈虚拟内存(操作系统、Redis)

浅谈虚拟内存&#xff08;操作系统、Redis&#xff09; 参考&鸣谢 4.1 为什么要有虚拟内存&#xff1f; xiaolincoding 【简单说下】REDIS的虚拟内存机制,会吗?别翻书 aristo_boyunv Redis 虚拟内存 Java杨永杰 浅谈虚拟内存&#xff1a;操作系统与 Redis 在计算机系统中…...

【LeetCode HOT 100】详细题解之链表篇

LeetCode HOT 100题解之链表篇 160 相交链表题目分析代码 206 反转链表方法一&#xff1a;迭代 234 回文链表方法一&#xff1a;将值复制到数组中方法二&#xff1a;快慢指针 141 环形链表方法一&#xff1a;哈希表方法二&#xff1a;快慢指针 142 环形链表II方法一&#xff1a…...

二叉树的递归遍历

方法论 确定递归函数的参数和返回值 确定哪些参数是递归的过程中需要处理的&#xff0c;那么就在递归函数里加上这个参数&#xff0c; 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件 写完了递归算法, 运行的时候&#xff0c;经常会遇到栈溢…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...