Kmeans based indexing and Asymmetric Distance Computation for ANN search (Binary Local Feature):...

转自: http://www.cvchina.info/2012/01/13/kmeans-based-indexing-and-asymmetric-distance-computation-for-ann-search-binary-local-feature-part1/#more-3232


受Herve Jegou的Hamming Embedding and Weak Geometric consistency for large-scale image search以及Product quantization for nearest neighbor search启发,将Kmeans clustering、inverted files、Asymmetric Distance Computation应用到二进制形式的局部特征的最近邻检索。

主要思路:

用Kmeans做特征的粗索引。

根据统计数据对feature进行压缩。

检索时使用非对称的方式计算索引特征与查询特征之间的距离。

算法:

训练:

  1. 使用Kmeans对欲索引的特征进行聚类,得到K个中心。对二进制形式的feature做聚类时,类别中心更新方式为:对于每一个bit,统计所有落在该类别的特征的对应bit上的1,0频率,并取高者。
  2. 对于每个cluster,统计所有落在该类别的特征的每个bit位的1,0频率,取1或者0频率靠近50%的前M个bits。(越靠近50%,熵越大)

经过训练,我们得到两组数据:

  • K个特征类别中心。
  • 对于每个类别中心,都有一组“M个bit位置标示符”。这些标示符构成一个对原始feature进行压缩的依据。(本文以后将其称为投影向量)

索引:

  1. 建立倒排表
  2. 对于每一个欲索引的特征,计算其类别中心,并用该类别的投影向量对特征进行投影,得到一个M位的signature。记为sig_templ, 将该signature插入到倒排表中。

ANN检索:

  1. 计算query特征的类别中心query_cluster,并用该类别的投影向量对特征进行投影,得到一个M位的sig_query。
  2. 计算query特征与类别中心的,除去该类别投影向量对应的bit位的距离,记为dist_base.
  3. 遍历query_cluster对应的倒排表项,计算sig_query于表项中的sig_templ的距离,记为dist_sig。那么query特征与索引特征的距离dist = dist_base + dist_sig. 如此得到的最小距离,如小于某阈值,即可认为找到一个ANN。

关于时间复杂度的一点分析:

假设K = 40, M = 64,特征为32Byte ORB(假设有1k的供索引的特征):

那么每次ANN检索只用做

40次32Byte的Hamming Distance计算 +  约25次8Byte的Hamming Distance计算。

对比穷举检索:

1000次32Byte的Hamming Distance计算

速度提升:20x

 

    示例:
    实验配置:
  • 特征:Orb
  • nn/ann匹配阈值:50
  • K = 40
    下图为穷举检索,图像匹配的结果:(无ransac)

image

After Ransac:

image

下图为使用上述ANN检索方式,图像匹配的结果:(无ransac)

image

After Ransac:

image

可以看出,匹配点数会有明显下降。原因是两级索引方式固有的缺陷。(两个本身很近的feature,会被分类到不同的cluster)。也许使用Multi Assignment会有所改善。

等代码整理好再发part2.


你可能感兴趣的:(算法,image,search,query,byte,distance)