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