Значение параметров функцииDetectMultiScale(a,b,c)

OpenCV-Python версии 3.4.1

Я пытаюсь обнаружить несколько объектов через камеру. Объекты: лицо, глаза, ложка, ручка. Ложка и ручка являются особыми, то есть он должен обнаруживать только те ручку и ложку, с которыми я его тренировал. Но он обнаруживает все виды лиц и глаз, поскольку я использовал файл «.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. По моему мнению, эти два действительно важны и делают код очень чувствительным, поскольку он влияет на ложные срабатывания. Как правильно их настроить, чтобы уменьшить количество ложных срабатываний?

Это действительно важный параметр в случае обнаружения объекта, поэтому было бы полезно для всех, если бы у нас был ответ раз и навсегда.

Спасибо.


person Winbuntu    schedule 02.07.2018    source источник


Ответы (1)


Вы откуда-то взяли код (включая вызов detectMultiScale) или написали его сами?

Это просто вопрос настройки этих двух последних параметров путем проб и ошибок, или можно знать, как изменить их в соответствии с изображениями?

В тонкой настройке есть некоторые пробы и ошибки, но вы должны понимать все параметры и выбирать начальные значения, которые дают хороший уровень производительности. Затем вы можете использовать какой-то автоматический метод для точной настройки (т. е. итеративно переобучить и повторно протестировать с разными значениями параметров и посмотреть, улучшится или ухудшится обнаружение, но будьте осторожны с переобучением). Поскольку параметры образуют большое многомерное пространство, поиск хороших параметров случайным образом нецелесообразен.

Глядя на привязки Python OpenCV, кажется, что вы используете два числовых параметра: scaleFactor и minNeighbors соответственно. По этому вопросу есть хорошее объяснение minNeighbours: параметр OpenCV detectMultiScale() minNeighbors. Установка его выше должна уменьшить ваши ложные срабатывания, как описано здесь.

Параметр scaleFactor определяет компромисс между точностью обнаружения и скоростью. Окно обнаружения начинается с размера minSize, и после тестирования всех окон этого размера окно увеличивается на scaleFactor и повторно тестируется, и так далее, пока окно не достигнет или не превысит maxSize. Если scaleFactor большое (например, 2.0), конечно, будет меньше шагов, поэтому обнаружение будет быстрее, но вы можете пропустить объекты, размер которых находится между двумя тестируемыми масштабами. Но функции, подобные Хаару, по своей природе устойчивы к небольшому изменению масштаба, поэтому нет необходимости делать scaleFactor очень маленьким (например, 1,001); это просто тратит время на ненужные шаги. Вот почему по умолчанию 1,3, а не меньше.

Установка minSize и maxSize также важна для максимальной скорости обнаружения. Не проверяйте окна, размер которых меньше или больше, чем диапазон размеров, который вы ожидаете с учетом вашей настройки. Поэтому вы должны указать их в своем вызове.

Честно говоря, я не вижу, чтобы каскадные классификаторы Хаара были так хороши для обнаружения ручек или ложек в неизвестной ориентации (если это ваш вариант использования). Перья длинные и тонкие, что плохо подходит для квадратного окна обнаружения. Например, вы можете добиться большего успеха с LINEMOD.

По моему мнению, эти два действительно важны и делают код очень чувствительным, поскольку он влияет на ложные срабатывания. Как правильно их настроить, чтобы уменьшить количество ложных срабатываний?

Пока ваши ложноотрицательные показатели и скорость в порядке, не играйте с scaleFactor, вместо этого работайте над улучшением ваших тренировочных данных, чтобы снизить высокий уровень ложноположительных результатов. Если при этом скорость падает до неприемлемого уровня (поскольку каскад разрастается и включает слишком много стадий классификатора), повторно посетите scaleFactor.

person Chungzuwalla    schedule 16.07.2018
comment
Как передать параметры minSize и maxSize? Можете ли вы поделиться примером? - person loadbox; 25.06.2020