CBAM:融合通道和空间注意力的注意力模块

2023-11-13

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:Sik-Ho Tsang

编译:ronghuaiyang

导读

使用CBAM加持的MobileNetV1,ResNeXt&ResNet,WRN优于使用SENet的网络。

在这篇文章中,介绍了“CBAM: Convolutional Block Attention Module” (CBAM),主要内容:

  • 给定中间特征图,BAM按顺序推导出沿通道和空间两个独立维度的注意力图,然后将注意图相乘到输入特征图进行自适应特征细化。

  • CBAM可以无缝集成到任何CNN架构中,开销可以忽略不计,并且可以与基础CNN一起进行端到端训练。

这是一篇发表在2018 ECCV上的论文,被引次数超过1000次。下面具体介绍。

1. CBAM: 一般性结构

CBAM: General Architecture

CBAM依次推断出一个1D的通道注意图Mc,尺寸为Cx1x1,和一个2D的空间注意力图Ms,尺寸为1xHxW。

其中 ⨂ 表示元素乘法,F’’是最终的细化输出。

这两个模块可以以并行或顺序的方式放置。结果表明,顺序排列的结果比并行排列的结果好。对于排列的顺序,实验结果表明,通道在前面略优于空间在前面。下面是一个ResBlock中CBAM的例子:

2. 通道注意力模块

通道注意力模块

通道注意力聚焦在“什么”是有意义的输入图像,为了有效计算通道注意力,需要对输入特征图的空间维度进行压缩,对于空间信息的聚合,常用的方法是平均池化。但有人认为,最大池化收集了另一个重要线索,关于独特的物体特征,可以推断更细的通道上的注意力。因此,平均池化和最大池化的特征是同时使用的。

FcavgFcmax,分别表示平均池化特征最大池化特征。然后,这两个描述符被转发到一个共享网络,以产生我们的通道注意力图Mc。共享网络由一个多层感知器(MLP)组成,其中有一个隐含层。为减少参数开销,隐藏层的激活大小设为R/C=r×1×1,其中R为下降率。将共享网络应用到每个描述符后,输出的特征向量使用element-wise求和进行合并。σ表示sigmoid函数。这个Mc(F)与F进行元素相乘得到F’.。

3. 空间注意力模块

空间注意力模块

空间注意力聚焦在“哪里”是最具信息量的部分,这是对通道注意力的补充。为了计算空间注意力,沿着通道轴应用平均池化和最大池操作,然后将它们连接起来生成一个有效的特征描述符。然后应用卷积层生成大小为R×H×W 的空间注意力图Ms(F),该空间注意图编码了需要关注或压制的位置。

具体来说,使用两个pooling操作聚合成一个feature map的通道信息,生成两个2D图: Fsavg大小为1×H×WFsmax大小为1×H×Wσ表示sigmoid函数,f7×7表示一个滤波器大小为7×7的卷积运算。

4. ImageNet上的消融研究

4.1. Max Pool 还是 Avg Pool

对比不同的通道注意力模型

最大池化编码了最显著的部分,而平均池化编码了全局的统计信息。因此,这两个特征被同时使用,并对这些特征应用一个共享网络。在SENet中的SE部分使用CAM是一种进一步提升的有效的方法。

4.2. 空间和通道注意力

对比不同的通道注意力方法

通道池化产生更好的准确性,表明显式建模的池化导致更好的注意力推断,而不是可学习的加权通道池化。在这两种情况下,采用更大的内核大小(k=7)可以产生更好的精度。这意味着需要一个开阔的视野(即大的感受野)来决定重要的空间区域。简单的说,我们使用了通道轴上卷积核大小为7的平均和最大池化特征作为我们的空间注意模块。

4.3. 通道和空间注意力的排列

从空间的角度来看,通道注意力是全局的,而空间注意力是局部的。研究发现,按顺序生成注意力图比并行生成注意力图更好。此外,通道在前面的性能略优于空间在前面。最终模块的top-1误差达到22.66%,大大低于SE。

5. SOTA对比

5.1. ImageNet

在ImageNet-1K上的分类结果

ResNet,WideResNet,ResNeXt使用了CBAM后显著优于基线。这意味着CBAM是强大的,显示了新的池化方法的有效性,它产生更丰富的描述符和空间注意力图,有效地补充了通道注意力。CBAM不仅大大提高了基线的准确性,而且也很好的提高了SE的性能。

