我已经从 hog.compute 函数中提取了特征,然后使用这些特征来训练 SVM 分类器。我使用了一个我在网上找到的脚本来从分类文件中分离 rho 和支持向量。
tree = ET.p('svm_data.xml')
root = tree.getroot()
SVs = root.getchildren()[0].getchildren()[-2].getchildren()[0]
rho = float( root.getchildren()[0].getchildren()[-1].getchildren()[0].getchildren()[1].text)
svmvec = [float(x) for x in re.sub( '\s+', ' ', SVs.text).strip().split(' ')]
svmvec.append(-rho)
pickle.dump(svmvec, open("svm.pickle", 'wb'))
这段代码将 rho 和支持向量保存到我提供给 hog.DetectMultiScale 函数的不同文件中。最初我得到了 CheckDetectorSize 错误,但不知何故我处理了它们。但现在它终于执行了,为什么它总是在中心而不是在人上绘制一个矩形?Check here使用从上述代码生成的文件的最终代码,在检测到的区域上绘制
hog = cv2.HOGDescriptor("hog.xml") svm =
pickle.load(open("svmcoeff.pickle", 'rb'))
hog.setSVMDetector(np.array(svm))
for i in range(1,9): image = cv2.imread('test-'+str(i)+'.png') image =
imutils.resize(image, width=min(300, image.shape[1])) orig =
image.copy()
(rects, weights) = hog.detectMultiScale(image)
for (x, y, w, h) in rects: cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255),2)
rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects])
pick = non_max_suppression(rects, probs=None,overlapThresh=0.65)
for (xA, yA, xB, yB) in pick: cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)
cv2.imshow("Before NMS", orig) cv2.imshow("After NMS", image)
key = cv2.waitKey(0) if key == 27: continue
我不能直接回答你的问题,但我可以建议调试步骤。
首先,您是否检查了 SVM 系数是什么样子 (上层代码 post)?您正在进行大量的内容相关操作,例如选择数组中的最后一个元素,以及其中的文本字段,以及文本替换等。我不知道你的svm_data.xml
的格式,也不能说任何关于这些步骤的正确性。但你应该肯定检查输出在这个代码的每一步,特别是1你产生的这些
你应该纠正你的第二个代码帖子的格式,这对于 python 代码来说意义重大。我猜你不知何故缺少换行符。
在这里,第一步应该是检查您读入的值svm
并与原始值进行比较。
确保 HoG 检测器返回的矩形参数和 cv.rectangle 使用的参数是兼容的。你的代码看起来 OK (并用在线示例检查)。但我仍然会尝试手动绘制几个矩形只是为了检查
你也做一个非最大抑制。之前和之后有区别吗?你应该首先验证你之前得到了一些有意义的东西。首先检查 HoG 检测器返回rects
中有意义的东西,而不是图像中心的矩形。如果它没有这样做,那么你的问题就在这个过程中的那个点之前。
如果问题出在rects
中,那么您应该返回并事先验证每个步骤。我已经提到从生成它们的位置跟踪 SVM 参数,直到将它们设置为 HoG 检测器。然后,您可以尝试使用其默认人员检测器运行 HoG 检测器,以查看整个检测过程是否正常。
这些是我现在能想到的。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(72条)