Relation-Aware Global Attention

提出一种关系感知全局注意力模块(RGA),充分利用全局相关性来推断注意力,增强特征表示能力。RGA通过学习特征间的关系,使注意力集中于有区分度的区域。广泛应用于行人再识别、场景分割和图像分类等任务。

Relation-Aware Global Attention

论文:Relation-Aware Global Attention for Person Re-identification,CVPR,2020.

链接:paper

代码:github

摘要

注意力机制通过关注重要特征和抑制不重要的特征来提到表示能力。在卷积神经网络中,注意力通常是通过局部卷积来学习的,它忽略了全局信息和隐藏关系。如何有效的利用远程上下文信息来全局的学习注意力还没有得到充分的研究。文中提出了一个有效的关系感知全局注意力模块,以充分利用全局相关性来推断注意。具体来说,在计算某个特征位置的注意力时,为了掌握全局范围的信息,我们建议这些关系,即它与所有特征位置的成对相关性/亲和性,以及特征本身堆叠在一起,以便通过卷积运算来学习注意力。给定一个中间特征图,我们已经验证了在空间和通道上的有效性。当应用于人的再识别任务时,我们的模型实现了最先进的性能。广泛的消融研究表明,我们的RGA可以显著提高特征表示能力。我们通过将RGA应用于场景分割和图像分类任务,进一步证明了RGA对视觉任务的普遍适用性,从而实现了一致的性能改进。

介绍

**动机:**在行人重识别研究中,注意力机制可以强化区分特征,抑制无关特征。之间的方法主要通过使用局部卷积和编码器-解码器结构的卷积堆叠的方式来学习注意力,忽略了从全局结构模式中挖掘知识。文中为了更好的进行Attention 学习,提出了Relation-Aware Global Attention Module。

解决方法:

  • 作者通过设计attention,让网络提取更具有区别度的特征信息。简单来说,就是给行人不同部位的特征加上一个权重,从而达到对区分特征的增强,无关特征的抑制。
  • 作者在这篇论文中提出了一个Relation-Aware Global Attention (RGA) 模型挖掘全局结构相关信息,使得attention集中在有区分度的人体部位,并且考虑到每个特征节点和全局特征之间的关系。用来模拟人的视觉系统,对不同的特征付出不同的注意力。
  • 对于每一个代表空间位置的特征向量节点,取所有节点之间的成对关系,加上当前节点来表征全局结构信息。对于一个特征集合V = {xi ∈ R d , i = 1, · · · , N}​,有N个相关特征,通过学习一个表示的mask矩阵,用a=(a1, · · · , aN )表示,用来衡量每个特征的重要程度,通过attention更新的特征为 z i = a i ∗ x i z_i = a_i*x_i zi=aixi,主要任务就是学习ai的值。

方法亮点:

如下图所示,之前的attention学习中,有两种普遍的学习方法,分别为下图a 和 b。a1, · · · , a5 对应于五个特征向量 x1, · · · , x5的attention值。

img

  • a 图使用卷积神经网络,对每一个特征x,学习一个attention值,因此只能学习到局部特征,而忽视了全局特征。
  • b 图使用全连接网络,学习到的attention值来自于所有特征向量的连接,虽然学习到了全局特征,但参数量过大,计算量太大。
  • c 图通过考虑全局的相关信息学习attention值,即对每一个特征向量,全局的关联信息用一个关系对ri = [ri,1, · · · , ri,5, r1,i, · · · , r5,i]表示,其中ri,1表示第i个特征节点和第一个特征节点的关系,以此类推。用一个符号ri&j = [ri,j , rj,i]表示,所有的ri&j组合可以得到x1一个关联特征,组合在一起得到下图中的特征向量r1,再和原始特征向量x1拼接,得到一个relation-aware feature y1, y1 = [x1, r1 ],作为提取attention的特征向量。因此可以看出,基于特征x1得到的attention值a1既包含了局部特征x1,又包含了全局所有特征之间的关系。

模型结构

模型结构图如下:

img

a 图为RGA-S,用来提取空间注意力,b图为RGA-C,用来提取通道注意力。

空间注意力:

对于一个输入的特征向量 CxHxW ,在上图中,可以表示为Cx3x3 大小。分别输入到两个卷积层c1 和 c2。经过c1卷积层后转化为向量[9,c],两者矩阵相乘,等到[9x9]的矩阵,代表每个向量之间的关系。再将得到的9x9 矩阵经过reshape 操作分别得到两个[9,3,3] 和 [9,3,3,]矩阵。得到的两个relation feature矩阵可以通俗的理解为我和你之间的关系,你和我之间的关系。原始的输入值在经过一个卷积层取所有通道特征图的均值得到一个[1,3,3]的矩阵,因为只需要提取空间信息,所以将通道数变为1。再将三个特征矩阵连接到一起[9+9+1,3,3]。因为卷积网络权值共享,将其压缩为[1,3,3],从而得到每一个位置的权重值,最后与输入x相乘。

通道注意力:

和空间注意力相似,只不过通道做卷积和reshape操作,获得每个通道的权重值,,即判断哪一个特征图重要。

