toopazo

Reconocimiento facial a partir de videos

Dentro de la amplia gama de problemas que la visión computacional busca resolver, el problema de reconocimiento facial no requiere de mucha introducción. Es fácil entender su gran impacto en aplicaciones de negocios, seguridad, legales, etc. Probablemente todos los que lean este articulo se habrán encontrado con alguna aplicación móvil que la requiera. Y hasta puede que se hayan preguntado por que su aplicación no es aún más masiva.

En este articulo me gustaría presentar mi trabajo en una variante particular del problema de reconocimiento facial: el reconocimiento de rostros a partir de videos. Explicado en sencillo, el desafío es lograr reconocer a la mayor cantidad de personas que aparecen en un video a medida que avanza. Es decir, si al segundo 23 apareció Juan Perez y al segundo 43 Maria Sandoval, queremos que el sistema reconozca a cada uno de ellos durante todo el tiempo que permanezcan en escena. Al final de la escena queremos tener una secuencia de recortes del rostro de Juan y otra secuencia de recortes del rostro de María. Si más adelante en el video, Juan o María vuelven a aparecer, queremos re-conocerlos y saber que son ellos. Aunque tengan otra ropa o estén en otro lugar físico.

alt_text

El sueño

Tal como yo lo definiría, el sueño de un sistema de reconocimiento de rostros a partir de videos es el siguiente: Imaginemos que ponemos una cámara en pleno Paseo Ahumada, y que grabamos los rostros de todos los que pasan por ahí. Detectamos a cada persona que transita, obtenemos la representación de su rostro en un vector de espacio latente y lo guardamos en una base de datos de gran tamaño (20 millones de chilenos). Esto significa que guardaremos decenas de millones de secuencias. Cada secuencia contendrá el rostro de una persona a medida que se mueve en la escena. Días después y en otro extremo de la ciudad (un Mall concurrido, una estación de Metro, etc) el sistema realiza la misma operación. Luego de procesar la nueva secuencia, una notificación automática registra en la base de datos que la misma persona fue vista en ese nuevo lugar. Vale la pena aclarar, que tal como está definido este sistema, no estamos buscando identificar a las personas (asignar nombre, rut, domicilio a cada rostro, etc), sino re-conocer que hemos vuelvo ver al mismo rostros en otra parte del video (e.g rostro 2345 visto en lugar X y luego en lugar Y con fecha y hora respectiva).

alt_text

Estado del arte

Al leer la bibliografía técnica acerca de reconocimiento facial, es usual encontrar un conjunto de términos técnicos que pueden llevar a confusión si no son definidos correctamente. A continuación daremos una definición sucinta de cada uno.

Existe muchísima bibliografía de reconocimiento facial. Sin embargo, acá nos estamos enfocando en reconocimiento en base a videos, es decir, reconocimiento que haga uso de la variable temporal. Las implementaciones frame-a-frame no son consideradas, porque presuponen de una estructura y contexto que no se da en el escenario que nos planteamos. Es decir, videos de vigilancia de áreas públicas, y no uno de fotos tomadas con el expreso deseo de ser bien tomadas (luz, pose, nitidez, etc). Es por ello que soluciones como Amazon Rekognition, daon.com, idemia.com y similares no son consideradas acá.

El análisis de la bibliografía del área representa un desafío en si misma. Ya que esta bastante repartida en trabajos que buscan distintos objetivos. Esto es tan así, que me ha llevado a creer que una de las principales razones para el gran avance de los modelos de redes neuronales, ha sido la existencia de desafíos claros y dataset accesibles. Esto ha permitido crear tableros de seguimiento unificados y verificables como los de Face Recognition en paperswithcode.com. Da la impresión que esta cultura de problema unificado + datos abiertos + métricas de seguimiento ha sido clave en el éxito del área. Por ejemplo, el reconocimiento de rostros en base a imágenes tiene tableros como el siguiente.

alt_text

En el caso de reconocimiento facial a partir de videos, si bien existen dataset disponibles (YouTube Faces DB, IJB-S, HACS), la definición de que problema se quiere resolver aún no tiene una delimitación unificada. Algunos autores asumen conocer el número de rostros, otros asumen conocer la distribución de vectores latentes a priori, otros son métodos online, otros son offline. Es decir, cada uno arma su problema de manera distinta al anterior.

Desde un punto de vista más técnico, lo que diferencia el reconocimiento en base a videos es el incorporar la variable temporal dentro del análisis, y decidir en base a una secuencia de imágenes de rostros (no una sola), si un rostro es conocido o es nuevo. En la literatura existen al menos dos estrategias para resolver el problema: (1) agrupar las detecciones de rostros y comparar entre agrupaciones, y (2) fusionar las detecciones de rostros en una sola representación (un solo vector) y comprar entre esas representaciones. Para el primer caso se suelen ocupar técnicas de búsqueda y comparación de vectores en clusters. Para el segundo caso existen algoritmos que fusionan las secuencias en un solo vector, como por ejemplo, averaging, temporal pooling o los famosos attention mechanisms de los LLM. A pesar de las dificultades ya advertidas, algunos de los trabajos más relevantes del 2006 a la fecha son:

