domingo, 20 de mayo de 2012

Detección facial

"

Asignación #3 Implementación de un sistema inteligente
IntroducciónEl tema que elegí para esta asignación fue el de redes neuronales artificiales. Objetivo
Con la ayuda de un biblioteca de codigo abierto lograr desarrollar una aplicación que mediante el uso de redes neuronales artificiales logré detectar rostros humanos.

Justificación


Básicamente seleccione este tema por que es parte de mi proyecto de clase, el cual consiste en un detector de mentiras de tiempo real. Mientras tanto en esta practica he decidido poder iniciarme en el uso de redes neuronales artificiales para el procesamiento de datos, ya que la deteccion facial no es nadamas que simple agrupamiento y clasificacion a niveles un poco más complejos.




Desarollo

Para iniciar con el desarrollo de esta practica requeri descargar la libreria que me ayudaria a realizar el procesamiento de imagenes, video y por fortuna también a utilizar las redes neuronales artificiales. Decidí usar esta libreria por que esta bajo la licencia BSD que me permite usarla libremente para propósitos comerciales y de investigación tal es este caso.
Lo primero que hice fue descargar los binarios necesarios de la pagina de openCV para poderlos utilizar en el sistema android, esto es un poco complicado ya que el codigo de openCV esta hecho en C/C++ entonces hay dos opciones utilizar el NDK de android para poder utilizar codigo nativo en las aplicaciones y poder usar openCV tranquilamente. O usar javaCV el cual se podría decir que es la tradución de openCV pero en java.


Despues de configuraciones simples en el IDE eclipse ( agregar librerias externas a un proyecto de android 2.2 ) y agregar el codigo de ejemplo que viene para crear vistas simples con javaCV fui creando la aplicación.

Para el entrenamiento me di cuenta que para lograr resultados decentes o considerables necesitaba una buena base de conocimiento, por fortuna openCV contiene ya una base entrenada por haartraining con una cantidad de 3000 samples positivos y 1500 negativos la cual no pude quedarme con la tentación de ver que tan acertada era con una cantidad tan grande samples.

A continuacion muestro la parte del codigo del procesamiento.

  
/*En esta seccion de codigo podemos ver como 
 *se hace el procesamiento de 
 *cada frame, primero se hace una 
 *copia a color y una en escala de grises
 *despues se verifica si mCascade no esta 
 *vacia, este objeto es el clasificador
 *despues se toman los datos para iniciar 
 *con la comparacion y se utiliza el
 *metodo detectMultiScale del clasificador 
 *para comparar dicho imagen
 *Despues por cada rostro que se detecte se 
 *crea un rectangulo para enmarcarlo.
 *Por ultimo se crea un mapa de bits con los 
 *datos de la matriz de colores.
 */

     @Override
     protected Bitmap processFrame(VideoCapture capture) {    
        capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
        capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);

        
        if (mCascade != null) {
            int height = mGray.rows();
            int faceSize = Math.round(height * FdActivity.minFaceSize);
            List<Rect> faces = new LinkedList<Rect>();
            mCascade.detectMultiScale(mGray, faces, 
              1.1, 2, 2 , new Size(faceSize, faceSize));
            
            for (Rect r : faces)
                Core.rectangle(mRgba, r.tl(), r.br(), 
                        new Scalar(0, 255, 0, 255), 3);
        }
        
        Bitmap bmp = Bitmap.createBitmap(mRgba.cols(),
              mRgba.rows(), Bitmap.Config.ARGB_8888);

        if (Utils.matToBitmap(mRgba, bmp))
            return bmp;

        bmp.recycle();
        return null;
    }

Este segmento de codigo esta inmediato despues de proporcionarle a la aplicacion la base del entrenamiento previo. Por ultimo otras generalidades del proyecto fueron que solo lo pude permitir usar como landscape para tener una uso solido y poder seleccionar el tamaño del rostro en comparación del tamaño de resolución del celular. Esto es para poder ver el comportamiento dandole diferentes rangos al procesamiento.
Código completo AQUI

Resultados

La aplicación es capaz de detectar rostros, utilizando un tamaño de rostro pequeño en comparacion de la resolución de la camara. Son buenos resultados tomando en cuenta que el entrenamiento de la red fue tomando desde los ejemplos que proporciona openCV.

Video





Conclusiones

Pués los resultados resultaron bastantes satisfactorios, sin embargo no son 100% perfectos. Esto lo digo por que cuando esta detectando los rostros a veces confunde otras cosas con rostros, ademas parece ser que es más practico utilizar un tamaño de rostro pequeño con respecto a la resolución de la camara, pero esto produce más procesamiento y por ende le pide mas recursos al telefono lo cual no es muy bueno. 
"

Asignación #3 Implementación de un sistema inteligente
IntroducciónEl tema que elegí para esta asignación fue el de redes neuronales artificiales. Objetivo
Con la ayuda de un biblioteca de codigo abierto lograr desarrollar una aplicación que mediante el uso de redes neuronales artificiales logré detectar rostros humanos.

