4

私は、SIFT、HISTOGRAM、および EGDE という 3 つの異なる機能を使用して、オブジェクト分類器の開発に取り組んでいます。

ただし、これらの 3 つの機能は異なる次元のベクトルを持ちます (例: SIFT = 128 次元)。ヒスト = 256。

現在、サイズが異なるため、これらの機能を 1 つのベクトルに連結することはできません。私がやろうとしていることですが、それが正しい方法になるかどうかはわかりません:

機能ごとに分類子を個別にトレーニングし、3 つの異なる機能に個別に分類を適用し、過半数を数え、最終的に多数決で画像を宣言します。

これは正しい方法だと思いますか?

4

1 に答える 1

13

複数の特徴を考慮した分類結果を取得するには、いくつかの方法があります。あなたが提案したのは、機能を組み合わせる代わりに、複数の分類器をトレーニングし、いくつかのプロトコルを介して、それらの間のコンセンサスに到達する1つの可能性です。これは通常、アンサンブル メソッドのフィールドの下にあります。分類子を組み合わせる方法の詳細については、ブースト、ランダム フォレストについてグーグルで検索してみてください。

ただし、次元が異なるために特徴ベクトルを連結できないというのは事実ではありません。フィーチャを連結して巨大なベクトルにすることもできます。たとえば、SIFT と HIST の特徴を結合すると、384 次元のベクトルが得られます。使用する分類器によっては、ベクトルのエントリを正規化して、構造上大きな値を持つという理由だけでどの特徴も支配しないようにする必要があります。

コメントに応じて編集: ヒストグラムはオブジェクト全体の特性 (色など) を表す特徴ベクトルのようですが、SIFT 記述子はそのオブジェクトの局所的な関心キーポイントで抽出されます。SIFT 記述子の数は画像ごとに異なる場合があるため、分類するサンプルごとに 1 つの特徴ベクトルを取り込むことが多いため、SIFT 記述子を通常の分類器に直接渡すことはできません。このような場合、多くの画像から抽出した SIFT 記述子を使用して、コードブック(ビジュアル ディクショナリとも呼ばれます) を作成する必要があります。次に、このコードブックを使用して、各画像から抽出した多くの SIFT 記述子から SINGLE 特徴ベクトルを導き出します。これは、「ビジュアル ワード (BOW) の袋」として知られているものです。SIFT記述子を「要約」する単一のベクトルができたので、それをヒストグラムと連結してより大きなベクトルを形成できます。この単一のベクトルは、全体の画像/(画像内のオブジェクト)を要約します。

bag of words コードブックを作成する方法と、それを使用して各画像から抽出された多くの SIFT 記述子から単一の特徴ベクトルを導出する方法の詳細については、この本 (著者の Web サイトから無料でダウンロードできます) http://programmingcomputervision を参照してください。 com/の「画像の検索」の章の下。実際には、思ったよりもずっと簡単です。

大まかに言えば、KMeans を実行して多くの画像から SIFT 記述子をクラスタ化し、それらの重心 (「ビジュアル ワード」と呼ばれるベクトル) をコードブックとして取得します。たとえば、K = 1000 の場合、1000 個のビジュアル ワード コードブックがあります。次に、画像ごとに、K と同じサイズ (この場合は 1000) の結果ベクトルを作成します。このベクトルの各要素は、ビジュアル ワードに対応します。次に、イメージから抽出された各 SIFT 記述子について、コードブックで最も一致するベクトルを見つけ、結果ベクトルの対応するセルのカウントを増やします。完了すると、この結果ベクトルは基本的に、さまざまなビジュアル ワードが画像に表示される頻度をカウントします。類似の画像は、同じビジュアル ワードに対して同様のカウントを持つため、このベクトルは効果的に画像を表します。また、「正規化」する必要があります。このベクトルを使用して、異なる数の SIFT 記述子 (したがって合計カウント) を持つ画像が比較可能であることを確認します。これは、各エントリをベクトル内の合計数で単純に除算するか、本で説明されているように tf/idf などのより洗練された尺度を使用するのと同じくらい簡単です。

著者は、本に付随する Web サイトで Python コードも提供していると思います。よくわからない場合は、それらを確認するか、試してみてください。

機能を組み合わせるより洗練された方法には、Multiple Kernel Learning (MKL) があります。この場合、それぞれが 1 つの特徴を使用して、異なるカーネル行列を計算します。次に、カーネル行列を結合するための最適な重みを見つけ、結合されたカーネル行列を使用して SVM をトレーニングします。このコードは Shogun Machine Learning Library にあります。

于 2013-07-31T04:58:55.313 に答える