opencv - training - ¿Por qué crear sus propias cascadas de clasificación Haar?
pyimagesearch face recognition (2)
Los clasificadores de cascadas Haar o LBP son una técnica común utilizada para la detección de objetos rígidos. Aquí hay dos puntos principales para entrenar su propia cascada:
Las cascadas que vienen con OpenCV no cubren todos los tipos de objetos posibles. De modo que puede usar una de las cascadas de OpenCV si va a crear una aplicación de detección de rostros, pero no hay cascadas listas para usar si necesita detectar, por ejemplo, perros.
Y las cascadas de OpenCV son buenas, pero no son las mejores posibles. Es una tarea desafiante, pero es posible entrenar una cascada que tendrá una mayor tasa de detección y producirá menos falsos positivos y falsos negativos.
Y un comentario importante: el equipo de OpenCV ahora considera obsoleta la aplicación de haartraining utilizada en su tutorial. opencv_traincascade
es una versión más nueva y tiene 2 características importantes: admite funciones LBP y admite multi-threading (TBB). La diferencia típica se parece a esto
haartraining + singlecore> 3 semanas para un clasificador.
traincascades + multicore <30 minutos para un clasificador.
Pero lo peor de todo es que no conozco ningún buen tutorial que explique el uso de opencv_traincascade
. Mira este hilo para más detalles.
Encontré este tutorial sobre cómo crear tus propias cascadas clasificadoras de haar.
Esto me planteó la pregunta: ¿cuáles son las ventajas, si las hay, de ejecutar HaarTraining y crear su propio clasificador (en lugar de utilizar las cascadas proporcionadas por OpenCv)?
Puedo darte un ejemplo de Linux. El código y las técnicas fueron extraídos de una variedad de fuentes. Sigue este ejemplo pero con una versión python de mergevec, por lo que no tiene que compilar el archivo mergevec.cpp.
Suponiendo que tiene dos carpetas con imágenes recortadas y listas positivas y negativas (archivos .png en este ejemplo), crea dos archivos de texto con todos los nombres de imagen en:
find positive_images -iname "*.png" > positives.txt
find negative_images -iname "*.png" > negatives.txt
Luego, usando el script createsamples.pl provisto por Naotoshi Seo (en la carpeta OpenCV / bin), que toma los dos archivos de texto y una carpeta de salida, y crea los archivos .vec:
perl createsamples.pl positives.txt negatives.txt ''output'' 1500 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxzangle 0.5 -w 50 -h 50"
Siga eso con un script python creado por Blake Wulfe llamado mergevec.py, que creará un archivo output.vec combinando todos los archivos .vec en la subcarpeta
python mergevec.py -v samples -o output.vec
Suponiendo que todo está hecho, usar opencv_traincascade de la siguiente manera debería ayudar:
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
Si todo va bien, usa la cascada recién creada (clasificador / cascade.xml) con algo así como facedetect.py de las muestras opencv:
opencv-3.0.0-rc1/samples/python2/facedetect.py --cascade classifier/cascade.xml test_movie.mp4