Entrenar opencv
Como veo que Tonny esta interesado en opencv.. les traigo ahora los pasos para entrenar la red neuronal para el reconocimiento de patrones, ahora ya podemos entrenarlo para que reconozca lo que queramos
Cuando se instala la librería Opencv se puede jugar con algunos ejemplos básicos para detectar rostro, boca, ojos, nariz. Para ello se utiliza unos archivos *.xml de muestra que trae OpenCV.
¿Pero que hay de generar nuestros propios archivos para reconocimientos de objetos?
Proceso
El proceso completo lleva una serie de 4 pasos
1 Adquisición de imagenes
2 Crear muestra
3 Entrenamiento
4 Pruebas
Lo primero que debemos hacer es generar una estructura de directorio para poder trabajar:
training
data
cascade
negativas
positivas
1.Adquisición de imágenes:
negativas: las denominadas imágenes negativas son cualquier grupo de imágenes en las cuales no aparece el objeto sobre el cual queremos generar el entrenamiento.
Para estas imágenes también hay que generar un archivo (negativas.txt) que sirve de indice para las etapas posteriores, con la siguiente estructura:
negativas/img1.jpg
negativas/img2.jpg
negativas/img3.jpg
negativas/imgn.jpg
positivas: estas imágenes son las que contienen el objeto que estamos intentando detectar. La idea es generar un muestreo del objeto en distintos ángulos, iluminación, etc.
Para estas imágenes también debe generarse un archivo indice, pero que contienen algo mas de información:
positivas/img1.bmp 1 100 100 25 25
positivas/img1.bmp 1 120 110 27 28
positivas/img1.bmp 1 130 900 30 31
positivas/img1.bmp 1 140 105 22 23
En este archivo se especifica donde se encuentra el objeto dentro de la imagen positiva. Siendo la primera el numero de objetos dentro de la imagen, las 2 siguientes son las coordenadas x e y (respectivamente) y las siguientes 2 ancho y largo.
Para generar este archivo se cuenta con una herramienta que trae OpenCV llamada objectmarker.
Para un buen entrenamiento se necesitaran aproximadamente 5000 imágenes negativas y 1500 positivas, claro que para realizar las pruebas con unas 200 positivas y unas 1000 negativas bastará
2.Crear muestra:
En esta etapa nos valdremos de una herramienta llamada createsamples.
En este caso desde la linea de comando de GNU/Linux debemos ejecutar:
opencv-createsamples -info positivas.txt -vec data/muestra.vec -num 1500 -w 20 -h 20
-info: es la ubicación del archivo con el indice las imágenes positivas.
-vec: es el nombre del archivo de salida con la muestra generada.
-num: cantidad de imágenes positivas.
-w: ancho de la muestra de salida.
-h: alto de la muestra de salida.
Se puede verificar el archivo con el siguiente comando:
opencv-createsamples -vec positivas.vec -w 20 -h 20
3.Entrenamiento:
Para esta etapa nos valdremos de otra herramienta llamada haartraining, el archivo indice generado con las imágenes negativas y el archivo de muestras generado en la etapa anterior.
Nuevamente desde la linea de comandos:
opencv-haartraining -data data/cascade -vec data/muestra.vec
-bg negativas.txt -nstages 30 -nsplit 2 -minhitrate 0.999
-maxfalsealarm 0.5 -npos 1500 -nneg 5000 -w 20 -h 20 -mem 1300
-mode ALL
-data: directorio de salida para la generación del entrenamiento.
-vec: archivo con muestras generado en la etapa anterior.
-bg: archivo indice con las imágenes negativas.
-nstages: número de etapas de entrenamiento. Es directamente proporcional a la calidad del clasificador a generar.
-nsplit: debilidad del clasificador.
-minhitrate: mínimo rango de cada etapa.
-maxfalsealarm: determina el rango máximo de falsas alarmas admitidas para cada etapa.
-npos: numero de imágenes positivas indexadas.
-nneg: numero de imágenes negativas indexadas.
-w: ancho.
-h: alto.
-mem: memoria a utilizar en el proceso.
4.Pruebas:
como vemos en la imagen capturada lo he entrenado para que detecte las placas de los vehículos y lo saco en una ventana nueva
- blog de palichis
- Inicie sesión o regístrese para comentar

