《Aggregating local descriptors into a compact image representation》论文笔记
提取到VLAD特征后,要先用PCA降维,然后再用ADC方法对每一幅图像建立索引,这里先介绍ADC方法。
ADC方法是对图片库中,除query vector x之外的所有图的vector Y=y1,y2...yn,做kmeans产生k个聚类中心,用log2kbit编码这k个center的ID,ci=q(yi),比如k=16,yi属于c8,那么用4bit编码yi:q(yi)=0100
找到离x最近的a个邻居NNa(x)也就是计算如下问题:
NNa(x)=a?argmini||x?q(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是一个固定的值,所以每个子向量被编码成
log2ksbit。
此时(2)式中的距离计算就成了如下形式:
||x?q(yi)||2=∑j=1...m||x2?qj(yji)||2.(4)
在search之前,我们可以提前计算出一个lookup table保存子向量
xj分别到
ks个聚类中心的距离,生成lookup table的复杂度为
O(D?ks),当
ks<<n时,这个值相比于(2)式的复杂度O(D*n)是可以忽略不计的。
根据这个编码,可以对
yi做分解:
yi=q(yi)+εq(yi).(5)
其中
εq(yi)是指这次编码所造成的损失(quantization loss)。
这样,ADC就把一个vector编码成B bit,
B=mlog2ks.