Eigenfaces: Recuperando Humanos de los Fantasmas

Figura #1: Casper the Friendly Ghost (fuente: https://vignette.wikia.nocookie.net/christmasspecials/images/e/e8/Casper.jpg/revision/latest?cb=20121014033319)

Tener más teniendo menos… ¡Fácil! Este método de aprendizaje automático le ayudará a almacenar más información en tamaños más pequeños con sólo algunos fundamentos de álgebra lineal. Con ello, recuperaremos rostros humanos de algunos desaguisados con forma de fantasma.

Seguro que te lo han dicho, los vectores independientes crean espacios de forma abstracta. Ahora, imagínate de verdad. Todos los espacios están formados por los vectores y también las cosas dentro de esos espacios. Algunos de estos vectores contribuyen a algunas de las cosas más que a otras. Los otros pueden ser insignificantes además de ellos y tal vez no necesitemos saber sobre esos porque básicamente no nos importa y no queremos llevar sus problemas con nosotros. Esto es exactamente lo que voy a mostrar para hacer sobre eigenfaces en este post.

Figura #2: no este espacio sino también este espacio (fuente: https://img.purch.com/w/660/aHR0cDovL3d3dy5saXZlc2NpZW5jZS5jb20vaW1hZ2VzL2kvMDAwLzA5Ny85NTcvb3JpZ2luYWwvc3BhY2UuanBn)

Nuestro tema principal es PCA. Es un algoritmo muy utilizado en diversos temas. Su uso en rostros lo hace más interpretable para el ser humano por lo que es una de las aplicaciones más populares. Eigenfaces es un método útil para el reconocimiento y la detección de rostros mediante la determinación de la varianza de los rostros en una colección de imágenes de rostros y el uso de esas varianzas para codificar y decodificar un rostro de una manera de aprendizaje automático sin la información completa reduciendo la complejidad computacional y espacial. Aunque fue utilizado por primera vez en 1991 por Turk y Pentland y tiene limitaciones en comparación con la tecnología actual, sus fundamentos siguen siendo muy beneficiosos para las nuevas prácticas.

Figura #3: LFW (fuente: http://vis-www.cs.umass.edu/lfw/Six_Face_Panels_sm.jpg)

Antes de pasar a la implementación, me gustaría hacer una pequeña introducción sobre los conceptos básicos mencionados. Además, puedes encontrar el script completo y el conjunto de datos (una pequeña fracción de LFW_cropped) que utilicé aquí.

Evectores propios y valores propios

Todos sabemos cómo funcionan exactamente los vectores propios y los valores propios. Quizás no exactamente pero hemos oído hablar de ellos, muchas veces. Aquí va una explicación para la minoría que, como yo, sigue olvidándose.

Tengamos una matriz A cuadrada. Casi todos los vectores cambian de sentido al ser multiplicados por A como es de esperar. Sin embargo, hay ciertos vectores x que tienen exactamente la misma dirección que Ax. Así que… ¿Adivina qué? Esos son nuestros vectores propios. Los especiales… Aunque tengan la misma dirección, Ax y x podrían seguir siendo dos vectores diferentes por sus magnitudes. Aquí hay una igualdad conocida. Ax=λx. Lo que hace que esos dos sean iguales es λ, nuestro escalar igualador de magnitudes, el valor propio. Esto nos dirá cómo nuestro eigenvector cambió después de la multiplicación

Desde arriba, usted puede decir por qué son útiles en la práctica. Para una comprensión más profunda y probablemente apreciación ir a MIT’s Eigenvalues and Eigenvectors Chapter.

Principal Component Analysis (PCA)

El objetivo principal de PCA es la reducción de la dimensionalidad. Tiene muchas aplicaciones en visualización, extracción de características, compresión de datos, etc. La idea que subyace es proyectar linealmente los datos originales en un subespacio de menor dimensión que ofrezca a los componentes principales (vectores propios) la máxima varianza de los datos proyectados y/o el mínimo error de distorsión de la proyección. Finalmente, ambos conducen al mismo resultado, que es la mejor fórmula de reconstrucción. Como nota al margen, este subespacio se llama subespacio principal.

Para los cálculos de la maximización de la varianza y la minimización del error de distorsión, puede ir a las notas de la conferencia de ANU sobre PCA. También, otro video en youtube llamado Principal Components Analysis -Georgia Tech-Machine Learning me ayudó a entender los conceptos mucho mejor.

Implementación

¡Ok! Todos listos para la implementación. Primero, importaremos las librerías necesarias. Supongo que todos sabéis para qué sirven. Me centraré en la parte de explicación de los algoritmos. Si tenéis alguna otra duda sobre el código, dejad una respuesta más abajo.

A continuación, necesitamos una función que visualice las imágenes de nuestro conjunto de datos de forma atractiva. Aquí está.

Pongámosla en nuestro conjunto de datos lfwcrop_grey.zip. Aquí, sólo tomo los primeros 1000 de las caras debido a la complejidad computacional, pero realmente no importa. Si quieres ir a por todas, entonces hazlo. También transformé las imágenes en una matriz numpy (con forma de 1000, 64, 64) para su procesamiento.

Leave a Reply