在ImageNet-1K上使用轻量网络MobileNet的分类结果

CBAM的总体开销在参数和计算方面都非常小。CBAM非常适合于轻量级网络MobileNetV1。以上改进显示了CBAM在低端设备上应用的巨大潜力。

5.2. 使用Grad-CAM进行网络可视化

Grad-CAM可视化结果

Grad-CAM是最近提出的一种可视化方法,它使用梯度来计算卷积层中空间位置的重要性。Grad-CAM结果清晰地显示了网络关注的区域。我们可以清楚地看到集成了CBAM的网络的Grad-CAM mask对于目标区域的覆盖要比其他方法更好。

5.3. MS COCO Object Detection

在MS COCO验证集上的物体检测mAP

我们的检测方法是Faster R-CNN,基线网络是ImageNet上预训练过的ResNet50和ResNet101,可以看到,较基线有显著改善,展示了CBAM在其他识别任务上的泛化性能。

5.4. VOC 2007 Object Detection

PASCAL VOC 2007测试集

物体检测器为SSD和StairNet,我们可以清楚地看到,CBAM对两个骨干网络的所有基线的准确性都有提升。

CBAM精度的提高带来的参数开销可以忽略不计,这表明增强不是由于简单的容量增加,而是由于有效的特征细化。

—END—

英文原文:https://sh-tsang.medium.com/reading-cbam-convolutional-block-attention-module-image-classification-ddbaf10f7430

请长按或扫描二维码关注本公众号

喜欢的话,请给我个在看吧

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CBAM:融合通道和空间注意力的注意力模块 的相关文章

  • Erlang:到 Python 实例的端口没有响应

    我正在尝试通过 Erlang 端口与外部 python 进程进行通信 首先 打开一个端口 然后通过 stdin 将消息发送到外部进程 我期待在进程的标准输出上得到相应的答复 我的尝试如下所示 open a port Port open po
  • 从所有数据帧列中删除子字符串

    我有一个单词列表 大约 1000 个单词 我称之为负面单词 CAST ARTICLES SANITARY JAN CLAUSES SPECIAL ENDORSEMENT 我很快就会用这个单词列表制作一个数据框 我还有一个数据框 看起来像 F
  • DynamodB:如何更新排序键?

    该表有两个键 filename 分区键 和eventTime 排序键 我要更新eventTime对于某些filename Tried put item and update item 发送相同的filename与新的eventTime但这些
  • pyCUDA无法打印结果

    最近 我使用 pip 为我的 python3 4 3 安装 pyCUDA 但我在测试示例代码时发现 https documen tician de pycuda tutorial html getting started https doc
  • Python:json_normalize pandas 系列给出 TypeError

    我在 pandas 系列中有数万行像这样的 json 片段df json IDs lotId 1 Id 123456 date 2009 04 17 bidsCount 2 IDs lotId 2 Id 123456 date 2009 0
  • 使用 Boto3 超时的 AWS Lambda 函数

    我已经解决了我自己的问题 但无论如何我都会发布它 希望能节省其他人几个小时 我在 AWS 上有一个无服务器项目 使用 Python 将记录插入到 kinesis 队列中 但是 当我使用 boto3 client kinesis 或 put
  • 将整数系列转换为交替(双元)二进制系列

    我不知道如何最好地表达这个问题 因为在这里谷歌搜索和搜索总是让我找到更复杂的东西 我很确定这是基本的东西 但对于我的生活来说 我找不到一个好的方法来做到这一点下列 给定一个整数序列 比如说 for x in range 0 36 我想将这些
  • 使用 scikit 时 scipy.sparse 矩阵的缩放问题

    在使用 scikit learn 解决机器学习问题时 我需要在使用 SVM 进行训练之前对 scipy sparse 矩阵进行缩放 但在文档 http scikit learn org stable modules preprocessin
  • 为什么需要设置WORKON_HOME环境变量?

    我已经有一段时间没有使用 python 虚拟环境了 但我也安装了虚拟环境包装器 我的问题是 在文档页面中它说要这样做 export WORKON HOME Envs mkdir p WORKON HOME source usr local
  • 如何知道python运行脚本的路径?

    sys arg 0 给我 python 脚本 例如 python hello py 返回 sys arg 0 的 hello py 但我需要知道 hello py 位于完整路径中的位置 我怎样才能用Python做到这一点 os path a
  • 列表推导式和 for 循环中的 Lambda 表达式[重复]

    这个问题在这里已经有答案了 我想要一个 lambda 列表 作为一些繁重计算的缓存 并注意到这一点 gt gt gt j for j in lambda i for i in range 10 9 9 9 9 9 9 9 9 9 9 Alt
  • 无法通过 Android 应用程序访问我的笔记本电脑的本地主机

    因此 我在发布此内容之前做了一项研究 我发现的解决方案不起作用 更准确地说 连接到我的笔记本电脑的 IPv4192 168 XXX XXX 没用 连接到10 0 2 2 加上端口 不起作用 我需要测试使用 Django Rest 框架构建的
  • Pandas 字典键到列[重复]

    这个问题在这里已经有答案了 我有一个像这样的数据框 index column1 e1 u c680 5 u c681 1 u c682 2 u c57 e2 u c680 6 u c681 2 u c682 1 u c57 e3 u c68
  • 使用会话在 Django 中将文件从一个视图传递到另一个视图

    我当前的工作项目要求我允许用户上传各种格式的文件 目前仅处理 CSV 格式 然后使用包含的数据来绘制图表Pandas http pandas pydata org 图书馆 我决定将图形渲染到模板的最简单方法是为图形创建特定视图 然后将图像从
  • 使用 ElementTree 在 python 中解析 xml

    我对 python 很陌生 我需要解析一些脏的 xml 文件 这些文件需要先清理 我有以下 python 代码 import arff import xml etree ElementTree import re totstring wit
  • 哪种方式最适合Python工厂注册?

    这是一个关于这些方法中哪一种被认为是最有效的问题 Pythonic 我不是在寻找个人意见 而是在寻找惯用的观点 我的背景不是Python 所以这会对我有帮助 我正在开发一个可扩展的 Python 3 项目 这个想法类似于工厂模式 只不过它是
  • 如何检测一个二维数组是否在另一个二维数组内?

    因此 在堆栈溢出成员的帮助下 我得到了以下代码 data needle s which is a png image base64 code goes here decoded data decode base64 f cStringIO
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • 检查 IP 地址是否在给定范围内

    我想检查一下是否有IP180 179 77 11位于特定范围之间 例如180 179 0 0 180 179 255 255 我编写了一个函数 它将每个 IP 八位字节与其他八位字节进行比较 def match mask IP min ip
  • Chrome 驱动程序和 Chromium 二进制文件无法在 aws lambda 上运行

    我陷入了一个问题 我需要在 AWS lambda 上做一些抓取工作 所以我按照下面提到的博客及其代码库作为起点 这非常有帮助 并且在运行时环境 Python 3 6 的 AWS lambda 上对我来说工作得很好 https manivan

