全局上下文网络GCNet:创新架构提升视觉识别性能

news2025/3/20 21:23:02

摘要:本文介绍了全局上下文网络(GCNet),通过深入分析非局部网络(NLNet),发现其在重要视觉识别任务中学习的全局上下文与查询位置无关。基于此,提出简化的非局部模块、全局上下文建模框架和GC模块,GCNet在多个视觉任务中性能优异,计算量更低。
关键词:全局上下文网络;非局部网络;自注意力机制;视觉识别;长距离依赖建模

一、引言

在计算机视觉领域,捕捉图像中像素间的长距离依赖关系对理解视觉场景至关重要,这一技术广泛应用于图像分类、目标检测与分割、视频动作识别等任务。传统卷积神经网络主要通过堆叠卷积层来建模长距离依赖,但存在计算效率低和优化困难的问题。非局部网络(NLNet)利用自注意力机制为解决该问题提供了新途径,然而经研究发现,NLNet所建模的全局上下文在不同查询位置近乎相同。
在这里插入图片描述

基于此发现,本文提出全局上下文网络(GCNet)。GCNet通过简化非局部模块,构建全局上下文建模框架,并引入全局上下文(GC)模块,有效提升了视觉识别性能,且计算量显著降低,在多个视觉任务中展现出卓越的效果。

二、相关工作

2.1 深度架构

深度架构的发展是推动计算机视觉进步的关键力量。一方面,诸多研究致力于设计基础组件的功能公式,提升网络的图像特征提取能力。例如AlexNet证明了增加卷积神经网络的深度和宽度可提高图像分类准确率;VGG进一步增加深度和宽度,并采用小内核卷积层;GoogLeNet引入1×1卷积减少参数;ResNet提出跳跃连接解决梯度消失问题;DenseNet通过连接操作增强层间信息流动;ResNeXt和Xception利用分组卷积优化网络参数;可变形卷积网络增强几何建模能力;局部关系网络基于像素对关系确定聚合权重。另一方面,针对特定任务的深度架构不断涌现,如MobileNet用于移动视觉应用,ShuffleNet采用通道洗牌优化分组卷积,FCN用于语义分割,YOLO系列实现快速目标检测,I3D和P3D分别通过3D卷积和分离卷积处理视频动作识别任务。

2.2 长距离依赖建模

长距离依赖建模方法主要分为基于成对关系和基于上下文融合两类。基于成对关系的方法多基于自注意力机制,NLNet是其中的开创性工作,其通过计算像素间的成对关系来建模长距离依赖,在多个视觉任务中取得了良好效果。此外,还有OCNet、DANet和CCNet等扩展方法。然而,本文通过实证分析表明,NLNet在许多重要视觉识别任务中实际上是在学习查询无关的全局上下文,而非成对关系。

基于上下文融合的方法则通过聚合全局信息来增强每个位置的特征,如SENet、GENet、PSANet和CBAM等。但这些方法在全局上下文建模方面可能存在局限性。

2.3 自注意力建模

自注意力机制在自然语言处理和视觉识别等领域广泛应用。在自然语言处理中,Transformer通过自注意力机制建模单词间的长距离依赖,推动了机器翻译的发展;在视觉识别中,注意力机制不仅用于像素关系建模,还用于对象 - 对象/对象 - 像素关系建模,在目标检测中发挥了重要作用。本文围绕自注意力机制在像素 - 像素关系建模中的应用展开研究,提出的GCNet及相关分析为该领域提供了新的思路。

三、非局部网络分析

3.1 回顾非局部模块

非局部模块旨在通过聚合其他位置的信息来增强查询位置的特征,其公式为:
z i = x i + W z ∑ j = 1 N p f ( x i , x j ) C ( x ) ( W v ⋅ x j ) z_{i}=x_{i}+W_{z} \sum_{j = 1}^{N_{p}} \frac{f(x_{i}, x_{j})}{\mathcal{C}(x)}(W_{v} \cdot x_{j}) zi=xi+Wzj=1NpC(x)f(xi,xj)(Wvxj)
其中, i i i为查询位置索引, j j j枚举所有位置, f ( x i , x j ) f(x_{i}, x_{j}) f(xi,xj)表示位置 i i i j j j之间的关系, C ( x ) \mathcal{C}(x) C(x)为归一化因子, W z W_{z} Wz W v W_{v} Wv为线性变换矩阵。

