Se pretende escribir una librería capaz de detectar rostros de gatos (ningún motivo en especial), utilizando técnicas de filtrados y mapeos de zonas de interés, eso quiere decir que se pretende mapear características especiales que nos indican que se trata de un rostro.
Justificación
En la actualidad existen tecnologías capaces de detectar rostros y clasificarlos, la mayoría son productos que vienen con esas características. Lo que se busca con este proyecto es proporcionar una librería dedicada a esto.
Sus aplicaciones son variadas, de las más interesantes está la de utilizar tecnologías de reconocimiento facial para buscar personas extraviadas. Otra posible aplicación interesante sería la de buscar delincuentes, pues es lo mismo que la anterior pero enfocada a otro tema.
Ya que el tema es utilizarla en gatos (u otros animales), una aplicación interesante sería el de puertas automáticas que detectan un gato y se abren o cierran.
También una idea sería utilizar un sistema como ese para rellenar los platos de las mascotas dependiendo del rostro del animal, si hay larga o corta exposición en la cámara, el sistema decidiría que hacer.
Diseño del software
El programa trabaja de forma sencilla, pues lo único que debe hacer es buscar zonas de interes en una imagen. El procedimiento es el siguiente:
- Entrada de datos: Una imagen con algún gato de entrada para iniciar con el proceso, se inicia con un filtro mediano para eliminar ruido.
- Filtrado: Desde que se obtiene una versión de la imagen con filtro mediano, se empieza a obtener los datos necesarios. Se continua con el proceso de normalización para obtener un mapa de puntos.
- Mapeo: Una vez que se tiene el mapa de puntos, se puede notar que en la imagen se encuentran resaltadas algunas zonas de interés (ojos, nariz, orejas, etc.). Se adelgazan los puntos para separar las zonas de interés del ruido.
- Detección: Con las zonas de interés mapeadas, sabemos lo que buscamos en las imágenes y de esta manera podremos detectar lo que estemos buscando, en este caso un rostro.
Primero se introduce una imagen:
Después se inicia el proceso de filtrado:
Una vez aplicado el filtro mediano, se procede a normalizar, lo que ocurriría en una imagen normal es que daría una imagen con bordes destacados, en este caso no son bordes sino puntos:
Se procede a eliminar ruido de la imagen, los puntos sobresalientes sobrevivirán:
Ahora solo quedan zonas de interés, se toma el centro de las más notables, en este caso los ojos y la mancha frontal son elementos comunes en los gatos, puesto que es una imagen chica solo se alcanzó a detectar esas zonas, pero será suficiente:
Ahora estos puntos ya son del rostro detectado, solo falta encerrar la zona en un rectángulo para identificar el rostro del gato:
Simplemente encerramos la zona en la imagen original y listo.
Descripción textual
Lo que hace el software internamente en realidad es filtrar y buscar puntos de interés, pero ¿cómo se que una mancha no es un punto de interés? Pues la mayoría de los puntos de interés son simétricos y de gran tamaño. La mayor parte de las manchas se pierden cuando se filtra la imagen, el resto hace interferencia pero no es la gran cosa.
Librerías
Solamente utilicé la librería PIL, en un principio utilizaría OpenCV, pues en el puedo hacer la mayoría de los filtrados en menor tiempo, pero decidí utilizar el 100% de mi librería.
Los filtros y funciones que utilicé fueron los siguientes:
- Filtro mediano: utilizado para remover ruido y para destacar los puntos de mapeo, junto con la normalización.
- Filtro promedio: al igual que el filtro mediano, sirve para remover el ruido de las imágenes, además de que con el pude puntear la imagen en conjunto con filtro mediano.
- Normalización: En general fue el encargado de mantener en funcionamiento las dos anteriores, entre iteraciones, paraba las imágenes a blanco y negro para evitar la generación de ruido.
- BFS: utilizado para localizar zonas de interés y obtener su centro.
- Dilatación: Sirve para adelgazar los pixeles negros mediante la dilatación de los blancos, útil para separar puntos.
Desempeño
Para las medidas de desempeño, puesto que solo utilicé imagenes estáticas, utilicé 8 resoluciones para una misma imagen y medí el tiempo de procesamiento.
- Para imagenes grandes el tiempo de procesamiento es mayor pero tiene mejores resultados.
- Para imagenes pequeñas, el procesamiento es rápido pero poco efectivo.
- 800x850
- 750x800
- 700x750
- 600x650
- 550x600
- 500x550
- 350x400
- 250x300
En el ejemplo siguiente se muestra el mejor y el peor caso:
Esta es la versión original y de mayor resolución, como se puede ver, hay detección en una zona aceptable. | Esta versión es de tamaño reducido, el tiempo de procesamiento es de pocos segundos pero no da buenos resultados. |
Demo
Futuro del proyecto
Para el futuro quizá deje a un lado Python y empieze a trabajar con un lenguaje más eficiente en cuanto a rendimiento. Esto ayudará implementar filtros en tiempos pequeños, y será mejor en cuestión de paralelización, pues muchos procesos facilmente se pueden paralelizar.
También tengo pensado en utilizar procesamiento de video y webcams en tiempo real, pues eso es más factible que usar imagenes estáticas.
Con los datos de salida de la librería se puede alimentar una red neuronal para que aprenda a detectar las zonas de interes basadas en haar cascades como OpenCV.
Liga al proyecto: https://github.com/victoralex911/vision-computacional/tree/master/cats
Presentación:
Referencias:
[1] Yongsheng Gao, Maylor K.H. Leung, "Face Recognition Using a Line Edge Map" (IEEE Pattern Analysis and Machine Intelligence 2002)
[2] Kevin Bonsor, Ryan Johnson, "How Facial Recognition Systems Work", "HowStuffWorks", http://electronics.howstuffworks.com/gadgets/high-tech-gadgets/facial-recognition.htm
Incluye el video en la entrada por favor. También menciona en lo de desempeño las resoluciones utilizadas en alguna tablita o algo. Van 9 pts por la presentación.
ResponderBorrarNP lab de movimiento.
ResponderBorrarEl reporte está bien; 10 pts.
ResponderBorrarEl repo pudiera haber salido más limpio teniendo una carpeta para las imágenes. Los pedazos de código no usados los pudieras haber borrado. 9 pts por el código.