随机推荐

  • 论文阅读:FMCW雷达生命体征监测(心跳监测)

    论文 基于连续波雷达的非接触式生命体征监测系统设计与实现 1 雷达种类及特点 用于非接触式测量的雷达种类主要有脉冲雷达和连续波雷达两类 脉冲雷达根据发射脉冲与接收脉冲的时间差来计算所测量对象的实际距离 脉冲雷达需要将窄脉冲持续地发出 其优点
  • QVector 容器

    QVector 容器 QVector在相邻的内存中存储给定数据类型T的一组数据 在QVector前部或中间位置插入操作速度都很慢 因会导致内存中大量的数据移动 访问数据可使用下标 也可使用迭代器 继承自QVector类的子类有QPolygo
  • 如何运行后缀名为.ipynb的文件

    打开cmd 输入 pip install jupyter notebook 安装截图 下载之后 输入 jupyter notebook 之后浏览器会弹出一个页面 如图 然后就可以打开电脑里的文件 如图 也可以选择upload你的文件 打开i
  • Android 下拉刷新实践

    1 手动实现一个下拉刷新功能 2 效果图 3 view结构 4 实现思路
  • linux系统调用线程

    1 基础概念 早期unix系统中 没有线程概念 后来才引入线程 linxu 为了迎合 windows引入了线程 linux 上进程是非常优秀了 linux 上用线程和进程的区别不大 老程序都是用进程 gdb不支持线程 因为gdb比线程出现了
  • net core 下的图形验证码

    首先 通过 Nuget 安装 dotnet add package Lazy Captcha Core 注册服务 默认使用了内存存储 AddDistributedMemoryCache builder Services AddCaptcha
  • 什么是IDP?---What Is an Internal Developer Platform (IDP)?

    The modern approach to software delivery is based on cloud native services and the DevOps culture entailing software dev
  • 项目-天气邮局

    一 项目背景 http协议被广泛使用 从移动端 pc端浏览器 http协议无疑是打开互联网应用窗口的重要协议 http在网络应用层中的地位不可撼动 是能准确区分前后台的重要协议 在学习完网络的有关知识后 HTTP服务器无疑是巩固及应用所学知
  • 怎么用linux查看xml文件格式,xml是什么格式?xml文件格式用什么软件可以打开

    xml是什么格式 xml文件是很多用户在电脑上看见过了 很多小伙伴看到了xml格式的文件都不知道这个是什么东东 其实这个xml也是一种比较有用的文件 可以用来存储软件数据 不过不是所有的软件都可以打开的 下面智能手机网就来科普一下xml是什
  • 各种虚拟机体验杂谈 --- 兼发布 google chrome os (chromiumos) vmware版本

    前两天赶时髦 把笔记本换上了win8 pro 换win8pro的原因 一个是价格真的很有诚意 另一个就是从DP版本开始就一直用 虽然兼容性问题多多 但作为宿主主机还行 而且xenclient也实在是让人窝火 号称裸机虚拟 其实硬盘速度慢如蜗
  • 读论文(五)MedDialog【参考性大】【可复现】

    Abstract 医疗对话系统有望帮助远程医疗增加医疗保健服务的可及性 提高患者护理质量并降低医疗成本 为促进医学对话系统的研发 我们构建了大规模的医学对话数据集 MedDialog 其中包含中文数据集340万条医患对话 英文数据集120条
  • 24 个 ES6 方法,解决实际开发的 JS 问题

    1 如何隐藏所有指定的元素 tips 本文主要介绍 24 中 es6 方法 这些方法都挺实用的 本本请记好 时不时翻出来看看 const hide el gt Array from el forEach e gt e style displ
  • 使用 Socket 通信实现 FTP 客户端程序

    转 https www ibm com developerworks cn linux l cn socketftp index html FTP FTP 概述 文件传输协议 FTP 作为网络共享文件的传输协议 在网络应用软件中具有广泛的应
  • python是一门面向过程的语言有哪些,python是面向过程的吗

    python是面向过程的吗 1 面向过程 核心是过程二字 过程指的是解决问题的步骤 好比如设计一条流水线 是一种机械式的思维方式 就是程序从上到下一步步执行 一步步从上到下 从头到尾的解决问题 基本设计思路就是程序一开始是要着手解决一个大的
  • 迷你Web文件服务器

    在开发Web程序的时候 有时候需要一个轻量级的Web服务器 用来响应前端的请求 前端一般的请求可以通过本地文件的方式显示 但是毕竟不是真正的Web服务器 有了这个需求 我们开发了一款迷你绿色通用的Web文件服务器 下载地址 WebServe
  • Ubuntu16.04.7+Qt15.5.0环境配置(一条龙讲解)

    目录 1 下载并安装Ubuntu 2 Qt下载与安装 3 Qt环境配置 4 设置编译套件 5 创建qt快速启动脚本 1 下载并安装Ubuntu Ubuntu16 04 7下载链接https releases ubuntu com xenia
  • ipconfig bash: ipconfig: command not found...

    在使用linux查看端口的时候 应该用ifconfig Windows才使用ipconfig
  • Qt 操作SQLite数据库

    一 SQLite 介绍 Sqlite 数据库作为 Qt 项目开发中经常使用的一个轻量级的数据库 可以说是兼容性相对比较好的数据库之一 Sqlite就像Qt的亲儿子 如同微软兼容Access数据库一样 Qt5 以上版本可以直接使用 Qt自带驱
  • 09字符串排序

    给定两个字符串 从字符串2中找出字符串1中的所有字符 去重并按照ASCII码值从小到大排列 输入字符串1长度不超过1024 字符串2长度不超过100 字符范围满足ASCII编码要求 按照ASCII由小到大排序 输入描述 bach bbaac
  • CBAM:融合通道和空间注意力的注意力模块

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 作者 Sik Ho Tsang 编译 ronghuaiyang 导读 使用CBAM加持的MobileNetV1 ResNeXt ResNet WRN优于使用SENet的网络 在这篇文章