Reconocimiento facial con regresión logística

| Última modificación: 16 de abril de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

En el presente artículo haremos un ejercicio de reconocimiento facial con regresión logística. Vamos a seguir trabajando con el algoritmo con el que ya hemos trabajado en el blog, según el cual se debe encontrar, entre un número de imágenes dadas, las que tengan rostros similares o iguales al de George Bush.

Reconocimiento facial con regresión logística

Podemos mejorar el algoritmo, en lugar de usar un KNN (k-nearest neighbor o algoritmo de vecinos más cercanos) podemos usar una regresión logística sobre los componentes principales más importantes.

Para este caso nos quedamos con 150 componentes principales y vamos a coger la matriz de train, que vamos a pasar a un algoritmo de regresión logística.

Lo que haremos es quedarnos con los 150 primeros componentes principales de la matriz rotada, la que tenía 947 columnas, o sea todas las fotos transformadas. Estos son los datos que usaremos para hacer la predicción.

También creamos otra nueva columna llamada name, que es el nombre que se saca de la fila y que va a ser Bush u otro (“bush”, “other”).

#Reconocimiento facial con regresión logística
number_of_pca_components <- 150
df train <- data.frame (pr_pics$x[ , 1 : number_of_pca_components])
df_train$name <- as.factor (rownames (pr_pics$x))
head (df_train)
Reconocimiento facial con regresión logística

Con esto hacemos un modelo de regresión binomial con los 150 componentes.

#Reconocimiento facial con regresión logística
model <-glm (df_train, formula = "name~.", family = binomial) summary (model)

Los fitted values son los valores que nos está dando entre 0 y 1. En este caso, los espectros para esos valores son bastante anchos y, por eso, sale la advertencia que dice: “Warning message:
‘glm.fit: fitted probabilities numerically 0 or 1 ocurred’ “

summary (model$fitted.values)

Min: 0.000000

1st Qu: 0.005392

Median: 0.950338

Mean: 0.608236

3rd Qu: 0.999986

Max: 1.000000

Por lo contrario, en la matriz de confusión nos encontramos con buenos valores. Un accuracy de 0.96 (96%) es bastante bueno; no obstante, estos datos son de training, así que no te emociones mucho.

#Reconocimiento facial con regresión logística
confusionMatrix (data = as.factor (ifelse (model$fitted.values < 00.5, 'bush', 'other')), reference = df_train$name)

Veamos, por tanto, la predicción. ¿Qué tenemos que hacer para calcular la predicción? Primero mostraremos la matriz de fotos original:

#Reconocimiento facial con regresión logística
dim (test_matrix)

406 . 62500

La matriz original tiene 406 fotos y cada una de esas fotos tiene 62500 píxeles.

Esta información la pasamos al dominio PCA:

#Reconocimiento facial con regresión logística
test_pics_pca <- predict (pr_pics, test_matrix)
dim (test_pics_pca)

406 . 947

Una vez que estemos en este dominio PCA, donde tenemos 947 columnas, nos quedamos únicamente con las primeras 150 columnas.

#Reconocimiento facial con regresión logística
df_test <- data.frame (test_pics_pca [ , 1 : number_of_pca_components])
dim (df_test)

406 . 150

Se queda con las primeras 150 columnas y hacemos lo mismo, añadimos una columna que se llame name y que corresponda a la columna de la matriz original:

df_test$name <- as.factor (rownames (test_pics_pca))
head (df_test)

Con el predict tenemos un valor que es el logaritmo de la razón de momios.

pred_test_glm <- predict (model, df_test)
head (pred_test_glm)

bush: -10.6243029407688

bush.1: 2.14515000051053

bush.2: -6.73672564547873

bush.3: -15.7724125754304

bush.4: -9.30471693387415

bush.5: 1.6677216738126

#Reconocimiento facial con regresión logística
df_result <- data.frame (real = df_test$name, pred = pred_test_glm, row.names = NULL)
summary (df_result)

Tenemos el summary result con el valor real y el valor predicho de esta nueva columna.

Aquí con un factor estamos diciendo que, si es un valor negativo, es Bush; por otro lado, si es un valor positivo, no es Bush, es decir, es cualquier otro.

Pintamos la matriz de confusión:

#Reconocimiento facial con regresión logística
df_result$pred_name <- as.factor (ifelse (df_result$pred < 0, 'bush", "other'))
confusionMatrix (data = df_result$pred_name, reference = df_result$real)

La matriz de confusión es bastante buena, ya que tiene un accuracy de 0.8547 (85%).

#Reconocimiento facial con regresión logística
library (ROCR)
#Con type="response" utilizamos la salida de la link function,
#pasa por la función sigmoidal (inversa de logit) y devuelve un valor en el rango [0,1] df result$p <- predict (model, df_test, type = "response")
pr <- prediction (df_resultsp, df_testsname)
prf <- performance (pr, measure = "tpr", x.measure = "fpr")
plot (prf)

La curva de ROC también sale muy bien, nada raro.

prf <- performance (pr, measure = "prec", x.measure = "rec")
plot (prf)
performance (pr, measure = "auc") @y.values

1.0915845491813716

sucede con el auc lo mismo que con la curva de ROC, todo está bastante bien.

¿Quieres seguir aprendiendo sobre lo visto hoy?

Recuerda que si quieres seguir aprendiendo sobre esta temática, puedes seguir nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva de 8 meses en la que adquirirás todas las herramientas y conocimientos necesarios para incursionar en un mercado laboral lleno de oportunidades. ¡Anímate a impulsar tu vida y tu carrera y pide información!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado