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

news2024/9/28 13:18:15

文章目录

  • 1.Introduction
  • 2.Convolutional Block Attention Module
  • Experiments
  • Conclusion


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

1.Introduction

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

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

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

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

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

在这里插入图片描述

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

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

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

2.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_out
       out = 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 1
        self.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

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

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

相关文章

运维,36岁,正在经历中年危机,零基础入门到精通,收藏这一篇就够了

我今年36岁,运维经理,985硕士毕业,目前正在经历中年危机,真的很焦虑,对未来充满担忧。不知道这样的日子还会持续多久,突然很想把这些年的经历记录下来,那就从今天开始吧。 先说一下我的中年危机…

中国科学技术大学《2020年+2021年845自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《25届中国科学技术大学845自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2020年真题 2021年真题 Part1:2020年2021年完整版真题 2020年真…

python实战三:使用循环while模拟用户登录

# (1)初始变量 i0 while i<3: # (2)条件判断# (3)语句块user_name input(请输入您的用户名&#xff1a;)pwd input(请输入您的密码&#xff1a;)#登陆判断 if elseif user_namewwl and pwd66666666:print(系统正在登录&#xff0c;请稍后)#需要改变循环变量&#xff0c;目…

一文读懂:监督式微调(SFT)

监督式微调 (Supervised fine-tuning)&#xff0c;也就是SFT&#xff0c;就是拿一个已经学了不少东西的大型语言模型&#xff0c;然后用一些特定的、已经标记好的数据来教它怎么更好地完成某个特定的任务。就好比你已经学会了做饭&#xff0c;但是要特别学会怎么做川菜&#xf…

以流量裂变为目标,驱动动销新潮流

在当今数字化商业世界&#xff0c;流量成为关键。而以流量裂变为目标的动销策略&#xff0c;正成为企业致胜法宝。 流量裂变&#xff0c;即让流量呈指数级增长。它依靠用户传播分享&#xff0c;能快速扩大品牌曝光度与影响力&#xff0c;提高获客效率。动销则是推动产品销售&am…

【幂简集成】手机归属地查询API,精准获取号码所在地,提升数据准确率

在互联网与移动通信技术迅猛进步的背景下&#xff0c;手机号码已成为企业经营及个人生活中的重要工具。对众多企业而言&#xff0c;通过手机号归属地查询&#xff0c;既可优化营销策略&#xff0c;又能提高客户服务精确性。手机号归属地查询 API 的问世&#xff0c;旨在满足这一…

AI产品经理学习路径:从零基础到精通,从此篇开始!

一、AI产品经理和和通用型产品经理的异同&#xff1a; 市面上不同的公司对产品经理的定位有很大的差别&#xff0c;一名合格的产品经理是能对软件产品整个生命周期负责的人。 思考框架相同&#xff1a; AI产品经理和通用型软件产品经理的底层思考框架是一样的&#xff0c;都是…

旺店通ERP集成金蝶K3(旺店通主供应链)

源系统成集云目标系统 金蝶K3介绍 金蝶K3是一款ERP软件&#xff0c;它集成了供应链管理、财务管理、人力资源管理、客户关系管理、办公自动化、商业分析、移动商务、集成接口及行业插件等业务管理组件。以成本管理为目标&#xff0c;计划与流程控制为主线&#xff0c;通过对成…

protobuff中的required有什么用?

大家在proto2 应该经常看到如下msg表达: message MsgType3 { required int32 value1 1; required int32 value2 2; } 在protobuff中的required 有什么作用&#xff1f;在 Protocol Buffers&#xff08;protobuf&#xff09;中&#xff0c;required 关键字用于指定某个字段是…

Pygame中Sprite实现逃亡游戏5

在《Pygame中Sprite实现逃亡游戏4》中通过碰撞检测实现了玩家、飞龙与飞火之间的碰撞处理&#xff0c;基本上实现了逃亡功能。最后&#xff0c;实现这个逃亡游戏中文字提示的功能。 1 操作提示 当进入游戏后&#xff0c;会在玩家下方的位置给出操作提示&#xff0c;如图1所示…

Battery management system (BMS)

电池管理系统&#xff08;BMS&#xff09;是一种专门用于监督电池组的技术&#xff0c;电池组由电池单元组成&#xff0c;在电气上按照行x列矩阵配置进行排列&#xff0c;以便在预期的负载场景下&#xff0c;在一段时间内提供目标范围的电压和电流。 文章目录 电池管理系统是如…

Linux之实战命令16:ncal应用实例(五十)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

消息中间件 Kafka 快速入门与实战

1、概述 最近感觉上班实在是太无聊&#xff0c;打算给大家分享一下Kafka的使用&#xff0c;本篇文章首先给大家分享三种方式搭建Kafka环境&#xff0c;接着给大家介绍kafka核心的基础概念以及Java API的使用&#xff0c;最后分享一个SpringBoot的集成案例&#xff0c;希望对大…

Arthas sc(查看JVM已加载的类信息 )

文章目录 二、命令列表2.2 class/classloader相关命令2.2.5 sc&#xff08;查看JVM已加载的类信息 &#xff09;举例1&#xff1a;模糊搜索&#xff0c;xx包下所有的类举例2&#xff1a;打印类的详细信息举例3&#xff1a;打印出类的Field信息 二、命令列表 2.2 class/classlo…

计算机网络的整体认识---网络协议,网络传输过程

计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 广域网WAN: 将远隔千里的计算机都连在一起;所谓 "局域网" 和 "广域网" 只是一个相…

(最新已验证)stm32 + 新版 onenet +dht11+esp8266/01s + mqtt物联网上报温湿度和控制单片机(保姆级教程)

物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意&#xff1a;ESP-01sWIFI模块&#xff0c;去搜了一下这个小东西很有玩点&#xff0c;远程控制LED啥的&#xff0c;然后我就想…

Arthas classloader (查看 classloader 的继承树,urls,类加载信息)

文章目录 二、命令列表2.2 class/classloader相关命令2.2.4 classloader &#xff08;查看 classloader 的继承树&#xff0c;urls&#xff0c;类加载信息&#xff09;举例1&#xff1a;按类加载类型查看统计信息举例2&#xff1a;按类加载实例查看统计信息举例3&#xff1a;查…

k8s搭建一主三从的mysql8集群---无坑

一&#xff0c;环境准备 1.1 k8s集群服务器 ip角色系统主机名cpumem192.168.40.129mastercentos7.9k8smaster48192.168.40.130node1centos7.9k8snode148192.168.40.131node2centos7.9k8snode248192.168.40.132node3centos7.9k8snode348 k8s集群操作请参考《K8s安装部署&…

如何调整云桌面安装的虚拟机分辨率?

如何调整云桌面安装的虚拟机分辨率&#xff1f; 1. 编辑GRUB配置文件2. 修改分辨率3. 更新GRUB4. 重启虚拟机 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在云桌面环境中&#xff0c;虚拟机分辨率过低且无法调整时&#xff0c;可以通过以…

UCS512DHN DMX512差分并联协议LED驱动IC 舞动灯光的魔法芯片

UCS512DHN产品概述&#xff1a; UCS512DHN是DMX512差分并联协议LED驱动芯片&#xff0c;可选择1/2/3/4通道高精度恒流输出&#xff0c;灰度达65536 级。UCS512DHN为带散热片封装的大电流输出版本。UCS512DHN有PWM反极性输出功能&#xff0c;此功能适合外挂三极 管&#xff0c;…