Улучшение каскадов XML для обнаружения LBP/HAAR

Я пытаюсь сделать детектор автомобилей из изображений БПЛА с помощью Python 2.7 и OpenCV 2.4.13. Цель состоит в том, чтобы обнаруживать автомобили сверху в любом направлении в городских условиях. Я сталкиваюсь с проблемами времени и точности.

Детектор отлично работает, когда я использую его с некоторыми каскадами, которые я получил из Интернета:

  • Классификатор бананов (очевидно, он не обнаруживает автомобили, но обнаруживает объекты, которые распознает как бананы): ( coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html)
  • Каскады обнаружения лиц из OpenCV (такое же поведение, как у бананового классификатора)

Для самого обнаружения я использую detectMultiScale() с scaleFactor = 1.1-1.2 и minNeighbors=3

Обнаружение выполняется за разумное время (несколько секунд) на изображении размером 4000x3000 пикселей.

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

Для обучения я извлек как позитивные, так и негативные изображения из большой ортомозаики (которую я несколько раз уменьшал), на которой есть парковка с большим количеством автомобилей. Я извлек в общей сложности 50 автомобилей (25x55 пикселей), которые затем отразил горизонтально, в результате чего получилось 100 позитивных изображений и 2119 негативных изображений (60x60 пикселей) из одной и той же ортофотоплана. Я называю этот набор «полным набором» изображений. Из этого набора я создал подмножество (4 позитива и 35 негативов), которое назвал «фиктивным набором»:

Пример положительного изображения 1

Пример 1 негативного изображения

Для обучения я использовал opencv_createsamples и opencv_traincascade. Я создал 6000 образцов из 100 позитивных изображений, вращая автомобили от 0 до 360 градусов:

perl bin/createsamples.pl positives.txt negatives.txt samples 6000 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 0.5 -maxyangle 0.5 -maxzangle 6.28 -maxidev 40 -w 60 -h 60"

Итак, теперь у меня есть 6000 образцов изображений автомобилей размером 60x60 пикселей в любом направлении на случайном фоне.

Затем я выполнил mergevec.py, чтобы создать файл samples.vec, и запустил обучающее приложение opencv_traincascade:

python mergevec.py -v samples/ -o samples.vec
opencv_traincascade -data classifier -vec samples.vec -bg negatives.txt -numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 3700 -numNeg 2119 -w 60 -h 60 -mode ALL -precalcValBufSize 3096 -precalcIdxBufSize 3096

С помощью этого метода я обучил четыре классификатора, два из которых использовали полный набор, а два других использовали фиктивный набор, один LBP и один HAAR для каждого набора. Результаты, которые я получаю, следующие:

  1. Манекен, LBP: Тренировка остановлена ​​на 1 этапе. Быстрое обнаружение, объекты не обнаружены
  2. Манекен, HAAR: Обучение остановлено на 1 этапе. Обнаружение занимает целую вечность (или, по крайней мере, более получаса). Я прервал процесс, потому что он явно не работает.
  3. Полный комплект, LBP: Обучение остановлено в 6 Этапов. Очень медленное обнаружение (1-2 минуты на изображении 500x400 пикселей при масштабном коэффициенте = 2). Обнаружение очень небольшого количества объектов (2), ни одного из них автомобилей, когда на изображении не менее 10 автомобилей, а также то же изображение, которое использовалось для обучения.
  4. Полный комплект, HAAR: Я прекратил тренировку на 4-м этапе, чтобы проверить его. То же поведение, что и с набором Dummy.

Что я делаю неправильно? Так как каскады банан и лицо срабатывают за разумное время и обнаруживают объекты, проблема явно в моих каскадах, но не могу понять почему.

Я действительно ценю твою помощь. Заранее спасибо, Федерико.


person Federico    schedule 02.09.2016    source источник
comment
Обновление: я обучил промежуточный набор с использованием функций HAAR. Он работает очень медленно и не обнаруживает ничего, кроме объекта в центре изображения, независимо от того, какое изображение я использую. Видимо каскад так и не научился какой-то фиче :(   -  person Federico    schedule 05.09.2016


Ответы (1)


Я не могу сказать точно, но у меня есть идея, почему нельзя обучить каскады HAAR (LBP) обнаруживать произвольно ориентированные автомобили.

Эти каскады отлично работают при обнаружении объектов примерно одинаковой формы и цвета (яркости). Фронтально ориентированное лицо является хорошим примером таких объектов. Но гораздо хуже работает, когда лицо имеет другую ориентацию и цвет (это не шутка, стандартные хаар-каскады из OpenCV имеют проблемы с определением человека с темной кожей). Хотя эти проблемы являются результатом тренировочного набора, который содержит только лица фронтально ориентированных европейцев. Но если мы попытаемся добавить в обучающую выборку лица всех цветов и пространственных ориентаций, то столкнемся с теми же проблемами, что и вы.

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

Таким образом, каскады HAAR (LBP) нельзя использовать для обнаружения объектов переменной формы. Но вы можете посмотреть в сторону Deep Convolution Neural Networks. Насколько я знаю, они могут решить эти проблемы.

person ErmIg    schedule 08.09.2016
comment
Привет Эрмлг. Наконец-то я понял, как обучить каскад, который работает. Похоже, что размер обучающего окна должен быть меньше размера негативных изображений. Я думаю, что это из-за алгоритма обучения opencv, который накладывает положительные изображения на негативы для повышения надежности, но я не уверен. На данный момент это работает только для автомобилей в вертикальном положении, но сейчас я пытаюсь обучить каскад с повернутыми версиями положительных образцов. Буду публиковать с обновлениями. Большое Вам спасибо. - person Federico; 08.09.2016