miércoles, 2 de mayo de 2012

Práctica No. 3: Detección Facial


Práctica No.3

Introducción
El tema que elegimos para esta práctica es el de Detección de Rostros por medio de un programa escrito en python y de una especie de librería que se realiza o se obtiene por medio de un entrenamiento (adquisición y procesamiento de imágenes) para poder reconocer los patrones de las imágenes deseadas.
Todo esto apoyándonos de medios externos como librerías y otras herramientas para facilitar y sobre todo acelerar el proceso, ya que es muy largo.
La librería encargada del procesamiento de las imágenes para el entrenamiento es la llamada OpenCV (Open Source Computer Vision) y algunas herramientas que nos permitieron avanzar más rápido en la recopilación y la organización de las imágenes son: objectmarker, haarconv y algunos archivos .bat que aceleraron la creación de los catálogos de las imágenes a procesar.
Objetivo
El objetivo principal durante el desarrollo de esta práctica fue el de crear un programa que fuera capaz de detectar rostros en imágenes mediante la obtención de éstas con una cámara web, también se puede llamar: detección de rostros en tiempo real, esto con la finalidad de profundizar un poco más en el tema y apoyar de alguna manera el avance de nuestro proyecto en clase.
Objetivo que logramos, aunque no con un 100% en cuanto a la calidad de la detección debido al tiempo que requiere el procesamiento de imágenes.

Justificación
El motivo de nuestra elección se basa en que este tema o práctica es un fragmento en cuanto a la realización de nuestro proyecto en la clase, por lo que nos permitiría acortar la curva de aprendizaje en cuanto a lo requerido en la clase, avanzado un poco más rápido y  además de que con esto nos podemos centrar en un sola actividad e invertir todo nuestro tiempo a un solo tema y no todo lo contrario, ya que tendríamos que dividir nuestro tiempo en la realización de más actividades.

Desarrollo
En cuanto al desarrollo, los principales pasos y los más laboriosos fueron:

1.- La adquisición de los paquetes, software y herramientas necesarias, ya que hay que realizar pruebas (como habíamos comentado en la parte del avance) y verificar la compatibilidad de todos estos paquetes ya que de lo contrario no podríamos haber continuado.
2.- La parte más laboriosa y más importante del proceso fue la de la recopilación y la organización de las imágenes, creación de los catálogos para el proceso de entrenamiento o haartraining como también es conocido debido la aplicación de la librería OpenCV que se utiliza (haartraining.exe). 

Para el proceso de entrenamiento es necesaria la recopilación de fotografías o imágenes, clasificadas en positivas (las imágenes donde no aparece el objeto a reconocer) y positivas (donde si aparece el objeto a reconocer), además de la creación de catálogos, que no son más que archivos .txt con una lista de las direcciones de las imágenes y en el caso de las positivas además de las direcciones hay que agregar las coordenadas de donde comienza el espacio ocupado por el objeto reconocer y también las distancias de largo y ancho del espacio ocupado por el objeto, esto con la finalidad de indicar la posición del objeto dentro de la imagen.
En nuestro caso para realizar el entrenamiento y para que nuestro entrenamiento fuera de una calidad aceptable (excelente sería con el uso a partir de 1500 positivas y 5000 negativas), recopilamos y utilizamos la cantidad de 200 imágenes positivas (que en su totalidad son fotografías de un compañero donde aparece su rostro en diferentes condiciones de iluminación) y 1100 imágenes negativas (que obviamente son imágenes donde no aparece ningún tipo de rostro humano), todas con un tamaño de 320x240 pixeles para tratar de ayudar a localizar más fácilmente el objeto a reconocer y por lo tanto reducir el tiempo de entrenamiento.
Para la creación del catálogo de las positivas no valimos de una herramienta llamada objectmarker y para el catálogo de las negativas de un archivo .bat solo añadía la direccion de las imágenes a un .txt.

Proceso de creación del catálogo positivo utilizando objectmarker
Después hay que crear una muestra de las imágenes positivas, esto haciendo uso de una herramienta incluida en el paquete de OpenCV llamada createsamples.exe que arrojara un archivo .vec (que se utiliza en el siguiente punto) se utiliza dándole opciones que vienen listadas en la documentación de OpenCV, como la cantidad de la muestra y el directorio de salida de la aplicación.

Ya con la muestra y los catálogos listos, procedimos al proceso que involucra la mayor cantidad de tiempo en esta práctica, el entrenamiento que se realiza con la herramienta haartraining.exe y que arrojaría el archivo .xml necesario para la detección de rostros; también se ejecuta con opciones (listadas en la documentación), una opción al haartraining que se llama stages, que es la cantidad de escenarios en los que se evaluará el procesamiento de las imágenes
.
Durante este paso tuvimos que tomar una gran decisión (que podría poner en riesgo la entrega a tiempo de nuestra práctica), el de detener o no el proceso de entrenamiento, ya que debido a la cantidad de imágenes a procesar el tiempo que tardaría era considerablemente alto (que verdaderamente pensamos que tardaría algo de tiempo pero no en esa magnitud) y necesitábamos que terminara para poder continuar, ya que al iniciar el proceso de entrenamiento se le da la opción stages (en nuestro caso 30 para garantizar buena calidad); en nuestro caso el entrenamiento se encontraba en el stage 18 de 30 y la cantidad de tiempo invertido era alrededor de 2 días y horas, entonces la incógnita era si podíamos detener o no el proceso y podríamos utilizar los datos obtenidos durante ese tiempo.

