k means -在OpenCV中实现词汇树



我正试图实现基于论文"可扩展识别与词汇树"的图像搜索。我使用SURF来提取特征和关键点。例如,对于一张图像,我得到300个关键点,每个关键点有128个描述符值。我的问题是如何在数据上应用K-Means聚类算法。我的意思是,我是否需要在所有点上应用聚类算法,比如300*128的值,或者我是否需要找到连续描述符值之间的距离,并存储这些值,然后在其上应用聚类算法。我很困惑,希望你能帮助我。

谢谢,岩石。

从你的问题来看,我觉得你很困惑。词汇树技术基于k-means分层聚类和叶子节点的TF-IDF加权方案。

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

对于实现,cv::BOWTrainer从OpenCV是一个好的起点是没有被很好地实现了分层弓计划实施以来的情况下中心存储在一个简单的cv::Mat词汇树通常是不平衡的,它映射到一个矩阵level-wise的方式可能不是有效的内存使用的观点当节点的数量远低于理论平衡树的节点数量和深度L k分支因素,即:

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

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

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-code/

祝你好运! !

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

最新更新