Ejemplo de Identificacion de Caras en Java con OpenCV

Ejemplo de Identificacion de Caras en Java con OpenCV

Todos hemos visto como en peliculas de Ciencia Ficcion se identifica a una persona por medio de una Camara y se obtiene en cuestion de pocos segundos su nombre, edad, domicilio y hasta lo que desayuno ese dia 😀 .. si bien no hemos llegado a tanto en este ambito de reconocimiento facial si se ha avanzado un poco, aunque es algo tardado y poco eficiente, podemos ver a continuacion un ejemplo practico en el que podras crearte tu propio programa de Identificacion de caras en java con OpenCV ( fantastica libreria 😉 ) asi que si estas interesado y quieres sentirte parte de una pelicula tipo Minority Report 😀 sigue leyendo …

Requerimientos

Antes de …

Primero que nada decir que el Articulo se basa unicamente en el codigo java basico para lograr la Identificacion de Caras, Reconocimiento Facial, Face Recognition o como quieras llamarle 😉 si tu quieres ( y creo que lo vas a hacer 😀 ) puedes crearte tu Interfaz Grafica, añadir bases de datos, Sistema de Voz, un moño.. en fin, lo que quieras agregarle. Tambien mencionar que este codigo lo tenia hace tiempo ya pero no lo habia subido, algunos comentarios en el blog y a mi correo me pedian ayuda para realizar esto asi que espero y les ayude de algo. Decir tambien que el codigo no es mio, aunque no recuerdo de donde lo saque 🙁 ( era un sitio en Ingles.. para variar en esto de OpenCV ) tiene algunas modificaciones mias en algunas cosas que no Funcionaban o en cosas extras que le agrege.

Hace algun tiempo realize un tutorial de Deteccion de Rostros en Java con Opencv, aunque en realidad lo posicione con el titulo de Reconocimiento de Rostros 😕 no es eso lo que hace realmente ( no se que estaba pensando.. es por eso que este Articulo se llama Identificacion de Caras en Java con OpenCV 😀 ) aquel articulo hablaba sobre como realizar la deteccion simple y facil de caras, este otro en cambio reconoce a que persona corresponde la imagen con el rostro que le es enviada.

Aclarar tambien que necesitamos OpenCV y JavaCV ( link arriba 😀 ) asi como tambien quiza quieras echarle un ojo a el link del Api de la clase FaceRecognizer.

Ahora bien, una vez aclarado algunas cosas vamos a darnos una vuelta por el procedimiento para realizar la Identificacion de Caras..


¿Sabías que?

¿Necesitas aprender algo nuevo ? Ve a Udemy, busca el tema del que quieres aprender, selecciona el curso para ti y continua con tu aprendizaje.

Udemy

El Proceso …

El Proceso basicamente se divide en 2 partes..

  • Entrenamiento
  • Identificacion/Reconocimiento

 

Para el Primero necesitaremos un conjunto de imagenes ( el codigo viene configurado para 10 pero puedes cambiarlo ) del rostro de una persona desde diversas condiciones de luz, despues dentro del codigo a estas imagenes se les pasaran unos filtros y obtendremos unas imagenes formateadas para el correcto aprendizaje de la misma. El Proceso de Reconocimiento de Rostros que hacemos aqui lo hacemos con la clase FaceRecognizer como ya lo sabes, esta clase se ayuda de Patrones de Histogramas, un Histograma viene siendo una representacion que relaciona los niveles de intensidad de una imagen y el numero de pixeles que tienen esa intensidad, ese es el secreto de esta tecnica.

Para la Identificacion o Reconocimiento de caras necesitaremos pasarle una imagen del rostro que quieres detectar ( obviamente que ya haya sido entrenado antes 😎 ) y el codigo obtendra su valor de histograma y comprobara si existe uno en su datamap que este por encima del minimo aceptable establecido, si es asi obtendra el valor de la cadena de texto relacionado a ese valor.

Espero que mas o menos quede claro 😉 ahora vamos con lo que quieres ver.

El Codigo …

Tenemos una estructura de carpetas en C: para realizar las pruebas ( puedes cambiarlo pero ojo! cambia tambien el codigo ) tenemos..

[note]C:facerecognizerdataimagestraining
[/note]

