HOSG:提取身份信息个部分之间的关系
首先将每幅图像进行均匀划分为6份,形成6个节点。代码中体现:
for i in range(self.num_stripes):
# local_6_feat = F.max_pool2d(
# feat[:, :, i * stripe_h_6: (i + 1) * stripe_h_6, :],
# (stripe_h_6, feat.size(-1)))
local_6_feat = feat[:, :, i * stripe_h_6: (i + 1) * stripe_h_6, :]
b, c, h, w = local_6_feat.shape
local_6_feat = local_6_feat.view(b, c, -1)
p = 3 # regDB: 10.0 SYSU: 3.0
local_6_feat = (torch.mean(local_6_feat ** p, dim=-1) + 1e-12) ** (1 / p)
local_6_feat = local_6_feat.view(local_6_feat.size(0),local_6_feat.size(1),1,1)
local_6_feat_list.append(local_6_feat)
for i in range(self.num_stripes):
local_6_feat = self.local_6_conv_list[i](local_6_feat_list[i]).squeeze(3).squeeze(2)
同一图像中不同节点之间距离公式
除去目标节点,剩余5个节点的聚合信息,代码体现:
for i in range(self.num_stripes):
rest_6_feat_list.append((local_6_feat_list[(i + 1) % self.num_stripes]
+ local_6_feat_list[(i + 2) % self.num_stripes]
+ local_6_feat_list[(i + 3) % self.num_stripes]
+ local_6_feat_list[(i + 4) % self.num_stripes]
+ local_6_feat_list[(i + 5) % self.num_stripes]) / 5)
利用下图方式更新节点特征,更新后的节点特征包含本节点特征以及本节点与其他节点之间关系
代码体现:
for i in range(self.num_stripes):
local_6_feat = self.local_6_conv_list[i](local_6_feat_list[i]).squeeze(3).squeeze(2)
input_rest_6_feat = self.rest_6_conv_list[i](rest_6_feat_list[i]).squeeze(3).squeeze(2)
input_local_rest_6_feat = torch.cat((local_6_feat, input_rest_6_feat), 1).unsqueeze(2).unsqueeze(3)
local_rest_6_feat = self.relation_6_conv_list[i](input_local_rest_6_feat)
local_rest_6_feat = (local_rest_6_feat
+ local_6_feat.unsqueeze(2).unsqueeze(3)).squeeze(3).squeeze(2)
final_feat_list.append(local_rest_6_feat)
但是代码中剩余节点并没有经过上图中的Gem pooling层
HGAM:目的是使同一个人的不同图像之间的特征是对齐的,从而避免两幅图像之间噪声信息的干扰。
首先构造了一个异质相邻矩阵E,eij表示第i个样本和第j个样本的L2距离。
然后利用和Dijkstra类似的路径搜索算法计算两个图之间的最终最短距离(我对这个最终最短距离的理解是综合两个图的所有对应节点的距离最短)
CMCC
作者期望异构全局图特征是一致的,即希望统一身份下红外样本和可见光的全局图特征表示各部分所表示的特征是一致的。
每个样本的特征图为一个归一化之后的向量,两个向量的点积表示两个特征图的相关性(也可以理解为点积为两向量的夹角,夹角约小,相关性越高)
所以CMCC损失可以写为
M为样本数量,a为协同系数。通过CMCC损失,可以使Xii趋向于1,使Xij趋向于0.