Translate

sábado, 7 de septiembre de 2013

Reconocimiento de caras en Android



Introducción

A continuación describo los elementos para construir una app en Android para reconocimiento de caras.

Algoritmos de reconocimiento de caras en Android con OpenCV

Para que nuestros robots puedan reconocernos deberíamos tener a nuestra disposición  alguna librería que nos permitiera incorporar esta función.

En OpenCV existen tres algoritmos de reconocimiento de caras:

- Eigenfaces
- Fisherfaces
- LBPH (Local Binary Patterns Histograms)

Los dos primero Eigenfaces y Fisherfaces se basan en la reducción de la dimensionalidad. En una imagen de 100x100 píxeles existen 10.000 píxeles o dimensiones si estamos hablando de un clasificador. Pero de esas 10.000, ¿cúantas son de verdad necesarias para reconocer una imagen?. El análisis de componentes principales nos ordena la importancia de estas dimensiones para que podamos trabajar con muchas menos.







Caras reducidas a sus componentes principales.


LPBH en cambio no se basa en la comparación directa de imágenes con dimensionalidad reducida. Se basa en la extracción de características relevantes de cada imagen.
Para cada pixel se obtiene un histograma local. Los píxeles de alrededor se traducen a 1 y 0 dependiendo de si tienen más intensidad o menos que el pixel centra, y se asigna ese valor al píxel central.



La imagen se divide en una cantidad m de regiones y se extrae un hostigrama de cada una. Estos histogramas luego se concatenan.

JavaCV y OpenCV 

La implementación de estos algoritmos están descritos en la documentación de OpenCV :http://docs.opencv.org/trunk/modules/contrib/doc/facerec/facerec_tutorial.html

El problema es que estas funciones no están disponibles directamente en la librería de OpenCV Android. Afortunadamente existe un proyecto denominado JavaCV que pone a disposición de los desarrolladores en Java para Android y otros sistemas todas las funciones de OpenCV, FFmpeg y otras librerías-
La página del proyecto nos da indicaciones detalladas de cómo incorporar la librería a un proyecto Android: https://code.google.com/p/javacv/

Implementación

Con la ayuda de OpenCV implementé una pequeña aplicación de prueba. Esta aplicación está subida al play store y tiene disponible el códifuente en gitHub.
La aplicación en el modo entrenamiento localiza caras en la imagen mediante un clasificador en cascada haar. El rectángulo obtenido sirve para entrenar al algoritmo o para que el algoritmo lo clasifique. Cuando se clasifica una imagen se obtiene también un indicador de la “confianza” en la clasificación.
Aunque la implementación realizada permite utilizar cualquiera de los tres algoritmos incluidos, el que se ha elegido finalmente para la app es LPBH, pues es el único que me ha dado un resultado aceptable en condiciones reales.



La entrada en play store: Reconocimiento de caras OpenCV , https://play.google.com/store/apps/details?id=org.opencv.javacv.facerecognition




Instrucciones de uso:

 Se necesitan al menos tener dos caras guardadas para que pueda empezar a reconocer

 Modo Entrenar: Escribir el nombre de la persona, enfocar  y cuando empiece a aparecer un recuadro localizando una cara pulsar el botón "Rec". Pulsar Rec varias veces para almacenar diferentes gestos. Para tener mejores resultados, hacer la grabación con iluminación adecuada.

 Modo Buscar. Enfocar a una cara y si la reconoce aparecerá su nombre. Un icono aparecerá verde, amarillo o rojo dependiendo del grado de confianza en el reconocimiento.

Icorporación al robot:


1 comentario:

  1. Os comparto este link aquí encontraréis un proyecto.. espero que les ayude

    https://youtu.be/BpVDzKfcrp0

    ResponderEliminar