为简化表示,记 ω i j = f ( x i , x j ) C ( x ) \omega_{i j}=\frac{f(x_{i}, x_{j})}{\mathcal{C}(x)} ωij=C(x)f(xi,xj)为归一化的成对关系。非局部模块有高斯、嵌入高斯、点积和拼接四种实例化方式,其中嵌入高斯和高斯应用较为广泛,其架构如图3所示。

非局部模块可视为查询特定的全局上下文建模模块,通过加权求和计算全局上下文向量,进而增强查询位置的特征。然而,其时间和空间复杂度较高,通常仅应用于网络架构的少数位置。
在这里插入图片描述
非局部模块的两种实例化方式:嵌入高斯和高斯。特征图以其维度展示,如CxHxW。⊗表示矩阵乘法,⊕表示逐元素广播加法。对于两个不同维度的矩阵,广播操作会首先在各个维度上扩展特征,使两个矩阵维度匹配。

3.2 分析

3.2.1 可视化

为直观理解非局部模块的行为,我们可视化了不同查询位置的注意力图。以嵌入高斯实例化方式为例,在COCO目标检测任务中,我们在Mask R-CNN(FPN和ResNet50骨干网络)上进行实验,仅在 r e s 4 res4 res4的最后一个残差模块前添加一个非局部模块。
在这里插入图片描述

从COCO数据集中随机选取六张图像,为每张图像可视化三个不同查询位置(红色点)的注意力图(热图)。结果令人惊讶,不同查询位置的注意力图几乎相同,这表明在目标检测任务中,非局部模块可能并未学习像素 - 像素关系,而是在学习全局上下文,计算不同的注意力图可能是多余的。

3.2.2 统计分析

为进一步验证可视化观察结果,我们进行了统计分析。通过计算不同位置的输入特征、注意力图和输出特征之间的余弦距离,来评估它们的差异。平均距离度量定义为:
a v g _ d i s t = 1 N p 2 ∑ i = 1 N p ∑ j = 1 N ˉ p d i s t ( v i , v j ) avg\_dist = \frac{1}{N_{p}^{2}} \sum_{i = 1}^{N_{p}} \sum_{j = 1}^{\bar{N}_{p}} dist(v_{i}, v_{j}) avg_dist=Np21i=1Npj=1Nˉpdist(vi,vj)
其中, d i s t ( v i , v j ) = ( 1 − c o s ( v i , v j ) ) / 2 dist(v_{i}, v_{j})=(1 - cos (v_{i}, v_{j})) / 2 dist(vi,vj)=(1cos(vi,vj))/2为余弦距离。

在COCO目标检测、Kinetics动作识别和ImageNet图像分类三个标准任务中,对非局部模块的四种实例化方式进行分析。结果显示,输入特征在不同位置具有区分度,但输出的全局上下文特征在不同查询位置几乎相同,注意力图的余弦距离也很小,这再次验证了可视化的结论。

此外,我们还分析了非局部模块在不同网络阶段的表现。随着网络层次的升高,输出特征对查询的依赖性增强。同时,对嵌入高斯和高斯实例化方式进行细粒度分析,进一步揭示了非局部模块在不同任务中的行为差异。

值得注意的是,虽然非局部网络在多数任务中未学习成对关系,但在Cityscapes语义分割任务中,它成功学习了成对关系。然而,简化版的NLNet(仅建模全局上下文)在该任务上也表现出与NLNet相当的性能,这表明在语义分割任务中,准确率的提升可能主要归因于全局上下文建模。

四、方法

在这里插入图片描述

主要模块的架构。特征图以特征维度表示,例如C×H×W表示一个通道数为C、高度为H、宽度为W的特征图。⊗表示矩阵乘法,⊕表示广播逐元素加法,⊙表示广播逐元素乘法。

4.1 简化非局部模块

