2017-12-18 4 views
0

HOG + SVM 모델을 교육 중이며 교육 데이터의 크기와 종횡비가 다양합니다. SVM 모델은 가변 크기 목록에 대해 학습 할 수 없으므로 이미지 크기에 관계없이 동일한 길이의 그래디언트 막대 그래프를 계산하려고합니다.이미지 크기에 관계없이 고정 길이의 그래디언트 (HOG)의 히스토그램을 계산하십시오.

영리한 방법이 있습니까? 또는 이미지의 크기를 조정하거나 패드를 씌우는 것이 좋습니다.

답변

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 

희망 하시겠습니까? 사람들이 일반적으로 경우에 무엇을

관련 문제