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
http://www.slideshare.net/edgar007/opencv-entrenamiento12
http://threadingbuildingblocks.org/
http://www.shervinemami.co.cc/faceRecognition.html
http://wikipedia.org
Muy bien, chicos. Como quiera, los comentarios ya los hicimos en el laboratorio.
ResponderEliminar