Зачем создавать свои собственные каскады Хаара-классификатора? - PullRequest
13 голосов
/ 29 августа 2011

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

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

Ответы [ 2 ]

31 голосов
/ 29 августа 2011

Классификаторы каскадов Хаара или LBP - это распространенная методика, используемая для обнаружения жестких объектов. Итак, вот два основных момента для обучения вашего собственного каскада:

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

  2. И каскады из OpenCV хороши, но они не самые лучшие. Это сложная задача, но можно обучить каскад, который будет иметь более высокий уровень обнаружения и производить меньше ложноположительных и ложноотрицательных результатов.

И еще одно важное замечание: приложение haartraining, используемое в вашем руководстве, теперь считается командой OpenCV устаревшим. opencv_traincascade является более новой версией и имеет 2 важные функции: поддерживает функции LBP и поддерживает многопоточность (TBB). Типичная разница выглядит следующим образом

haartraining + singlecore> 3 недели для одного классификатора.
traincascades + многоядерный <30 минут для одного классификатора. </p>

Но хуже всего то, что я не знаю хороших руководств, объясняющих использование opencv_traincascade. Подробнее см. в этой теме .

2 голосов
/ 11 августа 2015

Я могу привести пример Linux. Код и методы были взяты из различных источников. Это следует за этим примером , но с версией mergevec на python, поэтому вам не нужно компилировать файл mergevec.cpp.

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

find positive_images -iname "*.png" > positives.txt
find negative_images -iname "*.png" > negatives.txt

Затем с помощью сценария createamples.pl , предоставленного Naotoshi Seo (в папке 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, созданный 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) с чем-то вроде facedetect.py из примеров opencv:

opencv-3.0.0-rc1/samples/python2/facedetect.py --cascade classifier/cascade.xml test_movie.mp4
...