Cree su aplicación web para detectar mascarillas usando Python, OpenCV, Tensorflow y Streamlit

Índice

Introducción

En este tutorial aprenderemos a crear una aplicación web para reconocer en tiempo real si las personas tienen o no máscara.

El proceso se ilustra en el siguiente gráfico:

De la imagen podemos observar los siguiente pasos:

  1. Necesitamos identificar rostros a partir de una imagen.
    • Esto lo realizaremos usando OpenCV
  2. Necesitamos predecir si los rostros tienen o no máscara.
    • Esto lo realizaremos usando nuestro modelo entrenado con Tensorflow.

Para generar nuestra aplicación web usaremos la biblioteca Streamlit

1. Detectando rostros

Antes de predecir si un rostro tiene o no mascarilla, necesitamos primero identificar rostros a partir de una imagen. Si no encontramos rostros, muestro modelo no predecirá si tiene o no mascarillas; pero si encontramos un rostro, nuestro modelo tendrá que predecir.

El siguiente código Python identifica rostros:

Las siguientes imágenes muestran el resultado de este código:

  • Imagen inicial:

  • Rostros detectados:

Podríamos probar con modelos basados en redes neuronales, pero vamos a quedarnos con el resultado de OpenCV. Si quieren un modelo de reconocimiento de rostros usando Deep Learning póngalo en los comentarios por favor.

Listo, detección de rostros ok!!!. Ahora a entrenar nuestro modelo!!!

2. Modelo ML

A continuación, vamos a entrenar un modelo que nos ayude a predecir si un rostro tiene o no máscara.

Basándonos en los pasos que realizamos en la publicación del juego de Dino, realizaremos lo siguiente:

1. Descargando imágenes

Los datos los he descargado de Kaggle. Este conjunto de datos consta de 7553 imágenes agrupadas en dos clases:

  • with_mask: imágenes de rostros con mascarilla.

  • without_mask: imágenes de rostros sin mascarilla.

Además, los datos están balanceados, por lo que no tenemos que adaptar nuestra función de pérdida.

2. Entrenando y evaluando el modelo

El siguiente enlace escrito en Jupyter Notebook explica los pasos que realicé para entrenar el modelo. Es importante tener en cuenta lo siguiente:

1. Aumento de datos

Para entrenar redes neuronales necesitamos muchas imágenes. Para solucionar esto, aplicamos los siguientes aumentos de datos:

  • preprocessing_function: preparamos los datos antes de entrenar y predecir por la red neuronal.
  • rotation_range: rotamos la imagen aleatoriamente.
  • width_shift_range: desplazamos la imagen aleatoriamente, tanto a la izquierda como a la derecha. Para más información, puede ver el siguiente enlace.
  • height_shift_range: desplazamos la imagen aleatoriamente, arriba y abajo. Para más información, puede ver el siguiente enlace.
  • shear_range: recortamos la imagen aleatoriamente.
  • zoom_range: acercamos y alejamos aleatoriamente la imagen.
  • horizontal_flip: invertimos la imagen de manera aleatoria horizontalmente.
  • vertical_flip: invertimos la imagen de manera aleatoria verticalmente.

Si quiere revisar todos los argumentos, puede ir a este enlace.

2. Transferencia de aprendizaje

Vamos a aprovechar un modelo que ha aprendido de un gran conjunto de imágenes. Este modelo pre-entrenado es MobileNet. Elegimos este modelo ya que el problema no es muy complicado y queremos que el modelo sea portable (pese poco).

3. Regularización y callbacks

Unas técnicas para que nuestro modelo pueda generalizar y no sobreajustar son:

  • Regularización. Añadimos una restricción en forma de regularización a nuestras pesos.
  • Callbacks. En este caso usamos:
    • parada temprana (early stooping), si vemos que nuestro modelo no mejora la métrica (cross entropía) en nuestro conjunto de validación, detenemos el entrenamiento y nos quedamos con los mejores pesos.
    • learning rate: si vemos que nuestro modelo no mejora la métrica (cross entropía binaria) en nuestro conjunto de validación, reducimos nuestro ratio de aprendizaje

¡Listo! Ya tenemos nuestro modelo creado y almacenado, ahora sigue crear nuestra aplicación web.

3. Creando nuestra aplicación Web

Vamos a usar la biblioteca Streamlit para crear nuestra aplicación web.

El siguiente código Python realiza los siguientes pasos:

  • Acceder a la cámara de nuestro ordenador.
  • Realizar capturas.
  • Identificar y predecir rostros

Para ejecutar nuestro programa tenemos que escribir lo siguiente:

Esto abrirá automáticamente una nueva pestaña con nuestra aplicación. Si no abre automáticamente, aparecerá un mensaje con la url a la que tenemos que acceder:

4. ¡A probar!

El siguiente video muestra a nuestro modelo jugando 😀

Y eso es todo, hemos creado una aplicación web para identificar si tenemos o no puesta mascarilla.

El código completo lo pueden encontrar en el siguiente enlace: https://github.com/Jazielinho/face_mask_detector

Todo comentario es bienvenido.

close

¡No te pierdas mis últimas publicaciones!

¡No te enviaré spam!

13 respuestas a «Cree su aplicación web para detectar mascarillas usando Python, OpenCV, Tensorflow y Streamlit»

  1. Hola, genial implementación, me podrías ayudar, no logro identificar este modulo :

    ModuleNotFoundError: No module named ‘config_tr’

  2. mil gracias por tu aporte, disculpa, sabes por que sale este error

    File “C:\Users\PC-GARCIA\Documents\detectorMascarillas\face_mask_detector-master\face_mask_detector-master\mask_detector_app.py”, line 27, in load_model
    model_file = open(config_tr.MODEL_PATH_JSON, ‘r’)

    PermissionError: [Errno 13] Permission denied: ‘D:/10_PUBLICACIONES/publicaciones/face_mask_detector/models/model.json’

    1. Hola Carlos, gracias por leer mi artículo, espero te haya gustado.
      Respecto a tu pregunta, para realizar la predicción necesita cargar unos ficheros: un json (con la arquitectura del modelo) y un h5 (con los pesos del modelo). La dirección se define en el fichero config_tf. En github se encuentran en la ruta D:, parece que los ficheros no están en esa ruta y falla al leer. Si los ficheros json y h5 se encuentran en otra dirección, basta con actualizar los valores de las variables MODEL_PATH_JSON y MODEL_PATH_H5.
      Saludos.

  3. Hola una pregunta ¿Cual es la finalidad de la siguiente linea de código?
    img_path = ‘C:/Users/jahaz/OneDrive/Escritorio/Rostros-reveladores…-¿Qué-dice-el-tuyo.jpg’

Deja una respuesta

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