Comentarios
Wow impresionante palichis
Wow impresionante palichis los tutoriales están excelentes sera mejor moverlos al libro de coplec
que cheveres cosas que se pueden hacer con sw libre
así q tenga tiempo sigo jugando con estas librerias, es chevere cuando mas personas ponen mas contenido en el sitio.
Saludos.
Tienes el código en python ?
Tienes el código en python ?
Qué código??
Qué código??
Opps me equivoque, me
Opps me equivoque, me refería a si tu realizaste el entrenamiento y tienes los archivos xml ya que ahí se ve que encontró la placa

ah, sipe ahí te va, tambien
ah, sipe ahí te va, tambien envío un entrenamiento de reconocimiento de llantas, claro que no esta bien entrenado ya que no tenía las placas suficientes como pa entrenarlo bien, entrenamiento con aprox 200 placas.. mínimo requerido 3000
Excelente post
Esta excelente este post gracias palichis por favor tu debes tener ya listo el xml sera que me podrias ayudar con eso por favor... Y bueno de paso como veo que andas empapado del tema consultarte algunas cosas... Gracias, saludos
Justo lo que buscaba
Hola.
Estoy haciendo un reconocedor de señales de tráfico. ¿ Cuántas imágenes positivas y negativas crees que necesitaría por lo menos ? ¿ COnoces alguna base de datos o algun fichero xml que las contengan ya? Un saludo y muchas gracias.
Saludos slawer, no entiendo
Saludos slawer, no entiendo muy bien lo que necesitas.. si puedes describir un poco mejor tu proyecto, para poder ayudarte....
ahora si hablas de señales
ahora si hablas de señales quiere decir que son varias, recuerda que el entrenamiento es para reconocer ciertos patrones, si bien las placas no son todas iguales, tienen características similares, tienen 3 letras son de la misma tipografía, se le entrena para reconocimiento de 3 o cuatro números etc.
Si entiendo bien tu quieres ver las señales de transito, como "pare" "no estacionar" "ceda el paso" etc. nota que tienen primero distinta forma, segundo el contenido al se amplio entonces los patrones no te van a coincidir. Para esto debes tener un entrenamiento por separado de las N señales de transito.
Otra opción es usar un reconocimiento o una comparación con imágenes... algo como... http://coplec.org/?q=2010/08/06/buscar-un-objeto-dentro-de-una-escena, pero en este caso también deberías hacer N comparaciones, según las señales.
Cualquier novedad nos escribes
saludos
Hablo de señales :)
Hola y gracias por contestar tan rápido.
Realmente no quiero comparar con N imágenes, supongo que eso hará que el vaya todo demasiado lento. Me interesa algo como lo de las matriculas, darle ejemplos y que el programa se las arregle solo. ¿Debería separar, por ejemplo, las señales triangulares de las redondas en dos tipos (2 xml)?¿No haría, también, que todo fuese muy lento? Mi intención era realizar un único xml.
un saludo y gracias.
Hola
Pues la verdad si tendrías que realizar algunos xml para que te reconozca por separado las señales, ya que como decía son diferentes, cada una tiene particularidades distintas comenzando desde la forma, una solución para que el reconocimiento sea rápido es escalar la imagen obtenida a la mitas o menos..
O tal vez realizar un entrenamiento de toda la señal, es decir desde el poste al raz del suelo hasta la parte superior, pero ahí tendrás varios falsos positivos de letreros que no sean señales de transito.. es una posible solución.. se tendría que probar para ver la factibilidad de implementación de este tipo entrenamiento....
Cualquier duda o si pones en practica el entrenamiento de esta ultima idea nos comentas
saludos
Hola
Y una vez más gracias por contestar.
He probado lo que me sugeriste anteriormente y funciona, el problema que tengo ahora es que solo puedo usar un fichero xml cada vez, por ejemplo, tengo un xml de señales triangulares y otro de señales redondas. Mi pregunta es la siguiente: ¿Puedo usarlos a la vez, es decir, puedo sobre el mismo video capturar a la vez las señales triangulares y las redondas?¿o opencv me restringe a solo un xml?
Espero haberme explicado bien.
Un saludo y Gracias.
A ver,.. lo que se tendría
A ver,.. lo que se tendría que hacer en este caso hacer comparaciones, si frame capturado y primer xml tienen reconocimiento entonces sigue la secuencia, caso contrario mandas al otro reconocimiento
redondas = cv.HaarDetectObjects(small_img, cascadered, cv.CreateMemStorage(0),haar_scale, min_neighbors, haar_flags, min_size)
if redonas:
print redondas
elif:
trinangulares = cv.HaarDetectObjects(small_img, cascadetri, cv.CreateMemStorage(0),haar_scale, min_neighbors, haar_flags, min_size)
if triangulares:
print triangulares
elif
exagonales = cv.HaarDetectObjects(small_img, cascade, cv.CreateMemStorage(0), haar_scale, min_neighbors, haar_flags, min_size)
if exagonales;
print exagonales
y así con todos los xml que tengas... la verdad no te permite usar mas de un xml por función
saludos
Gracias
Muchas gracias por todo.
Creo que ya tengo toda la información que necesito. Muchas gracias por todo. Y felicidades por los tutoriales, están muy bien.
Un saludo y gracias.
Pregunta
Me parece muy bueno lo que has publicado, he trabajado con reconocimientos de rostros pero no me imaginaba que se podia hacer un entrenamiento para cualquier objeto, pero me guataría que me aclares algo, las imagenes de muestra tanto positivas y negativas deben ser obtenidas en el campo donde se va aplicar el algoritmo de detención o pueden ser adquiridas en otro lugar?
Gracias.
Saludos sramirez, pues las
Saludos sramirez, pues las imágenes pueden ser de cualquier lugar, incluso de cualquier perspectiva, es decir de lado, de frente, desde arriba de abajo, etc etc, las imágenes negativas pueden ser cualquier imagen, capturas de pantalla, fotos personales, tu galería de imágenes etc, siempre y cuando no esté el objeto a reconocer en ninguna de ellas,
Gracias por la aclaración,
Gracias por la aclaración, una pregunta más, en las imagenes positivas de alguna forma es necesario especificar donde esta el objeto o algo por el estilo? Por ejemplo en la imagen de prueba que tienes en el foro fue necesario decir en que lugar estaba o sólo bastó con decirle que es una imagen positiva.
Gracias.
Aquí un documento como
Aquí un documento como entrenar opencv no recuerdo de donde lo descargue pero puede servirte.
http://www.coplec.org/files/training.odt
Pues si, el documento que te
Pues si, el documento que te da tonny es similar a mi howto, ahí tienes las coordenadas de la imagen 130 900 30 31 x y y tamaño.