Códigos disponibles

En cuanto a las implementaciones disponibles. Algunos repositorios que tienen algún nivel de reconocimiento en video son:

Airflow: Mi (humilde) implementación

¿Como implementar el sueño?

En este proyecto se trabajó con las siguientes herramientas tecnológicas:

alt_text

Videos

Un conjunto de videos que muestre a personas y sus rostros. En este proyecto simplemente saqué un video de Youtube sobre la inauguración de Metro. Como primera etapa haremos re-conocimiento dentro del mismo video. Pero luego queremos extender esto a un conjunto de miles de videos.

Detector de rostros

Acá no hay mucho misterio. Los detectores tienen una larga historia dentro de la visión computacional. Son el segundo caso más usado luego del clasificador de imágenes. En este proyecto se usó el modelo insightface para detectar rostros de personas.

Estimador de pose

Para esta parte también usamos insightface ya que además de ser un modelo detector, entrega por cada rostro un vector que representa si la persona está mirando de frente, de costado, arriba abajo. Este estimador es muy importante para procesar solo los recortes de rostros en que la persona está mirando de frente y por tanto podrá ser reconocida de buena manera.

Descriptor de rostros

Este problema es muy antiguo dentro del área de reconocimiento de rostros. Antes del uso masivo de redes neuronales se usaban detectores de keypoints (ojos, nariz, boca, orejas, mejillas, etc) para elaborar matemáticamente un vector descriptor. Un buen resumen de estos algoritmos se puede ver en Gururaj Et al. 2024 Comprehensive. Algunos de estos métodos clásicos son: HOG, Eigenface, Independent Component analysis, Scale-Invariant Feature Transform (SIFT), Gabor filter, Local Phase Quantization (LPQ), Linear Discriminant Analysis (LDA), entre otros.

Sin embargo, todo esto fue reemplazado por el uso de redes neuronales de aprendizaje profundo que generan vectores descriptores de mucho mayor calidad. Diversos métodos de entrenamiento han sido propuestos para mejorar el desempeño de estas redes. Los dos más conocidas son aquellos derivados de la función softmax de clasificación y el de triple-loss.

En este proyecto usamos el modelo insightface que además de ser un modelo detector de rostros, entrega por cada rostro un vector descriptor. Este vectors descriptor es el que usaremos para comprar rostros. En particular el modelo que usamos fue entrenado usando una función de perdida llamada ArcFace que ha tenido muy buen desempeño.

Base de datos

En este proyecto se uso Postgres. Esta es una base da datos de alto desempeño y muy usada. Se interactúa con ella a través de SQL. Y en ella se almacena la información de cada rostros detectado, y su relación con el frame del video en que fue obtenido.

Existe un complemento de Postgres llamado pgvector que es clave para transformar a una base de datos clásica en una base de datos para IA. Existe toda una industria centrada en interactuar con datos no estructurados que basan su funcionamiento en bases de datos de vectores. Estos vectores son una especia de «tarjeta de presentación» de los datos no estructurados (pdf, imágenes, audio, etc).

Comparación de vectores

Esta es un área de investigación muy activa y compleja, ya que el uso de vectores descriptores es la base sobre la que se sostienen muchas aplicaciones: búsqueda de imágenes, sugerencias de compra, minería de datos, etc. Además de esto, la industria de vectores descriptores está siendo usada para dar algo de orden (buscar, relacionas, entender) la gigante masa de datos no estructurados.

En el caso del reconocimiento de rostros. La forma más sencilla (pero no la más robusta) de reconocer rostros es comparar el vector latente del desconocido, contra los vectores de rostros de la base de datos. Hacer una resta y fijar un valor umbralo, bajo el cual diremos que es la misma persona y sobre el cual diremos que no lo es. Este método funciona, y si tenemos fotos muy bien tomadas, en alta resolución y buena iluminación si funciona. Pero es obviamente muy susceptible a errores cuando las condiciones no son las optimas (mala iluminación, baja resolución o mala calidad de la foto, la persona no está mirando de frente, uso de lentes, mascarilla, etc). En este proyecto usaremos un algoritmo basado en secuencias de rostros recortadas desde el video. El uso de una secuencia, en vez de solo un recorte, busca hacer mucho más robusto al algoritmo.

El código

El código esta disponible para su uso libre y gratuito en https://github.com/toopazo/airflow. Allí mismo están todas las instrucciones de instalación y ejecución.

El código hace uso de Docker para levantar una imagen de Postgres y una imagen de inferencia, ademas de otra para realizar el procesamiento de IA y el reconocimiento de rostros.

Resultados al dia 5 de Diciembre de 2024.

Actualmente el código lee el video y procesa cada frame. Extrae de él los rostros y los almacena en las siguientes tablas de la base de datos

alt_text
alt_text

Luego el sistema consulta directamente a la base de datos para ejecutar los pasos:

alt_text