0

kmeans関数を使用してキーポイント(SIFTを使用して検出)をクラスター化しようとしていますが、使用する準備ができていません。

キーポイントは、以下のコードを使用してxml/ymlファイルに保存されます。

int _tmain(int argc, _TCHAR* argv[])
{
Mat img;

img = imread("c:\\box.png", 0);

SiftFeatureDetector detector;
vector<KeyPoint> keypoints;
detector.detect(img, keypoints);



FileStorage fs("keypoint1.xml", FileStorage::WRITE);
write(fs, "keypoints1", keypoints);
fs.release();

xmlはスペースで区切られたキーポイントを保存し、ymlはコンマを使用してキーポイントを区切ります。

%YAML:1.0
keypoints1: [ 6.1368021965026855e+000, 5.2649226188659668e+000,
    4.0740542411804199e+000, 2.7943280029296875e+002, 0., 9109760, -1,
    6.1368021965026855e+000, 5.2649226188659668e+000,
    4.0740542411804199e+000, 3.4678604125976562e+002, 0., 9109760, -1,
    1.5903041076660156e+002, 2.4698186874389648e+001,
    4.1325736045837402e+000, 9.7977493286132813e+001, 0., 10158336, -1,
    1.6808378601074219e+002, 2.5029441833496094e+001,
    4.2399377822875977e+000, 9.7380126953125000e+001, 0., 11993344, -1,
    1.9952423095703125e+002, 4.4663669586181641e+001,
    5.0049328804016113e+000, 5.7439949035644531e+001, 0., 7275008, -1,
    3.0947158813476563e+002, 4.6865818023681641e+001,......................

kmeans関数では、サンプルごとに1行の入力が必要です誰かがこれを説明できますか?つまり、上記のファイルを単一の行として使用できますか?FileStorage読み取りメソッドを使用してkmeansの対象になりますか?

ファイルに追加してファイルから読み取りたい理由は、キーポイントをクラスター化する必要がある100個の画像があるとします。これらすべてのファイルを1つの巨大なファイルに追加し、それをクラスター化します。

ありがとうございました

4

3 に答える 3

2

トムは正しい。通常、SIFTでは、画像ごとに複数のキーポイントを使用します。これがキーポイント検出の背後にある全体的な考え方であり、以降のステップで画像の「興味深い」部分のみを処理しようとするというものです。

したがって、画像をクラスタリングする場合、通常のSIFT機能はあまりうまく機能しません。これらは、複数の画像にわたって同じキーポイントを見つけることが期待されるパノラマの構築などに適しています。

ただし、SIFTキーポイントを「悪用」することはできます。そしてそれはおそらくあなたが再現しようとしているものです。コーディングの観点から自分で理解しようとするのではなく、関連する記事を読むと確かに役立ちます。

簡単な紹介はここにあります:http: //image-net.org/download-features

通常のグリッドを使用して、各画像から同じ数のキーポイントをサンプリングする方法に注目してください。それでも、それらを1つの巨大な配列にまとめることはできません。これは、類似性検索では機能しません。代わりに、一種の次元削減を実行します。

それらは、すべての画像の個々のキーポイントすべてに対してk-meansを実行して、視覚的な単語と呼ばれる1000個の「共通の」キーポイントを取得します。次に、各キーポイントを最も一致する視覚的な単語に翻訳し、この方法で画像のテキストのような表現を取得します。キーポイントに人間が読める形式の名前がないことを除けば、ビーバーが泳いでいる画像の場合、画像を「空の空空空の毛皮の毛皮の森空の空の毛皮の水林水水水森」のように表現することを想像できます。湖。

これらの単語表現のバッグで、クラスタリングまたは類似性検索を再度実行できます。ベクトルがスパースであるため、K-meansはうまく機能しません。ユークリッド距離はスパースデータではうまく機能しません。残念ながら、k-meansはユークリッド距離用に設計されています。さらに、手段はもはやまばらではなく、それはそれらを異常にします。ほとんどの場合、結果として得られる手段は、インスタンスよりも互いに類似しており、パーティショニング全体が不条理になります。

于 2012-11-16T22:08:39.023 に答える
1

シフトポイントの数は画像によって異なるため、投影する固定長のベクトルもありません。さらに、1つの大きなベクトルを作成するためにそれらを連結する順序は、順序が重要であることを意味します。SIFT特徴は、点のセットです(ベクトルではありません)

類似性を定義するには、より高度なメトリックが必要です。ユークリッドまたは他のベクトルベースのメトリックは機能しません。OpenCVのK-meansはベクトル入力を必要とするため、機能しません。

于 2012-11-16T18:59:45.733 に答える
0

SIFT特徴は1つのものであり、各特徴の値がベクトルを構築します。SIFTキーポイントからSIFT記述子を抽出すると、4x4領域の8つの可能な方向の勾配の大きさが抽出されます。したがって、128個の特徴、または必要に応じて128個の次元を持つ各キーポイントのベクトルがあります。これは、ユークリッド空間で点を表すのと同じですが、3次元ではなく、128になります。通常のSIFT記述子の変形で、パフォーマンスが向上します。密なSIFT。ガウス分布の差からキーポイントを計算する代わりに、画像の上に長方形のグリッドを配置して記述子を抽出します。グーグルでvl_featを探してください。

于 2013-06-09T23:45:25.090 に答える