4

我正在尝试基于论文“Scalable Recognition with a Vocabulary Tree”来实现图像搜索。我正在使用 SURF 来提取特征和关键点。例如,对于一个图像,我得到 300 个关键点,每个关键点有 128 个描述符值。我的问题是如何在数据上应用 K-Means 聚类算法。我的意思是我是否需要对所有点应用聚类算法,即 300*128 值,或者我是否需要找到连续描述符值之间的距离并存储这些值并对其应用聚类算法。我很困惑,任何帮助将不胜感激。

谢谢,洛基。

4

3 回答 3

2

从你的问题我会说你很困惑。词汇树技术基于使用 k-means 层次聚类和叶节点的 TF-IDF 加权方案。

简而言之,用于构建词汇树的聚类算法在所有d-dimensional数据上运行一次 k-means(d=128对于 SIFT 的情况),然后在每个获得的集群上再次运行 k-means,直到某个深度级别。因此,词汇树构造的两个主要参数是分支因子k和树深度L。一些改进只考虑了分支因子,而深度是通过切割树来自动确定的,以实现最小方差测量。

至于实现,cv::BOWTrainerOpenCV 是一个很好的起点,尽管对于分层 BoW 方案的情况不是很好,因为它强制将中心存储在一个简单的中cv::Mat,而词汇树通常是不平衡的,并将其映射到一个矩阵当节点数远低于具有深度L和分支因子的平衡树中的理论节点数时,从内存使用的角度来看,逐级方式可能效率不高k,即:

n << (1-k^L)/(1-k)

于 2013-09-26T12:02:17.777 回答
0

据我所知,我认为您必须将所有描述符存储在 cv::Mat 上,然后将其添加到“Kmeans Trainer”中,因此您最终可以应用聚类算法。这里有一个片段可以让您了解我在说什么:

BOWKMeansTrainer bowtrainer(1000); //num clusters
bowtrainer.add(training_descriptors); // we add the descriptors
Mat vocabulary = bowtrainer.cluster(); // apply the clustering algorithm

这可能会让你感兴趣:http ://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w -代码/

祝你好运!!

于 2013-06-28T19:39:43.993 回答
0

查看libvot中的代码,在 src/vocab_tree/clustering.* 中,您可以找到聚类算法的详细实现。

于 2016-04-11T16:02:51.103 回答