opencv flann module:knn-search for hierarchical kmeans tree给出了奇怪的结果

时间:2013-07-07 19:19:33

标签: opencv sift knn flann

我有大约130,000个SIFT描述符。我正在使用Opencv的flann模块构建一个层次化的Kmeans索引。在此之后,我想量化这些130,000个描述符(稍后将量化更多)。我正在使用flann的knnsearch方法来做到这一点。但这种方法的结果很奇怪。对于每个描述符,它显示的最近索引是描述符本身的索引。但是,它应该显示最近的簇的簇ID,它将是HIK树的叶子之一。

我应该尝试k = 2

以下是代码段 -

 int k=1;
 cv::flann::KMeansIndexParams indexParams(8,4,cvflann::FLANN_CENTERS_KMEANSPP) ;
 cv::flann::Index hik_tree(cluster_data, indexParams);
 Mat indices,dist;
 hik_tree.knnSearch(cluster_data, indices, dist, k, cv::flann::SearchParams(64));

2 个答案:

答案 0 :(得分:2)

knnSearch正在查找索引中的k个最近邻居(它不提供群集ID!)。您使用cluster_data构建索引,然后尝试将cluster_data与自身匹配。在这种情况下,每个描述符的最近邻居本身就不足为奇了......

编辑:如果您想获得这些中心,请查看此内容(来自FLANN库的来源):

/**
 * Chooses the initial centers using the algorithm proposed in the KMeans++ paper:
 * Arthur, David; Vassilvitskii, Sergei - k-means++: The Advantages of Careful Seeding
 */
template <typename Distance>
class KMeansppCenterChooser : public CenterChooser<Distance>
{
...

答案 1 :(得分:0)

k-NN是一种监督分类算法,这就是为什么你应该用你的训练样本构建一个Index对象,所以使用

  

cv :: flann :: Index hik_tree(samples,indexParams);

而不是

  

cv :: flann :: Index hik_tree(cluster_data,indexParams);