2011-07-15 10 views
3

OpenCVには、SVMをトレーニングするためのサンプル行列を取り込むCvSVMクラスがあります。行列は2Dであり、サンプルは行内にあります。HOGにSVMを与える:HOGには9個のビンがありますが、SVMには1Dの行列が入ります。

ビデオフィードの方向勾配(HOG)のヒストグラムを生成する独自の方法を作成しました。これを行うために、私はHOGを格納するための9チャンネルの行列を作成しました。各チャンネルは方向ビンに対応しています。だから私はCV_32FC(9)タイプの40x30マトリックスを持っています。

また、HOGのビジュアライゼーションが行われ、機能しています。

この行列をOpenCV SVMにどのように供給するのかわかりません。なぜなら、私がそれを平坦化すると、SVMが1次元入力データから9D超平面をどのように学習するのか分からないからです。

答えて

3

SVMは常に、機能ベクトルごとに1行のデータを取り込みます。従って、特徴ベクトルの次元は行の長さである。 2Dデータを扱っている場合、特徴ベクトルごとに2つのアイテムがあります。 2Dデータの例は、このWebページ上にある:OpenCVのhttp://sites.google.com/site/btabibian/labbook/svmusingopencvにおける同等のデモの

http://www.csie.ntu.edu.tw/~cjlin/libsvm/

コード

ポイントは、あなたが9ビン細胞と2Dとしてヒストグラムを考えているにもかかわらず、ということです、特徴ベクトルは実際にはこれの平坦化されたバージョンである。したがって、それを長い特徴ベクトルに平坦化することは正しい。私の結果は、長さ2304(16x16x9)の特徴ベクトルで、小さなテストセットで100%の予測精度が得られます(つまり、おそらく100%をわずかに下回りますが、例外的にうまく機能しています)。

この理由は、SVMが特徴ベクトルのアイテムごとの重みのシステム上で動作しているためです。だから問題の次元とは関係がないので、超平面は常に特徴ベクトルと同じ次元にあります。それを見るもう1つの方法は、超平面について忘れて、それを特徴ベクトルの各項目の重みの束として見ることです。この場合、アイテムごとに1つの重み付けが必要であり、各アイテムに重み付けを乗算して結果を出力します。