图像检索中,对一幅图像编码后的向量的维度是很高。以VLAD为例,基于SIFT特征点,设视觉词汇表的大小为256,那么一幅图像编码后的VLAD向量的长度为$128 \times 256 = 32768 $。通常要对编码后的VLAD向量进行降维,降维后的向量长度应该根据图像库中图像量的大小来,如果只是几百张的小的图像库,那么可以降维到128甚至是64维,在这种情况下降维后的VLAD向量仍然有很好的区分度;但是如果图片库的数量是几千,几万张,如果VLAD降维的维度太低,损失的信息过多,就不能有很好的区分度,维度过低检索的精度就会低很多。为了保证检索的精度,VLAD向量要有1024或者2048的维度。
以上数据是笔者经历的项目的经验值,并不一定适合所有的情况。
如果是在低维度的小数据集中,可以使用线性查找(Linear Search)的方法,但是在高纬度大数据集中,线性查找的效率很低,显然是不可行的。如何的从大的高维数据集中找到与某个向量最相似的一个或多个向量,是图像检索中一个难点。
在这种高纬度大数据集中的检索,通常需要使用最近邻最相似查找(Approximate Nearest Neighbor,ANN)的方法。ANN的相似性检索算法,大体可以分为三大类:
- 基于树的方法,KD-树为代表。对于低维度的数据,KD树的查找性能还是比较高效的;但当空间维度较高时,该方法会退化为暴力枚举,性能较差,这时一般会采用下面的哈希方法或者矢量量化方法。
- 哈希方法
- LSH Locality Sensitive Hashing 为代表,对于小数据集和中等数据集效果不错
- 矢量量化
- vector quantization,在矢量量化编码中,关键是码本的建立和码字搜索算法。比如常见的聚类算法,就是一种矢量量化方法。而在相似搜索中,向量量化方法又以PQ方法为代表
- 对于大规模数据集,矢量量化是个很好的选择
LSH
LSH(Locality Sensitive Hashing)位置敏感哈希,局部敏感哈希
最近邻最相似搜索算法的一种,有比较可靠的理论根据且在高维数据中表现比较好,很适合应用在图像检索中。
与一般的哈希算法不同的是其位置敏感性,也就是散列前类似的点(距离近的点),在散列后仍然能够保证在一定程度的相似,且有一定的概率保证。
LSH和普通哈希的区别
基本思想
LSH不像树形结构的方法可以得到精确的结果,LSH所得到的是一个近似的结果,因为在很多领域中并不需非常高的精确度。即使是近似解,但有时候这个近似程度几乎和精准解一致。
LSH的主要思想是,高维空间的两点若距离很近,那么设计一种哈希函数对这两点进行哈希值计算,使得他们哈希值有很大的概率是一样的。同时若两点之间的距离较远,他们哈希值相同的概率会很小。
LSH哈希函数要满足的性质
一个哈希函数满足以下性质时,被称为\((R,cR,P_1,P_2)\)-sensive,对于高维空间的任意两点\(x,y\)
- 如果\(d(x,y) \le R\),则\(h(x) = h(y)\)的概率不小于\(P_1\)
- 如果\(d(x,y) \ge cR\),则\(h(x) = h(y)\)的概率不大于\(P_2\)
其中\(d(x,y)\)是两个点\(x,y\)之间的距离,\(h\)是哈希函数,\(h(x)\)和\(h(y)\)是对点\(x,y\)的哈希变换,并且需要满足:
- \(c > 1\)
- \(P_1 > P_2\)
LSH的原理是挺简单的,其核心有两个:
- 两个高维向量的相似性的度量
- \((R,cR,P_1,P_2)\)-sensive哈希函数的选择
LSH的哈希函数的选择取决于其选择的相似性度量方法,当然并不是所有向量相似性度量的方法都能找到相应的LSH函数,比如LSH最初提出的时候时候基于欧式距离的度量方法就没有找到合适的LSH函数。
Origin LSH
最初设计的LSH应该是想基于欧式距离(\(L_2\)),但是对于欧式距离当时没有找到合适的LSH函数;但是在曼哈顿距离(\(L_1\))下找到了合适的LSH函数。所以,就有了一个假设,向量所在的原始空间中\(L_1\)和\(L_2\)度量的效果相差不大,也就是说用\(L_1\)来代替\(L_2\)。
所以就有两个准则:
- 使用\(L_1\)也就是曼哈顿距离进行度量。 基于假设\(L_1\)和\(L_2\)的度量效果相差不大。
- 向量的各个分量,要被正整数化,方便进行01编码。
为什么要进行01