0

我有大约 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));
4

2 回答 2

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>
{
...
于 2013-07-08T07:18:39.473 回答
0

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

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

代替

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

于 2013-11-08T15:56:21.623 回答