0

ボキャブラリー ツリーを使用してスケーラブルな認識 を実装しようとしています。opencv kmeans 関数を使用して特徴ベクトルをクラスター化しているため、すべてのベクトルを 1 つの Mat オブジェクトに入れ、次のように関数に渡します。

TermCriteria criteria;
criteria.epsilon = 0.1;
int attempts = 1;
int flags = KMEANS_RANDOM_CENTERS;
int K = 10;
Mat Centers;
Mat Labels;

kmeans(descriptors, K, Labels, criteria, attempts, flags, Centers);

したがって、この関数では、「Centers」と「Labels」の Mat オブジェクトを次のように塗りつぶします。

Centers has K rows, 64 columns (I'm using SURF features) and one channel

Labels has as many rows as "descriptors", one column and one channel and it's values are in the range of [0 K-1]

これらは私がチェックしたものです。これをすべてのベクトルに対して行った後、同じラベルのベクトルを新しい Mat にコピーし、再度関数に渡します。

私の問題は、範囲 [0 k-1] の値の 1 つが「ラベル」にない場合があるため、そのクラスターに分類される特徴ベクトルがないことです。さまざまな K について確認しましたが、通常、あるレベルで少なくとも 1 回発生します (ただし、最初の呼び出しでは発生しません)。K = 3 の場合でも。

そのとき、関数に渡すデータが正しくないと思います。だから私の質問は、いつこれが起こる可能性があるのですか? 関数に渡すデータが有効であることを確認するために、どのようなことを確認する必要がありますか?

また、論文の適切な実装のリンクがあれば、ここに投稿していただければ幸いです。

4

1 に答える 1

0

一部のクラスターでは、メンバーの数が K 未満であることが判明したため、次のレベルで関数がエラーを返します。クラスターが空になることがある理由はまだわかりませんが。

于 2013-08-15T04:30:13.120 に答える