我正在訓練HOG + SVM模型,並且我的訓練數據具有各種大小和縱橫比。 SVM模型不能在可變大小列表上進行訓練,因此我正在計算無論圖像大小如何都是相同長度的梯度直方圖。計算固定長度的灰度直方圖(HOG),無論圖像大小如何
有沒有一個聰明的方法來做到這一點?或者更好地調整圖像大小或填充它們?
我正在訓練HOG + SVM模型,並且我的訓練數據具有各種大小和縱橫比。 SVM模型不能在可變大小列表上進行訓練,因此我正在計算無論圖像大小如何都是相同長度的梯度直方圖。計算固定長度的灰度直方圖(HOG),無論圖像大小如何
有沒有一個聰明的方法來做到這一點?或者更好地調整圖像大小或填充它們?
人們通常在這種情況下做的是對遵循以下兩種情況之一:
第一種方法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
希望有所幫助!