Я пытаюсь сделать детектор автомобилей из изображений БПЛА с помощью 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 для каждого набора. Результаты, которые я получаю, следующие:
- Манекен, LBP: Тренировка остановлена на 1 этапе. Быстрое обнаружение, объекты не обнаружены
- Манекен, HAAR: Обучение остановлено на 1 этапе. Обнаружение занимает целую вечность (или, по крайней мере, более получаса). Я прервал процесс, потому что он явно не работает.
- Полный комплект, LBP: Обучение остановлено в 6 Этапов. Очень медленное обнаружение (1-2 минуты на изображении 500x400 пикселей при масштабном коэффициенте = 2). Обнаружение очень небольшого количества объектов (2), ни одного из них автомобилей, когда на изображении не менее 10 автомобилей, а также то же изображение, которое использовалось для обучения.
- Полный комплект, HAAR: Я прекратил тренировку на 4-м этапе, чтобы проверить его. То же поведение, что и с набором Dummy.
Что я делаю неправильно? Так как каскады банан и лицо срабатывают за разумное время и обнаруживают объекты, проблема явно в моих каскадах, но не могу понять почему.
Я действительно ценю твою помощь. Заранее спасибо, Федерико.