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