Reconocimiento Facial con Machine Learning: FaceNet y one-shot learning
En este post veremos cómo funcionan los sistemas de Machine Learning para el Reconocimiento Facial. En particular hablaremos del one-shot learning y de FaceNet, una Red Convolucional que permite extraer las características más relevantes de un rostro permitiendo lograr una altísima precisión en el reconocimiento facial, más alta incluso que la lograda por los seres humanos.
¡Así que listo, comencemos!
Tabla de contenido
Video
Como siempre, en el canal de YouTube se encuentra el video de este post:
Introducción
Desbloquear el teléfono celular, etiquetar rostros conocidos en redes sociales, acceder a servicios bancarios online o identificar posibles sospechosos usando sistemas de vigilancia…. Pero ¿qué tienen en común todas estas tecnologías?
¡Pues todas ellas usan el reconocimiento facial! y aunque existen muchas maneras de lograrlo, en la actualidad la técnica más usada se basa en el Machine Learning y en el uso de Redes Convolucionales.
Pero no nos adelantemos. Antes de continuar hablemos brevemente de las dos principales aplicaciones del reconocimiento facial: la verificación de rostros y la identificación.
En la verificación se compara un rostro desconocido con una imagen de referencia, y el sistema permite confirmar o rechazar la identidad. Esta tecnología es la que se usa por ejemplo para desbloquear el acceso a algunos teléfonos inteligentes, o para hacer transacciones bancarias desde el celular:
En la identificación se compara la imagen de un rostro desconocido con todas las imágenes de caras conocidas almacenadas previamente en una base de datos, con el objetivo de determinar la identidad correspondiente a la imagen de entrada. El ejemplo clásico en este caso son los sistemas de vigilancia, o también los sistemas de acceso que vienen implementando muchas empresas en el mundo:
El reconocimiento facial: principio general de funcionamiento
Pues bien, para entender cómo logra se logra hacer esto con un modelo de Machine Learning, veamos de forma intuitiva cómo funcionaría este reconocimiento.
Para este ejemplo nos vamos a enfocar en la identificación facial, aunque las mismas ideas se aplican a la verificación.
Primero, supongamos que tenemos cuatro rostros y que queremos diferenciar unos de otros. Para simplificar las cosas supongamos que nos enfocamos en sólo dos características de cada rostro: el color del cabello y el color de los ojos (que en ambos casos podrán ser oscuros o claros):
Al analizar estas características podemos fácilmente diferenciar una persona de otra: cabello claro y ojos oscuros, cabello y ojos claros, cabello oscuro y ojos claros y cabello y ojos oscuros.
Bien, ahora hagamos lo siguiente: ubiquemos estos cuatro personajes en un sistema de coordenadas: el eje horizontal va a representar la característica “color del cabello” y el eje vertical la característica “color de ojos”:
Supongamos que ahora introducimos una nueva imagen de un rostro y queremos saber a cuál de estas cuatro personas pertenece:
Para ello nos enfocaremos únicamente en esas dos características: el color del cabello y el de los ojos. En este caso vemos que el rostro en cuestión tiene cabello y ojos oscuros, así que lo ubicamos más cerca de la cuarta agrupación, ¡y listo con esto ya hemos hecho el reconocimiento facial, ya sabemos la identidad de esta persona!
La representación compacta del rostro: la clave del reconocimiento facial
Pero analicemos en detalle lo que acabamos de hacer.
En el primer paso encontramos una representación compacta para cada imagen de referencia. Es decir, cada rostro fue representado con dos características. Y decimos que esta es una representación compacta, pues no estamos usando cada pixel de la imagen, sino únicamente dos elementos (el color del cabello y de los ojos):
En el segundo paso lo que hicimos fue ubicar cada representación compacta en un sistema de coordenadas. En este caso el sistema tiene sólo dos dimensiones, porque estamos extrayendo sólo dos características de cada imagen:
Bien, este es nuestro punto de partida para el reconocimiento. Después, en el tercer paso, introdujimos una nueva imagen, un rostro desconocido. ¿Y qué hicimos? Pues obtuvimos las dos características del nuevo rostro: el color del cabello y de los ojos:
Y en el paso cuatro, y usando estas dos características, ubicamos la representación compacta del nuevo rostro en el mismo sistema de coordenadas de las imágenes de referencia:
Finalmente, en el último paso determinamos cuál de las cuatro representaciones compactas de referencia se encontraba más cerca de la representación del nuevo rostro. Es decir, y esto es muy importante: lo que hicimos intuitivamente fue calcular la distancia entre la representación obtenida y aquellas de nuestras imágenes de referencia. La distancia más corta nos indica a cuál celebridad corresponde el rostro desconocido.
El one-shot learning: reconocimiento facial con Machine Learning
Bien, ya tenemos la idea general de cómo funciona un sistema de reconocimiento facial. Pero ¿cómo logramos hacer esto con un sistema de Machine Learning?
La respuesta más lógica es usando una Red Convolucional que se usa precisamente para procesar imágenes. Recordemos que una red de este tipo tiene unas capas convolucionales, que se encargan de extraer características relevantes de las imágenes, unas capas fully connected, que se encargan de obtener una representación compacta de las características obtenidas, y una capa de clasificación:
En este caso nos desharemos del clasificador, pues en el caso del reconocimiento facial estamos ante un problema llamado one-shot learning, lo que significa que la red tendrá sólo UNA oportunidad (es decir sólo una imagen) para aprender las características esenciales del rostro y poder reconocerlo. ¡Y un clasificador no logra aprender con tan sólo una imagen!
¿Y por qué deshacernos de la capa de clasificación? Para entender esto volvamos rápidamente al método visto anteriormente: recordemos que el paso fundamental consistía en obtener la representación compacta de los rostros de referencia y del rostro desconocido, para luego compararlos:
Al eliminar la capa de clasificación tendremos a la salida de la Red Convolucional precisamente una representación compacta de la imagen de entrada: es decir que en lugar de la imagen tendremos un vector, con muchos menos elementos de la imagen, pero que contendrá la información esencial de la misma para lograr su reconocimiento.
Así que en este caso usaremos la red para que en lugar de aprenda a extraer representaciones compactas de los rostros humanos que le permitan diferenciar con precisión unos de otros.
Usualmente lo que se hace es entrenar este tipo de Red con miles de rostros humanos y poco a poco la red aprenderá a obtener estas representaciones compactas. Después, con un nuevo rostro, la red hara uso de este “conocimiento” (obtenido durante el entrenamiento) para generar una correcta representación compacta del nuevo rostro. Para generar esta nueva representación compacta tendrá ¡sólo una oportunidad! y de allí el término de este esquema: one-shot learning.
Veamos a continuación una de las arquitecturas más usadas en la actualidad.
FaceNet: reconocimiento facial con Redes Convolucionales
Hablemos de FaceNet, un sistema desarrollado por Google, y que es uno de los sistemas de reconocimiento facial más precisos que existe en la actualidad.
A la entrada de esta red tendremos imágenes a color de 220x220 pixeles. Pero lo más importante es su salida, que será un vector de 128 elementos que es precisamente la representación compacta de cada rostro de entrada:
Vamos a llamar a esta representación embedding. Este embedding contiene la información esencial de cada rostro que permitirá realizar el reconocimiento con una alta precisión.
Entrenamiento: triplet loss
Lo más novedoso de esta red es la forma como se entrena, pues la idea es que aprenda a discriminar de manera precisa los rostros que corresponden a diferentes personas. Para esto se una función de error conocida como triplet loss.
Así, durante el entrenamiento no se presentan a la red imágenes individuales sino tripletas: una imagen de referencia, una imagen positiva (es decir de un rostro que corresponde a la misma imagen de referencia) y una imagen negativa (es decir con un rostro diferente al de la imagen de referencia):
Con este entrenamiento la red aprenderá progresivamente a ubicar los embeddings de rostros similares cada vez más cerca, en este espacio de 128 dimensiones, y a la vez los embeddings de rostros diferentes estarán cada vez más alejados unos de otros.
Al usar más de ¡¡500 millones de imágenes para el entrenamiento!! FaceNet logra una precisión altísima: del 99.63% en la verificación de rostros. Esto quiere decir que de cada 10.000 rostros analizados tan sólo 37 son identificados incorrectamente! Esto supera incluso el desempeño de los humanos en el reconocimiento facial.
Finalmente el reconocimiento facial: cálculo de distancias
Una vez entrenada la red, que es la parte más complicada, se pueden usar diferentes métodos para realizar el reconocimiento facial.
Uno de ellos es una simple comparación entre el embedding del rostro de entrada y los embeddings de referencia.
Así, para el caso de la verificación se introducen a la Red Convolucional tanto la imagen de referencia como el rostro desconocido, y se obtiene para cada una el embedding correspondiente. Luego se calcula la distancia entre estos dos embeddings y si la distancia es inferior a un umbral entonces se confirma su identidad, de lo contrario es rechazada:
Para el caso de la identificación hace algo similar: se calculan los embeddings tanto de las imágenes de referencia como del rostro “desconocido”. Se obtienen las distancias desde este rostro hasta cada uno de los embeddings de referencia y se determina la menor distancia, y si está por debajo de un umbral, el sujeto es reconocido exitosamente:
Conclusión
El modelo que acabamos de ver es uno de los sistemas de reconocimiento facial más robustos que existe en la actualidad, y que incluso tiene una precisión superior a la alcanzada por el ser humano.
En el próximo post veremos otro sistema importante: la detección de rostros, que permite identificar en una imagen las regiones que contienen rostros humanos. Al combinar estos dos sistemas, el de reconocimiento que acabamos de ver y el de detección, veremos, en el tercer post de la serie, cómo implementar en su totalidad un sistema de reconocimiento facial en Python.
Si tienes alguna duda de este artículo o tienes alguna sugerencia no dudes en contactarme diligenciando el siguiente formulario: