论文阅读(十一):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

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

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

相关文章

关于BSV区块链覆盖网络的常见问题解答(上篇)

​​发表时间:2024年9月20日 在BSV区块链上的覆盖网络服务为寻求可扩展、安全、高效交易处理解决方案的开发者和企业家开辟了新的视野。 作为开创性的曼达拉升级的一部分,覆盖网络服务提供了一个强大的框架,用于管理特定类型的交易和数据访问…

新编英语语法教程

新编英语语法教程 1. 新编英语语法教程 (第 6 版) 学生用书1.1. 目录1.2. 电子课件 References A New English Grammar Coursebook 新编英语语法教程 (第 6 版) 学生用书新编英语语法教程 (第 6 版) 教师用书 1. 新编英语语法教程 (第 6 版) 学生用书 https://erp.sflep.cn/…

3.点位管理改造-列表查询——帝可得管理系统

目录 前言一、与页面原型差距1.现在:2.目标:3. 存在问题: 二、修改1.重新设计SQL语句2.修改mapper层,使用Mybatis中的嵌套查询3.修改service层4. 修改controller层5.前端修改6.补充区域查看详情7.数据完整性 前言 提示&#xff1…

《OpenCV 计算机视觉》—— 视频背景建模

文章目录 一、背景建模的目的二、背景建模的方法三、背景建模的步骤四、注意事项五、代码实现 一、背景建模的目的 视频背景建模的主要目的是从视频序列中提取出静态背景,以便将动态的前景对象与静态的背景进行分离。这有助于进一步分析和处理视频内容,…

【Mybatis篇】Mybatis的关联映射详细代码带练 (多对多查询、Mybatis缓存机制)

🧸安清h:个人主页 🎥个人专栏:【计算机网络】,【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯一.关联映射概述 &#x1f6a…

RTSP协议讲解

1.RTSP协议 rtsp,英文全称 Real Time Streaming Protocol,RFC2326,实时流传输协议,是 TCP/IP 协议体系中的一个应用层协议。 RTSP 交互流程 1)OPTIONS C--->S 客户端向服务器端发现 OPTIONS,请求可用…

html中的文本标签(含标签的实现案例)

目录 1.标题标签 2.标题标签的align属性 3.段落标签 4.水平线标签hr 5.换行标签br 6.文本样式标签font ​编辑7.文本格式化标签 8.文本语义标签 1)时间time标签 2)文本高亮Mark标签 3)cite标签 9.特殊字符标签 10.图像标签img 附录&#xff…

基于微信小程序的旅游拼团系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

gitee公钥设置、创建库及使用

简介 一、如何安装git 使用gitee,需要先安装git工具。 工具网站地址:https://git-scm.com/downloads 安装完成后,在terminal命令行输入git --version可以查看到git的版本。 二、登录gitee 我们先在 gitee上注册账号并登录。gitee官网&#x…

震动传感器介绍及实战

目录 前言 震动传感器 1.震动传感器配图 2.震动传感器原理图 3.震动传感器使用 1-震动传感器的意义 2-震动传感器的应用场景 3- SW-18010P震动传感器使用方法 震动传感器控制灯 操作 增加延时 使用SPC-ISP生成演示函数 总结 前言 我们上节已经简单了解了LED的使用…

二、变量与基本类型

变量与基本类型 变量定义声明和使用 基本类型数字类型介绍运算算术运算符位运算符赋值运算符运算符优先级 布尔类型字符类型字符串类型 变量 定义 变量,指值可以变的量。变量以非数字的符号来表达,一般用拉丁字母。变量的用处在于能一般化描述指令的方式…

MongoDB集群模式详解及应用实战

目录 本节课内容: 集群搭建 1.创建3个目录: 2.编辑配置文件 ​编辑 3.启动: 4.看看: 5.另外,两个如上1,2,3步骤操作 ,但是日志目录,端口什么的需要改一下即可。 …

10以内数的分解

// 10以内数的分解.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> using namespace std; int main(int argc, char* argv[]){for (int i 2; i < 10; i){for (int j 1; j < i; j){printf("%d%d%d ",j…

操作系统学习笔记---文件管理

文件系统基础 概念 文件&#xff1a;以计算机硬盘为载体的存储在计算机上的信息集合 文件的属性 文件具有一定的属性&#xff0c;系统不同&#xff0c;属性也会有所不同&#xff0c;但通第都包括如下属性&#xff1a;名称、标识符、类型、位置、大小、保护、时间、日期和用…

vue3+vite@4+ts+elementplus创建项目详解

1、第一步创建项目cnpm init vite4 2、设置vue3.2局域网可访问配置&#xff1a; 找到项目路径下的package.json目录下找到script对象下面添加一下代码&#xff1a; "serve": "vite --host 0.0.0.0" 启动项目命令不在是dev而是&#xff1a;cnpm run serve 3…

《深度学习》OpenCV 摄像头OCR 过程及案例解析

目录 一、摄像头OCR 1、含义 2、一般操作步骤 1&#xff09;安装OpenCV库 2&#xff09;设置摄像头 3&#xff09;图像采集 4&#xff09;图像预处理 5&#xff09;文本识别 6&#xff09;文本处理 7&#xff09;结果显示 二、案例实现 1、定义展示图像函数 2、定…

深入理解 JavaScript 事件循环机制:单线程中的异步处理核心

深入理解 JavaScript 事件循环机制&#xff1a;单线程中的异步处理核心 JavaScript 是一门单线程的编程语言&#xff0c;也就是说它在同一时间只能执行一个任务。然而&#xff0c;现代 Web 应用经常需要处理大量的异步操作&#xff0c;如用户输入、网络请求、定时器等。为了确…

《迁移学习》—— 将 ResNet18 模型迁移到食物分类项目中

文章目录 一、迁移学习的简单介绍1.迁移学习是什么&#xff1f;2.迁移学习的步骤 二、数据集介绍三、代码实现1. 步骤2.所用到方法介绍的文章链接3. 完整代码 一、迁移学习的简单介绍 1.迁移学习是什么&#xff1f; 迁移学习是指利用已经训练好的模型&#xff0c;在新的任务上…

鸿蒙开发(NEXT/API 12)【状态查询与订阅】手机侧应用开发

注意 该接口的调用需要在开发者联盟申请设备基础信息权限与穿戴用户状态权限&#xff0c;穿戴用户状态权限还需获得用户授权。 实时查询穿戴设备可用空间、电量状态。订阅穿戴设备连接状态、低电量告警、用户心率告警。查询和订阅穿戴设备充电状态、佩戴状态、设备模式。 使…

初识Django

前言: 各位观众老爷们好&#xff0c;最近几个月都没怎么更新&#xff0c;主要是最近的事情太多了&#xff0c;我也在继续学习Django框架&#xff0c;之前还参加了一些比赛&#xff0c;现在我会开始持续更新Django的学习&#xff0c;这个过程会比较久&#xff0c;我会把我学习的…