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

目录

写在前面

一、基数和宽度

二、通道注意力模块(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_outreturn 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 nnclass 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_outreturn 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 = 1def __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) * outout = self.sa(out) * outout = self.relu(out)return outif __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.rhkb.cn/news/413856.html

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

相关文章

Photomator 3.3.22 (macOS Universal) - 照片编辑软件

Photomator 3.3.22 (macOS Universal) - 照片编辑软件 适用于 Mac、iPhone 和 iPad 的终极照片编辑器 请访问原文链接:https://sysin.org/blog/photomator/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Photoma…

LeetCode_sql_day20(1398.购买了产品A和产品B却没有购买产品C的顾客)

描述: Customers 表: ------------------------------ | Column Name | Type | ------------------------------ | customer_id | int | | customer_name | varchar | ------------------------------ customer_id 是这张表中具有唯一…

浏览器播放RTSP流,支持H264、H265等格式,支持IE、Chrome等浏览器

目录 背景 解决方案 效果 代码 前端代码 后端代码 下载 背景 项目中需要在浏览器中播放RTSP流,实在是不想折腾ActiveX控件 1、麻烦(开发麻烦、使用时设置也麻烦) 2、非IE浏览器不兼容 解决方案 使用OpenCvSharpNancy写一个解码服…

617. 合并二叉树

目录 一:题目: 二:代码: 三:结果: 一:题目: 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些…

捷达千里江山首发亮相,捷达品牌2024成都车展继续宠粉不停

2024年8月30日,捷达品牌携新车捷达千里江山惊艳亮相2024成都国际车展,并在五周年之际,发布幸福包油计划等宠粉福利,号召用户打卡千里江山,奔赴美好。与此同时,全新捷达VS5/VS7五周年纪念版车型进一步降低了…

H264码流结构讲解

所谓的码流结构就是指:视频经过编码之后所得到的数据是怎样排列的,换句话说,就是编码后的码流我们该如何将一帧一帧的数据分离开来,哪一块数据是一帧图像,哪一块是另外一帧图像,只要了解了这个,…

vue3是如何避免样式污染的?

众所周知,在vue中使用scoped可以避免父组件的样式渗透到子组件中。使用了scoped后会给html增加自定义属性data-v-x,同时会给组件内CSS选择器添加对应的属性选择器[data-v-x]。本文讲一下vue是如何给CSS选择器添加对应的属性选择器[data-v-x]。注&#xf…

JVM堆内存空间(heap)

在Java程序运行时,系统运行过程中产生的大部分实例对象以及数组对象都会被放到堆中存储。 默认情况下,如果不通过参数强制指定堆空间大小,那么JVM会根据当前所在的平台进行自适应调整,起始大小默认为当前物理机器内存的1/64&…

基于ssm+vue的汽车租赁管理系统

摘要 随着移动应用技术的发展,越来越多的用户借助于移动手机、电脑完成生活中的事务,许多的传统行业也更加重视与互联网的结合,以提高商家知名度和寻求更高的经济利益。针对传统汽车租赁系统,租赁信息、续租信息等问题&#xff0c…

【算法每日一练及解题思路】找出模式匹配字符串的异位词在原始字符串中出现的索引下标

【算法每日一练及解题思路】找出模式匹配字符串的异位词在原始字符串中出现的索引下标 一、题目:找出模式匹配字符串的异位词在原始字符串中出现的索引下标 二、举例: 两个字符串原始字符串initStr123sf3rtfb,模式匹配字符串regxf3s,找到模…

区域生长算法详解与Python实现

图像分割是计算机视觉中一个重要的任务,区域生长算法是其中的一种常见方法。本文将详细介绍区域生长算法的原理,并通过Python代码实现,带你一步步理解它的实际应用。 1. 区域生长算法简介 区域生长算法是一种基于像素相似性进行图像分割的方…

【方法论】读论文的三个层次,四个阶段,十个问题

学习资料 - 沈向洋十问 如何正确阅读一篇科研论文 阅读理解作者的意图,不同的阅读需求对应不同的阅读层次(速读,精读,研读) 速读:标题,引言,摘要,结论 文章要解决什么…

并发编程之定时任务定时线程池

并发编程之定时任务&定时线程池-CSDN博客

Upload-LABS通关攻略【1-20关】

Pass-01 第一关是前端JS绕过 上传一个php文件显示只能上传特定后缀名的文件 这里将1.php改为1.jpg直接进行抓包,在数据包中将jpg改为php放行 文件上传成功,邮件图片新建页面打开 可以访问到1.php文件,则一句话密码上传成功 使用蚁剑 进行连接…

六、vue进阶知识点

一、scoped解决样式冲突 默认情况:写在组件中的样式会 全局生效→ 因此很容易造成多个组件之间的样式冲突问题。 1.全局样式:默认组件中的样式会作用到全局 2.局部样式:可以给组件加上 scoped 属性,可以让样式只作用于当前组件scoped原理? 1.当前组件内标签都被添加 data-v-…

智慧猪场实训中心解决方案

一、引言 随着科技的飞速发展,传统养猪业正经历着前所未有的变革。为了提高养猪效率、降低生产成本并保障猪只健康,智慧养猪场的概念应运而生。唯众特此推出《智慧猪场实训中心解决方案》,旨在通过先进的技术与管理手段,为养猪业培…

RTA-OS Port Guide学习(一)-基于S32K324 OS

文章目录 前言OS Port的安装Port CharacteristicsParameters of ImplementationConfiguration ParametersStack used for C-startup(SpPreStartOS)Stack used when idle (SpStartOS)Stack overheads for ISR activation (SpIDisp)Stack overheads for ECC tasks (SpECC)Stack o…

uniapp uni-popup底部弹框留白 底部颜色修改 滚动穿刺

做底部弹框的时候,可能出现以下场景需要处理。 一、出现底部留白不是白色,需要修改颜色的时候: 1、如果弹框不需要圆角效果,则在uni-popup加上背景色就行,弹框是个直角样式: 2、如果需要圆角效果&#xff0…

vue3本地运行错误集

1、解决报错ValidationError: Progress Plugin Invalid Options问题 ValidationError: Progress Plugin Invalid Optionsoptions should NOT have additional propertiesoptions should NOT have additional propertiesoptions should NOT have additional propertiesoptions …

「Claude3.5」全面超越「gpt-4o」,我用它做了个贪吃蛇,玩了一整天!

大家好,我是凡人。 就在昨天晚上Anthropic在X上连续发了4条动态来高调宣布他们的Claude 3.5 Sonnet中杯的版本已经全面向公众开放使用,大批的技术博主连夜测试,纷纷给出的不低的评价。 而这还仅仅是开胃小菜,官方宣称今年晚些时候…