伪装目标检测之注意力CBAM:《Convolutional Block Attention Module》

论文地址:link
代码:link

摘要

我们提出了卷积块注意力模块(CBAM),这是一种简单而有效的用于前馈卷积神经网络的注意力模块。给定一个中间特征图,我们的模块依次推断沿着两个独立维度的注意力图,通道和空间,然后将这些注意力图与输入特征图相乘,进行自适应特征细化。由于CBAM是一个轻量级和通用的模块,它可以无缝地集成到任何CNN架构中,几乎没有额外开销,并且可以与基础CNN一起端到端地进行训练。我们通过在ImageNet-1K、MS COCO检测和VOC 2007检测数据集上进行大量实验来验证我们的CBAM。 我们的实验证明,在各种模型中,分类和检测性能均有一致的提升,展示了CBAM的广泛适用性。

1.介绍

卷积神经网络(CNN)凭借其丰富的表示能力,显著提升了视觉任务的性能[1,2,3]。为了增强CNN的性能,最近的研究主要探讨了网络的三个重要因素:深度、宽度和基数。。除了这些因素,我们研究了架构设计的另一个方面,即注意力。注意力的重要性在前的文献中得到了广泛研究[12,13,14,15,16,17]。注意力不仅告诉我们要关注哪里,还改善了感兴趣的表示。我们的目标是通过使用注意力机制增强表示能力:专注于重要特征并抑制不必要的特征。在本文中,我们提出了一个新的网络模块,名为“卷积块注意力模块”。由于卷积操作通过将跨通道和空间信息混合在一起提取信息特征,我们采用我们的模块来强调这两个主要维度上的有意义特征:通道和空间轴。为了实现这一点,我们依次应用通道和空间注意力模块(如图1所示),以便每个分支可以分别学习在通道和空间轴上关注“什么”和“哪里”。
主要贡献
1.我们提出了一个简单而有效的注意力模块(CBAM),可以广泛应用于提升CNN的表示能力。
2.我们通过广泛的消融研究验证了我们的注意力模块的有效性。
3.我们验证了在多个基准测试(ImageNet-1K、MS COCO和VOC 2007)上,通过插入我们的轻量级模块,各种网络的性能得到了显著提升。

2.卷积块注意模块

在这里插入图片描述
给定一个中间特征图 F ∈ R C × H × W F \in {R^{C \times H \times W}} FRC×H×W作为输入,CBAM 依次推断出一个1D通道注意力图 M c ∈ R C × 1 × 1 {M_c} \in {R^{C \times 1 \times 1}} McRC×1×1和一个 2D 空间注意力图 M s ∈ R 1 × H × W {M_s} \in {R^{1 \times H \times W}} MsR1×H×W,如图1所示。总体注意力过程可以总结为:
在这里插入图片描述
在这里,符号 ⊗ 表示逐元素乘法。在乘法过程中,注意力值相应地进行广播(复制):通道注意力值沿空间维度广播,反之亦然。F ′′ 是最终的精炼输出。图2描述了每个注意力图的计算过程。以下描述了每个注意力模块的细节。

2.1 Channel attention module

利用特征的通道间关系来生成通道注意力图,特征图的每个通道都被视为特征检测器,通道注意力集中在给定输入图像的情况下“什么”是有意义的,为了有效地计算通道注意力,压缩输入特征图的空间维度,使用平均池化和最大池化特征。利用这两个特征可以极大地提高网络的表示能力,而不是单独使用每个特征。
首先利用平均池化和最大池化操作来聚合特征图的空间信息,生成两个不同的空间上下文描述符, F a v g c F_{avg}^c Favgc F m a x c F_{max}^c Fmaxc,分别表示平均池化特征和最大池化特征。然后,这两个描述符都被转发到共享网络以生成我们的通道注意力图 M c ∈ R C × 1 × 1 {M_c} \in {R^{C \times 1 \times 1}} McRC×1×1 。共享网络由具有一个隐藏层的多层感知器(MLP)组成。为了减少参数开销,隐藏激活大小设置为 R C / r × 1 × 1 R ^{C/r×1×1} RC/r×1×1 ,其中 r 是缩减比率。将共享网络应用于每个描述符后,我们使用逐元素求和来合并输出特征向量。简而言之,通道注意力计算如下:
在这里插入图片描述
其中 σ 表示 sigmoid 函数,W0 ∈ R C / r × C R^{C/r×C} RC/r×C ,W1 ∈ R C × C / r R^{C×C/r} RC×C/r 。请注意,两个输入共享 MLP 权重 W 0 W_0 W0 W 1 W_1 W1,并且 ReLU 激活函数后面跟着 W 0 W_0 W0

