Python 为什么我的定制猪检测器总是在图像中心而不是人身上画一个矩形?

Python 为什么我的定制猪检测器总是在图像中心而不是人身上画一个矩形?,python,python-3.x,opencv,machine-learning,opencv3.0,Python,Python 3.x,Opencv,Machine Learning,Opencv3.0,我从hog.compute函数中提取了特征,然后用这些特征来训练SVM分类器。我使用了一个我在网上找到的脚本,将rho和支持向量从分类文件中分离出来 tree = ET.parse('svm_data.xml') root = tree.getroot() SVs = root.getchildren()[0].getchildren()[-2].getchildren()[0] rho = float( root.getchildren()[0].getchildren()[-1].getc

我从hog.compute函数中提取了特征,然后用这些特征来训练SVM分类器。我使用了一个我在网上找到的脚本,将rho和支持向量从分类文件中分离出来

tree = ET.parse('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错误,但不知怎么地我处理了它们。但是现在它终于执行了,为什么它总是在中心画一个矩形而不是一个人呢? 使用上述代码生成的文件在检测区域上绘制矩形的最终代码:


我不能直接回答您的问题,但我可以建议调试步骤

首先,你检查过SVM系数是什么样子的吗(上面的代码帖子)?您正在执行许多与内容相关的操作,例如拾取数组中的最后一个元素、其中的文本字段以及文本替换等。我不知道您的
svm_data.xml的格式,也无法说明这些步骤的正确性。但是您应该在代码的每一步都检查输出,尤其是
svmvec
。将这些值与您从原始对象/方法/等获得的值进行比较。您使用生成的
svm_data.xml
大多数svm实现都有交互访问这些参数的方法,例如在Matlab或python中

您应该更正第二篇代码文章的格式,这对python代码非常重要。我猜你不知怎的错过了换行符

这里的第一步应该是检查读入
svm
的值,并与原始值进行比较

确保HoG检测器返回的矩形参数与cv.rectangle使用的参数兼容。您的代码看起来不错(并通过联机示例进行检查)。但我仍然会尝试手工绘制一些矩形来检查

您还可以执行非最大值抑制。前后有区别吗?你应该先确认你得到了一些有意义的东西。第一个check HoG检测器在
矩形中返回有意义的内容,而不是图像中心的矩形。如果它没有这样做,那么你的问题就在这个过程中的那个点之前。如果
矩形
包含漂亮的矩形,但您没有看到它们被绘制,那么您的问题就在那里,应该很容易解决

如果问题出现在
rects
中,则应返回并事先验证每个步骤。我已经提到了跟踪SVM参数,从生成它们的位置一直跟踪到将它们设置为HoG检测器。然后,您可以尝试使用默认的人员检测器运行HoG检测器,以查看整个检测过程是否正常工作


这就是我现在能想到的。

我不能直接回答您的问题,但我可以建议调试步骤

首先,你检查过SVM系数是什么样子的吗(上面的代码帖子)?您正在执行许多与内容相关的操作,例如拾取数组中的最后一个元素、其中的文本字段以及文本替换等。我不知道您的
svm_data.xml的格式,也无法说明这些步骤的正确性。但是您应该在代码的每一步都检查输出,尤其是
svmvec
。将这些值与您从原始对象/方法/等获得的值进行比较。您使用生成的
svm_data.xml
大多数svm实现都有交互访问这些参数的方法,例如在Matlab或python中

您应该更正第二篇代码文章的格式,这对python代码非常重要。我猜你不知怎的错过了换行符

这里的第一步应该是检查读入
svm
的值,并与原始值进行比较

确保HoG检测器返回的矩形参数与cv.rectangle使用的参数兼容。您的代码看起来不错(并通过联机示例进行检查)。但我仍然会尝试手工绘制一些矩形来检查

您还可以执行非最大值抑制。前后有区别吗?你应该先确认你得到了一些有意义的东西。第一个check HoG检测器在
矩形中返回有意义的内容,而不是图像中心的矩形。如果它没有这样做,那么你的问题就在这个过程中的那个点之前。如果
矩形
包含漂亮的矩形,但您没有看到它们被绘制,那么您的问题就在那里,应该很容易解决

如果问题出现在
rects
中,则应返回并事先验证每个步骤。我已经提到了跟踪SVM参数,从生成它们的位置一直跟踪到将它们设置为HoG检测器。然后,您可以尝试使用默认的人员检测器运行HoG检测器,以查看整个检测过程是否正常工作


这就是我现在能想到的。

欢迎来到StackOverflow!如果你在发帖时遵循一些简单的规则,你会得到更好、更快的帮助。首先,在发布代码时使用。它更容易阅读和复制。其次,最好提供一个例子来说明您的问题。这使其他人更容易验证和解决您的问题。欢迎使用StackOverflow!如果你在发帖时遵循一些简单的规则,你会得到更好、更快的帮助。首先,在发布代码时使用。它更容易阅读和复制。其次,最好提供一个例子来说明您的问题。这使其他人更容易验证和解决您的问题。您好,非常感谢您的详细回复。OpenCV提供默认人员检测器训练模型的SVM系数。我比较了我的SVM系数和默认值,它们非常不同。是的,关于互动我,你是对的
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