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

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

marzo 31, 2021 13 Por Jahaziel Ponce

Í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.

¡No te pierdas mis últimas publicaciones!

¡No te enviaré spam!