ADC方法(asymmetric distance computation)

《Aggregating local descriptors into a compact image representation》论文笔记

提取到VLAD特征后,要先用PCA降维,然后再用ADC方法对每一幅图像建立索引,这里先介绍ADC方法。

ADC方法是对图片库中,除query vector x之外的所有图的vector Y=y1,y2...yn ,做kmeans产生k个聚类中心,用 log2k bit编码这k个center的ID, ci=q(yi) ,比如k=16,yi属于c8,那么用4bit编码yi: q(yi)=1000
找到离x最近的a个邻居 NNa(x) 也就是计算如下问题:

NNa(x)=a argmini||xq(yi)||2.(2)

然而这里存在的问题是,k必须是一个较小的值,这样会导致信息损失较严重,因为上百万个图,最后只对应到了16种编码,搜索精度会很低。如果想用64bit编码, k=264 ,聚类中心的个数太多,kmeans计算代价很大。所以这里参考论文《Product quantization for nearest neighbor search》中的方法,对ADC方法做优化。
这种方法是把vector y划分成m个子向量,如果y长度为D,那么每个子向量长度:D/m,定义product quantizer:
q(x)=(q1(x1),q2(x2)...qm(xm)).(3)

也就是对每个子向量做上述的ADC编码。把 Y=y1,y2...yn 各自的第j个子向量拿出来 yj1,yj2...yjn ,用kmeans把他们聚为 ks 类,这个 ks 是一个固定的值,所以每个子向量被编码成 log2ks bit。
此时(2)式中的距离计算就成了如下形式:
||xq(yi)||2=j=1...m||xjqj(yji)||2.(4)

在search之前,我们可以提前计算出一个lookup table保存子向量 xj 分别到 ks 个聚类中心的距离,生成lookup table的复杂度为 O(Dks) ,当 ks<<n 时,这个值相比于(2)式的复杂度O(D*n)是可以忽略不计的。
根据这个编码,可以对 yi 做分解:
yi=q(yi)+εq(yi).(5)

其中 εq(yi) 是指这次编码所造成的损失(quantization loss)。
这样,ADC就把一个vector编码成B bit, B=mlog2ks.

你可能感兴趣的:(computer,vision,machine,learning)