前提:
我对计算机视觉/图像处理和机器学习真的很新手(幸运的是,我在信息检索方面更有经验),所以请对这个无知的菜鸟友善一些!:D
我的应用:
我们有一个移动应用,用户拍摄一张照片(称为查询),系统会返回一张之前由其他用户拍摄的最相似的图片(称为数据集元素)。时间性能至关重要,其次是精确度,最后是内存使用。
我的方法:
首先,很明显这是一个1-最近邻问题(1-NN)。LSH是解决这个问题的流行、快速且相对精确的方法。特别是,我的LSH实现是使用核化局部敏感哈希来实现良好的精度,将一个d
维向量转换为一个s
维二进制向量(其中s<<d
),然后使用汉明空间中的快速精确搜索与多索引哈希来快速查找数据集中所有向量(转换到汉明空间)之间的确切最近邻居。
此外,我打算使用SIFT,因为我想为我的应用使用一个强大的关键点检测器和描述符。
这个过程中缺少什么?
嗯,看起来我已经决定了一切,对吗?实际上不是:在我的链接问题中,我面临的问题是如何将单个图像的一组描述符向量表示为一个向量。为什么我需要它?因为LSH中的查询/数据集元素是向量,而不是矩阵(而SIFT关键点描述符集是一个矩阵)。正如有人在评论中建议的,最常见(也是最有效)的解决方案是使用特征包(BoF)模型,我对这个模型还不太熟悉。
所以,我阅读了这篇文章,但我仍然有一些问题(见下面的问题)!
问题:
第一个也是最重要的问题: 你认为这是一个合理的方案吗?
- 在BoF算法中使用k-means是否是这种应用的最佳选择?有什么替代的聚类算法吗?
- 通过BoF获得的码字向量的维度等于聚类数量(所以在
k
-means方法中的k
参数)? - 如果2.是正确的,那么
k
越大,得到的BoF向量就越精确? - 有没有“动态”的k-means?因为查询图像必须在计算完成后添加到数据集中(记住:数据集由所有提交的查询的图像组成),聚类可能会随时间变化。
- 给定一个查询图像,获得码本向量的过程是否与数据集图像的过程相同,例如,我们将每个描述符分配给一个聚类,并且结果向量的第
i
维等于分配给第i
个聚类的描述符数量?
回答:
看起来你正在从SIFT生成的一组关键点特征中构建码本。
-
你可以尝试“高斯混合”模型。K-means假设关键点的每个维度是独立的,而“高斯混合”可以模拟关键点特征各维度之间的相关性。
-
我无法回答这个问题。但我记得默认情况下SIFT关键点有128个维度。你可能想要更少的聚类数量,比如50个聚类。
-
N/A
-
你可以尝试无限高斯混合模型,或者查看这篇论文:“Revisiting k-means: New Algorithms via Bayesian Nonparametrics” by Brian Kulis and Michael Jordan!
-
我不确定是否理解这个问题。
希望这对你有帮助!