Зачем создавать собственные каскады кластера Haar?
Я нашел этот учебник по созданию собственных каскадов хара-классификатора.
Это подняло вопрос со мной: какие преимущества, если таковые имеются, для запуска HaarTraining и создания собственного классификатора (в отличие от использования каскадов, предоставляемых OpenCv)?
Ответы
Ответ 1
Классификаторы каскадов Хаара или LBP являются обычным методом, используемым для обнаружения или жестких объектов. Итак, вот два основных момента для обучения вашему собственному каскаду:
-
Каскады, идущие с OpenCV, не охватывают все возможные типы объектов. Таким образом, вы можете использовать один из каскадов OpenCV, если вы собираетесь создать приложение для распознавания лиц, но нет готовых к использованию каскадов, если вам нужно обнаружить, например, собак.
-
И каскады от OpenCV хороши, но они не самые лучшие. Это сложная задача, но можно обучить каскад, который будет иметь более высокий уровень обнаружения и создать меньше ложных срабатываний и ложных отрицаний.
И одно важное замечание: приложение haartrining, используемое в вашем учебнике, теперь считается устаревшим командой OpenCV. opencv_traincascade
- более новая версия и имеет две важные функции: поддерживает функции LBP и поддерживает многопоточность (TBB). Типичная разница выглядит так:
haartraining + singlecore > 3 недели для одного классификатора.
traincascades + multicore < 30 минут для одного классификатора.
Но хуже всего я не знаю хороших учебников, объясняющих использование opencv_traincascade
. Подробнее см. этот поток.
Ответ 2
Я могу привести пример Linux. Код и методы были извлечены из различных источников. Это этот пример, но с версией mergevec на python, поэтому вам не нужно компилировать файл mergevec.cpp.
Предполагая, что у вас есть две папки с обрезанными и готовыми положительными и отрицательными изображениями (.png файлы в этом примере), вы создаете два текстовых файла со всеми именами изображений в:
find positive_images -iname "*.png" > positives.txt
find negative_images -iname "*.png" > negatives.txt
Затем, используя createsamples.pl script, предоставленный Наотоши Сео (в папке OpenCV/bin), которая берет два текста файлы и выходную папку и создает файлы .vec:
perl createsamples.pl positives.txt negatives.txt 'output' 1500 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxzangle 0.5 -w 50 -h 50"
Следуйте за этим с помощью python script, созданного Blake Wulfe под именем mergevec.py, который создаст файл output.vec, объединив все .vec файлы в подпапке
python mergevec.py -v samples -o output.vec
Предполагая, что все сделано, использование opencv_traincascade следующим образом должно помочь:
opencv_traincascade -data classifier -vec output.vec -bg negatives.txt \
-numStages 10 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 200 \
-numNeg 400 -w 50 -h 50 -mode ALL
Если все будет хорошо, используйте свой недавно созданный каскад (classifier/cascade.xml) с чем-то вроде facesetect.py из образцов opencv:
opencv-3.0.0-rc1/samples/python2/facedetect.py --cascade classifier/cascade.xml test_movie.mp4