Skip to main content

Detección de Mascarilla para COVID-19 con Tensorflowjs

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (2 votos, promedio: 5,00 de 5)
Cargando…

El COVID ha dado la excusa a muchos aficionados a realizar cierto tipo de ejercicios realizados con redes neuronales para por ejemplo detectar si las personas llevan mascarilla, si la llevan incluso bien puesta por encima de la nariz, detectar si te estás tocando la cara…

Os mostramos como poder hacer vuestro propio detector de mascarilla facial usando tensorflowjs con un código que tiene menos de 50 líneas en javascript (hay link al final). Para llegar a esta solución tan minimalista nos ayudaremos de varias ayudas:

  • La librería basada en tensorflowjs de reconocimiento facial face-api[1] que implementa el algoritmo de localización de caras en las imágenes: con SSD Mobilenet V1
  • Entrenamiento de una red convolucional que identifique a una persona con o sin máscara partiendo de un modelo de buen rendimiento: Mobilenet V2

El roadmap para llegar a la solución nos va a dar la excusa estupenda para repasar algunos logros de los algoritmos de AI que nos permiten llegar a estas soluciones tan prácticas.

Primer problema: Como encontrar una cara en una imagen

El algoritmo llamado SDD[2] (Single Shot MultiBox Detector) se encarga de detectar todo tipo de objetos en una imagen, tiene muchísimas aplicaciones, desde la conducción autónoma a la localización de objetivos en aplicaciones militares.

Esta red es principalmente la concatenación de una modelo de red neuronal convolucional, que puede ser una VGG, ResNet o una MobileNet V1 (Google 2017) más unas capas convolucionales adicionales que definen en este caso hasta unos 8732 boxes  o “pixeles” de detección que permiten delimitar donde está el objeto y que objeto es.

Nota: Hay otras redes de la misma familia que SDD (detección de objetos) como las YOLO o las R-CNN. Hay soluciones parecidas a las de este artículo basadas en ellas.

La librería face-api detecta caras y puede aplicar dos tipos de redes de detección que han sido entrenadas exclusivamente para identificar caras de personas:

  • SSD Mobilenet V1
  • TinyFaceDetector

Después de hacer algunas pruebas se observa que la mejor de las dos es la SSD Mobilenet V1 principalmente porque la TinyFaceDetector, aunque es más rápida, no encuentra las caras de las personas que tienen mascarilla. En cambio, la SDD Mobilenet V1 identifica correctamente donde está la cara lleve o no mascarilla puesta, lo cual es esencial para nuestro objetivo.

Segundo problema: Como saber si una persona tiene o no mascarilla

Este problema es tradicional, es decir, se trata de hacer una red convolucional que clasifique una imagen entre cara con o sin mascarilla. Pero no vamos a diseñar y entrenar una red desde 0 y tirarnos horas de CPU sino que vamos a partir de una red diseñada y entrenada por Google en todo tipo de imágenes, re-entrenándola más con unas imágenes adicionales de personas con y sin mascarilla.

Aquí aprovecho el esfuerzo de Prajna Bhandary[3] y Adrian Rosebrok[4], que ya se han encargado de entrenar una red de clasificación de imágenes. La red que han escogido es la MobileNetV2[5] (Google 2018), es una red muy versátil tanto para detectar como para clasificar objetos en tiempo real.

El entrenamiento de la red se ha reproducido en Python con tensorflow en menos de 15 minutos (20 epochs) en un portátil: https://github.com/m-alcu/tensorflowjs-face-api-mask-detection/blob/master/training-python/train_facemask.ipynb con una efectividad (accuracy) muy elevada:

Una vez entrenado el modelo se hacen pruebas que efectivamente nos dan el resultado esperado en imágenes nuevas de personas que tienen y no tienen mascarilla: https://github.com/m-alcu/tensorflowjs-face-api-mask-detection/blob/master/training-python/detect_facemask.ipynb

Tercer problema: Migrar el modelo de Python a Javascript

Los modelos de tensorflow (tanto el modelo como los pesos de los pesos entrenados) en Python se pueden migrar fácilmente si tiene el formato Keras que es nuestro caso: https://www.tensorflow.org/js/tutorials/conversion/import_keras

Esta exportación genera un fichero json que tiene el modelo y la estructura del modelo y uno o varios ficheros adicionales (shards) con los pesos de la red.

De esta forma, podemos aprovechar el modelo entrenado en tensorflow (Python) para hacer predicciones con tensorflowjs (javascript)

Cuarto problema: ¿Cómo concatenamos la detección de las caras con la clasificación de la mascarilla?

Este es un problema de integración de dos librerías.

  • Usar Face-api,js para detectar todas las caras en una imagen de video proporcionada por nuestra cámara
  • Usar Face-api,js para extraer todas las caras detectadas así como la posición en la que se encuentran.
  • Analizar cada una de las caras en la segunda red que nos predice si tiene o no mascarilla
  • Usar de nuevo Face-api para pintar en cada cara un recuadro señalando la cara y una etiqueta con el resultado de la predicción de la segunda red.

El código puede encontrarse en: https://github.com/m-alcu/tensorflowjs-face-api-mask-detection/tree/master/detect-js

Y la versión online de la misma (solo para Chrome de momento) en: https://m-alcu.github.io/tensorflowjs-facemask/

Conclusiones y siguientes pasos

Este es un simple ejercicio de como la AI es accesible para todos y puede ayudar en situaciones cotidianas. Hemos utilizado los recursos que existen en cuanto a modelos ya entrenados y a librerías que ayudan a llegar a la solución de forma eficiente con pocas líneas de código.

Por supuesto, hay margen de mejora en la red de predicción debido a que las imágenes recogidas por la primera etapa son caras muy recortadas, en contraposición a la red con la que se entrenó dicha fase en python. Sería bastante sencillo emplear la primera etapa de forma separada para ir recortando y almacenando caras con y sin mascarilla recogidas de internet, e incluso entrenar con imágenes de personas que tienen la mascarilla mal colocada clasificándolas como ‘no mask’.

Mayor compatibilidad. Se puede añadir compatibilidad para Firefox / Safari principalmente debido que el componente de video navigator.getUserMedia en otros navegadores tiene otro nombre.

  1. https://github.com/justadudewhohacks/face-api.js/
  2. http://ceur-ws.org/Vol-2500/paper_5.pdf
  3. https://github.com/prajnasb/observations
  4. https://www.pyimagesearch.com/2020/05/04/covid-19-face-mask-detector-with-opencv-keras-tensorflow-and-deep-learning/
  5. https://ai.googleblog.com/2018/04/mobilenetv2-next-generation-of-on.html
Martin Alcubierre Arenillas

Martin Alcubierre Arenillas

Ingeniero de Telecomunicaciones, con más de 15 años de Jefe de Proyecto en el sector de Banca-Seguros y Utilities, principalmente en integración de sistemas y proyectos de Business Intelligence. Desde hace 3 años participando en proyectos de desarrollo de soluciones móviles en el ámbito de la Salud (mHealth).

Martin Alcubierre Arenillas ha escrito 4 entradas


Martin Alcubierre Arenillas

Martin Alcubierre Arenillas

Ingeniero de Telecomunicaciones, con más de 15 años de Jefe de Proyecto en el sector de Banca-Seguros y Utilities, principalmente en integración de sistemas y proyectos de Business Intelligence. Desde hace 3 años participando en proyectos de desarrollo de soluciones móviles en el ámbito de la Salud (mHealth).

Deja un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.