Hamming Embedding 汉明嵌入简介

参考文献  Hamming Embedding and Weak Geometric Consistency for Large Scale Image Search


  在SIFT结合BOF模型中,如果聚类时聚类中心数量选择过大或过小,都会造成一定的问题。Hamming Embedding 汉明嵌入简介_第1张图片

如图所示,红色的方框表示一个特征,红色的叉表示该特征的各种噪音版本,本质上应该是一类特征。如果K选择过大(左图),则会对特征分得过细,导致这些噪音特征分到不同的聚类中心中;如果k选择过小(右图),则降低了BOF的描述能力,使得很多本来不是同一类的特征也被分到了一个聚类空间中。那么有没有一种方法既不让噪音版本分到不同的聚类中心去,又保证了BOF的描述能力不下降呢?

  在K-MEANS时我们选择较小的k,形成比较粗糙的字典,在匹配时对每个聚类中心里的点再继续细分,具体的,给每个点赋予一个新的64维特征向量,该向量的每一个维度取值只能是0或1的binary,然后计算两两特征之间的汉明距离,如果汉明距离小于一个阈值则认为这两个向量属于同一类。汉明距离的计算公式如下:

x,y分别是在BOF里属于同一个聚类中心的点,然后对它们的新特征计算汉明距离,如果h小于一个阈值(经验上为22)则认为x和y两个特征是匹配的。它们的匹配分数可以计算为

Hamming Embedding 汉明嵌入简介_第2张图片

这样就解决了聚类时字典过大或者过小带来的问题,也说明了该怎么处理特征的匹配及匹配分数的计算。下面来说说怎么从128的SIFT向量计算出64维的binary向量。

Hamming Embedding 汉明嵌入简介_第3张图片


上图是论文中给出的方法,我稍微解释下。前面3步是离线操作,生成一个转换矩阵,以及一个中值向量。因为我做的是SIFT,生成的是64维的binary,我就用具体的应用来解释这段话的意思:

1.随机生成一个128*128的,符合高斯分布的矩阵,然后对改矩阵做QR分解,取得到的128*128的正交投影矩阵的前64行,得到我们需要的64*128的矩阵。

这段话第一次读不太明白啥意思,怎么做,其实很简单,在matlab里几行代码就可以搞定:

 A = randn(128);   %生成符合高斯分布的矩阵

[Q R] = qr(A);  %得到正交矩阵Q

P = Q(1:64,:);  %取前64行,就是我们要的转换矩阵了。

2.使用大量的属于同一个聚类中心的sift向量来乘这个矩阵P,Px即可得到64维的向量。

3.在第2步中,产生大量64维的向量,然后对这些向量的每一个维度,计算该维度数据的中值,即可得到一个中值向量T。

注意,对BOF中的每一个聚类中心,都要计算各自的中值向量,即最终聚类中心有多少个,这个64维的中值向量T也就有多少个。


经过上面的步骤,就算出了一个P和K个T,然互对新来的SIFT特征,首先P*vec(sift),得到64维的特征,然后将这个64维的特征和SIFT对应的聚类中心的64维T的每一维比较,SIFT[i] > T[i] ,则b[i] =1; 否则b[i] =0; 最终就得到了64维的binary向量b,然后根据上文说的匹配方式去做就可以了。下图是我为了更加详细说面生成64维binary向量过程画的草图。等式右边的蓝色矩阵的每一列表示2中生成的64维向量,对每一行取中值,就得到了绿色的那个64维的中值向量。

Hamming Embedding 汉明嵌入简介_第4张图片


由于我只是在一个大的视频检索中使用了汉明嵌入,没有单独实验证明它的效果,所以就没有实验效果图。但是这样做相比简单得使用SIFT+BOF的方法,效果提升是明显的。


你可能感兴趣的:(cv)