Подтвердить что ты не робот

Зачем создавать собственные каскады кластера Haar?

Я нашел этот учебник по созданию собственных каскадов хара-классификатора.

Это подняло вопрос со мной: какие преимущества, если таковые имеются, для запуска HaarTraining и создания собственного классификатора (в отличие от использования каскадов, предоставляемых OpenCv)?

4b9b3361

Ответ 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