基于嵌入高斯实例化方式在标准任务中的代表性性能,我们以其为基础进行简化。由于不同查询位置的注意力图几乎相同,我们计算一个全局(查询无关)的注意力图,并在所有查询位置共享。同时,省略 W z W_{z} Wz,简化后的非局部模块公式为:
z i = x i + ∑ j = 1 N p exp ⁡ ( W k x j ) ∑ m = 1 N p exp ⁡ ( W k x m ) ( W v ⋅ x j ) z_{i}=x_{i}+\sum_{j = 1}^{N_{p}} \frac{\exp(W_{k}x_{j})}{\sum_{m = 1}^{N_{p}} \exp(W_{k}x_{m})}(W_{v} \cdot x_{j}) zi=xi+j=1Npm=1Npexp(Wkxm)exp(Wkxj)(Wvxj)
进一步应用分配律,将 W v W_{v} Wv移到注意力池化之外,得到:
z i = x i + W v ∑ j = 1 N p exp ⁡ ( W k x j ) ∑ m = 1 N p exp ⁡ ( W k x m ) x j z_{i}=x_{i}+W_{v} \sum_{j = 1}^{N_{p}} \frac{\exp(W_{k}x_{j})}{\sum_{m = 1}^{N_{p}} \exp(W_{k}x_{m})}x_{j} zi=xi+Wvj=1Npm=1Npexp(Wkxm)exp(Wkxj)xj
此简化模块的计算量显著降低,实验表明,它在多个任务上与原始非局部模块性能相当,但计算成本更低。

4.2 全局上下文建模框架

简化的非局部模块可抽象为三个部分:全局注意力池化、特征变换和特征聚合。我们将其视为全局上下文建模框架,定义为:
z i = F ( x i , δ ( ∑ j = 1 N p α j x j ) ) z_{i}=F\left(x_{i}, \delta\left(\sum_{j = 1}^{N_{p}} \alpha_{j}x_{j}\right)\right) zi=F(xi,δ(j=1Npαjxj))
其中, ∑ j α j x j \sum_{j} \alpha_{j}x_{j} jαjxj为上下文建模模块,通过加权平均聚合所有位置的特征得到全局上下文特征; δ ( ⋅ ) \delta(\cdot) δ()表示特征变换,用于捕捉通道间的依赖关系; F ( ⋅ , ⋅ ) F(\cdot, \cdot) F(,)表示融合函数,将全局上下文特征聚合到每个位置的特征中。

有趣的是,挤压激励(SE)模块也是该框架的一个实例。SE模块通过全局平均池化、瓶颈变换和重新缩放函数实现对通道重要性的校准,与我们的框架存在相似之处。

4.3 全局上下文模块

为进一步优化,我们提出全局上下文(GC)模块。在简化非局部模块的基础上,将变换模块的1x1卷积替换为瓶颈变换模块,减少参数数量。同时,在瓶颈变换内部(ReLU之前)添加层归一化,以简化优化并提升性能。

GC模块的公式为:
z i = x i + W v 2 R e L U ( L N ( W v 1 ∑ j = 1 N p e W k x j ∑ m = 1 N p e W k x m x j ) ) z_{i}=x_{i}+W_{v2}ReLU\left(LN\left(W_{v1} \sum_{j = 1}^{N_{p}} \frac{e^{W_{k}x_{j}}}{\sum_{m = 1}^{N_{p}} e^{W_{k}x_{m}}}x_{j}\right)\right) zi=xi+Wv2ReLU(LN(Wv1j=1Npm=1NpeWkxmeWkxjxj))
GC模块计算量轻,可应用于多个层,有效捕捉长距离依赖关系。以ResNet-50为例,添加GC模块后,计算量仅增加0.26%,参数增加约9.86%,但性能提升显著。

与非局部模块相比,GC模块建模的全局上下文相同,但计算成本更低;与SE模块相比,GC模块在捕捉长距离依赖方面更具优势,且通过层归一化优化了瓶颈变换的性能。

五、实验

5.1 COCO上的目标检测/实例分割

我们在COCO 2017数据集上进行目标检测和实例分割实验,遵循标准评估设置,使用PyTorch和mmdetection框架进行实验。

5.1.1 消融研究

