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.
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.
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.
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.
En la capa de negocios se emplea el lenguaje Python con las siguientes librerías:
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.
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.
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:
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:
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:
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.
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)