0

約 130,000 の SIFT 記述子があります。Opencv の flann モジュールを使用して、階層的な Kmeans-index を構築しています。この後、これらの 130,000 個の記述子を量子化したいと思います (後でさらに量子化します)。これを行うために、フランの knnsearch メソッドを使用しています。しかし、この方法の結果は奇妙なものです。すべての記述子について、表示されている最も近いインデックスは、記述子自体のインデックスです。ただし、HIK ツリーのリーフの 1 つである最も近いクラスターのクラスター ID を表示する必要があります。

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 に答える