gpt4 book ai didi

python - 为什么我的自定义 HOG 检测器总是在图像中心而不是人物上绘制矩形?

转载 作者:行者123 更新时间:2023-11-30 09:19:52 26 4
gpt4 key购买 nike

我从 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 错误,但我以某种方式处理了它们。但现在终于执行了,为什么总是在中心画一个矩形而不是一个人呢? 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 系数是什么样的吗(上面的代码)?您正在进行大量与内容相关的操作,例如选择数组中的最后一个元素、其中的文本字段以及文本替换等。我不知道您的 svm_data.xml 的格式> 并且不能说这些步骤的正确性。但您绝对应该检查此代码的每一步的输出,尤其是 svmvec。将这些值与从原始对象/方法/等中获得的值进行比较。您生成了 svm_data.xml - 大多数 SVM 实现都有交互访问这些参数的方法,例如在 Matlab 或 Python 中。

您应该更正第二个代码帖子的格式,这对于 python 代码很重要。我猜你不知何故缺少换行符。

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

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

您还进行了非最大抑制。之前和之后有区别吗?你应该首先验证你之前得到过一些有意义的东西。首先检查 HoG 检测器在矩形中返回一些有意义的内容,而不是图像中心的矩形。如果没有这样做,那么您的问题就出现在流程中的该点之前。如果矩形包含漂亮的矩形,但您没有看到它们被绘制,那么您的问题就在那里并且应该很容易解决。

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

目前我能想到的就是这些。

关于python - 为什么我的自定义 HOG 检测器总是在图像中心而不是人物上绘制矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44105655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com