OpenCV и C ++: ошибка с Traincascade: практическая проблема

В последние несколько дней я исследовал методы createamples и traincascade для создания каскадного классификатора автомобиля. Как и я сам, многие люди не понимают, как обойти все ошибки и проблемы, поэтому в этом посте я объясню свою процедуру и рассуждения так, как могу, а также мою проблему.

Чтобы дать немного больше контекста, в прошлом я реализовывал расширенный классификатор с функциями Haar, но поскольку метод не был каскадным, он был очень медленным. Я, однако, очень хорошо знаком с методом, лежащим в основе каскадной классификации.

Проблема: классификация автомобилей по изображениям

Я загрузил набор данных (набор изображений), который предоставляет 550 положительных окон (изображения 100 Вт x 40 ч с автомобилями) и 500 отрицательных окон (изображения 100 Вт x 40 ч без автомобилей), и я собираюсь использовать эти данные для обучения каскадного классификатора.

ШАГ 1 — Генерация файлов .dat для создания образцов

Приложению createamples требуется файл .dat с информацией о положительных и отрицательных образцах. Я сгенерировал два файла .dat, один с положительными окнами, а другой с отрицательными:

структура примера positive.dat:

CarData\TrainImages\POS\pos-0.pgm 1 0 0 100 40

CarData\TrainImages\POS\pos-1.pgm 1 0 0 100 40 (and more 548 lines of this)

Число 1 указывает, что во всем изображении присутствует один объект, а следующие 4 целых числа представляют ограничивающий прямоугольник, в котором находится объект (все изображение в этом примере)

Пример структуры негатива.

CarData\TrainImages\NEG\neg-0.pgm

CarData\TrainImages\NEG\neg-1.pgm(and more 498 lines of this)

ШАГ 2 — Создание файлов .vec

Для этого я использую приложение createamples.exe со следующей командной строкой:

: createsamples.exe -info path/positive.dat -vec samples.vec -bg negative.dat -w 100 -h 40 -num 550

Пока все хорошо, файл samples.vec генерируется без проблем.

ШАГ 3 — Обучение каскадного классификатора

Для этого я использую приложение traincascade со следующей командной строкой:

: traincascade.exe -data CarDetector -vec path/samples.vec -bg path/negative.dat -numStages 15 -stageType BOOST -featureType HAAR -w 100 -h 40 -bt DAB -maxDepth 2 -mode ALL

ОБЪЯСНЯЕМЫЕ ПАРАМЕТРЫ:

numStages (15): означает, что я хочу, чтобы у моего классификатора было 15 этапов принятия решения.

stageType (BOOST): каждый этап является повышенным классификатором

featureType (HAAR): использовать функции haar для классификации. HOG и LBP также доступны.

w (100): ширина окна обнаружения

h (40): высота окна обнаружения

bt (DAB): означает, что я хочу использовать Discrete Adaboost (а не logitboost и другие)

maxDepth (2): означает, что каждый слабый классификатор будет использовать 3 функции для классификации

-Режим (ВСЕ): я думаю, это означает, что он будет использовать все различные функции haar.

ОШИБКА

Когда я запускаю команду, программа немедленно завершает работу без сообщения об ошибке, поэтому я совершенно не понимаю, что я делаю неправильно.
Я надеюсь, что кто-то, имеющий опыт в этом вопросе, определит проблему с моей процедурой, так как эта проблема разделяется многими людьми, которые пытаются использовать это приложение.

проблема

С уважением!

ИМПОРТ — РЕДАКТИРОВАТЬ 2:

Я пытался обучить классификатор с помощью устаревшего приложения haartraining, просто чтобы узнать, смогу ли я получить больше информации, и вот что происходит:

Описание изображения

1

Решение

Вы используете изображения размером 100х40. (-w 100 -h 40) Очевидно, OpenCV предварительно вычисляет все возможные функции, и это приводит к неправильному распределению (я получаю неправильное распределение в моей системе). Попробуйте уменьшить размер до 25×10 и посмотрите, произойдет ли это до сих пор.

1

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

Других решений пока нет …