IA para detectar EPIs y Distancia Social

Enrique Blanco    23 junio, 2020
Figura 1. Equipos de Protección Inividual (EPI) que tan familiares se han vuelto.

Dadas las circunstancias actuales, de la pandemia que estamos viviendo, desde el departamento de Ideas Locas seguimos interesándonos por todas aquellas soluciones que puedan ofrecer algún tipo de ayuda, en especial cuando están relacionadas con Machine Learning y Deep learning. En el anterior artículo sobre IA, hablamos de cómo se podría abordar la detección de afecciones respiratorias haciendo uso de Transfer Learning.

En este artículo traemos una serie de soluciones que,  haciendo uso de visión artificial, nos permiten determinar:

  • si un sujeto lleva puesta, o no, una mascarilla;
  • si esa persona lleva, o no, guantes;
  • si dentro de un determinado entorno se está manteniendo la distancia de seguridad.

En el artículo realizado a finales de mayo por Fran Ramírez en elladodelmal pudimos ver una prueba de concepto (PoC) adaptada a Raspberry Pi para la detección de rostros con mascarilla, para que, cualquier persona con un pequeño dispositivo en casa, pueda hacer uso de esta PoC.

Detección de mascarillas en rostro

Empecemos viendo cómo podemos crear un motor de visión artificial que nos permita determinar si una persona lleva la protección facial adecuada. El código lo tenéis disponible en el siguiente repositorio.
Para realizar un detector de máscara facial personalizado, necesitamos dividir nuestro proyecto en dos fases distintas:

  • Entrenamiento: aquí nos enfocaremos en cargar nuestro conjunto de datos de detección de máscara facial desde el disco, entrenar un modelo (usando Keras / TensorFlow) en este conjunto de datos y luego serializar el detector de máscara facial en local;
  • Despliegue: Una vez que el detector de máscara facial está entrenado, podemos pasar a cargar el detector de máscara, realizar la detección de la cara y luego clasificar cada cara como Mask o No Mask.

Dataset

El conjunto de datos usados se ha obtenido del siguiente repositorio y se ha completado con algunas imágenes más de individuos de distintas etnias para garantizar un modelo más robusto.
En total, el conjunto de datos consta de 1.442 imágenes que pertenecen a dos clases:

  • Con máscara: 723 imágenes
  • Sin máscara: 719 imágenes

Este método es, en realidad, mucho más fácil de lo que parece una vez que aplicamos puntos de referencia faciales al problema. Los puntos de referencia faciales nos permiten inferir automáticamente la ubicación de las estructuras faciales, que incluyen: ojos, cejas, nariz, boca y contorno del rostro.

Para obtener la Region of Interest (ROI) que enmarca el rostro: Entendemos que incluir la máscara en las imágenes y tapar ciertos landmarks ayudará al modelo a discretizar las muestras satisfactoriamente.

Sobre el dataset disponible se hace data augmentation durante el entrenamiento:

  • Rotación aleatoria de cada imagen de hasta 20 grados;
  • Desplazamiento en altura y anchura de hasta el 20% de la dimensión de la imagen;
  • Horizontal flipping;
  • ‘zoom_range’ y ‘shear_range’ de 0.15

Entrenando el modelo

Se usa Keras y TensorFlow para entrenar a un clasificador para detectar automáticamente si una persona usa una máscara o no. Para llevar a cabo esta tarea, ajustaremos la arquitectura MobileNet V2, una arquitectura altamente eficiente que se puede aplicar a dispositivos integrados con capacidad computacional limitada (por ejemplo, Raspberry Pi, Google Coral, NVIDIA Jetson Nano, etc.).

Ejecutando el siguiente comando:

$ python train_mask_detector.py --dataset dataset

Se lanza un entrenamiento que terminará cuando la condición de EarlyStopping implementada se cumpla. Lo que estamos haciendo es un fine-tuning de MobileNetv2 para ahorrar tiempo y garantizar una buena predicción.
Se obtienen dos checkpoints tras el entrenamiento: mask_detector_model.h5 y mask_detector.model.

Actualmente, la precisión sobre el test dataset está alrededor del 98%, lo suficientemente alta como para considerar que el modelo de clasificación es de buena calidad.

Detectando en vídeo

Nuestro detector de mascarillas COVID-19 también puede funcionar en tiempo real. Simplemente ejecutamos en terminal:

$ python detect_mask_video.py