在COCO 2017验证集上进行消融研究,结果表明:SNL和GC模块在参数和计算量减少的情况下,性能与NL模块相当,显示出原始非局部设计的冗余;在所有残差模块中添加GC模块可显著提升性能;不同位置插入GC模块效果相似,我们选择after1x1作为默认设置;较高层插入GC模块效果更好,且插入所有层(c3+c4+c5)性能提升更明显;瓶颈设计中,层归一化可有效优化性能,且随着瓶颈比率r减小,性能提升;在融合阶段,加法比缩放更有效,注意力池化与加法结合(att+add)效果最佳。

此外,不同归一化方式对GCNet性能有影响,将骨干网络中的fixBN替换为syncBN可提升性能,且在骨干网络和头部都应用syncBN时,GCNet与基线的差距仍然存在。

5.1.2 更强骨干网络实验

在更强的骨干网络(如ResNet-101、ResNeXt-101)上进行实验,添加可变形卷积和采用级联策略。结果显示,即使采用更强的骨干网络,GCNet相比基线仍有显著性能提升,在测试开发集上也验证了方法的鲁棒性。

5.2 ImageNet上的图像分类

在ImageNet数据集上进行图像分类实验,遵循标准设置进行训练和评估。

实验结果表明,GC模块在参数和计算量更低的情况下,性能略优于NL和SNL模块。在所有残差模块中插入GC模块可显著提升Top-1准确率,且计算开销增加极少。与其他方法相比,GCNet在Top-1准确率上优于SENet和CBAM。

5.3 Kinetics上的动作识别

在Kinetics数据集上进行动作识别实验,采用slow-only基线。

消融研究显示,简化的NL模块和GC模块替换NL模块时性能相当,添加更多GC模块可进一步提升性能且计算量更低。与其他方法相比,GCNet在Top-1准确率上优于GloRE和NLNet。

5.4 Cityscapes上的语义分割

在Cityscapes数据集上进行语义分割实验,遵循CCNet的训练设置和超参数。

实验结果表明,SNL头和NL头性能相当,说明自注意力机制的准确率提升主要源于全局上下文建模。所有头相比基线都显著提升性能,表明长距离依赖在语义分割任务中的重要性。在头部集成GC模块后,骨干网络中的GC模块效果不明显。注意力池化与加法结合(GCNet)在参数和计算量相同的情况下,优于普通平均池化与缩放结合(SENet带层归一化)。与其他方法相比,GCNet与DANet、ANN、CCNet和NLNet性能相当。

5.5 可视化

通过可视化GCNet和NLNet的注意力图,发现两者学习到的注意力图相似,且都聚焦于小或薄的物体,有助于检测这些物体。可视化GC模块的输出激活,发现浅层通道激活与类别无关,深层更依赖类别。通过类别选择性指数分析,发现GCNet在深层的类别选择性更低,这表明其全局上下文计算可能避免了局部模糊带来的问题。

六、结论

本文通过实证分析揭示了非局部网络在重要视觉识别任务中学习查询无关全局上下文的现象,基于此提出了GCNet。GCNet通过简化非局部模块、构建全局上下文建模框架和引入GC模块,在多个视觉任务中取得了优异的性能,且计算量显著降低。未来,全局上下文模块有望在生成模型、图学习模型和自监督模型等领域得到进一步扩展和应用。

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

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

相关文章

鸿蒙NEXT项目实战-百得知识库03

代码仓地址,大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点: 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…

Linux上位机开发实战(qt编译之谜)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很多同学都喜欢用IDE,也能理解。因为不管是visual studio qt插件,还是qt creator其实都帮我们做了很多额外的工作。这里面最…

【人工智能】【Python】在Scikit-Learn中使用网格搜索对决策树调参

这次实践课最大收获非网格搜索莫属。 # 导入包 import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split, GridSearchCV # 网格搜索 from sklearn.tree import DecisionTreeClassi…

用Python代码生成批量下单json