2.2 Spatial attention module

利用特征的空间关系生成空间注​​意力图。与通道注意力不同,空间注意力关注的是“哪里”,这是信息性的部分,与通道注意力是互补的。为了计算空间注意力,我们首先沿着通道轴应用平均池化和最大池化操作并将它们连接起来以生成有效的特征描述符。沿着通道轴应用池化操作被证明可以有效地突出显示信息区域。在级联特征描述符上,我们应用卷积层来生成空间注​​意力图 M s ( F ) ∈ R H × W {M_s}\left( F \right) \in {R^{H \times W}} Ms(F)RH×W,它对强调或抑制的位置进行编码。下面我们描述详细操作。通过使用两个池化操作来聚合特征图的通道信息,生成两个2D图: F a v g s ∈ R 1 × H × W F_{avg}^s \in {R^{1 \times H \times W}} FavgsR1×H×W F m a x s ∈ R 1 × H × W F_{max}^s \in {R^{1 \times H \times W}} FmaxsR1×H×W。每个表示整个通道的平均池化特征和最大池化特征。然后,它们通过标准卷积层连接和卷积,生成我们的 2D 空间注意力图。简而言之,空间注意力计算如下:
在这里插入图片描述
其中σ表示sigmoid函数,f 7×7表示滤波器尺寸为7×7的卷积运算。

注意力模块的安排。给定输入图像,两个注意力模块(通道和空间)计算互补注意力,分别关注“什么”和“哪里”。考虑到这一点,两个模块可以并行或顺序放置。我们发现顺序排列比并行排列提供更好的结果。对于顺序过程的安排,我们的实验结果表明,通道优先顺序略好于空间优先顺序。
代码实现:

