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!

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:

Principio de funcionamiento de un sistema de verificación de rostros
Principio de funcionamiento de un sistema de verificación de rostros

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:

Principio de funcionamiento de un sistema de identificación de rostros
Principio de funcionamiento de un sistema de identificación de rostros

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):

Nuestro punto de partida: cuatro rostros diferentes, con dos posibles colores de ojos o de cabello (claro u oscuro en cada caso)
Nuestro punto de partida: cuatro rostros diferentes, con dos posibles colores de ojos o de cabello (claro u oscuro en cada caso)

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”:

Los cuatro rostros iniciales ubicados en un sistema de coordenadas
Los cuatro rostros iniciales ubicados en un sistema de coordenadas

Supongamos que ahora introducimos una nueva imagen de un rostro y queremos saber a cuál de estas cuatro personas pertenece:

Los cuatro rostros iniciales y en rojo un nuevo rostro no identificado
Los cuatro rostros iniciales y en rojo un nuevo rostro no identificado

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!

Al 'comparar' las características del rostro desconocido con las de los rostros de referencia, podemos lograr la identificación del sujeto
Al 'comparar' las características del rostro desconocido con las de los rostros de referencia, podemos lograr la identificación del sujeto

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):

La representación compacta de cada rostro corresponde a las dos características de interés: el color del cabello y el color de los ojos
La representación compacta de cada rostro corresponde a las dos características de interés: el color del cabello y el color 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:

Ubicación de cada representación compacta en el sistema de coordenadas de dos dimensiones (correspondientes a dos características)
Ubicación de cada representación compacta en el sistema de coordenadas de dos dimensiones (correspondientes a dos características)

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:

Para identificar el rostro desconocido primero debemos obtener su representación compacta (a la izquierda, en rojo)
Para identificar el rostro desconocido primero debemos obtener su representación compacta (a la izquierda, en rojo)

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:

La representación compacta del rostro desconocido se ubica en el mismo sistema de coordenadas de los rostros anteriores
La representación compacta del rostro desconocido se ubica en el mismo sistema de coordenadas de los rostros anteriores

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.

Finalmente, la identidad del rostro desconocido corresponde a la representación compacta más cercana
Finalmente, la identidad del rostro desconocido corresponde a la representación compacta más cercana

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:

Estructura general de una Red Convolucional
Estructura general de una Red Convolucional

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!

Para el reconocimiento facial usando one-shot learning debemos deshacernos de la capa de salida (clasificación) de la Red Convolucional convencional, y dejar únicamente las capas convolucionales y las capas 'fully connected'
Para el reconocimiento facial usando one-shot learning debemos deshacernos de la capa de salida (clasificación) de la Red Convolucional convencional, y dejar únicamente las capas convolucionales y las capas 'fully connected'

¿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:

En el reconocimiento facial el problema se reduce a poder obtener la representación compacta de los rostros
En el reconocimiento facial el problema se reduce a poder obtener la representación compacta de los rostros

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:

Diagrama general de FaceNet, donde la representación compacta (a la derecha) es un vector de 128 elementos
Diagrama general de FaceNet, donde la representación compacta (a la derecha) es un vector de 128 elementos

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):

Ejemplos de los tres tipos de imágenes de entrenamiento usadas en FaceNet
Ejemplos de los tres tipos de imágenes de entrenamiento usadas en FaceNet

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:

Verificación de rostros con FaceNet
Verificación de rostros con FaceNet

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:

Identificación de rostros con FaceNet
Identificación de rostros con FaceNet

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].

Otros artículos que te pueden interesar

comments powered by Disqus