需求 根据以下json体,生成230OrderList对象生成10位有序的数字字母随机数赋值给OrderDetailList.ApiOrderId 和 OrderDetailList.Traceid生成的Json文件 保存在项目JSON目录中 {"UAccount": "xxxx","Password": "","…

TCP、UDP协议的应用、ServerSocket和Socket、DatagramSocket和DatagramPacket

DAY13.1 Java核心基础 TCP协议 TCP 协议是面向连接的运算层协议,比较复杂,应用程序在使用TCP协议之前必须建立连接,才能传输数据,数据传输完毕之后需要释放连接 就好比现实生活中的打电话,首先确保电话打通了才能进…

配置VMware Workstation中Ubuntu虚拟机与Windows主机的剪贴板共享功能

步骤1:安装或更新VMware Tools组件‌ ‌卸载旧版本工具(可选)‌ 若已安装旧版工具,建议先卸载: sudo apt-get autoremove open-vm-tools‌安装必需组件‌ sudo apt-get updatesudo apt-get install open-vm-tools o…

深入理解Python闭包与递归:原理、应用与实践

目录 闭包 什么是闭包: 闭包的基本结构: 实现闭包的条件: 1.嵌套函数 2.内函数引用外部函数的变量 3.外部函数返回内部函数 4.外部函数已经执行完毕 递归函数 什么是递归函数: 递归函数条件 1.必须有个明确的结束条…

SeaCMS代码审计

漏洞描述 漏洞分析 根据漏洞描述定位漏洞代码 当actionsaveCus或者save时,可以进行一个文件写入,不过文件类型被进行了限制,只有html,htm,js,txt,css 虽然这里并不能写入php文件,但是当actionadd或者custom时,这里进行…

好看的网络安全登录页面 vue http网络安全

一、http协议 http协议是一种网络传输协议,规定了浏览器和服务器之间的通信方式。位于网络模型中的应用层。(盗图小灰。ヾ(◍∇◍)ノ゙) 但是,它的信息传输全部是以明文方式,不够安全,…

Unity--GPT-SoVITS接入、处理GPTAPI的SSE响应流

GPT-SoVITS GPT-SoVITS- v2(v3也可以,两者对模型文件具有兼容) 点击后 会进入新的游览器网页 ----- 看了一圈,发现主要问题集中在模型的训练很需要CPU,也就是模型的制作上,问题很多,如果有现有…

Redis哈希槽机制的实现

Redis哈希槽机制的实现 Redis集群使用哈希槽(Hash Slot)来管理数据分布,整个集群被划分为固定的16384个哈希槽。当我们在集群中存储一个键时,Redis会先对键进行哈希运算,得到一个哈希值。然后,Redis将该哈…

docker pull 提示timeout

通过命令行拉取对应的mysql版本提示网络超时。 开始排查,首先确认是否能浏览器访问。ok的,可以正常访问。 终端curl 排查嗯 有问题 改了下 终端 vim ~/.zshrc 加入 export HTTP_PROXY"http://127.0.0.1:7890" export HTTPS_PROXY"…

(超详细) ETL工具之Kettle

Kettle简介 kettle最早是一个开源的ETL工具,后命名为Pentaho Data Integration。由JAVA开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道,可对接包括传统数据库、文件、大数据平台、接口、流…

random_masking 函数测试

文章目录 1. description2. excel3. pytorch code 1. description 功能:按一定比例的随机部分样本,简单来说就是按照一定的比例将行向量从小到大的顺序提取出来。思考1: 用了均匀分布,并且按照一定比例,取前prob概率来…

TDengine 中的流式计算

简介 TDengine 中的流计算,功能相当于简化版的 FLINK , 具有实时计算,计算结果可以输出到超级表中存储,同时也可用于窗口预计算,加快查询速度。 创建流式计算 CREATE STREAM [IF NOT EXISTS] stream_name [stream_o…

Java 大视界 -- Java 大数据在智慧交通自动驾驶仿真与测试数据处理中的应用(136)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

JVM的一些知识

JVM简介 JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别: VMw…

C语言每日一练——day_7

引言 针对初学者,每日练习几个题,快速上手C语言。第七天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…

Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹

引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…

用hexo初始化博客执行hexo init时碰到的问题

用hexo初始化博客执行hexo init时碰到的问题 $ hexo init myblog INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git fatal: unable to access https://github.com/hexojs/hexo-starter.git/: SSL certificate problem: unable to get local issuer cer…