2

OpenCV-Python 版本 3.4.1

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

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

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

谢谢你。

4

1 回答 1

5

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

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

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

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

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

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

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

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

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

于 2018-07-16T07:38:16.710 回答