Nosotros haremos la prueba entrenando el codigo para reconocer a 2 personas, Cristiano Ronaldo y John Terry ( mis jugadores favoritos de Futbol 😮 ) para lo cual necesitaremos 10 imagenes diferentes de el rostro de CR7 y otras 10 de John Terry, ademas otra extra de cada uno tambien diferente para utilizarla para reconocerlos, como se que no quieres perder tiempo buscandolas te las dejo aqui 😉 igual si quieres obtener otras fotos de otras personas puedes ir a Google Imagenes y realizar una busqueda personaliza en «Herramientas de Busqueda» -> «Tipo» -> «Rostros» asi te ahorras tiempo.

Otra cosa es que no necesitas fijarte en el tamaño o que tan cerca esta el rostro ( ojo! que solo aparezca una persona ) ya que el codigo viene con deteccion de rostros en las imagenes que utilizas para el entrenamiento, asi si envias una imagen de una persona cerca o un poco mas lejos el programa te detectara la cara y realizara un recorte, despues la preprocesara.

Ahora que tenemos la estructura de carpetas y las 22 imagenes( 10 y 10 para el entrenamiento / 1 y 1 para el reconomiento ) vamos a ver la estructura del proyecto ..

 

Ejemplo de Identificacion de Caras en Java con OpenCV 1
 

Create el proyecto tal y como luce aqui, mete las imagenes a la raiz de tu proyecto y comienza a escribir la clase Main..

La clase Main luce asi..


package reconocimiento;

import com.googlecode.javacv.cpp.opencv_core.CvRect;
import com.googlecode.javacv.cpp.opencv_core.CvSeq;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import static com.googlecode.javacv.cpp.opencv_core.cvGetSeqElem;
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {
    public static void main(String args[]){
        try {
            ReconocimientoCaras reconocer = ReconocimientoCaras.getInstance();

            //Entrenamiento
            IplImage[] trainImages = new IplImage[10];
            for(int i=1; i < = 10; i++){
                trainImages[i-1]=cvLoadImage("terry"+i+".jpg");
                CvSeq faces = reconocer.detectFace(trainImages[i-1]);
                CvRect r = new CvRect(cvGetSeqElem(faces,0));
                trainImages[i-1]=reconocer.preprocessImage(trainImages[i-1], r);
            }
            reconocer.learnNewFace("John Terry", trainImages);

            //Reconocimiento
            IplImage target = new IplImage();
            target = cvLoadImage("cr7_target.jpg");
            CvSeq faces2 = reconocer.detectFace(target);
            CvRect r2 = new CvRect(cvGetSeqElem(faces2,0));
            target=reconocer.preprocessImage(target, r2);
            System.out.println("Persona Identificada: "+reconocer.identifyFace(target));
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

Como puedes ver esta bien diferenciada la parte del Entrenamiento de la de Reconocimiento, puedes comentarte la parte de Reconocimiento si solo quieres Entrenar un nuevo Rostro o bien puedes comentar la parte del entrenamiento si lo que quieres una vez entrenado es reconocer un rostro. Puedes ver que yo realizo un entrenamiento de 10 imagenes y que leo el nombre de estas en un ciclo, detecto y preproceso, al final mando aprender la cara. En reconocimiento solo leo una imagen, la imagen objetivo, detecto la cara, preproceso y mando identificar, facil no? 😀 ahora me diras que donde sale la clase ReconocimientoCaras! pues te la dejo: ReconocimientoCaras.java porque no quiero alargar el contenido del articulo 😉

Algunas Imagenes …

Ejemplo de Identificacion de Caras en Java con OpenCV 2
 

Ejemplo de Identificacion de Caras en Java con OpenCV 3

Conclusiones …

Esta es solo una Tecnica de varias que existen, aunque creo que es la mas facil, su eficacia obviamente es algo limitada. Si se utilizan mas samples y se optimizan algunos valores se puede mejorar el porcentaje de acierto aunque tambien decir que su velocidad de reconocimiento es algo tardado, recordar que este es un campo que aun esta en desarrollo 🙂 no querramos descubrir una perla aqui, pero igual es bueno para desarrollo y aplicaciones de exhibición o poco exigidas. No te olvides de regalarme un +1, like, tweet o comentario para saber que estas ahi 😉
[lockercat] Descargar Proyecto Completo[/lockercat]

Ejemplo de Identificacion de Caras en Java con OpenCV

Clic para valorar esta información
[Total: 3 Promedio: 5]