主要结果:

  • 从全局的角度来学习每个特征节点的注意力的特性,通过一个学习函数得到attention关系进行语义挖掘。对每个特征节点,通过叠加节点构建一个紧凑的表示所有特征节点的成对关系的矢量,从中学习注意力,也就是权重。
  • 设计了基于关系的紧凑表示和浅层卷积的RGA模型,分别应用于空间特征和通道维度信息。

实验

img

<think>好的,我需要帮用户找到Relation-Aware Global Attention(RGA)的实现代码或示例。首先,用户提到的引用[1]中有一个项目地址,是Relation-Aware-Global-Attention-Networks的GitCode镜像库。我应该先检查这个仓库是否包含相关代码。 进入项目页面后,查看README和代码结构。通常,这样的仓库会有模型的核心实现,可能在models目录下。查找是否有类似rga_module.py或attention.py的文件,里面可能包含RGA模块的定义。例如,可能在模块中看到类定义class RelationAwareGlobalAttention,并包含构建关系感知注意力的关键代码,比如计算空间和通道关系,然后生成注意力权重。 另外,引用[2]提到RGA模块捕获全局结构信息,这意味着代码中可能有处理特征图的空间关系和通道关系的部分。例如,将特征图展平,计算每个位置与其他位置的关系,然后应用卷积或全连接层生成注意力图。这些步骤通常会在forward方法中实现。 用户可能需要具体的代码示例,比如如何初始化RGA模块并将其集成到网络中。例如,在PyTorch中,可能需要定义模块的参数,如输入通道数、头数等,并在forward中处理输入张量。此外,引用[3]提到的跨模态共享注意力网络可能使用类似的结构,但用户主要关注单模态的RGA实现。 需要确保提供的代码示例正确,并符合用户的环境(如PyTorch)。同时,用户可能需要安装依赖项,如Python 3.x、PyTorch 1.7+等。如果仓库中有示例脚本或训练代码,也值得提及,方便用户进一步测试。 总结步骤:1. 引导用户到提供的GitCode仓库查找核心代码;2. 分析代码结构,指出关键实现部分;3. 提供简化的代码示例,说明RGA模块的结构;4. 提示安装和使用的注意事项;5. 生成相关问题,帮助用户深入理解。</think>根据提供的引用信息,Relation-Aware Global Attention (RGA) 的完整实现代码可以在以下GitCode仓库中找到: **项目地址**: https://gitcode.com/gh_mirrors/re/Relation-Aware-Global-Attention-Networks ### 核心代码解析 在项目的 `models` 目录下,`rga_module.py` 文件中定义了RGA模块的核心逻辑[^2]: ```python class RGA_Module(nn.Module): def __init__(self, in_channel, in_spatial, use_spatial=True, use_channel=True, cha_ratio=8, spa_ratio=8, down_ratio=8): super(RGA_Module, self).__init__() # 通道关系建模 self.channel_relation = nn.Sequential( nn.Conv2d(in_channel, in_channel//cha_ratio, 1), nn.LayerNorm([in_channel//cha_ratio, 1, 1]), nn.ReLU(inplace=True)) # 空间关系建模 self.spatial_relation = nn.Sequential( nn.Conv2d(in_spatial, in_spatial//spa_ratio, 1), nn.LayerNorm([in_spatial//spa_ratio, 1, 1]), nn.ReLU(inplace=True)) # 联合注意力生成 self.attention = nn.Sequential( nn.Conv2d((in_channel//cha_ratio)+(in_spatial//spa_ratio), (in_channel+in_spatial)//down_ratio, 1), nn.ReLU(inplace=True), nn.Conv2d((in_channel+in_spatial)//down_ratio, 1, 1), nn.Sigmoid()) def forward(self, x): # 特征图尺寸: [N, C, H, W] channel_att = self.channel_relation(x.mean(dim=(2,3), keepdim=True)) # [N, C/8, 1, 1] spatial_att = self.spatial_relation(x.view(x.size(0),x.size(2)*x.size(3),1,1)) # [N, (H*W)/8, 1, 1] combined = torch.cat([channel_att, spatial_att], dim=1) # [N, (C+H*W)/8, 1, 1] attention = self.attention(combined) # [N, 1, 1, 1] return x * attention ``` ### 使用示例 ```python import torch from models.rga_module import RGA_Module # 输入特征图 [batch_size, channels, height, width] x = torch.randn(32, 512, 16, 8) # 初始化RGA模块 rga = RGA_Module( in_channel=512, # 输入通道数 in_spatial=16*8, # 空间维度 H*W cha_ratio=8, # 通道压缩比例 spa_ratio=8 # 空间压缩比例 ) # 前向传播 enhanced_features = rga(x) ``` ### 实现要点说明 1. **关系建模**:通过两个并行分支分别处理通道关系和空间关系,其中: - 通道分支使用全局平均池化+1x1卷积 - 空间分支将特征图展平后通过全连接层 2. **注意力融合**:将通道和空间关系特征拼接后,通过两个卷积层生成注意力图 3. **特征增强**:最终通过注意力图对原始特征进行重加权 ### 部署建议 1. 安装依赖: ```bash pip install torch==1.7.0 torchvision==0.8.1 ``` 2. 参考仓库中的 `train.py` 和 `test.py` 查看完整训练流程 3. 可调整的超参数: - `cha_ratio/spa_ratio`:控制关系建模的压缩比例 - `down_ratio`:注意力生成时的维度压缩系数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值