Reconocimiento facial con kNN

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

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este artícuo veremos cómo hacer reconocimiento facial con kNN o k-nearest neighbor. Recrearemos un algoritmo de reconocimiento facial que nos dirá si un rostro que se muestra es el de George Bush o no. Realizaremos un clasificador con un kNN de 1.

Reconocimiento facial con kNN

Esto es equivalente a un KNN con N=1.

Reconocimiento facial con kNN

Calculemos la matriz de confianza:

#Reconocimiento facial con kNN
number_of_pca_components <- 200

result <- data.frame (real = rownames (test_matrix), pred = NA, stringsAsFactors = T
Apc <- pr_pics$x [ , 1 : number_of_pca_components]

for (id_test_pic in 1 : nrow (test_matrix)) {

orig_pic <- test_matrix [id_test_pic, ]

t_pic <- transform_pca (row_orig_pic)[ , 1 : number_of_pca_components]
t_pic <- matrix (t_pic, nrow = 1)

dist <- rowSums ((t_pic [rep (1, times = nrow (Apc)), ] -Apc) ^ 2)
result$pred [id_test_pic] <- rownames (train_matrix [which.min (dist)]
}
result$pred = as.factor (resultspred)
str(result)
Reconocimiento facial con kNN

Tenemos, pues, una matriz que nos dice el valor real y el valor predicho.

#Reconocimiento facial con kNN
library (caret)
confusionMatrix (data = result$pred, reference = result$real)
Reconocimiento facial con kNN
sum (result$real == "bush")

159

sum (result$pred == "bush")

159

#Reconocimiento facial con kNN
#Más información de como obtener esas figuras
#https://www.rdocumentation.org/packages/caret/versions/6.0-85/topics/confusionMatrix
Pra <- sum (result$real == result$pred) / nrow (result)

paste ("Accuracy:", sum (result$real == result$pred) / nrow (result))
Pr_bush <- sum (result$real == "bush") / nrow (result)
Pr_other <- sum (result$real == "other") / nrow (result)
Pd_bush <- sum (result$pred = "bush") / nrow (result)
Pd_other <- sum (result$pred = "other") / nrow (result)

Pre <- Pr_bush * Pd_bush + Pr_other * Pd other
paste ("Kappa:", (Pra - Pre) / (1 - Pre))

paste ("Sensibilidad: ", sum (result$pred == "bush" & result$real == "bush") / sum (result$real == "bush"))
paste ("Especifidad: ", sum (result$pred == "other" & result$real == "other") / sum (result$real == "other"))
paste ("Pr pred:", sum (result$pred == "bush" & result$real == "bush") / sum (result$pred == "bush"))

‘Accuracy: 0.694581280788177’

‘Kappa: 0.359050747332773’

‘Sensibilidad: 0.610062893081761’

‘Especifidad: 0.748987854251012’

‘Pr pred: 0.610062893081761’

Si cambiamos la predicción para que el kNN no sea de 1 o de 2 o 3, sino, por ejemplo, de 6, el resultado se torna más impreciso:

#Reconocimiento facial con kNN
number_of_pca_components <- 100
knn <- 6

result <- data.frame (real = rownames (test_matrix), pred = NA)
Apc <- pr_pics$x [ , 1 : number_of_pca_components]

for (id_test_pic in 1 : nrow (test_matrix)) {

orig_pic <- test_matrix [id_test_pic, ]

t_pic <- transform_pca (row = orig_pic) [ , 1 : number_of_pca_components]
t_pic <- matrix (t_pic, nrow = 1)

dist <- rowSums ((t_pic [rep (1, times = nrow (Apc)), ] -Apc) ^ 2)

knn_tags <- rownames (train_matrix) [order (dist, decreasing = F) %in% c (1 : knn)]

#most common name <- names (sort (table (knn_tags), decreasing = T)) [1]
most_common_name <- names (which.max (table (knn_tags)))

result$pred [id_test_pic] < -most_common_name
}
result$pred = as.factor (result$pred)
confusionMatrix (table (result$pred, result$real))
Reconocimiento facial con kNN

¿Qué sigue?

Recuerda que si quieres seguir aprendiendo sobre datos, data mining y todo lo relacionado con estas temáticas, puedes inscribirte en nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva de pocos meses en la que aprenderás todo lo necesario para incursionar en el mundo laboral IT. ¡Solicita más información!

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

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