我遇到使用Python,OpenCV 3.1和HOG进行有用检测的问题。虽然我的工作代码没有错误地执行,但训练有素的HOG / SVM组合无法检测到测试图像。
从OpenCV示例和其他Stack Overflow讨论开始,我开发了以下方法。
win_size = (64, 64)
block_size = (16, 16)
block_stride = (8, 8)
cell_size = (8, 8)
nbins = 9
deriv_aperture = 1
win_sigma = 4.
histogram_norm_type = 0
l2_hys_threshold = 2.0000000000000001e-01
gamma_correction = 0
nlevels = 64
hog = cv2.HOGDescriptor(win_size,
block_size,
block_stride,
cell_size,
nbins,
deriv_aperture,
win_sigma,
histogram_norm_type,
l2_hys_threshold,
gamma_correction,
nlevels)
window_stride = (8, 8)
padding = (8, 8)
locations = ((0, 0),)
histograms = []
# not showing the loop here but
# create histograms for 600 positive and 600 negative images
# all images are of size 64x64
histograms.append(np.transpose(hog.compute(roi, window_stride, padding, locations)))
training_data = np.concatenate(histograms)
classifications = np.array([1] * 600 + [0] * 600)
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setC(0.01)
svm.setTermCriteria((cv2.TermCriteria_MAX_ITER, 100, 1e-6))
svm.train(training_data, cv2.ml.ROW_SAMPLE, classifications)
# testing
test_img = cv2.imread('test_image.jpg')
svmvec = svm.getSupportVectors()[0]
rho = -svm.getDecisionFunction(0)[0]
svmvec = np.append(svmvec, rho)
hog.setSVMDetector(svmvec)
found, w = hog.detectMultiScale(test_img)
在每次测试中,found
是图像中心的单个矩形,并不位于测试图像中正片所在的位置。
我已经根据Stack Overflow答案和其他OpenCV样本和讨论尝试了许多不同的参数组合。他们都没有改变结果。
答案 0 :(得分:0)
我认为您需要所有支持向量。所以问题不在于你的训练代码,而是你的考试。
svm.train(training_data, cv2.ml.ROW_SAMPLE, classifications)
您使用所有数据进行培训,但在测试时,您只使用生成的分类器的一小部分。
svmvec = svm.getSupportVectors()[0]
更改此行,您将减少一个问题。
答案 1 :(得分:0)
在中心创建单个矩形的原因是因为检测器几乎将所有区域分类为" human"。 默认情况下,detectMultiScale会抑制矩形的重叠。所以你只能看到中心的单个矩形。 您可以使用detectMultiScale的finalThreshold选项关闭此抑制。
hogParams = { 'finalThreshold': 0}
found, w = hog.detectMultiScale(test_img, **hogParams)
默认情况下,此参数设置为2。 您可以看到几乎所有区域都由矩形颜色填充。
我对此的回答"错误分类"是标签顺序的简单改变。
classifications = np.array([0] * 600 + [1] * 600)