Значение параметров deteMultiScale (a, b, c) - PullRequest
0 голосов
/ 02 июля 2018

OpenCV-Python версия 3.4.1

Я пытаюсь обнаружить несколько объектов с помощью камеры. Объектами являются Лицо, глаза, ложка, ручка. Ложка и ручка особенные, т. Е. Они должны обнаруживать только ручку и ложку, с которыми я их натренировал. Но он распознает все виды лиц и глаз, так как я использовал файл .xml для распознавания лиц и глаз, который поставляется с OpenCV-Python.

Мой вопрос касается кода. В моем коде есть строка, которая говорит Detective MultiSale (серый, 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 голосов
/ 16 июля 2018

Получили ли вы код (включая вызов для обнаружения MultiScale) откуда-то или написали его самостоятельно?

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

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

Глядя на привязки 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.

...