先贴论文链接及GitHub网址,如若侵权,请联系删除。
本文的创新是提出了一个Relation-Aware Global Attention (RGA) module,该module可以捕获全局结构信息用于注意力学习。
创新点(贡献):
- 本文通过从features之间相关性的全局视角来学习每个feature node之间的注意力。作者认为全局范围内的相关性拥有有价值的结构(类似于聚类)信息,并从一个学到的函数(卷积网络)来从相关性中挖掘语义关系,从而获得注意力。
- 本文设计了一个Relation-aware global attention (RGA) module,该module通过两个卷积层(卷积核为1x1)来表示全局范围内的相关性,并基于他们来获得注意力。该思想被应用到空间维度(RGA-S),和通道维度(RGA-C)。
关键技术(对应于文章第三章)
3.2 Spatial Relation-Aware Global Attention(空间)
输入:特征张量(feature map):
输入:空间注意力图(spatial attention map)大小为
根据输入feature map,获得 feature nodes,其中每个feature nodes

的维度为
,即
。将这
个nodes看成图
的
个节点。
从节点 到节点
的对级相关性
定义为嵌入空间中的点乘相关性(dot-product affinity)。
其中 和
为两个嵌入函数(1x1卷积层 + BN层 + ReLU)。反映在代码中,如下所示:
# Embedding functions for modeling relations
if self.use_spatial:
self.theta_spatial = nn.Sequential(
nn.Conv2d(in_channels=self.in_channel, out_channels=self.inter_channel,
kernel_size=1, stride=1, padding=0, bias=False),
nn.BatchNorm2d(self.inter_channel),
nn.ReLU()
)
self.phi_spatial = nn.Sequential(
nn.Conv2d(in_channels=self.in_channel, out_channels=self.inter_channel,
kernel_size=1, stride=1, padding=0, bias=False),
nn.BatchNorm2d(self.inter_channel),
nn.ReLU()
)
同理,可以得到节点 到节点
的对级相关性
。
本文使用 来描述
和
的双向相关性,然后使用相似性矩阵
来表示所有节点之间的对级相关性。
对于第 个feature node,本文以一个确切的固定顺序来堆叠所有nodes的对级相关性,其中node id为
,相关性向量为
,示例可参考图3(a),
。
为了学习第 个node的注意力,本文将feature
本身和相关性向量串联来探索global scope structural information relative和local original information。
因为 与相关性向量不在同一个feature domain中,因此使用下列公式将其转换,并进行串联获得
。
其中 和
分别为特征
本身和全局相关性
的嵌入函数(1x1卷积层 + BN层 + ReLU)。反映在代码中,如下:
# Embedding functions for original features
if self.use_spatial:
self.gx_spatial = nn.Sequential(
nn.Conv2d(in_channels=self.in_channel, out_channels=self.inter_channel,
kernel_size=1, stride=1, padding=0, bias=False),
nn.BatchNorm2d(self.inter_channel),
nn.ReLU()
)
# ...
# Embedding functions for relation features
if self.use_spatial:
self.gg_spatial = nn.Sequential(
nn.Conv2d(in_channels=self.in_spatial * 2, out_channels=self.inter_spatial,
kernel_size=1, stride=1, padding=0, bias=False),
nn.BatchNorm2d(self.inter_spatial),
nn.ReLU()
然后通过学到的模型从其中挖掘有价值的知识来生成注意力值 。
其中 和
为1x1卷积操作 + BN,
通过比例因子
来降维,
将通道维度降为1。反映在代码中如下:
# Networks for learning attention weights
if self.use_spatial:
num_channel_s = 1 + self.inter_spatial
self.W_spatial = nn.Sequential(
nn.Conv2d(in_channels=num_channel_s, out_channels=num_channel_s//down_ratio,
kernel_size=1, stride=1, padding=0, bias=False),
nn.BatchNorm2d(num_channel_s//down_ratio),
nn.ReLU(),
nn.Conv2d(in_channels=num_channel_s//down_ratio, out_channels=1,
kernel_size=1, stride=1, padding=0, bias=False),
nn.BatchNorm2d(1)
)
3.3 Channel Relation-Aware Global Attention (通道)
输入:特征张量(feature map):
输入:通道注意力向量(channel attention vector)大小为
根据输入feature map,获得 个feature nodes,其中每个feature nodes

的维度为
,即
。将这
个nodes看成图
的
个节点。
从节点 到节点
的对级相关性
定义为嵌入空间中的点乘相关性(dot-product affinity)。
其中 和
和空间通道的定义一致。
3.4 Analysis and Discussion
RGA VS CBAM: CBAM采用7x7的卷积核+sigmiod激活函数来决定空间特征位置的注意力,即只有中心位置的7x7=49个近邻feature nodes被用来计算注意力。而RGA-S联合利用所有空间位置的feature nodes来全局决策注意力值,并且仅使用1x1的卷积核。
RGA VS NL and SNL: 对于目标特征位置,NL汇总特征后加到原始特征中用于refinement,计算源位置特征的加权和。NL仅通过一种决策方式使用相关性作为权重用于特征合成。缺乏目标位置的特定适应性。RGA通过一学到的建模函数(卷积)从相关性的全局范围结构信息来挖掘知识。
4.2 实验结果
5 Conclusion
本文提出一种简单有效的Relation-Aware Global Attention module,可以建模全局范围内的结构信息,并通过学到的模型来推理注意力。对于每个特征位置,堆叠每个特征和所有特征之间的相关性,串联特征本身来推理当前位置处的注意力。
个人总结:
个人感觉这篇文章创新点只有一个,也就是RGA-S,和RGA-C,优势是可以添加到不同的backbone中,作为一个单独的注意力模块,从实验结果上看是比较有优势的。看到baseline也能达到一个很高的准确率,这点我比较疑惑,因为其他论文里baseline的效果无法达到94.2%的准确率。罗大神的reid strong baseline也只能达到94.5%。我甚至觉得,这个baseline里面用的东西对提升准确率也有很大帮助。后续若有时间会再更新。