Introducción Teórica Autovalores y Autovectores Los vectores propios o autovectores de un operador lineal (aplicación entre dos espacios vectoriales que preserva las operaciones de suma de vectores y producto por un escalar) son los vectores no nulos que, cuando son transformados por el operador, dan lugar a un múltiplo escalar de sí mismos, con lo que no cambian su dirección. Este escalar λ recibe el nombre de valor propio o autovalor. A menudo, una transformación queda completamente determinada por sus vectores propios y valores propios. Un espacio propio, autoespacio o eigenespace es el conjunto de vectores propios con un valor propio común. Formalmente, se definen los vectores propios y valores propios de la siguiente manera: Si A: V → V es un operador lineal en un cierto espacio vectorial V, v es un vector diferente de cero en V y c es un escalar tales que entonces decimos que v es un vector propio del operador A, y su valor propio asociado es c. Puede notarse que si v es un vector propio con el valor propio c entonces cualquier múltiplo diferente de cero de v es también un vector propio con el valor propio c. De hecho, todos los vectores propios con el valor propio asociado c junto con 0, forman un subespacio de V, el espacio propio para el valor propio c. Factorización QR En álgebra lineal, la descomposición o factorización QR de una matriz es una descomposición de la misma como producto de una matriz ortogonal por una triangular superior. La descomposición QR es la base del algoritmo QR utilizado para el cálculo de los vectores y valores propios de una matriz. Definición La descomposición QR de una matriz cuadrada real A es Donde Q es una matriz ortogonal (es decir se satisface QTQ = I) y R es una matriz triangular superior. Cálculo de la descomposición QR Método de reflexiones de HouseHolder Una transformación de Householder o reflexión de Householder es una transformación que refleja el espacio con respecto a un plano determinado. Esta propiedad se puede utilizar para realizar la transformación QR de una matriz si tenemos en cuenta que es posible elegir la matriz de Householder de manera que un vector elegido quede con una única componente no nula tras ser transformado (es decir, premultiplicando por la matriz de Householder). Gráficamente, esto significa que es posible reflejar el vector elegido respecto de un plano de forma que el reflejo quede sobre uno de los ejes de la base cartesiana. La manera de elegir el plano de reflexión y formar la matiz de Householder asociada es el siguiente: Sea un vector columna arbitrario m-dimensional tal que || || = |α|, donde α es un escalar; Entonces, siendo el vector (1,0,...,0)T, y ||·|| la norma euclídea, se define: donde v es un vector unitario perpendicular al plano de reflexión elegido. Q es una matriz de Householder asociada a dicho plano. Se verifica entonces: Esta propiedad se puede usar para transformar gradualmente los vectores columna de una matriz A de dimensiones m por n en una matriz triangular superior. En primer lugar se multiplica A con la matriz de Householder Q1 que obtenemos al elegir como vector la primera columna de la matriz. Esto proporciona una matriz QA con ceros en la primera columna (excepto el elemento de la primera fila). el procedimiento se puede repetir para A′ (que se obtiene de A eliminando la primera fila y columna), obteniendo así una matriz de Householder Q′2. Hay que tener en cuenta que Q′2 es menor que Q1. Para conseguir que esta matriz opere con Q1A en lugar de A′ es necesario expandirla hacia arriba a la izquierda, completando con la matriz identidad (es decir poner unos en los elementos de la diagonal y ceros en los restantes) obteniendo así la siguiente matriz Tras repetir el proceso t veces, donde t = min(m − 1,n), se obtiene donde R es una matriz triangular superior. De forma que tomando A = QR es una descomposición QR de la matriz A. Algoritmo QR ((Francis, Kublanovskaya - 1960) El algoritmo QR es un algoritmo de valor propio: es decir, un procedimiento para calcular los valores y vectores propios de una matriz. La idea básica es realizar en cada iteración una descomposición QR de la matriz, es decir escribirla como producto de una matriz ortogonal Q y una matriz triangular superior R, luego multiplicar dichas matrices en orden inverso y continuar iterando. El algoritmo es el siguiente: Se toma = y a partir de la factorizacion QR de , se construye De esta forma se tiene la sucesión de matrices todas semejantes a : .. . Si la matriz es simétrica, también lo son todas las , esto es, la sucesión y, por tanto , converge a la matriz diagonal de autovalores. Puede notarse ésto con mayor claridad a través del siguiente pseudocódigo: 1. i= 0 2. 3. Repetir Factor 4. 5. 6. i= i +1 7. Hasta la convergencia Desarrollo Primera parte: Matrices Debido a que el reconocimiento de caras requería trabajo con matrices, lo primero que hicimos fue implementar una clase propia de matrices que nos permita trabajar más fácilmente. Teníamos una clase de matrices que usamos en el trabajo práctico anterior, eso nos sirvió de base. Luego implementamos métodos propios para cada operación necesaria y utilizamos matrices de una columna para representar vectores. Sin mayores vicisitudes implementamos la suma y el producto de matrices. Decidimos implementar una versión de orden temporal O(1) del producto por un escalar. Para esto le agregamos un atributo a la matriz que le indica por qué factor está siendo multiplicada (si es ninguno, el valor es uno). Luego, el método GetItem devuelve el producto del elemento pedido por el factor y el método SetItem actualiza la matriz entera (multiplica los elementos por el factor, y luego lo reemplaza por uno) cuando se cambia un elemento. Segunda Parte: Método QR Viendo las matrices con el que íbamos a trabajar, notamos que tenían casi todos (si es que no todos) sus elementos no nulos. Con esto en mente decidimos usar, para obtener la descomposición QR, el método de Householder. Una vez implementado el método pasamos a la descomposición QR y la obtención de autovalores y autovectores a partir de la misma. Teniendo esto ya podíamos calcular la matriz de covarianzas y obtener los autovalores y autovectores de la misma. Pero ahora teníamos el problema de que aún reduciendo las imágenes de tamaño, nos quedaba una matriz demasiado grande, esto enlentecía considerablemente cualquier operación que requiriera varios productos entre matrices, especialmente QR. En un principio el tiempo que demoraban estas operaciones era enorme. Muchísimo mayor de lo esperado. Después de algunos experimentos, notamos que los elementos de la matriz que tenían que quedar en cero tardaban mucho en llegar. Esto se debía a un problema de redondeo, o mejor dicho a la falta de redondeo. El número seguía decreciendo hasta llegar a valores muy pequeños entre cero y uno, pero no llegaba a lo que el procesador identifica como cero. Entonces decidimos poner una cota, tal que cuando un número es más chico que esa cota, directamente lo consideramos como cero. Tercera Parte: Autocaras Una vez terminamos de implementar toda la parte matemática (matrices, método QR, autovalores y autovectores) nos quedaba la parte principal del trabajo, encontrar un método eficaz (o eficiente, de ser posible) para poder distinguir caras. Es decir, dado un conjunto de personas y fotos de sus caras, poder reconocer a cual pertenece una nueva imagen. Pasamos por varias ideas, ninguna concreta pero todas enraizadas en nuestros conocimientos de optimización combinatoria obtenidos en otras materias. Demás está decir que el enfoque no nos cerraba y no dio frutos. Consultando con conocidos de la materia optativa de procesamiento de imágenes, obtuvimos una publicación dedicada específicamente al tema de este trabajo. Dicha publicación es el paper de 1991 de Mathew Turk y Alex Pentland de nombre Eigenfaces for Recognition. En la misma vimos que el método para resolver el problema era básicamente el mismo planteado por la cátedra, con algunas variantes. La primera parte era igual, obtenía el promedio de las imágenes, y a partir de los mismos obtenía la matriz de covarianza. Luego aplicaba una transformación a la matriz que le reducía el tamaño. Cuando en el método original, nos quedaba una matriz de n por n con n igual a la cantidad de píxeles de las imágenes, utilizando este método n pasaba a ser cantidad de imágenes. La justificación de por qué este método servía igual, es decir que los autovalores de la matriz de covarianza se mantenían, resultó ser bastante sencilla. (donde y n es la cantidad de imágenes) Consideremos los autovectores y autovalores de la matriz de la matriz , tales que Multiplicando a izquierda por A a ambos lados obtenemos de donde vemos que son los autovectores de . A partir de este análisis, construímos la matriz de n por n y buscamos sus autovectores. Luego de eso el proceso es el mismo que el planteado por la cátedra en el enunciado. Se usa un subconjunto de autovectores para generar la transformación característica que aplicada a cada imagen nos da su correspondiente autocara (del inglés eigenface). Cuarta Parte: Reconociendo caras Parte 1: Distancias euclidianas Lo que obtuvimos de la publicación de Turk y Pentland, nos ayudó a que pudiéramos hacer andar nuestro trabajo en un tiempo considerablemente menor, lo que nos permitía hacer varias pruebas en unas pocas horas. Aún nos faltaba la parte final que era la de reconocer a que conjunto pertenecía una cara dada. De nuevo miramos al paper para esto y encontramos una solución simple pero, a priori, efectiva. El método de Turk y Pentland consistía en tomar la autocara nueva promedio de cada dominio de autocaras . Más precisamente: y compararla con el De ahí lo que quedaba era buscar el dominio que disminuyera la distancia con la imagen. Según lo planteado por Turk y Pentland en su publicación, este método tenía una alta eficiencia, era rápido y generalmente efectivo. Ellos utilizaban una cota para la distancia, de modo tal que si la distancia superaba dicha cota, la imagen no pertenecía al dominio. Lo que no decían era como llegaban a esa cota. Nosotros asumimos que probando íbamos a llegar algo razonable pero no fue así. Para empezar, primero las distancias nos daban en números muy grandes, del orden de 1011. Esto ya nos trajo confusión dado que adivinar una cota iba a ser difícil. Para resolver esto decidimos probar dividiendo las distancias por algún número cosa de que quedara algo proporcional pero en números más procesables. Buscábamos algo que nos de entre cero y uno. Logramos que nos diera entre cero y dos. Para esto utilizábamos la norma más grande de los dos vectores de la sustracción y dividíamos, la norma de la resta por dicho número. Esto no resolvía nuestro problema más importante, seguíamos teniendo casos que no daban como deberían dar. Parte 2: Recordando Probabilidad y Estadística Pensando un poco se nos ocurrió que debería haber un método para que la decisión de saber si una imagen pertenece o no a una persona quede en función de un valor que esta siempre entre cero y uno. El primer caso siendo que la probabilidad de que la imagen pertenezca al dominio es nula y el segundo, que pertenece sin duda alguna al dominio. Sea D el dominio correspondiente a una persona. Entonces, tiene en su interior dos cosas: Un conjunto de imágenes (cada una proyectada sobre el espacio de k dimensiones) Un centro de masa (el promedio del conjunto) El centro de masa c, junto con la distancia más grande de una imagen i al mismo, forman un círculo de centro c y radio equivalente a la distancia más grande. Dada una imagen i pertenece al dominio D, basta con fijarse si el punto que le corresponde a i en el espacio k-dimensional pertenece al círculo o no. El punto puede o no estar dentro del círculo, si no está, es porque la distancia al centro de masa es mayor a la mayor distancia encontrada, entonces la imagen definitivamente, al menos con la base de datos que se tiene, no pertenece al dominio D. Sea la transformación lineal de la imagen i y punto pertenece a un círculo si y solo si: el centro de masa del dominio k. Un < Radio del círculo Si la imagen está efectivamente en el círculo, nos fijamos la distancia al centro de masa y la vemos como un porcentaje en relación a la distancia máxima. Esto nos da una "probabilidad" de que la imagen pertenezca a la persona del dominio. De este modo tenemos un método que nos dice con una cierta certeza si la imagen pertenece a una persona. En pruebas (ver resultados), este método nos resultó el más seguro, corrigiendo los problemas de los anteriores y dándonos un mayor porcentaje de resultados exitosos, siendo las excepciones los casos donde dos círculos se superponen.