Pero puedes cortar la imagen como te decía en el post anterior
y así tener 0 0 32 31.. x y y tamaño de la imagen, para evitarte estar controlando las coordenadas de la imagen
saludos
Hola.. Pues si, si la imagen
Hola..
Pues si, si la imagen contiene mas objetos debes especificar las coordenadas de la imagen.. o lo que io hago es cortar el espacio en donde se encuentra la imagen y pues las coordenadas serian 0 0 y el tamaño de la imagen 100 200 por ejemplo. siempre deja un los colores de fondo, no borres nada que le tape o que este a lado de la imagen, esto sirve para mejorar el reconocimiento
Camara IP
Buenas, recien estoy comenzando a utilizar opencv, y no encuentro la solución para poder obtener imagenes desde una camara ip, podrias ayudarme o darme un consejo al respecto?
Desde ya muchas gracias
en que lenguaje estas
en que lenguaje estas programando
aquí hay un trozo en c
Capture * capture = cvCreateFileCapture("http://172.16.0.201");//create a camera captureDudas..
Hola que tal palichis, excelente post... En este momento me encuentro desarrollando un proyecto y estoy empezando a familiarizarme con opencv pero no entiendo varias cosas.. Como se genera el xml? Cual seria el codigo a ejecutar? el mismos que se encuentra en la carpeta samples?? Muchas Gracias
A ver... los pasos que hay
A ver... los pasos que hay que seguir están al inicio... el entrenamiento te genera el xml.. los comandos son
opencv-createsamples -info positivas.txt -vec data/muestra.vec -num 1500 -w 20 -h 20
opencv-haartraining -data data/cascade -vec data/muestra.vec
claro que primero tienes que seguir los pasos anteriores....
el código a generar?
si te refieres al código para usar el xml, pues este código va a depender de lo que necesites que realice tu programa... si te sirven los que están en samples, pues puedes usarlos
Palichis, según entiendo
Palichis, según entiendo recortaste las imágenes positivas, lo hiciste en lote o como lo hiciste o con que herramientas?
saludos!!!
tonny con gimp una a una....
tonny con gimp una a una.... ufff fue un trabajo muy arduo :P
Hola Palichis!
Hola Palichis espero que todo bien... no se si recuerdas de que te escribi hace un tiempo acerca de un proyecto de reconocimiento...trate de hacerlo por el otro ejemplo de hallar el objeto en la imagen pero aunque resulta mas facil aplicarlo es mas complicado trabajar con el de una manera eficiente. Estoy intentando ahora con haar pero tengo unas dudas...
Estoy utilizando mingw para compilar... sabes los comandos que me sirvan para entrenar la red?? o como generar los xml bajo windows?
y debo hacer el reconocimiento de manera recursiva, pasandole una serie de imagenes... algun consejo de como hacer esto??
Muchas Gracias palichis
Muy buen post
Excelente ejemplo palichis... Una pregunta palichis cuantas imagenes utilizaste para este ejemplo? Cual piensas tu que seria el minimo necesario para una imagen sencilla que no cambie mucho por ejemplo una oreja o algo asi??
gracias miguel... Pues use
gracias miguel...
Pues use aprox 500 positivas y unas 1500 negativas, en el ejemplo tengo varios falsos positivos que se pueden corregir con un entrenamiento bien realizado...
Para el ejemplo que pones de la oreja pues deben tener en cuenta que la oreja no cambia mucho pero si la cantidad de cabellos que la rodea iluminación sombras etc....
puedes probar con pocas imágenes positivas pero mientras mas utilices mejores resultados obtendrás
Reconocimiento
Buenas tardes.... está muy bueno el ejemplo... Mi pregunta, es q yo estoy haciendo un reconocimiento de billetes de diferentes denominaciones, pero al tomar la foto, me reconoce no solo el billete sino además otras partes.... estoy trabajando con 500 fotos positivas...
No entiendo bien con las
No entiendo bien con las otras partes, pero supongo haces referencia a falsos positivos.
Bueno Andreaa, hay gran diferencia entre placas de auto y un billete, como te das cuente al billete tiene mayor detalle y mayor cantidad de texturas etc, entonces para un mejor resultado sería optimo que se entrene con mayor cantidad de imágenes positivas....
saludos
detectar sonrisas
porfavor de manera urgente necesito ayuda, mi tesis es acerca de detectar sonrisas hice el procesos de entrenamiento pero no m creo un .xml me creo carpetas con .txt dentro no se como ocuparlo y estoy a poko tiempo de entregarlo por favor ayudame
Hola, ana
Hola, ana
Es normal que te salga un montón de carpetas con txt, eso es parte del entrenamiento, y al final de todo el proceso las carpetas van a quedarse ahí pero también se te generará el archivo xml que es la cascada con la información de tu entrenamiento, no cortes este entrenamiento en ningún momento porque el xml aparecerá al final de todo el proceso.
Te recuerdo que el entrenamiento se demorará dependiendo del número de imágenes positivas y negativas, pero igual mientras mas positivas tengas mejor resultados obtendrás
Como entrenar una red neuronal en Opencv
Hola a todos, soy nueva y la info que hay es buena, lo que pasa es que no se como generar los archivos .txt para las imagenes positiva y negativas, para el entrenamiento de la red, es decir no se cómo guardar las imagenes, me podrian ayudar en esto, es que estoy haciendo mi trabajo de grado y necesito entrenar un red neuronal con opencv. Gracias