FaceMask Detector

Este proyecto se trata de una aplicación de escritorio con Python y OpenCV, que detecta el uso de máscara o barbijo.

Tecnologías: Python - OpenCV - SQLite - Tkinter

Descripción del proyecto

En este proyecto se hará uso de la librería OpenCV para Python. OpenCV usa algoritmos de Machine Learning para buscar rostros dentro de una imagen. La forma de lograr esto es reconociendo cientos de pequeños patrones y características que deben coincidir durante el procesamiento de imágenes.

A partir de esto, el objetivo principal del programa es, dada una imagen, reconocer en primer lugar si existe un rostro humano dentro de ella, y si ese es el caso, detectar si la persona está usando cubrebocas. Teniendo en cuenta que un video es una serie ordenada de imágenes, es posible extender esta aplicación, y de esta forma poder lograr que el programa reconozca en videos a tiempo real si la persona que aparece en él está haciendo uso del cubrebocas o no.

Adicionalmente, el programa guardará en una base de datos los estados ‘con máscara’ o ‘sin máscara’ detectados en tiempo real, junto con la fecha y hora de ocurrencia. Esto permitirá realizar estadísticas diarias, semanales, y mensuales, que serán mostradas a través de gráficas a modo de reportes.

Bosquejo de Arquitectura

La arquitectura de la aplicación utilizará una estructura de 3 capas, las cuales se dividen en una capa de presentación (es decir, todo lo relacionado a la interfaz gráfica del usuario), una capa de negocios, que contendrá todos los cálculos y algoritmos de procesamiento de las imágenes, y por último una capa de datos, que almacenará los estados según corresponda.

Esquema de capas

Modelo Funcional

El modelo funcional de la aplicación consiste en, a través de una cámara web obtener video a tiempo real, y de él, extraer un frame cada cierto periodo de tiempo. Este frame será procesado con la librería OpenCV, donde se detectará si existen rostros humanos y si es así, su posición en el espacio de la imagen.

Luego, esa imagen será enviada a un modelo entrenado por la librería TensorFlow que nos devolverá una predicción de acuerdo a las características detectadas. Una vez obtenidas las predicciones, se clasificará el estado con las etiquetas ‘con máscara’ o ‘sin máscara’ y se procederá a dibujar sobre la imagen del video un rectángulo del color determinado (rojo o verde según el caso).

Además, se guardará un registro en la base de datos de todos los estados que se detecten. La decisión de si el estado actual debe guardarse o no, corresponde a la siguiente premisa: si pasaron más de 30 segundos desde que se guardó el último estado o si el estado actual es distinto del anterior, se registra. Caso contrario, se desecha. De esta forma se tiene un registro de datos consistentes que no ocupan rápidamente el espacio de almacenamiento disponible en la base de datos.

Modelo funcional

Requerimientos

Funcionales

  • El sistema debe extraer una imagen (frame) a partir de un video a tiempo real, en el cual una persona esté situada de frente a la cámara.
  • El sistema debe detectar un rostro humano dentro de una imagen extraída e identificarla como área de interés (ROI).
  • El sistema debe dibujar un recuadro en la zona de interés (ROI) del video, coloreado según la clasificación de la imagen.
  • El sistema debe almacenar en una base de datos el registro de la fecha y hora, y la clasificación provenientes de la imagen analizada.
  • El sistema debe permitir al cliente consultar los datos históricos a partir de estadísticas diarias, semanales y mensuales del sistema.

No Funcionales

  • El sistema debe ejecutarse desde un único archivo .py llamado app.py. (Portability)
  • El sistema debe diseñarse con la arquitectura en 3 capas. (Maintainability)
  • El sistema debe utilizar control de versiones mediante GIT. (Maintainability)
  • El sistema debe estar programado en Python 3.8 o superior. (Maintainability)
  • El sistema debe detectar el uso de la máscara el 90% de las veces. (Reliability)
  • El sistema debe funcionar en un equipo hogareño estándar. (Performance)
  • El sistema deberá cumplir con un tiempo de respuesta menor a 1 segundo. (Performance)
  • El sistema debe utilizar una base de datos SQL o NoSQL (Flexibility)

Stack Tecnológico

Capa de Datos

En la capa de datos se utilizó SQLite. SQLite es una herramienta de software libre, que permite almacenar información en distintos dispositivos de una forma sencilla, eficaz, potente y rápida. La elección de esta tecnología tiene que ver con la sencillez de los datos a registrar y con la velocidad de escritura que requieren los mismos. Además, al no manejar ningún dato sensible dentro de la aplicación, no se requiere un mayor nivel de seguridad que el que provee este motor de base de datos.

Capa de Negocio

En la capa de negocios se emplea el lenguaje Python con las siguientes librerías:

  • MatPlotLib: Es una librería especializada en la creación de gráficos en dos dimensiones. Permite crear y personalizar los tipos de gráficos más comunes, entre ellos histogramas, diagramas de barra, diagramas de líneas, etc.
  • Tensor Flow: Es una librería de código abierto para cálculo numérico, usando como forma de programación grafos de flujo de datos. Con esta librería somos capaces, entre otras operaciones, de construir y entrenar redes neuronales para detectar correlaciones y descifrar patrones, análogos al aprendizaje y razonamiento usados por los humanos.
  • Numpy: Es una librería especializada en el cálculo numérico y el análisis de datos, especialmente para un gran volumen de datos. Incorpora una nueva clase de objetos llamados arrays que permite representar colecciones de datos de un mismo tipo en varias dimensiones, y funciones muy eficientes para su manipulación.
  • OpenCV: Es una biblioteca libre de visión artificial originalmente desarrollada por Intel. OpenCV significa Open Computer Vision (Visión Artificial Abierta). Entre otras cosas, permite la detección de movimiento, reconocimiento de objetos, reconstrucción 3D a partir de imágenes, reconocimiento facial, etc.

