2017-12-18 229 views

回答

1

人們通常在這種情況下做的是對遵循以下兩種情況之一:

  1. 調整所有圖像(或圖像塊)以固定的大小和提取與HOG特徵。
  2. 使用「Bag of Words/Features」方法,不要調整圖像大小。

第一種方法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 

希望有所幫助!