En esta sencilla prueba de concepto creamos un detector de máscara facial que nos proteja del COVID-19 con OpenCV, Keras/TensorFlow y Deep Learning.
Para entrenar un detector de máscara facial personalizado, necesitamos dividir nuestro proyecto en dos fases distintas, cada una con sus propios subpasos respectivos (como se muestra en la Figura 1 anterior):
- 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.
Se puede hacer uso de Anaconda para la creación de un entorno virtual.
$ conda create --name <env> --file environment.yml
El conjunto de datos usados se ha obtenido del siguiente repositorio y se ha completado con algunas imágenes más de individuos de razas más dispares 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 aplica 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
- Contorno del rostro
Para quedarnos con 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 discrtizar 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 de 0.15;
- shear_range de 0.15.
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
.
El resultado del entrenamiento actual se puede consultar en TensorBoard.
$ tensorboard --logdir logs
Una vez se haya habilitado el servicio de monitorización, podemos analizar las curvas de la función de pérdida y precisión tanto sobre el training como el test dataset en local a través de:
http://localhost:6006
Actualmente, la precisión sobre el test dataset estaba alrededor del 98%
, lo suficientemente alto como para considerar que el modelo de clasificación es de buena calidad.
Ahora que nuestro detector de mascarillas está entrenado, podemos:
- Cargar una imagen de entrada desde el disco
- Detectar rostros en la imagen.
- Aplique nuestro detector de mascarilla para clasificar la cara como
con máscara
osin máscara
.
Para ello símplemente tenemos que ejecutar:
$ python detect_mask_image.py --image <route-to-image>
Esto nos devolverá la imagen con los rostros identificados y con una etiqueta de si lleva máscara o no.
Nuestro detector de mascarillas COVID-19 también puede funcionar en tiempo real.
Símplemente ejecutamos en terminal:
$ python detect_mask_video.py
Para poder servir en vídeo desde la webcam de nuestro dispositivo las predicciones de nuestro modelo.