Es importante aclarar que para poder entrenar al modelo que detecta si una persona tiene máscara o no, se utilizó la herramienta Teacheble Machine de Google (teachablemachine).

Para esto, se ingresó en la aplicación un Dataset que contenía aproximadamente 1400 imágenes subdivididas en dos categorías: rostros con máscara y rostros sin máscara. De esta forma, el software de Google nos dio como resultado un conjunto de archivos .py que contienen los algoritmos que clasifican una imagen dada, según las características de la misma.

Capa de Presentación

Para la presentación se hizo uso de la biblioteca gráfica TKinter, utilizando el paradigma orientado a objetos que permite la misma. El uso de esta biblioteca tiene que ver con la sencillez de la interfaz que provee. De esta manera, se puede integrar correctamente a OpenCV sin consumir demasiados recursos gráficos, altamente necesarios en el caso de esta aplicación, ya que muestra videos a tiempo real.

Operaciones de la capa de negocio

  • Cuando el usuario inicia la cámara (luego de clickear el botón iniciar), el sistema buscará rostros en la imagen de video. Para esto, actuará la librería de Python llamada ‘face_recognition’ realizando las siguientes operaciones 1:

    1. Se convierte la imagen de color a blanco y negro, dado que no se necesita color para encontrar rostros.
    2. Se observa cada uno de los pixeles de la imagen, junto con los que lo rodean. De esta forma, podemos darnos cuenta de qué tan oscuro es el píxel actual comparándolo con los que están a su alrededor.
    3. Luego se traza un vector (llamado gradiente) que indica en qué dirección la imagen se vuelve más oscura.
    4. Se repiten los pasos 2 y 3 para cada píxel de la imagen, reemplazando cada píxel por su gradiente.
    5. Dado que guardar el gradiente de cada uno de los píxeles nos devolvería demasiada calidad, la cual es innecesaria, se divide la imagen en pequeños cuadrados de 16x16 píxeles cada una.
    6. En cada cuadrado, se cuentan cuántos gradientes apuntan en cada dirección (cuantos apuntan hacia arriba, hacia arriba a la derecha, a la derecha, etc.)
    7. Se reemplaza ese cuadrado en la imagen con los gradientes direccionados más fuertes, construyendo un HOG (Histogram of Oriented Gradients).
    8. El HOG indica la localización de los límites del rostro en la imagen.
  • Una vez localizado el rostro, el sistema tomará una captura del video y guardará la imagen capturada en una carpeta llamada ‘imagenes’ con el nombre ‘Frame’ en formato .jpg

  • La ruta ./imágenes/Frame.jpg será enviada a la función ‘detect_mask’ el cual detectará si el rostro reconocido está utilizando cubrebocas o no, devolviendo las predicciones realizadas, siguiendo los pasos:

    1. Se crea un array del tamaño correcto para alimentar el modelo entrenado.
    2. Se normaliza la imagen, llevándola al tamaño definido sin causar distorsiones en ella.
    3. La imagen normalizada se inserta en el array, y se envía al modelo entrenado, para que el motor de inferencia realice sus predicciones.
  • De acuerdo a los números devueltos en las predicciones, se utilizará el color verde para indicar que la persona está haciendo uso de la máscara cuando esta sea mayor al 60% en su categoría. Caso contrario, se utilizará el color rojo para indicar que la persona no está haciendo uso de la máscara.

  • En la ventana de video, se mostrará el video a tiempo real, indicando la localización del rostro con un rectángulo del color definido a partir de la regla anterior, en conjunto con un texto sobre el video que indique si la persona tiene máscara o no y su porcentaje de predicción.

  • En una sección debajo de la ventana de video se mostrará un mensaje que diga ‘Acceso permitido’ en verde o ‘Acceso denegado’ en rojo según la correspondiente predicción. Es decir, si la persona está haciendo uso de la máscara, se referirá al primer caso y si no lo está haciendo, se referirá al segundo.

  • El estado será guardado en la base de datos si cumple con alguna de las siguientes condiciones:

    • El último estado guardado es distinto al estado actual (es decir se guardó un estado ‘sin_mascara’ y el estado actual es ‘con_mascara’ o viceversa) y pasaron más de 5 segundos desde que se registró el estado anterior.
    • El último estado guardado fue registrado hace más de 30 segundos.
  • Los datos de la sesión actual serán contados desde el tiempo en que se inicia la aplicación hasta que se finaliza, independientemente si se cerró la ventana de video.

  • Las estadísticas del mes mostrarán la suma de los datos por categoría de los últimos 30 días, finalizando en el día anterior a la fecha actual.

  • Las estadísticas de la semana mostrarán la suma de los datos por categoría a partir del último lunes previo a la fecha actual, independientemente del día de la semana en que se encuentre.

Capturas de pantalla

captura1

captura2

 

captura4


1 Machine Learning is Fun! Part 4: Modern Face Recognition with Deep Learning (https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78)