Detección facial y reconocimiento de emociones a través de IA

Según trabajo de everis, es posible detectar a una persona adormecida usando puntos de referencia de reconocimiento facial, tales como una entrada de una red neuronal, una red neuronal convolucional 3D.

Se ha demostrado que el reconocimiento de actividades se puede lograr con redes neuronales convolucionales 3D o Conv3D debido a la capacidad de analizar no sólo un fotograma, sino un grupo de ellos, este grupo de fotogramas es un video corto donde se encuentra la actividad.

Habiendo dicho eso y considerando la somnolencia como una actividad que puede estar contenida en un video, tiene sentido usar Conv3D para tratar de predecir la somnolencia.

El primer paso es extraer un fotograma de una cámara, por ejemplo una webcam. Una vez que tenemos el fotograma, usamos una biblioteca de Python llamada dlib donde se incluye un detector de hito facial; el resultado es una colección de coordenadas “x”, “y” que indican dónde están los puntos de referencia faciales.

Incluso cuando obtenemos una colección de puntos, sólo nos interesa la posición de los ojos, por lo que vamos a mantener sólo los doce puntos que pertenecen a los ojos.

Hasta ahora, tenemos los hitos faciales de un fotograma. Sin embargo, queremos darle a nuestro sistema el sentido de la secuencia, y para hacerlo, no estamos considerando fotogramas individuales para hacer nuestra predicción final, es mejor tomar un grupo de ellos.

Consideramos que analizar un segundo de video a la vez es suficiente para hacer buenas predicciones de somnolencia. Por lo tanto, mantenemos la detección de diez puntos de referencia faciales, que es equivalente a un segundo de video; luego, los concatenamos en un patrón que es una matriz con la forma (10, 12, 12); 10 fotogramas con 12 puntos en coordenadas “x” y 12 puntos en coordenadas “y”. Esta matriz es la entrada de nuestro modelo Conv3D para obtener la clasificación final.

Arquitectura

La cámara web siempre transmite video, pero analizamos un fotograma cada 0.1 segundos hasta que alcanzamos 10 muestras, el equivalente a 1 segundo, para extraer los puntos de referencia del rostro y mantener sólo los puntos correspondientes a ambos ojos. Agrupamos los puntos con una superposición de siete unidades, lo que significa que agrupamos los puntos del fotograma uno al diez, el siguiente grupo se forma desde el punto del fotograma cuatro hasta el fotograma trece.

Una vez que tenemos un grupo de puntos de ojos, los pasamos a nuestro modelo neuronal para obtener una clasificación, cuyo resultado puede ser [1, 0] que representa “despierto”, o [0, 1] que representa “soñoliento”. En otras palabras, estamos analizando la transmisión de la cámara web en partes pequeñas para obtener una predicción de la somnolencia cada segundo.

Aquí puedes encontrar cómo se obtuvo cada uno de los elementos utilizados para este artículo.

  • El sistema fue implementado en python5.
  • La extracción de fotogramas de la cámara web se logró mediante OpenCV para
  • Los hitos faciales se extrajeron con la biblioteca dlib.
  • El modelo fue construido utilizando keras.
  • La parte delantera se desplegó con la ayuda de flask.

Resultados

Se entrenó un modelo final sólo por 200 etapas, el optimizador utilizado para el entrenamiento de este modelo fue ADAM. Se hicieron intentos con muchos otros modelos, pero el mejor resultado es el que se muestra aquí.

El resultado final de este trabajo es un front-end donde se muestra la cámara web del usuario. La transmisión se analiza cada segundo, y la predicción “somnoliento” o“despierto” se muestra debajo del video. Como una característica adicional en nuestro ejemplo final, si el usuario es detectado como “somnoliento”, el sistema dispara una alarma sonora.

Para más experimentos, la solución propuesta aquí puede extenderse fácilmente para trabajar en un smartphone o incluso en un sistema integrado que ejecute una distribución de Ubuntu como la conocida raspberry pi.

 

Por: Crystian Gil Morales, Senior AI Engineer para el everis AI Digital Lab.