Cree su aplicación web para detectar mascarillas usando Python, OpenCV, Tensorflow y Streamlit
marzo 31, 2021Í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:
- Necesitamos identificar rostros a partir de una imagen.
- Esto lo realizaremos usando OpenCV
- 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:
- Usamos OpenCV para convertir la imagen en escala de grises.
- Detectamos rostros de la imagen en escala de grises:
- Usamos la función CascadeClassifier y detectMultiScale para reconocer imágenes.
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.
Hola, por alguna razon no me permite utilizar la camara, aguna idea?
Hola José. Gracias por leer la publicación.
¿Qué mensaje de error te ha salido?
Saludos.
Hola, me ayudarías por favor. Cual es este modulo ModuleNotFoundError: No module named ‘training ?
Training es la ruta donde se encuentra el entrenamiento del modelo:
https://github.com/Jazielinho/face_mask_detector/tree/master/training
Hola, genial implementación, me podrías ayudar, no logro identificar este modulo :
ModuleNotFoundError: No module named ‘config_tr’
Hola Emerson, tienes que usar este config (Está en mi github):
https://github.com/Jazielinho/face_mask_detector/blob/master/training/config_tr.py
Son parámetros de configuración (tamaño de la imagen, directorio donde se guardan los modelos y las imágenes)
Con Deep Learning, cómo sería? Saludos
Hola Luis? Qué parte de la publicación quisieras el uso de Deep Learning? Yo lo uso para clasificar si una persona tiene o no mascarilla.
Saludos.
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’
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.
mil gracias por tu respuesta, me sirvió mucho tu aplicación, saludos
¡Muchas gracias a ti por leerlo!
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’