import torch
import math
import torch.nn as nn
import torch.nn.functional as Fclass BasicConv(nn.Module):def __init__(self, in_planes, out_planes, kernel_size, stride=1, padding=0, dilation=1, groups=1, relu=True, bn=True, bias=False):super(BasicConv, self).__init__()self.out_channels = out_planesself.conv = nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias)self.bn = nn.BatchNorm2d(out_planes,eps=1e-5, momentum=0.01, affine=True) if bn else Noneself.relu = nn.ReLU() if relu else Nonedef forward(self, x):x = self.conv(x)if self.bn is not None:x = self.bn(x)if self.relu is not None:x = self.relu(x)return xclass Flatten(nn.Module):def forward(self, x):return x.view(x.size(0), -1)class ChannelGate(nn.Module):def __init__(self, gate_channels, reduction_ratio=16, pool_types=['avg', 'max']):super(ChannelGate, self).__init__()self.gate_channels = gate_channelsself.mlp = nn.Sequential(Flatten(),nn.Linear(gate_channels, gate_channels // reduction_ratio),nn.ReLU(),nn.Linear(gate_channels // reduction_ratio, gate_channels))self.pool_types = pool_typesdef forward(self, x):channel_att_sum = Nonefor pool_type in self.pool_types:if pool_type=='avg':avg_pool = F.avg_pool2d( x, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3)))channel_att_raw = self.mlp( avg_pool )elif pool_type=='max':max_pool = F.max_pool2d( x, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3)))channel_att_raw = self.mlp( max_pool )elif pool_type=='lp':lp_pool = F.lp_pool2d( x, 2, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3)))channel_att_raw = self.mlp( lp_pool )elif pool_type=='lse':# LSE pool onlylse_pool = logsumexp_2d(x)channel_att_raw = self.mlp( lse_pool )if channel_att_sum is None:channel_att_sum = channel_att_rawelse:channel_att_sum = channel_att_sum + channel_att_rawscale = F.sigmoid( channel_att_sum ).unsqueeze(2).unsqueeze(3).expand_as(x)return x * scaledef logsumexp_2d(tensor):tensor_flatten = tensor.view(tensor.size(0), tensor.size(1), -1)s, _ = torch.max(tensor_flatten, dim=2, keepdim=True)outputs = s + (tensor_flatten - s).exp().sum(dim=2, keepdim=True).log()return outputsclass ChannelPool(nn.Module):def forward(self, x):return torch.cat( (torch.max(x,1)[0].unsqueeze(1), torch.mean(x,1).unsqueeze(1)), dim=1 )class SpatialGate(nn.Module):def __init__(self):super(SpatialGate, self).__init__()kernel_size = 7self.compress = ChannelPool()self.spatial = BasicConv(2, 1, kernel_size, stride=1, padding=(kernel_size-1) // 2, relu=False)def forward(self, x):x_compress = self.compress(x)x_out = self.spatial(x_compress)scale = F.sigmoid(x_out) # broadcastingreturn x * scaleclass CBAM(nn.Module):def __init__(self, gate_channels, reduction_ratio=16, pool_types=['avg', 'max'], no_spatial=False):super(CBAM, self).__init__()self.ChannelGate = ChannelGate(gate_channels, reduction_ratio, pool_types)self.no_spatial=no_spatialif not no_spatial:self.SpatialGate = SpatialGate()def forward(self, x):x_out = self.ChannelGate(x)if not self.no_spatial:x_out = self.SpatialGate(x_out)return x_out

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

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

相关文章

10.2024

使用选择排序将{2,9,5,0,1,3,6,8}排序 代码&#xff1a; public class 第十题 {public static void main(String[] args) {int a[]{2,9,5,0,1,3,6,8};int begin0;int enda.length-1;while (begin<end){int mina[begin];int tbegin;for (int ibegin;i<end;i){if(min>…

Selenium 自动化 —— 定位页面元素

更多内容请关注我的 Selenium 自动化 专栏&#xff1a; 入门和 Hello World 实例使用WebDriverManager自动下载驱动Selenium IDE录制、回放、导出Java源码浏览器窗口操作切换浏览器窗口 使用 Selenium 做自动化&#xff0c;我们不仅仅是打开一个网页&#xff0c;这只是万里长…

Python私有属性和私有方法

私有属性和私有方法 在实际开发中&#xff0c;对象的某些属性或者方法只希望在对象内部被使用&#xff0c;而不希望在外界被访问。 私有属性&#xff1a;对象不希望公开的属性 私有方法&#xff1a;对象不希望公开的方法 定义方式&#xff1a;在属性名或者方法名前添加两个下划…

flask_restful规范返回值之类型设置

大型的互联网项目中&#xff0c;返回的数据格式&#xff0c;有时是比较复杂的结构。 如&#xff1a;豆瓣电影 https://movie.douban.com/j/chart/top_list?type24&interval_id 100%3A90&action&start20&limit20 返回的值里有 json 或者列表数据&#xff0c…

解决sqlalchemy执行语句提示Not an executable object

问题&#xff1a; from sqlalchemy import create_engine# 数据库的变量 HOST 127.0.0.1 PORT 3306 DATA_BASE itbz USERroot PWD123456 # DB_URL f数据库的名驱动名://{USER}:{PWD}{HOST}:{PORT}/{DATA_BASE} DB_URL fmysqlpymysql://{USER}:{PWD}{HOST}:{PORT}/{DATA_B…

分类模型评估:混淆矩阵与ROC曲线

1.混淆矩阵2.ROC曲线 & AUC指标 理解混淆矩阵和ROC曲线之前&#xff0c;先区分几个概念。对于分类问题&#xff0c;不论是多分类还是二分类&#xff0c;对于某个关注类来说&#xff0c;都可以看成是二分类问题&#xff0c;当前的这个关注类为正类&#xff0c;所有其他非关注…

政安晨:【Keras机器学习实践要点】(三)—— 编写组件与训练数据

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 介绍 通过 Keras&#xff0c;您可以编写自定…

位段详细解释

结构体位段的使用原则 在C语言中&#xff0c;结构体&#xff08;Struct&#xff09;是一种复合数据类型&#xff0c;它允许我们将多个不同类型的数据项组合成一个单一的实体。位段&#xff08;Bit Field&#xff09;是结构体中的一个特殊成员&#xff0c;它允许我们只取结构体…

常用中间件redis,kafka及其测试方法

常用消息中间件及其测试方法 一、中间件的使用场景引入中间件的目的一般有两个&#xff1a;1、提升性能常用的中间件&#xff1a;1) 高速缓存&#xff1a;redis2) 全文检索&#xff1a;ES3) 存日志&#xff1a;ELK架构4) 流量削峰&#xff1a;kafka 2、提升可用性产品架构中高可…

Spring Cloud 网关Gateway + 配置中心

网关 网络的接口&#xff0c;负责请求的路由、转发、身份校验 路由&#xff1a;告诉请求去哪找 转发&#xff1a;请求找不到直接带请求过去 路由及转发 判断前端请求的规则就这么配 当前情况下只需要访问8080端口 就可以完成对全部微服务的访问 路由属性 登录校验 没必要在每…

sonar+gitlab提交阻断 增量扫描

通过本文&#xff0c;您将可以学习到 sonarqube、git\gitlab、shell、sonar-scanner、sonarlint 一、前言 sonarqube 是一款开源的静态代码扫描工具。 实际生产应用中&#xff0c;sonarqube 如何落地&#xff0c;需要考虑以下四个维度&#xff1a; 1、规则的来源 现在规则的…

java一和零(力扣Leetcode474)

一和零 力扣原题 给定一个二进制字符串数组 strs 和两个整数 m 和 n&#xff0c;请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中最多有 m 个 0 和 n 个 1。 示例 1&#xff1a; 输入&#xff1a;strs [“10”, “0001”, “111001”, “1”, “0”], m 5, n …

【msyql】mysqldump: 未找到命令...

使用mysqldump备份数据库出现错误提示&#xff1a; mysqldump: 未找到命令... 执行的命令如下&#xff1a; mysqldump -uroot -proot --databases db_user > /home/backups/databackup.sql 解决方法 确认mysql是否安装 查看mysql版本 mysql --version 查找mysql安装路…

php反序列化刷题1

[SWPUCTF 2021 新生赛]ez_unserialize 查看源代码想到robots协议 看这个代码比较简单 直接让adminadmin passwdctf就行了 poc <?php class wllm {public $admin;public $passwd; }$p new wllm(); $p->admin "admin"; $p->passwd "ctf"; ec…

极光笔记|极光消息推送服务的云原生实践

摘要 极光始终秉承“以开发者为中心”的战略导向&#xff0c;极光推送&#xff08;JPush&#xff09;是国内领先的消息推送服务。极光推送&#xff08;JPush&#xff09;本质上是一种软件付费应用程序&#xff0c;结合当前主流云厂商基础施设&#xff0c;逐渐演进成了云上SaaS…

Java后端设置服务器允许跨域

文章目录 1、实现2、一些问题关于各项请求头的作用关于预检请求 3、一些补充4、疑问点 1、实现 以下通过servlet的Filter给所有响应的header加了一些跨域相关的数据&#xff0c;以实现允许跨域。 import org.springframework.context.annotation.Configuration; import org.s…

数据可视化基础与应用-04-seaborn库从入门到精通01-02

总结 本系列是数据可视化基础与应用的第04篇seaborn&#xff0c;是seaborn从入门到精通系列第1-2篇。本系列的目的是可以完整的完成seaborn从入门到精通。主要介绍基于seaborn实现数据可视化。 参考 参考:数据可视化-seaborn seaborn从入门到精通01-seaborn介绍与load_datas…

RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能

RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能 文章目录 RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能1. RabbitMQ端口说明2. 开启Rabbitmq后台管理功能1. 查看rabbitmq已安装的插件2. 开启rabbitmq后台管理平台插件3. 开启插件后&#xff0c;再次查看插…

RSTP环路避免实验(华为)

思科设备参考&#xff1a;RSTP环路避免实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 RSTP (Rapid Spanning Tree Protocol) 是从STP发展而来 • RSTP标准版本为IEEE802.1w • RSTP具备STP的所有功能&#xff0c;可以兼容STP运行 • RSTP和STP有所不同 减少了…

Tomcat下载安装以及配置

一、Tomcat介绍 二、Tomcat下载安装 进入tomcat官网&#xff0c;https://tomcat.apache.org/ 1、选择需要下载的版本&#xff0c;点击下载 下载路径一定要记住&#xff0c;并且路径中尽量不要有中文 8、9、10都可以&#xff0c;本博文以8为例 2、将下载后的安装包解压到指定位…