我想实现一个系统,给定一张输入图像,它能从大约5万张图像的数据集中返回一张合理相似的图像(近似结果是可以接受的)。时间性能至关重要。
我将使用SIFT的并行版本来获取描述符矩阵D
。我了解到Fisher Vector(FV)(VLfeat和Yael的实现)作为学习和更精确的替代方案,用于将D
表示为单一向量v
,替代了Bag of Features(BoF)。
我的问题是:
- FV使用什么距离度量?是欧几里得距离吗?如果是的话,我会使用基于欧几里得距离的LSH来快速查找FV的近似近邻。
- 有没有其他在时间效率上更高的FV的C++实现?
回答:
你可以考虑的另一种方法是VLAD编码。(基本上是FV的非概率版本,用k-Means聚类替代了GMM)
实现上与标准向量量化仅有细微差别,但在我的实验中,它显示出更好的性能,并且所需的码本大小显著减少。
它使用欧几里得距离来查找最近的码本向量,但不是简单地计数元素,而是累积每个元素的残差。
图像搜索的示例:链接
FV / VLAD论文:论文