脚本 evaluate_gpu.py 被用来评估行人重识别模型的效果。evaluate_gpu.py 根据 test.py 提取到的图片特征,将图片按照相似度排序,然后根据排序结果计算 mAP 和 rank-k 等评估指标。
1. 计算 Cosine similarity
Cosine similarity 就是余弦相似度,有时也与余弦距离混用,用夹角余弦来度量两个向量方向上的差异。两个向量之间的夹角余弦越小,向量间的方向就越一致。当夹角为零时,两个向量同向。向量间的余弦相似度值越大,向量就越相似。
欧式距离也常被用来进行相似度度量,计算公式如下所示。
相比欧式距离,余弦相似度更注重方向上的差异而不是距离。
余弦相似度在高维的情况下依然保持“相同时为1,正交时为0,相反时为-1”的性质。
欧式距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异。
因此,在深度学习中,经常使用余弦相似度计算向量间相似度。余弦相似度的计算方法如下:
evaluate_gpu.py 中就使用了余弦相似度计算向量间相似度。evaluate_gpu.py 使用通过 test.py 提取到的 L2 归一化的特征进行评估计算。因此 cos(θ)
的分母部分相当于为 1 ,只需要进行向量乘法。
下面给出相似度计算部分代码,并进行逐行解析。
# Evaluate
def evaluate(qf,ql,qc,gf,gl,gc):
# 改变 query 特征的shape,将最后一维置为 1
query = qf.view(-1,1)
print(query.shape)
# 计算 gallery 和 query 特征的余弦相似度,即计算矩阵 gf 和 query 的矩阵乘法
score = torch.mm(gf,query)
score = score.squeeze(1).cpu()
score = score.numpy()
# 向量按照余弦相似度值从小到大排序
# argsort 返回从小到大排序的数组索引
index = np.argsort(score) #from small to large
# 余弦相似度值越大,向量就越相似
# 余弦相似度值倒序,按照向量间的相似性从大到小排列,
# 数组中最开始的 gallery feature 和 query feature 最相似
index = index[::-1]