OpenCV каскадный классификатор с SVM в качестве слабого ученика

Я работаю над проектом, связанным с обнаружением людей. Я успешно реализовал как классификатор на основе HOG SVM (с libSVM), так и каскадный классификатор (с opencv). Классификатор svm работает действительно хорошо, я протестировал несколько видео, и он правильно обнаруживает людей с несколькими ложными срабатываниями и несколькими ложными отрицаниями; проблема здесь в вычислительном времени: около 1,2-1,3 с по всему изображению и 0,2-0,4 с по передним планам; Так как я работаю над проектом, который должен быть в состоянии работать практически в режиме реального времени, поэтому я переключился на каскадный классификатор (чтобы получить меньше вычислительного времени).
Поэтому я обучил много разных каскадных классификаторов с помощью opencv (opencv_traincascade). Вывод хороший с точки зрения вычислительного времени (0,2-0,3 с на всем изображении, намного меньше, когда запускается только на переднем плане), поэтому я достиг цели, скажем так. Проблема здесь заключается в качестве обнаружения: я получаю много ложного срабатывания и много ложного отрицания Так как только Разница между этими двумя методами заключается в том, что базовый классификатор используется в opencv (дерево решений или пни решений, во всяком случае, без SVM, насколько я понимаю), поэтому я начинаю думать, что моей проблемой может быть базовый классификатор (в некотором роде, hog функция лучше всего разделена гиперплоскостями, я думаю).

Конечно, набор данных, используемый в libsvm и Opencv, абсолютно одинаков как для обучения, так и для тестирования … ради полноты я использовал почти 9 тысяч положительных образцов и почти 30 тысяч отрицательных образцов.

Вот мои два вопроса:

  • Можно ли изменить базового слабого ученика в функции opencv_traincascade? если да, это svm один из возможных вариантов? если оба ответа да, как я могу сделать такую ​​вещь? 🙂
  • Существуют ли другие библиотеки компьютерного зрения или машинного обучения, которые реализуют SVM в качестве слабого классификатора и имеют некоторые методы для обучения каскадного классификатора? (эти библиотеки подходят для использования в сочетании с opencv?)

заранее спасибо как всегда!

Марко.

2

Решение

В принципе, слабым классификатором может быть что угодно, но сила методов, связанных с Adaboost, состоит в том, что они способны получать хорошие результаты из простых классификаторов (их называют «слабыми» по причине).
Использование SVN и каскада Adaboost является противоречием, поскольку первое не нуждается в использовании в такой среде: оно может выполнять свою работу самостоятельно, а второе быстро только потому, что использует слабые классификаторы.
Более того, я не знаю ни одного исследования об этом, и OpenCv не поддерживает его: вы должны писать код самостоятельно. Это огромная задача, и, вероятно, вы не получите интересного результата.
В любом случае, если вы считаете, что функции HOG более подходят для вашей задачи, у Traincascade в OpenCv есть такая возможность, кроме Haar и Lbp.
Что касается вашего второго вопроса, я не уверен, но вполне уверен, что ответ отрицательный.
Мой совет: постарайтесь получить как можно больше от traincascade, например, попробуйте увеличить количество идентификаторов сэмплов, которые вы можете, и сравнить результаты.

1

Другие решения

это бумага довольно хорошо. Это просто говорит о том, что SVM может рассматриваться как слабый классификатор, если вы используете меньше образцов для его обучения (скажем, менее половины обучающего набора). Чем выше вес, тем больше шансов, что его тренирует «слабый SVM».

К сожалению, исходный код широко не доступен. Если вы хотите быстрый прототип, используйте Python Scikit Learn и посмотрите, сможете ли вы получить желаемые результаты, прежде чем изменять opencv.

0