Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ndice
Introduccin
---------------------------------------- pag.3
La plantilla
Cara
----------------------------------------- pag.3
----------------------------------------- pag.3
Introduccin
El proyecto se creara con el IDE Netbeans, a partir de la plantilla que se nos proporciona.
La plantilla
La plantilla que se nos proporciona se encarga de gestionar todos los parmetros de
entrada y la base de datos.
Se compone de la clase Cara, ImageFilter y PlantillaPractica2SI, que viene a ser la
plantilla propiamente dicha, ya que apenas tendremos que aadir cdigo a ella.
Cara
Esta clase recibe una imagen, que puede no ser realmente una cara, y la transforma en
un array de enteros, que representan los pixels de la imagen en escala de grises (0 a
255).
La imagen adems es tratada con una mscara, para pasarla toda a un solo color.
A esta clase se le ha aadido
ImageFilter
Esta clase filtra las imgenes de entrada, en este caso las de la base de datos,
controlando que su extensin sea vlida. Tambin nos permite identificar el formato de
las imgenes que le pasemos al programa.
PlantillaPractica2SI
<<Dado que lo primero que tenemos que hacer es refactorizar esta clase para llamarla
Practica2SI, a partir de aqu la llamaremos as. >>
Esta es la clase principal de la primera parte de la prctica, en ella se van a invocar al
resto de clases y es donde tenemos la funcin Main().
Esta clase gestin adems los parmetros de entrada, y realiza ajustes en base a estos,
adems de ser el punto de entrada del programa y recoger la ruta a la base de datos.
La base de datos en, llamada facesDB, es un directorio compuesto por otros dos,
llamados cara y noCara. Estos contiene respectivamente una coleccin de caras y otra
de fotos de fondos, suelos,.. Y cualquier cosa distinta a una cara. Todas las imgenes
tienen un tamao de 24*24.
A partir de esta base de datos, la clase Practica2SI se encarga de crear dos listas para
el Adaboost, una de entrenamiento y otra de testeo.
Hiperplano
que
representara una serie de puntos en el espacio. Como las fotos sern de 24*24 nuestro
hiperplano constara de un vector de direccin de 576 puntos. Estos puntos se generan
aleatoriamente con un Math.random().
Por ultimo necesitamos una funcin que asigne un punto a uno de los subespacios que
crea el hiperplano, de forma que sepamos si el punto est por encima o por debajo. Esta
funcin es la que tendr que llamar despus el clasificador dbil.
La clase tambin incluye los Set y Get que permiten asignarle tantos unos puntos como
un valor C arbitrarios.
Con la clase hiperplano completa, podemos pasar a crear el clasificador dbil
Clasificador dbil
Esta clase consta de un hiperplano, un valor de confianza y un valor de error.
El hiperplano se genera automticamente al llamar al constructor del clasificador, pero
tambin puede asignase mediante get/set.
El cometido principal de esta clase consiste en recibir una instancia de la clase Cara y
evaluarla utilizando el hiperplano. Para esto tendremos la funcin evaluacin que utiliza
la frmula:
Para evaluar los pixels de la cara con el hiperplano. Esta ecuacin nos devolver un
nmero positivo si el objeto de la clase Cara es realmente una cara, o un nmero
negativo si no lo es.
Pero dado que el hiperplano se genera al azar y puede ser mejor o peor a la hora de
discernir si una imagen es cara o no, primero tendremos que entrenar el clasificador
dbil.
Este entrenamiento consiste en ir pasndole la lista de caras dedicadas a entrenamiento
e ir comprobando el resultado que nos da el clasificador: Con cada fallo se le asigna un
error al clasificador, que consiste en la suma del peso de cada cara que falle. Este error
adems nos permitir calcular el valor de confianza: = Ln (1-/ ). Este valor es lo
que nos indicara como de eficaz es este clasificador concreto, y nos ser necesario para
la ejecucin del clasificador fuerte.
Clasificador fuerte
El clasificador fuerte consiste en una batera de clasificadores dbiles, todos entrenados
con la misma lista de caras, de forma que cada uno tendr un valor de confianza distinto
segn lo bueno que sea clasificando. El clasificador funciona evaluando con todos sus
Adaboost
Cuando ht(i) es igual a yi el valor es positivo, con lo que el peso de la instancia Cara
incrementa, en caso contrario, al coincidir el resultado ser negativo y decrementara el
peso.
Tambin podemos ver con el seudocdigo proporcionado que en caso de que
obtengamos un error igual a 0 el bucle termina.
Finalmente Adaboost nos devolver un clasificador fuerte muy entrenado con el que
podremos empezar a clasificar las imgenes.
La llamada Adaboost la pondremos dentro de Practica2SI.init(), en la lnea 81 como nos
indica el pdf de la prctica:
Esto nos entregara el clasificador que tendremos que invocar en las lneas 111 y 123,
donde se realiza la clasificacin, primero de la lista de entrenamiento y despus de la
lista de test:
Ejecucin
La entrada del programa es la clase Practica2SI, que puede recibir varios parmetros
de entrada, algunos de ellos obligatorios.
-d ruta
-t testrate
-T maxT
Este
parmetro
es
el
mximo
de
-v
esta
desactivado
pero
se
Experimentacin y cuestiones
-Cul es el nmero de hiperplanos que se han de generar para que un clasificador
dbil funcione?
En el caso del clasificador dbil solo se necesita uno, ya que el C. dbil solo contiene
un hiperplano. Como el hiperplano es aleatorio, no se puede asegurar la eficacia.
En el caso del clasificador fuerte:
En conclusin se puede afirmar que si bien el clasificador puede llegar a ser muy eficaz
clasificando imgenes, tiene cierta carencias: Si observamos la tasa de fallos,
encontramos que dependiendo de los hiperplanos que genere y de los parmetros de
entrada, suele rondar el 3% como mximo, pero prcticamente todos los fallos ocurren
en imgenes no caras, pero que, entendiendo que el clasificador solo ve escalas de
grises, todas la imgenes que causan error siguen un patrn de fondo oscuro y un centro
de la imagen ms claro
Programa BuscadorCaras
El objetivo de la segunda parte es utilizar nuestro clasificador fuerte obtenido con
adaboost para crear un programa que, al recibir una image, identifique y marque las
caras que encuentre.
Este proyecto solo consta de dos clases: la clase principal se llama BuscaCaras, y es la
entrada del programa, se encargara de recibir por parmetro la ruta donde este
almacenado el clasificador a utilizar y la imagen que se quiera escanear.
Despus tenemos una clase auxiliar arquetpica del estndar de Oracle, mostrarCaras,
que nos permitir mostrar la imagen en una ventana al terminar de funcionar nuestro
algoritmo.
Adems, como el proyecto carga el clasificador usando serializacion, el proyecto
Practica2SI est incluido como .jar, de forma que podemos utilizar sus clases, pero no
modificarlas.
Planteamiento y diseo
El primer paso que debemos realizar es cargar tanto el clasificador como la imagen.
El primero no tiene mayor misterio porque podemos utilizar los mtodos estndar de
carga de objetos por serializacion.
La imagen en cambio tenemos que tratarla primero, asique utilizaremos parte del cdigo
de la clase Cara, de la parte anterior de la prctica.
Esto nos proporcionara un array de enteros con los pixels de la imagen, adems de las
medidas de estay un BufferedImage, que necesitaremos ms tarde.
El siguiente problema es que nuestro clasificador solo admite imgenes de 24*24, pero
las imgenes que aceptara BuscadorCaras pueden ser de cualquier tamao mayor.
Para solucionar esto tendremos que recorrer la imagen seccionando trozos de 24*24
que nuestro clasificador analizara. Esto no podemos hacerlo a partir del array de pixels,
pero si con BufferedImage y su clase getRGB().
Adems de esto, tenemos que tener en cuenta que las imgenes con las que se ha
entrenado al clasificador estaban tratadas con una mscara, por lo que nosotros tambin
tendremos que tratar con la misma marcara a las secciones de 24*24 que le pasemos
al clasificador:
Otro factor a tener en cuenta es que si recorremos pixel a pixel la imagen, cuando
encontremos cara, al avanzar un solo pixel es muy probable que nuestro clasificador
marque otra vez la misma cara, incluso varias veces segn la imagen, Para solucionar
esto haremos que nuestro clasificador avance 24 pixels de una vez en el eje horizontal
cuando encontremos una cara. Con todo esto, solo tenesmo que crear un doble bucle
for que recorra la imagen:
Ejecucin
El programa se ejecuta de manera similar a Practica2SI:
Java BuscadorCaras d rutafoto t rutaclasificador
-d rutafoto
Experimentacin
Vamos a probar a introducir esta imagen
Como podemos ver, aunque el algoritmo s reconoce caras y las marca, tambin comete
fallos y marca coas como los edificios del fondo o los globos. En general podemos
empezar a ver una pauta, ya que marca secciones de fondo oscuro con un tono ms
claro que se cruza por el centro.
Como podemos ver, aunque ha marcado las dos caras tambin ha marcado parte de
las camisetas, justamente cuando tenemos una parte oscura cruzada con una mucho
ms clara.
Conclusiones:
La conclusin que se puede obtener es que, si bien el programa s reconoce caras, est
claro que no es lo suficientemente completo como para ser realmente eficaz.
Algunas mejoras las podemos encontrar en el tema 13 de teora.
-Seleccin de caractersticas
En una imagen de 24*24 tenemos ms de 180000 posibles y tenemos que
seleccionar unas pocas, como por ejemplo el cambio de color del puente de la
nariz o los ojos.
Esto permite identificar de forma mucho ms fiable las caras que si solo nos
guiamos por el color
-Cascada de atencin
El algoritmo de Attentional Cascade consiste, a grandes rasgos, de una criba
por niveles de las distintas imgenes, utilizando clasificadores menos precisos
pero ms rpidos para seleccionar las caractersticas ms fciles de reconocer.
Aunque este mtodo es difcil de implementar los resultados son prcticamente
perfectos.
Adems, como nuestro clasificador hace una bsqueda en profundidad por la imagen,
el tiempo de ejecucin es exponencial respecto al tamao, tardando una media de 8
segundos en imgenes de 600*400.
Bibliografa
-Wikipedia.org
-Apuntes de teora temas 10 a 13
- enciclopedia_universal.esacademic.com
- http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html