まず、SIFT機能ではなくSURF機能を検出しています(基本機能は同じですが)。複数のSURF機能を使用する理由は、SURFがローカル画像機能である、つまり画像のほんの一部しか記述しないためです。一般に、複数の特徴が単一の画像内で検出される。クラスタ化する前に、これらの機能を単一の画像記述子に組み合わせる方法を探しているとよいでしょう。
これらの機能を組み合わせる一般的な方法は、Bag-of-wordsです。
教師なし学習をしているようだから、まずコードブックを習得する必要があります。一般的な方法は、すべての画像で抽出したすべてのSURFフィーチャーにk-means clusteringを使用することです。
これらのクラスタを使用して、各画像の「コードワード外観」のヒストグラムを作成してk次元画像記述子を生成します。この場合、クラスタごとに1つの「コードワード」が存在します。 SURF機能が関連するクラスタに属するたびに、コードワードが「表示される」と言います。
コードワードのヒストグラムは、各画像の画像記述子として機能します。同様の画像を見つけるために画像記述子にクラスタリングを適用することができます。一定のノルムを持つように画像記述子を正規化するか、コサイン類似度メトリック(k-meansクラスタリングを使用する場合はMATLABのkmeans(X,k,'Distance','cosine')
)を使用することをお勧めします。言っ
、より良い仕事をする可能性がある解決策は、画像記述子としてそれらを使用する(ImageNetのような)非常に大きな、多様なデータセットで訓練された畳み込みニューラルネットワークを使用して、深い機能を抽出することです。
ご返信ありがとうございます。私は最初に[リンク](https://stackoverflow.com/questions/44914225/clustering-surf-features-of-an-image-dataset-using-k-means-algorithm?rq=1)を使用しますが、コードワードのヒストグラムをどのように作成すればよいのですか? –
各画像に対して、その画像の特徴に対応する 'assignments'の値のサブセットに対して' histogram'関数を実行します。ヒストグラムのビンエッジを常に「0.5:(k + 1)」と定義してください。 – jodag