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

时间:2018-07-02 09:14:52

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

OpenCV-Python版本3.4.1

我正在尝试通过相机检测多个物体。对象是脸,眼睛,勺子,笔。 Spoon和Pen是特别的,也就是说,它应该只检测我训练过的Pen and Spoon。但是它可以检测到所有类型的人脸和眼睛,因为我使用了“ .xml”文件进行OpenCV-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. 这对我来说确实很重要,这会使代码非常敏感,因为它会影响误报。如何正确设置它们以减少误报?

在检测对象的过程中,它是非常重要的参数,因此,如果我们一劳永逸地获得答案,它将对所有人都有益。

谢谢。

1 个答案:

答案 0 :(得分:2)

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

  

是调整这最后两个参数只是一个反复试验的问题,还是可以知道如何根据图像进行更改?

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

查看Python OpenCV绑定,您使用的两个数字参数分别为scaleFactorminNeighborsminNeighbours在以下问题上有很好的解释:OpenCV detectMultiScale() minNeighbors parameter。如此处所述,将其设置得更高可以减少误报。

scaleFactor参数确定检测精度和速度之间的权衡。检测窗口以minSize大小开始,在测试了该大小的所有窗口之后,将窗口放大scaleFactor并重新测试,依此类推,直到窗口达到或超过{{1 }}。如果maxSize大(例如2.0),则步骤将更少,因此检测速度更快,但是您可能会错过大小在两个测试比例之间的对象。但是类似Haar的功能具有固有的鲁棒性,可以适应较小的规模变化,因此无需使scaleFactor非常小(例如1.001);只是浪费了不必要的步骤。这就是为什么默认值为1.3而不是更小的原因。

设置scaleFactorminSize对于最大化检测速度也很重要。不要测试小于或大于设置所需大小范围的窗口。因此,您应该在通话中指定这些内容。

说实话,我认为Haar级联分类器不能很好地检测未知方向的笔或匙(如果这是您的用例)。笔又长又细,不适合方形检测窗。例如,使用LINEMOD可能会获得更大的成功。

  

根据我的说法,这两点确实很重要,并且由于影响误报,因此使代码非常敏感。如何正确设置它们以减少误报?

虽然您的假阴性率和速度都可以,但不要玩maxSize,而应该改善您的训练数据以减少高假阳性率。如果这样做时速度下降到不可接受的水平(因为级联会增加以包括过多的分类器阶段),请重新访问scaleFactor