【问题标题】:Meaning of Parameters of detectMultiScale(a, b, c)detectMultiScale(a, b, c) 参数含义
【发布时间】:2018-12-10 11:24:05
【问题描述】:

OpenCV-Python 3.4.1 版

我正在尝试通过相机检测多个对象。对象是脸、眼睛、勺子、笔。 Spoon 和 Pen 是特别的,即它应该只检测我训练过的 Pen 和 Spoon。但它可以检测所有类型的人脸和眼睛,因为我使用 OpenCV-Python 附带的“.xml”文件进行人脸和眼睛检测。

我的问题是关于代码的。我的代码下面有一行说 检测MultiScale(灰色,1.3,10)。现在,我使用文档,仍然无法清楚地理解括号的最后两个参数。

我的代码:

# with camera feed
import cv2
import numpy as np

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
spoon_cascade = cv2.CascadeClassifier('SpoonCascade.xml')
pen_cascade = cv2.CascadeClassifier('PenCascade.xml')

cap = cv2.VideoCapture('link')

while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    spoons = spoon_cascade.detectMultiScale(gray, 1.3, 10)

    pens = pen_cascade.detectMultiScale(gray, 1.3, 10)

    for (x, y, w, h) in spoons:
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, 'Spoon', (x-w, y-h), font, 0.5, (0, 255, 255), 2, 
        cv2.LINE_AA)
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

    for (x, y, w, h) in pens:
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, 'Pen', (x-w, y-h), font, 0.5, (0, 255, 255), 2, 
        cv2.LINE_AA)
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

    for (x, y, w, h) in faces:
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, 'Face', (x + w, y + h), font, 0.5, (0, 255, 255), 2, 
        cv2.LINE_AA)
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
        roi_color = img[y:y + h, x:x + w]
        roi_gray = gray[y:y + h, x:x + w]
        eyes = eye_cascade.detectMultiScale(roi_gray)

        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 0, 
            255), 2)

    cv2.imshow('Voila', img)
    cv2.imwrite('KuchhToDetected.jpg', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

我的问题:

  1. 调整这最后两个参数是否只是试错法,还是可以根据图像知道如何更改它们?

  2. 在我看来,这两个非常重要,并且使代码非常敏感,因为它会影响误报。如何正确设置它们以减少误报?

在物体检测的情况下,这是一个非常重要的参数,所以如果我们一劳永逸地得到答案,这对所有人都是有益的。

谢谢。

【问题讨论】:

    标签: opencv opencv3.0 object-detection cascade-classifier opencv-python


    【解决方案1】:

    您是从某处获得代码(包括对 detectMultiScale 的调用)还是自己编写的?

    这只是调整最后两个参数的试错问题,还是可以根据图像知道如何更改它们?

    在微调过程中有一些反复试验,但您应该了解所有参数并选择能够提供良好性能水平的初始值。然后您可以使用某种自动方法进行微调(即,使用不同的参数值迭代地重新训练和重新测试,看看检测是改善还是恶化,但要小心过度拟合)。由于参数构成了一个很大的多维空间,随机寻找好的参数是不现实的。

    查看 Python OpenCV 绑定,您使用的两个数字参数似乎分别是 scaleFactorminNeighbors。关于这个问题,minNeighbours 有一个很好的解释:OpenCV detectMultiScale() minNeighbors parameter。如那里所述,将其设置得更高应该可以减少误报。

    scaleFactor 参数决定了检测精度和速度之间的权衡。检测窗口以minSize 的大小开始,在测试完所有该大小的窗口后,将窗口放大scaleFactor 并重新测试,依此类推,直到窗口达到或超过maxSize。如果scaleFactor 很大(例如2.0),当然步骤会更少,因此检测速度更快,但是您可能会错过大小在两个测试尺度之间的对象。但是类似 Haar 的特性对一些小的规模变化具有内在的鲁棒性,因此没有必要将scaleFactor 设置得非常小(例如 1.001);这只是在不必要的步骤上浪费时间。这就是为什么默认值为 1.3 而不是更小的原因。

    设置minSizemaxSize 对于最大化检测速度也很重要。不要测试小于或大于给定设置的预期尺寸范围的窗口。所以你应该在你的电话中指定这些。

    说实话,我认为 Haar 级联分类器对于检测未知方向的钢笔或勺子(如果这是您的用例)没有那么好。笔又长又细,不适合方形检测窗口。例如,您可能会通过 LINEMOD 获得更大的成功。

    在我看来,这两个非常重要,并且使代码非常敏感,因为它会影响误报。如何正确设置它们以减少误报?

    虽然您的误报率和速度都还可以,但不要玩scaleFactor,而是努力改进您的训练数据以降低您的高误报率。如果在执行此操作时速度下降到无法接受的水平(因为级联增长到包含太多分类器阶段),请重新访问 scaleFactor

    【讨论】:

    • 如何传递 minSize 和 maxSize 参数?你能分享一个例子吗?
    猜你喜欢
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多