ReID任务中存在的后处理方法的目的是为了获得更优的匹配结果和更优的匹配排序,在一般的ReID任务中,会通过欧式/余弦距离来计算度量矩阵,并利用k-近邻的思想,从gallery中选择与probe最相似的前k个,但是这种方法很有可能有false match的噪音数据参杂进这个ranking list中,如下图:
为此需要使用些后处理方法。
1、K-reciprocal(Re-rank)
这个算法的思路就是:如果两张图片A,B相似,那么B应该会在A的前K个近邻里面,反过来,A也会在B的前K个近邻里面。但如果两张图C,D不相似,即使C在D的前K个近邻里面,D也不会在C的前K个近邻里面。如下图:
K-reciprocal的实现流程如下:
假设我们有一个图片probe p,和图片集gallery g:
首先要计算 p 和所有 g 中的图片的马氏距离 和 杰卡德距离。其中马氏距离用于获得 initial ranking list,杰卡德距离用于获得 k-reciprocal 的 ranking list。
这个方法的重点在于杰卡德距离的计算,其计算公式如下:
其中,R是符合 k-reciprocal nearest neighbors 的图片集合,注意它是一个集合(而R*只是做了扩展的R),可以定义为:
N为K近邻的图片集合,定义如下:
简单来说,R(p,k)是以p作为probe,在gallery图片集中,能与p能有k相互近邻的图片集合。
根据前面的描述,k-reciprocal nearest neighbors(K相互近邻)比k-nearest neighbors(K近邻) 和probe p更相关。然而,由于照明、姿态、视图和遮挡的变化,正样本图像可能被从k-nearest neighbors中排除,并且随后不被包括在k-reciprocal nearest neighbors中。为了解决这个问题,我们根据以下条件将R(p,k)中每个候选项的1/2 k-reciprocal nearest neighbors增量地添加到更鲁棒的集合R *(p,k)中:
我们已经知道R(p,k)是一个集合,里面全是gallery中符合p的k-reciprocal nearest neighbors(K相互近邻)的图片gi。
然后我们现在要做的就是遍历这些gi,每一个拿出来就是q,然后我们再用这个q作为新的probe,在gallery图片集里做k变成原来一半的k-reciprocal nearest neighbors 得到R(q,1/2k),若R(p,k)和R(q,1/2k)的交集中的图片数大于等于2/3乘R(q,1/2k)中的图片数目的话,就把R(p,k)和R(q,1/2k)的并集作为R *(p,k),例子如下:
知道了R *之后,不难看懂杰卡德距离是如何计算的了,但是杰卡德距离有一定问题:
1)取交集和并集的操作非常耗时间,尤其是在需要计算所有图像对的情况下。一个可选方式是将近邻集编码为一个等价的但是更简单的向量,以减少计算复杂度。
2)这种距离计算方法将所有的近邻样本都认为是同等重要的,而实际上,距离更接近于probe的更可能是正样本。因此,根据原始的距离将大的权值分配给较近的样本这一做法是合理的。
3)为了得到鲁棒的距离度量,结合原始距离和Jaccard距离是有必要的。
为了克服上述缺点,我们开始改造Jaccard距离。首先,将k-reciprocal nearest neighbors(缩写k-rnn)集合编码为N维的二值向量
其中每个元素由以下指示函数定义:
接着,为了给每一个元素根据原始距离来重新分配权值,我们采用了高斯核。于是将向量改写为:
于是,计算Jaccard距离时用到的交集和并集的基数就改写为:
最后,我们终于得到了改造过的Jaccard距离:
Re-rank对于ReID任务的稳定涨点做出了很大贡献,大量应用在论文和比赛中,但是它也有超参数需要调节,如进入构建R*的k值的比例等。
参考链接:https://blog.****.net/u014453898/article/details/98790860
2、Query Expansion
拓展查询(QE, Query Expansion): 指对返回的前[email protected]个结果,包括查询样本本身,对它们的特征求和取平均,以此为检索特征,再做一次查询,这样做的基础是认为排序在前面的样本的置信度高噪声少,通过和他们做特征求和平均做查询,可以提高整体的召回率,也是ReID中常用的一种后处理方法。
3、PCA
PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的,依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。
详细计算及另外两种特征变换方法ICA、LDA可以参考之前的博客:https://blog.****.net/qq_34919792/article/details/104042365
ReID获得的输出是特征向量,可以通过特征转换的方法来降低维度,避免高维度带来的问题,使其鲁棒性更高,这种方法在早期的开源库中有使用,但是其效果并不是很稳定,所以在后期的应用并不多。
4、DBA
数据库中的每个特征都被自己的值和它的k-NN的top-k的加权和所取代。
5、SVD
通过矩阵的奇异值分解来降低特征维数。SVD是一种很经典的矩阵分解方法,教材上必讲内容。
原理和实现参考:https://www.cnblogs.com/endlesscoding/p/10033527.html