Cómo utilizar el programa adaboost que viene con OpenCV para entrenar y detectar objetivos
2. Error de muestra de lectura: argumento negativo o demasiado grande de la función CvAlloc. Se dice en Internet que este error se debe a que la asignación de memoria de ipimage única proporcionada por opencv no puede exceder 10000, y cada uno de mis negativos. Las muestras no superan este tamaño, el motivo específico no está claro. Posteriormente reduje el número de muestras negativas y aumenté el tamaño y se solucionó el problema.
Recientemente, quiero hacer un proyecto de reconocimiento de género en términos de detección de rostros y posicionamiento de rasgos faciales, utilicé OPENCV haartraining para el posicionamiento. Aquí aprendí durante dos días cómo usar opencv para entrenar mi propio clasificador. . Durante estos dos días de estudio, encontré muchos problemas, pero conocí a varios héroes de buen corazón que me ayudaron a resolver muchos problemas, especialmente a Wuji. Aquí me gustaría agradecerle nuevamente por su ayuda.
1. Introducción
El método de detección de objetos fue propuesto originalmente por Paul Viola [Viola01], y Rainer Lienhart [Lienhart02] mejoró el método. Los pasos básicos de este método son los siguientes: Primero, use la función Hash de muestras (alrededor de varios cientos de imágenes de muestra) para entrenar un clasificador para obtener un clasificador potenciador en cascada.
El término "cascada" en clasificadores significa que el clasificador final está compuesto por una cascada de múltiples clasificadores simples. En la detección de imágenes, la ventana detectada pasa por cada nivel del clasificador por turno, por lo que la mayoría de las áreas candidatas se eliminan en las capas de detección anteriores y todas las áreas detectadas por cada nivel del clasificador son áreas objetivo.
Una vez entrenado el clasificador, se puede aplicar para detectar regiones de interés en la imagen de entrada. La salida del clasificador es 1 si se detecta el área objetivo y 0 en caso contrario. Para detectar la imagen completa, se puede mover una ventana de búsqueda alrededor de la imagen para detectar posibles objetivos. Para buscar objetos objetivo de diferentes tamaños, el clasificador está diseñado para cambiar el tamaño, lo cual es más efectivo que cambiar el tamaño de la imagen a detectar. Por lo tanto, para detectar objetos de destino de tamaño desconocido en la imagen, el programa de escaneo generalmente necesita escanear la imagen varias veces usando ventanas de búsqueda de diferentes proporciones.
Actualmente existen cuatro técnicas de mejora que soportan este clasificador:
"Impulso" significa que cada capa del clasificador en cascada se puede modificar a partir de un algoritmo de impulso (votación ponderada) seleccionado y obtenido mediante el autoentrenamiento del clasificador básico.
Según el análisis anterior, la detección de objetivos se divide en tres pasos:
1. Crear muestras
2 Entrenar el clasificador.
3. Utilice el clasificador capacitado para la detección de objetivos.
2. Crear muestras
Las muestras de entrenamiento se dividen en muestras positivas y muestras negativas. Las muestras positivas son las muestras objetivo a detectar y las muestras negativas se refieren a cualquier otra imagen.
Muestras negativas
Las muestras negativas pueden provenir de cualquier imagen, pero estas imágenes no pueden contener características de destino. Las muestras negativas se describen mediante archivos de descripción de fondo. El perfil de fondo es un archivo de texto en el que cada línea contiene el nombre de archivo de la imagen negativa (según la ruta relativa al perfil). El proceso de creación del archivo es el siguiente:
El archivo de descripción de muestra se genera usando el comando Dos.
El método específico es ingresar al directorio de imágenes en Dos. Por ejemplo, mis imágenes se colocan en D:\face\posdata y luego:
Presione Ctrl+R para abrir el programa en ejecución de Windows, ingrese cmd. para abrir la ventana de comando de DOS e ingrese d: Enter, luego ingrese cd D:\face\negdata Ingrese la ruta de la imagen, ingrese dir /b > negdata.dat nuevamente, se generará un archivo negdata.dat en la ruta de la imagen, Abra el archivo y elimine la última parte de negdata.dat Una línea, para que se genere el archivo de descripción de muestra negativa. Los resultados de la ventana de comando DOS son los siguientes:
Muestras positivas
Para muestras positivas, la práctica común es cortar todas las muestras positivas y cortarlas al tamaño adecuado. Para las muestras positivas, el enfoque habitual es recortar y cambiar el tamaño (es decir, escalar a un tamaño específico) todas las muestras positivas, como se muestra en la siguiente figura:
Dado que las muestras positivas ingresadas a HaarTraining son archivos vec, usted necesita usar el programa CreateSamples que viene con OpenCV (en el opencv\bin que siguió, si no, debe compilarlo). El programa CreateSamples que viene con OpenCV (en el opencv\bin que le interesa; de lo contrario, debe compilar el archivo .dsw en opencv\apps\HaarTraining\make y prestar atención a compilar la versión de lanzamiento) puede convertir el preparó muestras positivas en un archivo vec. Los pasos de conversión son los siguientes:
1) Cree un archivo de descripción de muestra positiva, que describa el nombre del archivo de muestra positiva (incluida la ruta absoluta o la ruta relativa), el número de muestras positivas y la posición y el tamaño de cada muestra positiva en la imagen. Un archivo de descripción de muestra positiva típico es el siguiente:
posdata/1(10).bmp 1 1 1 23 23
posdata/1(11).bmp 1 1 1 23 23
p>posdata/1(12).bmp 1 1 1 23 23
Pero puede colocar el archivo de descripción en la ruta posdata (es decir, la ruta de muestra positiva), por lo que no es necesario agregar la ruta relativa anterior. El mismo método también se puede utilizar para generar el archivo de descripción de muestra negativa. Finalmente, use la herramienta de reemplazo de texto para reemplazar todos los "bmp" con "bmp 1 1 1 1 23 23
". muchas imágenes de muestra. Si tiene muchas imágenes de muestra, reemplazarlas con txt hará que el programa deje de responder. Puede copiar el contenido de la palabra reemplazada y luego volver a copiarlo. Los cinco números después de bmp representan el número de imágenes, la posición inicial del objetivo y su ancho y alto. Esto genera el archivo de descripción de muestra positiva posdata.dat.
2) Ejecute el programa CreateSamples. Si se ejecuta directamente en el entorno VC, puede configurar los parámetros de ejecución en el campo de parámetros del programa de la página de propiedades Proyecto\Configuración\Depuración. Los siguientes son ejemplos de parámetros de ejecución:
-info D:\face\posdata\posdata.dat -vec D:\face\pos.vec -num 50 -w 20 -h 20
significa que hay 50 muestras, el ancho de la muestra es 20, la altura es 20 y el archivo de descripción de la muestra positiva es posdata.dat.
O escriba en DOS:
"D:\Program Files\OpenCV\bin\createsamples.exe" -info "posdata\posdata.dat" -vec data\pos. -num 50 -w 20 -h 20
Después de ejecutar, se generará un archivo *.vec en d:\face\data. Este archivo contiene el número de muestras positivas, el ancho y el alto, y todos los datos de la imagen de muestra.
Los resultados son los siguientes:
Parámetros de línea de comando del programa Createsamples:
Parámetros de línea de comando:
-vec
Aprobado El nombre del archivo de salida de las muestras positivas entrenadas.
-img
Imagen de destino de origen (por ejemplo, icono de la empresa)
-bg
Descripción del archivo de fondo.
-num
El número de muestras positivas que se generarán es el mismo que el número de imágenes de muestra positivas.
-bgcolor
Color de fondo (suponiendo que la imagen actual esté en escala de grises). El color de fondo constituye el color transparente. Para imágenes comprimidas, la cantidad de diferencia de color se especifica mediante el parámetro bgthresh. Entonces, los píxeles ubicados en el medio entre bgcolor - bgthresh y bgcolor + bgthresh se consideran transparentes.
-bgthresh
-inv
Si se especifica, los colores se invertirán
-randinv
< / p>Si se especifica, los colores se invertirán arbitrariamente
-maxidev
La desviación máxima del color de fondo.
-maxangel
-maxangle
-maxzangle
Ángulo de rotación máximo en radianes como unidades).
-show
Si se especifica, se mostrará cada muestra. Al presionar la tecla "esc", se desactivará este interruptor, es decir, la imagen de muestra no se mostrará y la creación. El proceso continuará. Esta es una opción de depuración útil.
-w
Muestra el ancho de la muestra en píxeles
-h "sample_height"
Muestra el ancho en píxeles La altura de la muestra de salida.
En este punto, se ha completado el primer paso de la capacitación de muestra. Felicitaciones, has aprendido a entrenar un clasificador el 50% del tiempo, me tomó un día aprender esto yo mismo, así que supongo que lo aprendiste en unos minutos.
3. Entrenar al clasificador
Después de crear la muestra, el siguiente paso es entrenar al clasificador. Este proceso lo implementa el programa haartraining. El código fuente de este programa se proporciona con OpenCV y el archivo ejecutable se encuentra en el directorio bin del directorio de instalación de OpenCV.
Los parámetros de la línea de comando de Haartraining son los siguientes:
-data
El nombre de la ruta para almacenar el clasificador de entrenamiento.
-vec
Nombre de archivo de muestra positivo (creado por el programa de muestras de capacitación u otros métodos)
-bg
Archivo de descripción de fondo.
-npos
-nneg
Para cada muestra positiva/negativa utilizada para entrenar cada etapa del clasificador.
Los valores razonables son: nPos = 7000;nNeg = 3000
-nstages
El número de etapas a entrenar.
-nsplits
Determina el clasificador débil utilizado por el clasificador de etapa. Si es 1, se utiliza un clasificador de tocones simple. Si son 2 o más, se utiliza el clasificador CART con el nodo interno number_of_splits.
-mem
Memoria disponible precalculada (unidad: MB). Cuanto mayor sea la memoria, mayor será la velocidad de entrenamiento.
-sym (predeterminado)
-nonsym
Especifica si el objeto objetivo de entrenamiento es verticalmente simétrico. La simetría vertical aumenta la velocidad de entrenamiento objetivo. Por ejemplo, la sección frontal es verticalmente simétrica.
-minhitrate "min_hit_rate"
La tasa de aciertos mínima requerida para cada etapa del clasificador. La tasa de aciertos total es min_hit_rate elevada a la potencia de number_of_stages.
-maxfalsealarm
La tasa máxima de falsos positivos del clasificador sin etapas. La tasa total de falsas alarmas es max_false_alarm_rate elevada a la potencia de la serie.
-weighttrimming
Especifica si se utiliza el recorte de peso y en qué medida. La opción básica es 0.9
-eqw
-mode
Seleccione el tipo de conjunto de funciones de pelo que se utilizará. para entrenamiento, el básico usa solo características verticales, todos usan características verticales y con ángulo de rotación de 45 grados.
-w "sample_width"
-h "sample_height"
El tamaño de la muestra de entrenamiento en píxeles. Debe tener el mismo tamaño que la muestra de entrenamiento creada.
Ejemplo de clasificador de entrenamiento:
"D:\Program Files\OpenCV\bin\haartraining.exe" -data data\cascade -vec data\pos.vec -bg negdata\ negdata.dat -npos 49 -nneg 49 -mem 200 -mode ALL -w 20 -h 20
Una vez completado el entrenamiento, se generarán algunos subdirectorios en el directorio de datos, y estos subdirectorios son los entrenados. clasificador.
Los resultados del entrenamiento son los siguientes:
Felicitaciones, ha aprendido el 90% de la capacidad para entrenar al clasificador.
Cuatro: utilice el clasificador entrenado para la detección de objetivos.
Este paso requiere el uso de performance.exe, cuyo código fuente se proporciona con OpenCV, y el archivo ejecutable se encuentra en el directorio bin del directorio de instalación de OpenCV.
rendimiento.exe -data data/cascade -info posdata/test.dat -w 20 -h 20 -rs 30
Los parámetros de rendimiento de la línea de comando son los siguientes: p>
Uso: ./rendimiento
-data
-info
[-maxSizeDiff [-maxPosDiff [-sf [-ni] [-nos [-rs [-w [-h < .sample_height = 24>] O puede usar la función cvHaarDetectObjects de opencv para detectar: CvSeq* faces = cvHaarDetectObjects( img, cascada, almacenamiento,1.1, 2, CV_HAAR_DO_CANNY_PRUNING,cvSize( 40, 40 ) ); //3. Detectar caras .