rostros - reconocimiento de objetos opencv c++
Cómo entrenar la cascada apropiadamente (5)
¡Esto no es un error! Dadas las muestras presentadas y la configuración de la capacitación, su cascada ha alcanzado su potencial deseado. ¡Agregue más datos O haga sus requisitos más duros! Por ahora solo dice, lo hace tan bien como lo solicitó ...
Tienes tres formas ahora ...
- Agregue más etapas en -numStages para obtener su escenario, por ejemplo, si desea obtener 10 etapas, puede escribir en el parámetro -numStages 14 y obtendrá 10 u 11 etapas.
2. Puedes deshacerte de esto aumentando tus datos me refiero al número de tus imágenes positivas e imágenes negativas. "Trate de mantener positivos más que negativos"
3. Leí este en algún lado, así que no sé si funcionará o no. Puede hacer esto incrementando -minHitRate 0.995 y -maxFalseAlarmRate 0.5, estos dos parámetros tienen su valor predeterminado y puede deshacerse de su problema al aumentarlos a 0.998 y 0.7 y seguir haciendo esto.
Pero como dije, esto no es un error.
¿Cuál es el posible motivo de "Required leaf false alarm rate achieved. Branch training terminated."
El siguiente comando para entrenamiento:
para crear muestras
-img imgs / CHE_one_wb.jpg -num 300 -bg imgs / negat.dat -vec imgs / vector.vec -info imgs / smpl / info.txt -maxxangle 0.1 -maxyangle 0 -maxzangle 0.1 -maxidev 100 -bgcolor 255 -bgthresh 0 -w 20 -h 35
-img imgs / CHE_one_wb.jpg -num 300 -bg imgs / negat.dat -info imgs / smpl / info.txt -maxxangle 0.1 -maxyangle 0.1 -maxzangle 0.1 -maxidev 100 -bgcolor 255 -bgthresh 0 -w 20 -h 35
para el tren
-data imgs / cascade / -vec imgs / vector.vec -bg imgs / negat.dat -numPos 200 -numNeg 40 -numStages 10 -featureType LBP -maxFalseAlarmRate 0.9 -w 20 -h 35
RESULTADO DE LA FORMACIÓN
El número de negativos es muy pequeño en comparación con el número de positivos y el número de etapas.
Estableces maxFalseAlarmRate = 0.9.
Esto significa que en cada etapa no más del 90% de las 40 muestras negativas (es decir, 36 muestras) deberían estar dentro del límite de los positivos. Cuando el algoritmo logra colocar fuera de ese límite al menos 4 muestras, puede pasar a la siguiente etapa.
Esto funcionó por unas pocas etapas, hasta que sucedió (por mera casualidad) que menos de 36 muestras ya están dentro del límite positivo desde el comienzo (recuerde que la extracción de muestras negativas es un proceso aleatorio). Entonces, cuando el algoritmo debe operar la separación, ya tiene su trabajo hecho y no sabe cómo proceder.
He logrado mi objetivo y he entrenado una buena cascada.
- Primero necesita un par de muestras originales (no use una y multiplíquela con crear muestras). He usado 10 fotos diferentes de botellas de cerveza, para cada una he creado 200 muestras, luego he combinado todas las muestras en un archivo vectorial con 2000 muestras.
- -w 20 -h 35 debe coincidir con la relación de aspecto de su imagen original
- La relación de muestras positivas a negativas debe ser de alrededor de 2: 1 (debe haber más muestras positivas)
- Número de etapas que debe elegir usted mismo (para mí es 12-13). Cuantas más etapas establezca, más precisa será su cascada, pero también puede sobreentrenar su cascada y no encontrará nada. La precisión de su cascada se muestra mediante la aceptación de
0.000412662
en la última etapa, debe estar alrededor de este valor0.000412662
o menos.
Pero si obtiene una aceptación como esta 7.83885e-07
su cascada probablemente está sobreentrenada y no encontrará nada, trate de establecer menos etapas.
!!! Y una cosa más importante, cuando entrenes tu cascada deberías tener más de una característica en tu escenario comenzando desde 2 o 3 etapas. Si solo tiene una característica, no obtendrá una buena cascada. Deberías trabajar en tus imágenes de entrenamiento (muestras negativas y positivas). El entrenamiento normal se verá así:
Para entrenamiento he usado -data imgs/cascade/ -vec imgs/vector.vec -bg imgs/negat.dat -numPos 1900 -numNeg 900 -numStages 12 -featureType HAAR -minHitRate 0.999 -maxFalseAlarmRate 0.5 -w 24 -h 30
comando
Ambos tipos de funciones funcionan casi iguales, a veces el HAAR es un poco mejor pero es significativamente más lento que el LBP.
Si tiene una cantidad pequeña de datos, necesita menos etapas para alcanzar la tasa de falsas alarmas que configure. Esto significa que el clasificador en cascada es "lo suficientemente bueno" para que no tenga que crecer más. La relación total de falsos positivos se multiplica por la razón de cada etapa, por lo que después de un punto, se alcanza el valor.
En tus opciones, lo configuraste en 0.9. Considere hacerlo más alto, como 0,95 o más.
Además de eso, sus conjuntos de datos son pequeños, por lo que es más fácil para el algoritmo obtener buenos resultados al validarlos durante el entrenamiento. Cuanto menor sea el conjunto de datos, más fácil será entrenar al clasificador, por lo que se requieren menos etapas. Pero esto no significa que sea mejor cuando se ejecuta con datos reales. Además, si mantienes el tamaño de la capacitación bajo y estableces una relación más alta, considera que el clasificador necesitará más etapas para terminar y será más complicado, pero es muy posible que haya una capacitación excesiva en el conjunto de entrenamiento.
Para concluir, si la naturaleza de sus positivos y negativos que tiene los hace fáciles de separar, entonces no necesita tantas muestras. Por supuesto, eso depende de lo que estés entrenando para el algoritmo. Con su cantidad de muestras, las 10 etapas que pone son muchas, por lo que el algoritmo termina antes (no es necesariamente malo).
Cuando estaba entrenando caras, creo que tenía alrededor de 1 mil puntos positivos (incluidas todas las rotaciones / desviaciones) y 2-3 miles de negativos, para necesitar un clasificador de alrededor de 11-13 niveles, si no recuerdo mal.
El tutorial de Naotoshi Neo me había ayudado mucho.
Además, lo que noté ahora, como mencionó Safir, es que tienes muy pocas muestras negativas en comparación con las positivas. El número debe ser al menos igual, preferiblemente alrededor de 1.5 - 2 veces más que los positivos.