Justificación


Básicamente seleccione este tema por que es parte de mi proyecto de clase, el cual consiste en un detector de mentiras de tiempo real. Mientras tanto en esta practica he decidido poder iniciarme en el uso de redes neuronales artificiales para el procesamiento de datos, ya que la deteccion facial no es nadamas que simple agrupamiento y clasificacion a niveles un poco más complejos.




Desarollo

Para iniciar con el desarrollo de esta practica requeri descargar la libreria que me ayudaria a realizar el procesamiento de imagenes, video y por fortuna también a utilizar las redes neuronales artificiales. Decidí usar esta libreria por que esta bajo la licencia BSD que me permite usarla libremente para propósitos comerciales y de investigación tal es este caso.
Lo primero que hice fue descargar los binarios necesarios de la pagina de openCV para poderlos utilizar en el sistema android, esto es un poco complicado ya que el codigo de openCV esta hecho en C/C++ entonces hay dos opciones utilizar el NDK de android para poder utilizar codigo nativo en las aplicaciones y poder usar openCV tranquilamente. O usar javaCV el cual se podría decir que es la tradución de openCV pero en java.


Despues de configuraciones simples en el IDE eclipse ( agregar librerias externas a un proyecto de android 2.2 ) y agregar el codigo de ejemplo que viene para crear vistas simples con javaCV fui creando la aplicación.

Para el entrenamiento me di cuenta que para lograr resultados decentes o considerables necesitaba una buena base de conocimiento, por fortuna openCV contiene ya una base entrenada por haartraining con una cantidad de 3000 samples positivos y 1500 negativos la cual no pude quedarme con la tentación de ver que tan acertada era con una cantidad tan grande samples.

A continuacion muestro la parte del codigo del procesamiento.

  
/*En esta seccion de codigo podemos ver como 
 *se hace el procesamiento de 
 *cada frame, primero se hace una 
 *copia a color y una en escala de grises
 *despues se verifica si mCascade no esta 
 *vacia, este objeto es el clasificador
 *despues se toman los datos para iniciar 
 *con la comparacion y se utiliza el
 *metodo detectMultiScale del clasificador 
 *para comparar dicho imagen
 *Despues por cada rostro que se detecte se 
 *crea un rectangulo para enmarcarlo.
 *Por ultimo se crea un mapa de bits con los 
 *datos de la matriz de colores.
 */

     @Override
     protected Bitmap processFrame(VideoCapture capture) {    
        capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
        capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);

        
        if (mCascade != null) {
            int height = mGray.rows();
            int faceSize = Math.round(height * FdActivity.minFaceSize);
            List<Rect> faces = new LinkedList<Rect>();
            mCascade.detectMultiScale(mGray, faces, 
              1.1, 2, 2 , new Size(faceSize, faceSize));
            
            for (Rect r : faces)
                Core.rectangle(mRgba, r.tl(), r.br(), 
                        new Scalar(0, 255, 0, 255), 3);
        }
        
        Bitmap bmp = Bitmap.createBitmap(mRgba.cols(),
              mRgba.rows(), Bitmap.Config.ARGB_8888);

        if (Utils.matToBitmap(mRgba, bmp))
            return bmp;

        bmp.recycle();
        return null;
    }

Este segmento de codigo esta inmediato despues de proporcionarle a la aplicacion la base del entrenamiento previo. Por ultimo otras generalidades del proyecto fueron que solo lo pude permitir usar como landscape para tener una uso solido y poder seleccionar el tamaño del rostro en comparación del tamaño de resolución del celular. Esto es para poder ver el comportamiento dandole diferentes rangos al procesamiento.
Código completo AQUI

Resultados

La aplicación es capaz de detectar rostros, utilizando un tamaño de rostro pequeño en comparacion de la resolución de la camara. Son buenos resultados tomando en cuenta que el entrenamiento de la red fue tomando desde los ejemplos que proporciona openCV.

Video





Conclusiones

Pués los resultados resultaron bastantes satisfactorios, sin embargo no son 100% perfectos. Esto lo digo por que cuando esta detectando los rostros a veces confunde otras cosas con rostros, ademas parece ser que es más practico utilizar un tamaño de rostro pequeño con respecto a la resolución de la camara, pero esto produce más procesamiento y por ende le pide mas recursos al telefono lo cual no es muy bueno. 

1 comentarios:

Unknown dijo... Best Blogger Tips

hola amigo, tengo algo parecido en java. un programa para detectar rostros humanos y curiosamente.... tambien tengo que entregar un proyecto "detector de mentiras" en la universidad. podrias decirme como lo hiciste? como puedo saber si una persona miente con esta libreria Opencv???? muchas gracias espero tu respuesta

Publicar un comentario