Nos decidimos a detener el entrenamiento y encontramos una herramienta llamada haarconvert.exe que fue creada precisamente con ese objetivo, el de la creación de archivos .xml en base a entrenamiento interrumpidos.
Con esta utilidad construimos nuestro .xml y procedimos a la creación de nuestro código para la realización de las pruebas de nuestra librería creada mediante el entrenamiento trunco.

3.- Después de la recopilación de información, lectura y compresión de algunos ejemplos (la mayoría de ellos con un grado muy alto de complejidad), comenzamos las pruebas para la construcción de nuestro código que ejecutaría nuestra librería (obtenida con el entrenamiento), que en un principio solo ejecutaba le visualización de imágenes en tiempo real (mostrado durante el avance) y que posteriormente modificamos y logramos que se ejecutara y tomara de referencia nuestra librería de entrenamiento. Para verificar que funcionara correctamente o que al menos hiciera lo que nosotros queríamos y para descartar un fallo en nuestro entrenamiento, hicimos uso de un archivo .xml incluido en los paquetes de OpenCV que contenía un entrenamiento de reconocimiento de rostros y que por su puesto funcionaba correctamente.

Código
Los fragmentos mas importantes de nuestro código son: en el que se detectan las caras y en el que se muestras detección de las caras.


 
 
Resultados
Los resultados se pueden visualizar mejor en el video, pero a manera de referencia para verificar la calidad de nuestro programa como ya habíamos comentado, utilizamos un .xml incluido en el paquete de OpenCV y realizamos algunas comparaciones:

En cuanto a calidad de la detección de los rostros:
Obviamente nuestro entrenamiento fue superado pero tomando en cuenta la cantidad de imágenes, el tiempo invertido y el truncamiento del proceso e entrenamiento, el resultado de nuestro programa en cuanto a la detección de rostros supero ampliamente nuestras expectativas.
Para la detección en el nuestro hay que estar un poco más estático, sobre todo cuando se encuentra mas de una cara frente a la cámara, mientras que el otro no necesita de mucha ausencia de movimiento para realizar estas acciones.
Otro factor del que dependen mucho la detección de los rostros, es el de las condiciones de iluminación, bajo las cuales se realice el proceso.

En cuanto a la lentitud del programa durante la ejecución:
Nuestro programa corre un poco más fluido, tal vez debido a la mayor carga por parte del otro entrenamiento en cuanto a imágenes y el procesamiento de estas.


Video
En el primer video se ejecuta el programa haciendo el uso del archivo.xml que obtuvimos a partir del proceso de entrenamiento que llevamos a cabo y en el segundo se ejecuta el programa pero con el .xml incluido en la libreria OpenCV.

Al comparar las dos ejecuciones se llegaron a los resultados ya mencionadas arriba.





Conclusiones
El aprendizaje durante esta práctica ha sido muy extenso y de mucha utilidad, ya que los conocimiento que adquirimos pueden ser aplicados directamente en el proyecto que estamos llevando a cabo en clase y así nos facilitará el desarrollo de éste.
Algunas experiencias y que a la vez pueden ser aplicadas como recomendaciones, son las obtenidas específicamente en el proceso de entrenamiento que básicamente es la administración de los debidos tiempos para cada cosa, ya que como ya lo habíamos mencionado, este proceso requiere de una gran cantidad de tiempo y va a depender directamente de la cantidad de imágenes a procesar y esto está ligado directamente a la calidad del entrenamiento.

Pocas Imágenes = Entrenamiento Veloz = Entrenamiento de Baja Calidad
Muchas Imágenes = Entrenamiento Lento = Entrenamiento de Alta Calidad

Entonces la mejor recomendación que podemos dar, es que hagan una relación debido a los tres puntos anteriores y en base a eso establezcan la cantidad de imágenes que procesaran.

Otra recomendación, muy importante, es que al trabajar con la librería OpenCV y el entrenamiento, este proceso no esta del todo optimizado para realizarse rápidamente, es decir, que el entrenamiento no variará mucho dependiendo de la computadora que se use, es decir, no aprovecha al máximo los recursos de la computadora que se use, por lo que la recomendación cae en una pequeña investigación que realizó un compañero sobre como mejorar este proceso para que fuera más rápido, por lo que nos encontramos con una tecnología un poca más nueva por parte de la compañía Intel, llama Intel TBB (Threading Building Blocks)  que básicamente implementa una aplicación que realiza las mismas tareas que el haartraining incluido en OpenCV, pero con la diferencia de que esta aplicación si se encuentra optimizada para aprovechar mejor los recursos de la computadora en la que se realice el entrenamiento; con esto se puede aprovechar al máximo la capacidad de los procesadores de ultima generación, haciendo uso de todos sus núcleos para el entrenamiento cosa que las aplicaciones estándar de OpenCV no pueden hacer, lo mismo ocurre con las cantidades de memoria RAM disponibles.
Como es de esperarse esta herramienta no viene incluida junto con OpenCV, por lo que hay que descargar aparte y realizar una serie de pasos para poder instalarla y utilizarla.


Referencias Bibliográficas
http://opencv.willowgarage.com/documentation/python/index.html
http://www.slideshare.net/edgar007/opencv-entrenamiento12
http://threadingbuildingblocks.org/
http://www.shervinemami.co.cc/faceRecognition.html
http://wikipedia.org

1 comentario:

  1. Muy bien, chicos. Como quiera, los comentarios ya los hicimos en el laboratorio.

    ResponderEliminar