Para poder servir en video, desde la webcam de nuestro dispositivo, las predicciones de nuestro modelo. En el siguiente vídeo encontraréis un ejemplo de detección en tiempo real.

Vídeo 1:Comprobando el uso de mascarillas en tiempo real.

Detección de guantes

Continuamos con un modelo que “trackea” las manos de un sujeto en un vídeo y, por otro lado, determina si lleva puestos, o no, guantes. El código está disponible en este siguiente enlace.

Para ello, se hace uso del siguiente repositorio y de un modelo entrenado en Teachable Machine, herramienta de la que ya hemos hablado en este blog, cuyo checkpoint también se facilita en el código enlazado. En la carpeta Teachable Machine Gloves Detection se incluye todo el material descargable de ese servicio.

Para entrenar este último modelo de Machine Learning, se han tomado aproximadamente unas 1000 fotografías de manos con guantes (gloves-on) y otras 1000 fotografías de manos sin guantes (gloves-off) en diversas posiciones, siguiendo una estrategia similar de data augmentation a la especificada en el apartado anterior. Para poder servir de manera rápida este modelo lanzamos una predicción sobre cada imagen servida por la webcam y lo mezclamos con el modelo de detección y seguimiento de manos.

Detectando en vídeo

Para poder hacer uso de la PoC tras hacer un setup del entorno virtual necesario, simplemente se tiene que ejecutar el script.

$ python detect_single_threaded_gloves.py

Un ejemplo rápido de cómo funciona se facilita en el siguiente vídeo.

Video 2. Tracking de manos y detección de guantes a través de la webcam.

Comprobando que se respeta la distancia social

De manera muy rápida hemos investigado la posibilidad de medir la distancia social COVID-19 usando OpenCV, Deep Learning. Este código está basado en el siguiente artículo de pyimagesearch.

Los pasos para construir un detector de distanciamiento social incluyen:

  • Aplicar la detección de objetos para detectar a todas las personas (y solo a las personas) en una transmisión de video
  • Calcular las distancias por pares entre todas las personas detectadas
  • De acuerdo a las distancias recogidas, verificar si dos personas están separadas por menos de N píxeles.

Todos los detalles del código implementado lo tenéis en este tercer repositorio de GitHub.

Cálculo de las distancias entre sujetos

Para su uso, simplemente ejecutamos:

$ python social_distance_detector.py --input input.mp4  \ --output output.avi --display 0

Aspectos a mejorar

El detector de distanciamiento social no aprovecha una calibración de cámara adecuada, lo que significa que, para medir la distancia entre individuos, lo que realmente estamos haciendo (hasta ahora) es medir las distancias en píxeles. Claramente, es una buena solución si se trata de un estudio en 2D pero, en este caso, como estudiamos un caso tridimensional, este aspecto debía mejorar.

Por lo tanto, el primer paso para esta mejora de nuestro detector de distanciamiento social es utilizar una calibración de cámara adecuada. Una vez hecho esto, podremos calcular unidades de medida reales (en lugar de píxeles). En segundo lugar, debe considerar aplicar una transformación de arriba hacia abajo de su ángulo de visión.

En este punto Marta Vilá, recientemente incorporada al equipo de Ideas Locas, se puso manos a la obra y desarrolló una rutina que nos permite corregir la distorsión introducida en la perspectiva de la imagen.

Figura 1. Corrección vista aérea desde una cámara en vivo de la Plaza de España en Roma.

Además, nos topamos con otra implementación que permitía estimar el grado de ocupación de un volumen definido por el usuario sobre un video. El repositorio con todo el código necesario puede encontrarse en el siguiente enlace.

Video 3. Monitorización de la distancia de seguridad en un entorno elegido por el usuario.

Cómo habéis visto, siguiendo siempre la misma estrategia de entrenamiento de modelos de clasificación de imágenes y haciendo uso de librerías como Keras u OpenCV, podemos crear o aprovechar herramientas de manera muy rápida que pueden ayudarnos a controlar ciertos entornos. Juntando todas soluciones, por ejemplo, podemos impedir la entrada a una sala de reuniones a una persona si no lleva mascarilla y/o guantes o incluso, si, dentro de un entorno controlado, mantienen la distancia de seguridad.

Para mantenerte al día con LUCA visita nuestra página web,  suscríbete a LUCA Data Speaks o síguenos en TwitterLinkedIn YouTube.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *