En este ejercicio vamos a ver como aplicar PCA al reconocimiento facial por medio del algoritmo Eigenfaces. Vamos a descargamos un dataset público con miles de imágenes de más de 5000 personas. Cada imagen tiene tiene una resolución de 250x250px y ha sido colocada de tal forma que la cara siempre se encuentra en la misma posición.
Con esto vamos a hacer un algoritmo que nos diga si una foto pertenece a George W. Bush o no.
En esta sección, desarrollaremos las dos primeras fases del algoritmo Eigenfaces: la descarga de datos y la carga de imágenes.
Descarga de datos
Primero creamos el directorio donde se descargarán las imágenes.
Después, con la función curl_download, descargamos la fotos comprimidas en formato tgz. Ocupa unos 233Mbytes. La imágenes descomprimidas ocuparán unos 289Mbytes.
Primero lo que haremos será descargar el dataset de fotos:
#algoritmo Eigenfaces ext_dir <- 'data/faces dir.create (ext_dir) library (curl) out_file <- 'data/faces/faces.tgz' curl_download ("http://vis-www.cs.umass.edu/Lfw/Lfw-funneled.tgz', out_file, quiet = FALSE) #Con untar descomprimimos el dataset untar (out_file, exdir = ext_dir)
#aquí enseñamos el contenido list.files (ext_dir)
‘faces.tgz’ . ‘lfw_funneled’
ext_dir <- 'data/faces' list.files (paste0 (ext_dir, '/lfw_funneled'))
Carga de imágenes
Vamos a usar la libreria jgpeg para cargar las imágenes.
Creamos una función que convierte las imágenes de color a blanco y negro.
El readJPEG nos permite ir leyendo las fotos que hay en el directorio.
Al final, pasaremos las imágenes a blanco y negro por medio de la variable bw.
#algoritmo Eigenfaces library (jpeg) get_pic <- function (name, id, root_path = ext_dir, bw = FALSE) { img <- tryCatch ( readJPEG (paste0 (root_path, '/lfw_funneled/', name, ' / ', name, ' / ', sprintf ('%04d', id), '.jpg')), error = function (e) return (NULL)) if (!is.null (img) && bw) { img <- (img [ , 1] + img [ , , 2] + img [ , , 3]) / 3 } img } #Creamos una matriz que nos enseñe el número de la foto que busquemos. En este caso es la foto número 2. img <- get_pic ('Tony Blair', id = 2, bw = TRUE, root_path = ext_dir) paste ("Dimesiones:", paste0 (dim (img), collapse = 'x')) paste ("Tipo:", class (img)) options (repr.plot.height = 4, repr.plot.width = 4) plot (1 : 2, type = 'n') rasterImage (img, 1, 1, 2, 2)
‘Dimensiones : 250 x 250’
‘Tipo: matrix’ . ‘Tipo: array’
dim (img) <- c (1, 250 * 250)
dim (img)
1 . 62500
hist (img)
¿Qué sigue?
Ahora que hemos visto las dos primeras fases del reconocimiento facial con el algoritmo Eigenfaces, podemos avanzar a la siguiente fase, que es la transformación de imágenes.
¿Quieres seguir aprendiendo? Para ello, dejamos a tu disposición nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, con el cual aprenderás todo lo necesario para incursionar rápidamente en el mundo laboral. ¡Solicita más información y cambia tu vida!