您的位置:首页 > 其它

ADC方法(asymmetric distance computation)

2015-07-25 11:09 190 查看
《Aggregating local descriptors into a compact image representation》论文笔记

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

ADC方法是对图片库中,除query vector x之外的所有图的vector Y=y1,y2...ynY={y_1,y_2...y_n},做kmeans产生k个聚类中心,用log2klog_2 kbit编码这k个center的ID,ci=q(yi)c_i = q(y_i),比如k=16,yi属于c8,那么用4bit编码yi:q(yi)=1000q(y_i)=1000

找到离x最近的a个邻居NNa(x)NN_a(x)也就是计算如下问题:NNa(x)=a argmini||x−q(yi)||2.(2)NN_a(x) = a~argmin_i ||x-q(y_i)||^2.(2)

然而这里存在的问题是,k必须是一个较小的值,这样会导致信息损失较严重,因为上百万个图,最后只对应到了16种编码,搜索精度会很低。如果想用64bit编码,k=264k=2^{64},聚类中心的个数太多,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)q(x)=(q_1(x^1),q_2(x^2)...q_m(x^m)).(3)

也就是对每个子向量做上述的ADC编码。把Y=y1,y2...ynY={y_1,y_2...y_n}各自的第j个子向量拿出来yj1,yj2...yjn{y_1^j,y_2^j...y_n^j},用kmeans把他们聚为ksk_s类,这个ksk_s是一个固定的值,所以每个子向量被编码成log2kslog_2 k_sbit。

此时(2)式中的距离计算就成了如下形式:

||x−q(yi)||2=∑j=1...m||xj−qj(yji)||2.(4)||x-q(y_i)||^2 = \sum_{j=1...m} ||x^j -q_j(y_i^j)||^2.(4)

在search之前,我们可以提前计算出一个lookup table保存子向量xjx^j分别到ksk_s个聚类中心的距离,生成lookup table的复杂度为O(D∗ks)O(D*k_s),当ks<<nk_s << n时,这个值相比于(2)式的复杂度O(D*n)是可以忽略不计的。

根据这个编码,可以对yiy_i做分解:

yi=q(yi)+εq(yi).(5)y_i = q(y_i) + \varepsilon_q(y_i).(5)

其中εq(yi)\varepsilon_q(y_i)是指这次编码所造成的损失(quantization loss)。

这样,ADC就把一个vector编码成B bit,B=mlog2ks.B = m log_2 k_s.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: