ボキャブラリー ツリーを使用してスケーラブルな認識 を実装しようとしています。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 の場合でも。
そのとき、関数に渡すデータが正しくないと思います。だから私の質問は、いつこれが起こる可能性があるのですか? 関数に渡すデータが有効であることを確認するために、どのようなことを確認する必要がありますか?
また、論文の適切な実装のリンクがあれば、ここに投稿していただければ幸いです。