detectMultiScale(a, b, c) 参数含义

Meaning of Parameters of detectMultiScale(a, b, c)

OpenCV-Python 版本 3.4.1

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

我的问题是关于代码的。我的代码下面有一行说 detectMultiScale(灰色,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. 根据我的说法,这两个非常重要并且使代码非常敏感,因为它会影响误报。如何正确设置它们以减少误报?

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

谢谢。

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

Is it just a matter of trial and error adjusting these last two parameters or can one know how to change them according to the images?

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

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

scaleFactor参数决定了检测精度和速度之间的权衡。检测 window 从尺寸 minSize 开始,在测试该尺寸的所有 windows 之后,window 被放大 scaleFactor 并重新测试,依此类推,直到 window 达到或超过 maxSize。如果scaleFactor很大(比如2.0),当然步数会少一些,所以检测速度会更快,但是你可能会漏掉大小介于两个测试尺度之间的物体。但是 Haar-like 特征对尺度上的一些小变化具有固有的鲁棒性,因此没有必要使 scaleFactor 非常小(例如 1.001);那只会在不必要的步骤上浪费时间。这就是为什么默认值为 1.3 而不是更小的值。

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

老实说,我认为 Haar 级联分类器不太适合检测未知方向的笔或勺子(如果这是您的用例)。笔又长又细,不适合方形检测window。例如,您可能会使用 LINEMOD 获得更多成功。

According to me these two are really significant and make the code very sensitive as it affects false positives. How do I set them properly to reduce false positives ?

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