2017-12-18 7 views
0

私はHOG + SVMモデルを訓練しています。私の訓練データはさまざまなサイズとアスペクト比です。 SVMモデルは可変サイズのリストで訓練することができないので、画像のサイズに関係なく同じ長さの勾配のヒストグラムを計算したいと考えています。画像サイズに関係なく、固定長の勾配(HOG)のヒストグラムを計算します。

これを行うには巧妙な方法がありますか?それとも、画像のサイズを変更したり、画像を埋め込む方が良いでしょうか?

答えて

1

以下の2つのものの一つです:

  1. が固定サイズにすべてのイメージ(画像パッチ)サイズを変更し、それらからHOG特徴を抽出します。
  2. 「単語/機能のバッグ」方法を使用し、画像のサイズを変更しないでください。

最初の方法1.は非常にシンプルですが、方法が2.で解決しようとするいくつかの問題があります。 まず、豚ディスクリプタが何をするのか考えてみましょう。画像を固定長のセルに分割し、セル単位の勾配をセル単位で計算して(投票に基づいて)ヒストグラムを生成します。最後に、すべてのセルの連結ヒストグラムがあり、それがあなたの記述子です。

オブジェクト(検出したい)が同様の方法で画像をカバーしなければならないため、問題があります。それ以外の場合は、イメージ内のオブジェクトの場所によって記述子が異なって見えます。

次のように動作2.方法:

  1. は、あなたのトレーニングセットの正と負の両方の画像からHOG特徴量を抽出します。
  2. k-meansのようなクラスタリングアルゴリズムを使用して、一定量のk重心を定義します。
  3. データセット内の各画像について、HOGフィーチャを抽出し、要素ごとにセントロイドと比較して頻度ヒストグラムを作成します。

頻度ヒストグラムを使用してSVMのトレーニングを行い、分類段階で使用します。この方法では、場所は問題ではなく、固定サイズの入力が常にあります。また、ディメンションの削減のメリットもあります。

1

cv2.resize()を使用して画像を指定したターゲットシェイプに正規化し、画像を必要な数のブロックに分割し、向きのヒストグラムをマグニチュードと共に計算することができます。以下は同じものの簡単な実装です。

img = cv2.imread(filename,0) 
img = cv2.resize(img,(16,16)) #resize the image 

gx = cv2.Sobel(img, cv2.CV_32F, 1, 0) #horizontal gradinets 
gy = cv2.Sobel(img, cv2.CV_32F, 0, 1) # vertical gradients 

mag, ang = cv2.cartToPolar(gx, gy) 
bin_n = 16 # Number of bins 
# quantizing binvalues in (0-16) 
bins = np.int32(bin_n*ang/(2*np.pi)) 

# divide to 4 sub-squares 
s = 8 #block size 
bin_cells = bins[:s,:s],bins[s:,:s],bins[:s,s:],bins[s:,s:] 
mag_cells = mag[:s,:s], mag[s:,:s], mag[:s,s:], mag[s:,s:] 
hists = [np.bincount(b.ravel(), m.ravel(), bin_n) for b, m in zip(bin_cells,mag_cells)] 

hist = np.hstack(hists) #histogram feature data to be fed to SVM model 

希望します。人々は通常、このような場合には何

関連する問題