私はHOG + SVMモデルを訓練しています。私の訓練データはさまざまなサイズとアスペクト比です。 SVMモデルは可変サイズのリストで訓練することができないので、画像のサイズに関係なく同じ長さの勾配のヒストグラムを計算したいと考えています。画像サイズに関係なく、固定長の勾配(HOG)のヒストグラムを計算します。
これを行うには巧妙な方法がありますか?それとも、画像のサイズを変更したり、画像を埋め込む方が良いでしょうか?
私はHOG + SVMモデルを訓練しています。私の訓練データはさまざまなサイズとアスペクト比です。 SVMモデルは可変サイズのリストで訓練することができないので、画像のサイズに関係なく同じ長さの勾配のヒストグラムを計算したいと考えています。画像サイズに関係なく、固定長の勾配(HOG)のヒストグラムを計算します。
これを行うには巧妙な方法がありますか?それとも、画像のサイズを変更したり、画像を埋め込む方が良いでしょうか?
以下の2つのものの一つです:
最初の方法1.
は非常にシンプルですが、方法が2.
で解決しようとするいくつかの問題があります。 まず、豚ディスクリプタが何をするのか考えてみましょう。画像を固定長のセルに分割し、セル単位の勾配をセル単位で計算して(投票に基づいて)ヒストグラムを生成します。最後に、すべてのセルの連結ヒストグラムがあり、それがあなたの記述子です。
オブジェクト(検出したい)が同様の方法で画像をカバーしなければならないため、問題があります。それ以外の場合は、イメージ内のオブジェクトの場所によって記述子が異なって見えます。
次のように動作2.
方法:
k
重心を定義します。頻度ヒストグラムを使用してSVMのトレーニングを行い、分類段階で使用します。この方法では、場所は問題ではなく、固定サイズの入力が常にあります。また、ディメンションの削減のメリットもあります。
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
希望します。人々は通常、このような場合には何