Universidad Autónoma Metropolitana Unidad Azcapotzalco División de Ciencias Básicas e Ingeniería Licenciatura en Ingeniería en Computación Clasificador de imágenes especializado en detectar cubrebocas en tiempos de Covid-19 Proyecto de Investigación 2020 Primavera Santiago Peña Rodríguez 2163035605 al2163035605@azc.uam.mx Dra. Silvia Beatriz González Brambila Titular Departamento de Sistemas sgb@azc.uam.mx 11 de marzo de 2021 Declaratoria Yo, SILVIA BEATRIZ GONZÁLEZ BRAMBILA, declaro que aprobé el contenido del presente Reporte de Proyecto de Integración y doy mi autorización para su publicación en la Biblioteca Digital, así como en el Repositorio Institucional de UAM Azcapotzalco. Yo, SANTIAGO PEÑA RODRÍGUEZ, doy mi autorización a la Coordinación de Servicios de Información de la Universidad Autónoma Metropolitana, Unidad Azcapotzalco, para publicar el presente documento en la Biblioteca Digital, así como en el Repositorio Institucional de UAM Azcapotzalco. Resumen La situación de pandemia que se está viviendo en el mundo debido al Covid-19 ha obligado al ser humano a lucir la creatividad e inteligencia que le caracteriza, desde vacunas desarrolladas en tiempo récord hasta sobrellevar el abrupto cambio de pasar de una sociedad y economía presencial a una digital. Es por eso que en este trabajo se quería depositar una pequeña semilla que ayude a mitigar los terribles daños que la enfermedad ha causado en las personas y se pueda volver pronto a una nueva normalidad. Dicho esto, se empezó con el objetivo de armar un clasificador de imágenes con personas presentes para que estas sean catalogadas entre: con cubrebocas, mal cubrebocas o sin cubrebocas, debido a que actualmente los clasificadores que se centran en esta tarea únicamente entregan un resultado binario: con cubrebocas o sin cubrebocas, sin embargo, es muy importante catalogar a las personas que llevan puesto un cubrebocas pero de manera incorrecta, ya que disminuye la efectividad de evitar la propagación del virus. Para esto se utilizó el segmentador por instancias Yolact, ya que sus tiempos de inferencia permiten procesar 30 imágenes por segundo lo que ya se cataloga como en tiempo real para su uso en videos. El conjunto de datos se compuso de 979 imágenes divididas en: 775 para entrenamiento, 154 para validación y 50 para prueba. El formato que se utilizó para hacer las anotaciones fue el de MS COCO, el cual se basa en armar conjuntos de imágenes no icónicas de los objetos que se buscan detectar, ya que busca que los modelos se entrenen al comprender el contexto en el que suelen estar presentes los objetos. Para las anotaciones se utilizó la herramienta labelme que permite delimitar la máscara del elemento y con esta calcular su caja de contorno. Una vez listo el conjunto de datos, se pasó a la configuración de Yolact para iniciar el entrenamiento que se ejecutó en el entorno de nube Google Colab, debido a que no se contaban con los recursos computacionales necesarios para realizar el entrenamiento de la red, el cual brinda acceso gratuito a GPUs para realizar prácticas de inteligencia artificial. Se efectuaron diversos experimentos para determinar el protocolo a emplear en las anotaciones que arrojaran mejores resultados, ajustar hiper parámetros de la red y elegir la arquitectura a utilizar entre las que actualmente opera Yolact. Finalmente se llegó a un modelo que satisfacía los requerimientos y cumplía con el objetivo de catalogar las imágenes entre las tres categorías propuestas. Los resultados obtenidos con este modelo son: calificación mAP de 88.68 en la generación de la máscara y 1 una de 85.71 para la caja; puntaje F1 de 100% para ejemplos con cubrebocas, 97.8% sin cubrebocas y 96% en instancias con mal cubrebocas. En los diversos videos procesados se alcanzó a procesar desde 26 hasta 37 imágenes por segundo, lo que hacía muy fluidas las detecciones y sin sacrificar certeza en las clasificaciones, las cuales entregaron resultados igualmente buenos que en la prueba con imágenes. Con el trabajo que se realizó, se cree que se cumplieron las expectativas y que el clasificador servirá tanto para un uso práctico como académico. Lo primero porque los resultados sugieren que por su rendimiento está apto para clasificar ambientes sociales con fines estadísticos de uso. Lo segundo porque Yolact es un fuerte candidato para desarrollar modelos de visión por computadora, y debido a su reciente publicación, aún no hay mucho material con el cual apoyarse en caso de fallos, por lo que este proyecto puede servir como guía durante todo el desarrollo de algún otro cometido que se quiera realizar mediante Yolact. 2 Índice 1. Introducción 1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2. Justificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.3. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3.1. Objetivo General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3.2. Objetivos Específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.4. Trabajos Relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4.1. MOXA: A deep learning based unmanned approach for real-time monitoring of people wearing medical masks . . . . . . . . . . . . . . . . . 8 1.4.2. A hybrid deep transfer learning model with machine learning methods for face mask detection in the era of the COVID-19 pandemic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4.3. COCO (Creating Common Object in Context) Dataset for Chemistry Apparatus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2. Entorno 2.1. Marco Teórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.1.1. Aprendizaje profundo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.1.2. Visión por computadora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.1.3. Red neuronal convolucional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.1.4. Red residual (Resnet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.1.5. Transferencia de aprendizaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.1.6. Microsoft COCO: Common Objects in Context . . . . . . . . . . . . . . . 27 2.1.7. PyTorch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.1.8. Yolact . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.1.9. Google Colab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3 3. Exposición 3.1. Desarrollo del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.1.1. Planeación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.1.2. Obtención de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.1.3. Acondicionamiento de los datos . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.1.4. Ajuste de configuraciones y parámetros a Yolact . . . . . . . . . . . . . . 42 3.1.5. Entrenamiento con Yolact . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.1.6. Evaluación de Yolact . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4. Desenlace 4.1. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.2. Discusión de los resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.3. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.4. Trabajos futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Apéndice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 A. Familiarización con los componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 B. Prueba de dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 C. Afinar anotaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 D. Equilibrar dataset y aplicar transferencia de aprendizaje . . . . . . . . . . . . . . . . . . . . 72 E. Ajustar ritmo de aprendizaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 F. Ajustar lote de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 G. Tipos de arquitectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 H. Definir el número de anclas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Videos 1. Labelme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 2. Resultados para video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4 Introducción 1.1 Introducción La pandemia causada por el virus SARS-COV 2 ha impulsado una ola masiva de proyectos e investigaciones por todo el mundo para poder disminuir los efectos nocivos en la población, así como el número de contagios, razón por la que a nivel internacional se promueve el uso de cubrebocas [1]. En el campo de la computación, la inteligencia artificial está presente para contribuir desde diversos enfoques al control de esta pandemia. Es por eso que se incursionó en la parte de la visión por computadora que busca procesar, analizar y comprender imágenes. Siguiendo estos pasos se buscó clasificar imágenes en video, que contengan personas, en tres categorías: trae cubrebocas y lo usa correctamente, trae cubrebocas pero no lo usa adecuadamente y no trae cubrebocas. La forma en que se abordó este propósito fue utilizando el método de segmentación Yolact [3] que se enfoca en la segmentación por instancia, además de seguir la metodología de anotaciones MS COCO [2] para el conjunto de imágenes con las que se entrenó a la red. Para esto último, se necesitó reconocer en primer término la forma de un cubrebocas, ya que existen varios diseños de estos, y fue de mucha utilidad detectar la mayor cantidad. También fue importante determinar qué se considera como uso correcto. Por ello se buscó conseguir la mayor cantidad de imágenes para que diera diversidad en el tipo de cubrebocas así como las zonas donde se encuentra. El presente documento tiene la siguiente estructura: Marco teórico donde se exponen los términos necesarios, así como las tecnologías empleadas, para seguir el procedimiento del proyecto. Diseño del clasificador que muestra los pasos que se siguieron y brinda los comandos Unix para realizarlos. Resultados que se obtuvieron con el modelo que se optó por ser el más eficaz en cumplir la labor. Conclusiones acerca de los resultados 5 del proyecto, algunos de los cuales se busca solventar en Futuros Trabajos al igual que agregar nuevas funcionalidades. Se presenta un Apéndice que lista los distintos experimentos que se llevaron a cabo y ayudaron a moldear la arquitectura final del proyecto. Finalmente, además de este escrito, se presentan dos videos: uno que ofrece un tutorial para la ejecución del software labelme [55] que ayuda en la elaboración de las anotaciones de las imágenes y un segundo que muestra las clasificaciones detectadas al probar el modelo. El código del presente clasificador se encuentra en github.com/prsantiago/facemask-yolact, el dataset utilizado se almacena en github.com/prsantiago/facemask-dataset. 1.2 Justificación Por los momentos de pandemia que se están viviendo en el País y en todo el mundo, utilizar cubrebocas es una de las maneras más efectivas que los expertos en salud han propuesto para evitar que se propague este virus y sus variantes. Así, es primordial que la población haga uso de ellos en espacios compartidos y cerrados. De igual manera, contar con un sistema que monitoree su cumplimiento es conveniente para la sociedad. Actualmente se maneja una supervisión manual en establecimientos públicos (tiendas de autoservicio, supermercados, restaurantes) para que se respete esta medida, sin embargo, es complicado y poco eficiente, ya que su implementación se limita a sitios donde la circulación es controlable. Aprovechando las nuevas tecnologías en visión artificial, se abordó la problemática de clasificar imágenes de personas que usan correctamente un cubrebocas, no usan correctamente un cubrebocas y no traen cubrebocas; para que este proyecto sirva como base de vigilancia, monitoreo, y estadística que es esencial hoy en día. 6 https://github.com/prsantiago/facemask-yolact https://github.com/prsantiago/facemask-dataset 1.3 Objetivos 1.3.1 Objetivo General Implementar un clasificador de personas y catalogar las imágenes en aquellas que usan correctamente un cubrebocas, las que lo usan incorrectamente y las que no lo tienen. 1.3.2 Objetivos Específicos 1. Elaborar un dataset de imágenes con cubrebocas en formato COCO [2] que contenga las características que el modelo buscará identificar. 2. Modelar una capa de entrada, utilizando el framework PyTorch [24], que permita leer las imágenes del dataset y conectarlas a Yolact [3]. 3. Modelar una capa de salida, utilizando el framework PyTorch, necesaria para conectarla con las salidas de Yolact. 4. Construir el modelo completo entre las capas de entrada, Yolact y las capas de salida. 5. Entrenar el modelo completo, ajustando parámetros, y en su caso, la arquitectura de las capas modeladas. 6. Escoger el modelo que obtenga el desempeño más adecuado. Los objetivos que se lograron fueron: uno, se realizó exitosamente la recopilación de imágenes con los requisitos del problema y se hicieron las anotaciones correspondientes en formato COCO; cinco, a lo largo de ocho experimentos, se fueron afinando primero los parámetros, una vez optimizados, se continuó ajustando las características de la capa de detección de la red; seis, con los cambios del objetivo pasado, se obtuvieron resultados superiores a los alcanzados con los valores iniciales de Yolact. Los objetivos que no se alcanzaron en su totalidad fueron: dos, aunque se pre acondicionaron los datos para que fueran uniformes en su tamaño, este proceso no se realizó con el framework PyTorch. Asimismo, se aprovechó que Yolact ya normalizaba los datos que recibía antes de entrenarlos, la cual era la otra transformación que se tenía pensada para esta capa; tres, los resultados que se obtuvieron fueron satisfactorios, es por 7 eso que agregarle una capa de salida para mejorar la clasificación fue un tanto innecesaria y solo daría complejidad extra a la arquitectura; cuatro, sin capas externas que adaptar a la red original, este propósito perdió todo sentido de ejecución. 1.4 Trabajos Relacionados 1.4.1 MOXA: A deep learning based unmanned approach for real-time monitoring of people wearing medical masks [4] Proyecto que planea un sistema de reconocimiento de cubrebocas para utilizarse en cámaras CCTV (televisión de circuito cerrado) para el monitoreo de la obediencia de la población con respecto al uso de cubrebocas. Como la memoria y el poder de cómputo del sistema embebido en cuestión es limitado, se utilizan diferentes algoritmos de detección de objetos como: YOLOv3 y YOLOv3Tiny que utilizan la arquitectura nativa Darknet; SSD usando la eficiente y ligera MobileNet v2; Faster R-CNN con la red Inception v2. Esto con el propósito de determinar la eficiencia, rapidez y acoplamiento de cada modelo al sistema propuesto. Ya que el modelo seleccionado tendría que implementarse en un sistema embebido con capacidades computacionales limitadas, tomaron la decisión de elegir el prototipo que empleaba YOLOv3Tiny sobre YOLOv3, que era más preciso, debido a que tenía un balance superior entre certeza y rapidez en la detección. Existen dos diferencias muy marcadas que tiene este proyecto con el que se está presentando. El primero estriba en el uso de algoritmos de detección de objetos, cuando Yolact hace segmentación por instancia, siendo este último un proceso más laborioso en cuanto a las anotaciones para los datos, así como el trabajo de la red misma. Esta complejidad adicional tiene como recompensa que segmentar las instancias tiene mayores beneficios de uso para la visión por computadora que únicamente detectar los objetos. 8 La segunda es que manejan solo dos categorías para clasificar las imágenes: sin cubrebocas o con cubrebocas, sin hacer mención de cómo manejan los casos en los que el cubrebocas está presente pero sin ser colocado correctamente. Siendo más completo un modelo que maneja tres categorías: sin cubrebocas, mal cubrebocas o con cubrebocas. 1.4.2 A hybrid deep transfer learning model with machine learning methods for face mask detection in the era of the COVID-19 pandemic [5] En este artículo se utilizan tres modelos híbridos para la detección de cubrebocas, los cuales se entrenan y validan con dos datasets, uno está conformado por imágenes con cubrebocas reales, el segundo tiene cubrebocas computarizados, y otro extra que está compuesto con la mezcla de estos. Su finalidad es comparar el desempeño de los modelos, además de analizar con qué conjunto de imágenes se obtuvieron mejores resultados. La estructura de cada prototipo se distribuye en dos módulos: extracción de características y proceso de clasificación. En el primero se utiliza la red convolucional ResNet-50. En la segunda parte cada modelo tiene su algoritmo clasificador: árboles de decisión, SVM (máquinas de vectores de soporte) y ensemble. La conclusión fue que el modelo que usa SVM como clasificador obtuvo un rendimiento superior y que el entrenamiento con el dataset que tenía cubrebocas reales ayudaba en eso. Las disparidades que se descubren en este proyecto con el que se presenta son dos. La primera es en la arquitectura de la red, ya que utilizan una red convolucional para la extracción de características y un algoritmo de predicción para la parte de la clasificación, un método algo arcaico dadas las tecnologías actuales en el aprendizaje automático. Es por eso que en el presente trabajo se utilizaron únicamente redes neuronales en el desarrollo del clasificador. La segunda diferencia viene siendo que no cuentan con la categoría de mal cubrebocas, por lo que, solamente cataloga si hay presente un cubrebocas o no lo hay, quitándole información pertinente de monitoreo en los casos donde el cubrebocas se emplea de forma errónea. 9 1.4.3 COCO (Creating Common Object in Context) Dataset for Chemistry Apparatus [6] Teniendo en cuenta la importancia que significa tener un buen conjunto de datos para entrenar el modelo, en esta investigación se busca comparar las diferencias en el proceso de creación de un COCO dataset usando dos técnicas: manual, mediante el uso de APIs, web scraping y plataformas de datasets para maximizar la cantidad de imágenes orgánicas; y sintético, el cual conlleva a la recolección de fotografías base de los objetos a utilizar que se transformarán para crear un mayor número de imágenes sintéticas con ellas. Ya que los objetos a recolectar eran aparatos que se usan en un laboratorio de química, mencionan que la cantidad de imágenes orgánicas sobre ellos eran limitadas, por lo que el desarrollo de un dataset sintético daba un mayor número de datos con los cuales podían componer su conjunto de entrenamiento. El distintivo que se tiene con respecto a este proyecto es que se utilizaron imágenes reales sacadas de plataformas de datasets, además de tratar de maximizar el número de imágenes que siguieran la filosofía no icónica que emplea COCO para un mejor desempeño del modelo. Además se utilizó la herramienta labelme que tiene una mayor intuición de uso e instalación más sencilla que el software que se utilizó en este proyecto, dando con esto una reducción en el tiempo de producción de las anotaciones. 10 Entorno 2.1 Marco Teórico Con la intención de introducir los conceptos que se utilizaron en la consecución de este proyecto, y que por tanto se mencionan a lo largo de este reporte, se presenta una breve descripción de los siguientes temas: aprendizaje profundo, visión por computadora, red neuronal convolucional, red residual, transferencia de aprendizaje, MS COCO, PyTorch, Yolact y Google Colab. 2.1.1 Aprendizaje profundo Campo del aprendizaje automático que permite que la computadora aprenda por la experiencia y entienda la jerarquía de los conceptos del problema al que se está enfrentando. De esta forma, no es necesario que un humano le proporcione todo el conocimiento que requiere para llegar a una respuesta favorable. Su nombre parte de la noción de que va descomponiendo criterios complejos en unos más simples y los va apilando en capas que se van profundizando [10]. Entre los distintos métodos de aprendizaje profundo se encuentran las redes neuronales, modelos probabilísticos jerárquicos, algoritmos de aprendizaje de características supervisados y no supervisados. Puede parecer que es un área nueva de la computación, sin embargo sus orígenes se remontan a 1943 cuando se abordó la funcionalidad de las neuronas cerebrales con términos lógicos y computacionales, dando así el modelo MCP elaborado por Warren McCulloch y Walter Pitt [16, 17]. A finales de 1950, Frank Rosenblatt publica su desarrollo “perceptrón”, una neurona artificial, basándose en el modelo MCP [53]. Su desarrollo se pararía desde la década de 1960 hasta la década de 1980 con la formulación del Neocognitron, el ancestro de las redes neuronales convolucionales [54]. Este lapso de tiempo pasaría a conocerse como el invierno de la inteligencia artificial [18]. 11 El gran auge que se está dando alrededor de esta disciplina se debe a su superioridad en el rendimiento frente a otros campos relacionados, así como por la abundancia y complejidad en los tipos de datos que se deben de manejar [12]. Esta superioridad se pudo manifestar por la aparición de grandes datasets de buena calidad y que se encuentran abiertos al público, y por el incremento en el poder de cómputo de los GPU, que dio la oportunidad para migrar de un sistema que utiliza CPU a uno gráfico que da mayor aceleración en el entrenamiento de un modelo profundo de redes. 2.1.2 Visión por computadora Campo de la inteligencia artificial que busca replicar el sistema de visión humano para que la computadora sea capaz de identificar y procesar objetos en imágenes y videos. En los últimos años este campo ha visto una explosión muy grata de investigación y proyectos para su desarrollo, gracias a los avances en el aprendizaje profundo, las redes neuronales y al acceso a conjuntos masivos de imágenes con sus respectivas anotaciones como es el caso de ImageNet [20] y COCO [2] por nombrar unos pocos. El libre uso que se le brinda a la comunidad que trabaja en inteligencia artificial resulta muy alentador, ya que una de las tareas que más consume tiempo y esfuerzo en los modelos que tratan de detectar objetos es precisamente la obtención de imágenes sobre el ente y sus anotaciones correspondientes, las cuales son la clave durante el entrenamiento, ya que la red compara la clasificación que le dio respecto a la respuesta correcta que se encuentra en dichas notas y posteriormente ajusta sus valores de entrada, con el método de optimización previamente seleccionado, dado el nivel de certeza que tiene la detección. Queda por aludir que este campo está conformado por diversos tipos de tareas, cada una se logra de diferente manera y por consiguiente tienen su propio formato de anotaciones, por lo que se verán los cuatro principales tipos de visión por computadora, empezando por el más básico hasta el más complejo. Clasificación de imágenes Se busca saber qué objetos se encuentran en la imagen, sin enfocarse en el lugar dónde se encuentra o la cantidad que hay, simplemente catalogarlas [62]. Como se puede 12 observar en la figura 2.1, en la imagen solo se presentan los nombres de los objetos presentes en ella. Figura 2.1 Ejemplo dónde se clasifica una imagen. Fuente [2] Detección de objetos Además de listar los objetos presentes, brinda el área que ocupan estos, y por ende, su ubicación en la imagen. Se cuenta el número de instancias por categoría [14]. Esto se puede apreciar en la figura 2.2, donde con una caja de contorno, se delimita el área abarcada por cada objeto presente en la imagen. Figura 2.2 Ejemplo de una detección de objetos. Fuente [2] 13 Segmentación semántica Examina la imagen en busca de los mismos parámetros que la detección de objetos: clasificar y localizar objetos. Sin embargo, se distingue por darle un valor semántico a los pixeles para concluir si son relevantes para el tipo de pieza que se busca detectar, por lo que además de localizar, delimita el borde de los ejemplares encontrados, sin embargo, no da información acerca de la cardinalidad de cada objeto [61]. Como se exhibe en la figura 2.3, cada objeto presente se rellena con una máscara para expresar la relevancia de los pixeles con el elemento a detectar, es por eso que el fondo también es rellenado, ya que no tiene relevancia para ningún objeto. Figura 2.3 Ejemplo de una segmentación semántica. Fuente [2] Segmentación por instancia La práctica más compleja y la más cercana a la forma humana de detección entre los ejemplos presentados. Se sigue clasificando, localizando y segmentando a los objetos presentes en la imagen, pero se toma cada ejemplo como una instancia única, por lo que se lleva una cuenta de la cantidad de elementos por categoría presentes [14]. Esto se muestra en la figura 2.4, donde el relleno de cada objeto localizado es de diferente color, ya que se refiere a un elemento único de una máscara en específico. 14 Figura 2.4 Ejemplo de una segmentación por instancia. Fuente [2] 2.1.3 Red neuronal convolucional (RCN) [7] Este tipo de red neuronal toma el nombre de la operación lineal entre matrices llamado convolucional, CNN por “Convolutional Neural Network”. Es una red neuronal profunda que realiza dicha operación entre las matrices de la imagen y una matriz llamada kernel para obtener características como contornos y formas, entre otras. El mayor beneficio que esta presente frente a una red neuronal plana es que reduce el número de parámetros presentes en el tejido neuronal. Eso beneficia en el procesamiento de imágenes, ya que permite crear modelos con mayor número de capas que posibilita el aumento de características localizadas y así solucionar tareas complicadas [11]. Cada “perceptrón” de la CNN tiene como valor de entrada x, los pesos se representan con w y además cuentan con un sesgo b. La operación para cada j neurona en la capa con n neuronas se da por: 2.1 𝑖=1 𝑞 ∑ 𝑤 𝑖,𝑗 𝑥 𝑖 + 𝑏 𝑗 donde xi es el valor de entrada, wi,j es el peso sináptico, bj es el sesgo, y q el número de parámetros de entrada. Teniendo la sumatoria, se procede a la función de activación para obtener la salida yj. Este proceso se puede observar en la figura 2.5 15 Figura 2.5 Proceso de una red neuronal. Fuente [7] Los elementos que contiene una CNN son: entrada, convolución, pooling, función de activación, capa totalmente conectada y capa de salida. La convolución, pooling y función de activación pueden repetirse a lo largo de la arquitectura, ya que son las encargadas de adquirir las características de la imagen y es lo que hace a esta arquitectura ganar en profundidad. La capa totalmente conectada sirve para realizar la clasificación que se dará y de igual manera puede haber más de una de estas. En la figura 2.6 se exhibe el proceso que conlleva la clasificación de una imagen utilizando una CNN. Figura 2.6 Proceso de una red neuronal convolucional. Fuente [56] Extracción de características Este comienza con una imagen con W x L pixels, esta es construida comúnmente en formato RGB, esto quiere decir tres canales, Red, Green, Blue, que conforman la imagen a 16 W x L x 3 pixels. Para facilitar el procesamiento de la red, se normalizan las dimensiones a un tamaño de N x N pixels para toda imagen de entrada. Se continúa con la operación de convolución, la cual opera con dos matrices que en este caso son la imagen de N x N x 3 y un kernel de k x k, donde, por lo general, k es un número impar. Esta maniobra es definida de la siguiente manera: 2.2𝐶[𝑥, 𝑦] = 1 𝑀𝑁 𝑚=0 𝑀−1 ∑ 𝑁=0 𝑁−1 ∑ 𝐼[𝑚, 𝑛]𝐾[𝑥 − 𝑚, 𝑦 − 𝑛] donde I es la matriz de entrada, K es el kernel, M = k, N = k. Se puede notar en la ecuación 2.2 que la convolución solamente se realiza en un área de k x k de la imagen N x N, por lo que se debe efectuar CH veces horizontalmente y CV veces verticalmente, como se puede observar en la figura 2.7. Para llegar a este par de números, que resultan ser el tamaño de salida, se tiene que tener en cuenta cómo se está recorriendo la imagen. Se comienza a listar la dimensión N y k de la imagen y kernel, respectivamente, se puede rellenar la imagen de 𝜏 pixeles para que no se pierda la proporción de la imagen, este valor se debe sumar dos veces por aparecer de un lado y otro de la matriz, finalmente se darán 𝜌 pasos para realizar la siguiente convolución. Teniendo esto en cuenta, se llega a la siguiente formulación: 2.3𝐶 𝐻 = (𝑁 − 𝑘 + 2τ) ρ + 1 2.4𝐶 𝑉 = (𝑁 − 𝑘 + 2τ) ρ + 1 17 Figura 2.7 Convolución entre una imagen 5x5 con relleno = 1 y un kernel 3x3 que da 2 pasos en cada operación. Fuente [56] Al inicio del entrenamiento, los valores que contiene el kernel se generan aleatoriamente y conforme pasan las iteraciones, estos se van adaptando a los valores de entrada. El paso de pooling sirve para reducir el ruido que se pueda generar durante la convolución para quedarse únicamente con la información más representativa de la imagen. Para esto se utiliza un filtro de tamaño f x f y 𝜌 pasos. Existen varios tipos de pooling, pero el que se utiliza en Yolact es el de max-pooling, figura 2.8, donde se obtiene el valor máximo de una región Ri de tamaño f x f sobre la imagen N x N. El número de veces que se realiza en la imagen, y por ende es el tamaño resultante, se da por: 2.5𝑃 𝐻 = (𝑁 − 𝑓) ρ + 1 2.6𝑃 𝑉 = (𝑁 − 𝑓 ) ρ + 1 Figura 2.8 Max pooling a una imagen 4x4 con un filtro de 2x2 y dando 2 pasos por operación. Fuente [58] 18 La función de activación es la responsable de ajustar o borrar el valor de la neurona una vez que se aplicó la convolución para poder saturar o limitar la salida de esta [11]. Existen varias funciones, sin embargo, Yolact hace uso de las siguientes funciones de activación que se muestran en la figura 2.9: ● sigmoid: Es una función continua con rango de (0,1). Se utiliza para extraer las características no lineales de los datos en las capas cerca de la capa de entrada [57]. 2.7𝑌(𝑥) = 1 1 + 𝑒−𝑥 ● tanh (Tangente hiperbólica): Es una función continua con rango de (-1, 1). Se utiliza para extraer las características no lineales de los datos en las capas cerca de la capa de entrada [57]. 2.8𝑌(𝑥) = 1 − 𝑒−𝑥 1 + 𝑒−𝑥 ● ReLU (Rectified Linear Units): La más fácil de calcular y la que lleva a una convergencia más rápida durante el entrenamiento cuando se optimiza con gradiente descendente estocástico. Esto se debe a que mantiene la estabilidad del gradiente cuando x > 0 y elimina la salida para para mantener las características no𝑥 ≤ 0 lineales proporcionadas en las capas cercanas a la entrada. Suele usarse en las capas cercanas a la capa de salida [57]. 2.9𝑌(𝑥) = 𝑚𝑎𝑥(0, 𝑥) Figura 2.9 Graficación de cada función de activación. Fuente [57] 19 Clasificación El paso que sigue una vez que se completaron todas las capas de la parte de extracción de características es la clasificación. Para esto se utiliza una capa totalmente conectada o “fully-connected layer” (fc-layer), figura 2.10, la cual es un vector unidimensional donde cada valor es una neurona y la conjunción de todas las neuronas en la capa l actual forman cada elemento de la capa siguiente l + 1, de ahí su nombre de totalmente conectada. El valor yl(j) está dado por la siguiente función: 2.10𝑦 𝑙 (𝑗) = 𝑓 𝑙 ( 𝑖 = 1 𝑁 (𝑙 − 1) ∑ 𝑦 (𝑙 − 1) (𝑖) · 𝑤 𝑙 (𝑖, 𝑗) + 𝑏 𝑙 (𝑗)) donde N(l - 1) es el número de elementos de la capa l - 1, wl (i, j) es el peso para la conexión del elemento i en la capa l - 1 al elemento j de la capa l, bl (j) es el sesgo del elemento j en la capa l, y fl representa la función de activación de la capa l. Figura 2.10 Representación de una capa completamente conectada. Fuente [59] Para la última capa de esta sección se utiliza la función softmax que entrega valores entre cero y uno para cada categoría a la que se busca clasificar la imagen de entrada, la suma total de los valores para cada clase siempre da uno. Esta función está dada por la siguiente expresión: 20 2.11𝑠(𝑥 𝑗 ) = 𝑒 𝑥 𝑗 𝑘 = 1 𝑛 ∑ 𝑒 𝑥 𝑘 donde xj es el valor del elemento j de la capa, y n es el número de elementos que tiene la última capa. Método de aprendizaje Una vez explicada la estructura de la red neuronal convolucional, se continúa con la forma en que la CNN realiza el aprendizaje. La técnica utilizada se llama Backpropagation la cual propaga el error presente en las neuronas y con esto las ajusta. Es un proceso de dos pasos: propagación hacia adelante y propagación hacia atrás. En la primera se usan los valores de entrada de las neuronas para clasificar y una vez terminada, se calcula el error presente en la clasificación y se propaga hacia atrás a través de toda la red para su ajuste. Estos pesos se afinan de acuerdo a la tasa de aprendizaje y algoritmo de optimización elegidos, dando como resultado una función de error que muestra el proceso de aprendizaje que tiene la red. Figura 2.11 Representación en negro de la propagación hacia adelante y en rojo la propagación hacia atrás en una neurona artificial. Fuente [60] Para calcular el valor y que aparece en la figura 2.11 como resultado de la propagación hacia adelante, se necesitan el valor de sesgo , el peso , y el valor de𝑏 2 𝑤 2 entrada . La operación resultante da el valor z2 el cual se aplicará a una función de𝑥 2 activación f que finalmente entrega y. Este proceso se representa de la siguiente forma: 2.12𝑧 2 = 𝑤 2 (𝑥 2 ) + 𝑏 2 21 2.13𝑦 = 𝑓(𝑧 2 ) El siguiente paso es realizar la propagación hacia atrás. Para esto se compara contra el valor esperado , y se van realizando las diferenciaciones de la función de error con𝑦 respecto al valor que se quiere. Además, se necesita la tasa de aprendizaje a. 2.14𝑑𝑧 2 = 𝑦 − 𝑦 2.15𝑑𝑤 2 = 𝑥 2 · 𝑑𝑧 2 2.16𝑑𝑏 2 = 𝑑𝑧 2 2.17𝑤 2 : = 𝑤 2 − 𝑎(𝑑𝑤 2 ) 2.18𝑏 2 : = 𝑏 2 − 𝑎(𝑑𝑏 2 ) Para acelerar el aprendizaje de la red se suele utilizar un algoritmo de optimización junto al backpropagation. Como Yolact utiliza gradiente descendente estocástico con momentos, el cual se construye sobre gradiente descendente, únicamente se mencionan estos aún cuando hay otros algoritmos. ● Gradiente descendente [51]: Tiene como objetivo minimizar la función objetivo al actualizar los parámetros en la dirección opuesta del gradiente de la𝐽(𝑦, 𝑦) función objetivo .𝑑𝐽(𝑦, 𝑦) 𝑑𝑊 2.19𝑊 : = 𝑊 − 𝑎 · 𝑑𝐽(𝑦, 𝑦) 𝑑𝑊 donde es la tasa de aprendizaje, son los parámetros, es la predicción del𝑎 𝑊 𝑦 modelo, y es la dirección del gradiente que ajustará para decrecer .− 𝑑𝐽(𝑦, 𝑦) 𝑑𝑊 𝑊 𝐽 ● Gradiente descendente estocástico [51]: La actualización de la función objetivo se realiza con una aproximación del gradiente, por lo que se alcanza una convergencia más rápida en datasets con muchos datos. 2.20𝑊 : = 𝑊 − 𝑎 · 𝑑𝐽 𝑑𝑊 22 donde es la tasa de aprendizaje, son los parámetros, y es la dirección del𝑎 𝑊 − 𝑑𝐽 𝑑𝑊 gradiente aproximado que ajustará para decrecer .𝑊 𝐽 ● Gradiente descendente estocástico con momento [51]: Técnica que acelera la optimización pero evitando un sobreajuste en la función objetivo al aplicarle momento al gradiente. 2.21𝑉 𝑑𝑊 = β𝑉 𝑑𝑊 + (1 − β)𝑑𝑊 2.22𝑊 : = 𝑊 − 𝑎 · 𝑉 𝑑𝑊 donde es la tasa de aprendizaje, son los parámetros, , es el𝑎 𝑊 𝑑𝑊 = 𝑑𝐽 𝑑𝑊 β momento que se aplicará (0,1), y es la dirección del gradiente con momento− 𝑉 𝑑𝑊 que ajustará para decrecer .𝑊 𝐽 Los valores que van cambiando durante el entrenamiento de la arquitectura, que vienen siendo los parámetros de la red, sin embargo, existen otros tipos llamados hiper parámetros, los cuales son declarados antes de que empiece el entrenamiento y dictan la forma en que se dará este. Los hiper parámetros más importantes son: ● Tasa de aprendizaje [51]: Como se mencionó antes de manera indirecta, la tasa de aprendizaje es la que dicta la velocidad del entrenamiento, ya que es el factor por el cual se va ajustando el error que acarrea cada iteración, por lo que un valor grande acelera la minimización de la función objetivo y puede llevar a pasarse de lo óptimo, y un valor pequeño significa más ajustes para llegar al correcto. Por lo que se quiere una tasa de aprendizaje balanceada entre rapidez y exactitud. ● Lote de entrada [51]: Es el número de imágenes que ingresarán a la red en cada iteración. Este número depende mucho de los recursos de RAM con los que se cuenta, debido a que la red las procesa de forma paralela. Un lote de entrada alto significa menos iteraciones para completar una epoc, que es la vuelta entera al conjunto de datos, esto equivale a un entrenamiento más rápido de completar, lo cual es algo deseado. Por otro lado, se quiere que los ajustes a los valores de la red se hagan lo más pronto posible ya que eso significa clasificaciones más fidedignas, esto quiere decir iterar imagen por imagen aunque sea tardado. Es por eso que es muy importante llegar a un lote de entrada balanceado entre rapidez y exactitud. 23 2.1.4 Red residual (ResNet) [31] Red neuronal convolucional que facilita y mejora el desempeño durante el entrenamiento al incrementar el número de capas, que como se vió previamente, entre más capas más capacidad para detectar características del objeto a detectar. Sin embargo, en la práctica al desarrollar una red cada vez más profunda, con solo añadir más capas, conlleva a un mayor error en el gradiente de aprendizaje al pasar de una convergencia a una degradación en la función de pérdida, como se exhibe en la figura 2.12 Figura 2.12 Comparación de la función de costo entre una red plana y una red residual Es por eso que en el diseño que se ejemplifica en la figura 2.13, se toma un enfoque residual donde al conjunto de valores de salida se le añaden los valores de entrada, la cual es una operación de identidad, para que el error generado en el entrenamiento esté limitado a no ser mayor que la diferencia que tienen los valores iniciales. 24 Figura 2.13 Bloque residual. Fuente [31] El diseño completo de una red residual de 34 capas se presenta en la figura 2.14, en ella se observa que la conexión entre valores de entrada y salida se produce cada par de veces, este enlace se puede dar directamente cuando estas tienen las mismas dimensiones. Cuando las medidas difieren no se utiliza relleno y se dan dos pasos en cada convolución, por lo que no se introducen más parámetros; esta conexión se define por: 2.23𝑦 = 𝐹(𝑥, {𝑊 𝑖 }) + 𝑥 donde x y y representan la entrada y salida de las capas en consideración. La función es el valor residual por aprender.𝐹(𝑥, {𝑊 𝑖 }) Figura 2.14 Red residual de 34 capas. Fuente [31] El diseño de una red residual de 50 capas, en principio es la misma que en la de 34 niveles, sin embargo, cuando las dimensiones difieren se utiliza una proyección lineal WS para igualar el tamaño; esta conexión se fija mediante: 2.24𝑦 = 𝐹(𝑥, {𝑊 𝑖 }) + 𝑊 𝑆 𝑥 Además, el diseño se profundiza al añadir capas 1x1, del mismo tamaño, al inicio y al final, 4 veces mayores, de cada conjunto de nivel convolucional, tabla 2.1. 25 Tabla 2.1 Arquitectura de distintas redes residuales. Fuente [31] 2.1.4 Transferencia de aprendizaje Método en el que se aprovecha la habilidad de realizar una tarea para desarrollar otras más específicas y/o complejas relacionadas con la primera, esto con el fin de mejorar la precisión y reducir el tiempo de entrenamiento, puesto que, la falta de datos alrededor de ciertos tópicos y lo laborioso que es recolectar y anotar sus características, hace que esta práctica ayude a terminar modelos de aprendizaje automático más rápido al utilizar valores pre entrenados en la red [29]. Con la transferencia de aprendizaje se pretende unir conocimientos pasados para aflorar unos nuevos. Con ella se aborda el aprendizaje de forma dinámica en lugar de un desarrollo aislado entre distintas tareas. Este proceso no es exclusivo del ramo de la inteligencia artificial, sino que está inspirado en la inteligencia humana. Un ejemplo sería que en una clase de programación, no se enseña a leer y escribir para poder codificar sino que se construye esta nueva aptitud sobre esas habilidades previamente adquiridas. El concepto teórico de la transferencia de aprendizaje que se utiliza en [29, 30] está dividido en dos nociones: Dominio y Labor. Un dominio 𝓓 está relacionado con los datos a usar durante el entrenamiento. Está dado por un campo de características 𝓧 y una distribución probabilística marginal P(X), 26 donde X = {x1, …, xn} ϵ 𝓧. Para considerar a dos dominios como distintos, deben tener campos de características o distribución probabilística marginal diferentes. Una labor 𝓛 es definida por el conjunto de todas las categorías posibles 𝓨, además de una función predictiva 𝑓 (·). Con esto se conjetura la clase correspondiente dado un dominio 𝓓. Para considerar a dos labores como distintas, deben tener un conjunto de categorías o una función predictiva diferentes. Con estas dos nociones se puede armar la definición utilizada en [30]: dado un dominio 𝓓𝓘 y una labor 𝓛𝓘 de origen y un dominio 𝓓𝓕 y una labor 𝓛𝓕 final, la transferencia de aprendizaje ayuda a mejorar el aprendizaje de la función predictiva final 𝑓𝓕 (·) en 𝓓𝓕 al usar el conocimiento en 𝓓𝓘 y 𝓛𝓘, donde 𝓓𝓘 ≠ 𝓓𝓕 o 𝓛𝓘 ≠ 𝓛𝓕. 2.1.5 Microsoft COCO: Common Objects in Context [2] Estándar utilizado para componer conjuntos de imágenes para el reconocimiento de objetos. Actualmente cuenta con un universo de 91 elementos, dando en total 2.5 millones de instancias anotadas que se encuentran distribuidas en 328,000 imágenes. En contraste a ImageNet [27], COCO tiene menos categorías pero más instancias por cada una. Esto ayuda a los modelos a obtener mejores resultados en la localización del objeto. De igual manera, cuenta con más ejemplos de cada clase que PASCAL VOC [28]. Su objetivo es la ubicación por medio del contexto y el entendimiento de la escena. Esto lo logra al centrarse en: detectar vistas no icónicas de la pieza, razonamiento contextual entre objetos, y la precisa localización 2D de estos. Es por eso que su conjunto de datos involucra imágenes no icónicas, (c) figura 2.15, en lugar de solo mostrar el tipo, (a), o la escena, (b), a detectar, dado que, los modelos suelen sobresalir en las imágenes icónicas, pero batallan con las no icónicas. 27 (a) (b) (c) Figura 2.15 Ejemplo de (a) imágenes icónicas de objetos, (b) imágenes icónicas de escenas, (c) imágenes no icónicas. Fuente [2] Esto hace que los modelos entrenados usando este dataset tengan rendimientos superiores a los entrenados por distintos conjuntos de imágenes, en vista de que, la detección de muchos objetos solo se pueden realizar mediante el contexto, dado el pequeño tamaño o su aparición ambigua en la imagen [2]. Las anotaciones que se utilizan son únicas en comparación a otras conjuntos de imágenes, ya que como se exhibe en la propiedad “annotation” de la figura 2.16, utilizan la segmentación por instancia para ayudar en la precisión de la ubicación del objeto. Estas anotaciones son almacenadas en archivos JSON, los cuales facilitan la manipulación de los objetos que guardan. Figura 2.16 Ejemplo de una anotación en formato COCO. Fuente [45] 28 Actualmente, COCO no tiene una categoría “cara” sino que forma parte de la clase “persona”, sin embargo, es posible segmentar trozos de un tipo para crear nuevas categorías, como se hará en este proyecto. 2.1.6 PyTorch [24] PyTorch es una librería de aprendizaje automático, que se enfoca en la usabilidad y la velocidad de ejecución de tensores dinámicos, al mismo tiempo que mantiene un rendimiento equiparable al de otros frameworks. Esto lo hace por medio de un modelo de programación basado en arreglos acelerados por GPUs y derivaciones mediante una diferenciación automática. Todo esto integrado en ambiente Python [24]. Como se mencionó anteriormente, una de sus características insignia es que sirve como reemplazo de NumPy al hacer uso del poder del GPU, por lo que ofrece la conversión de arreglos NumPy [23] y tensores PyTorch con la llamada de torch.from_numpy() y .numpy() [26], respectivamente como se muestra en la figura 2.17. Figura 2.17 Conversión de Numpy a Torch y viceversa. La optimización del gradiente en una red neuronal se realiza automáticamente por medio de las funciones que contiene la librería. Como se puede observar en la figura 2.18, para realizar un paso de entrenamiento, se elige el modelo pre entrenado, se cargan los datos y las etiquetas correspondientes, en este caso el dato, una imagen de 64x64 pixeles con 1000 etiquetas. Para hacer la predicción se pasan los datos al modelo, una vez que se cuenta con esta, se calcula el valor de pérdida con respecto a la etiqueta y con esta diferencia se comienza a efectuar la propagación contraria del error a través de la red. Es en 29 esta instrucción, loss.backward(), en donde torch.autograd calcula y guarda el gradiente de cada parámetro del modelo. Por último, habiendo elegido el optimizador que se utilizará, en este ejemplo gradiente descendente estocástico, se realiza el ajuste a los valores de la red vía el gradiente almacenado [25]. Figura 2.18 Uso de torch.autograd para la optimización del gradiente. Fuente [25] Como se pudo observar, PyTorch es amigable con los proyectos de investigación, ya que deja los procesos complejos inherentes del aprendizaje profundo, escribir los modelos, cargar los datos, optimización, en manos de la misma librería a través de una interfaz de programación (API) intuitiva. Esto hace que además, el diseño de la red se exprese con los conceptos familiares de clases y funciones que se utilizan en la programación en general. 2.1.7 Yolact [3] Red convolucional “You Only Look At CoefficienTs” que segmenta cada instancia en un solo paso, al separar el proceso computacional de formar un diccionario general de prototipos sobre la imagen entera y la predicción de un conjunto de combinaciones lineales de los coeficientes por instancia, para llevarlos a cabo de forma paralela. Con este quiebre logra analizar una imagen en 0.022 segundos, usando Resnet-50, eso quiere decir que soporta 45 imágenes por segundo, cantidad que ya entra en el terreno del procesamiento en tiempo real. 30 El acoplamiento de estas dos etapas distintas, se puede notar en la figura 2.19, se da al ensamblar linealmente los prototipos generados en la “Protonet”, con los coeficientes pronosticados en la “Prediction head”, de ahí su nombre a solo mirar los coeficientes, y finalmente acotándolos con la caja conjeturada en “Crop”. Esto, además de ser más rápido, permite que la red aprenda cómo localizar la máscara de las instancias por sí misma, cuando estas, que son visual, espacial y semánticamente similares, aparecen de forma diferente en los prototipos. Figura 2.19 Arquitectura de Yolact. Fuente [3] Es importante señalar que el número de prototipos de máscara es independiente al número de categorías a clasificar, por lo que puede haber un número mayor de las primeras con respecto a las últimas, ya que se aprenden para cada imagen, dando así a la segmentación de cada instancia mediante una representación distribuida de las combinaciones de prototipos que se comparten entre categorías. Estas combinaciones suelen tener como función: dividir la imagen espacialmente, localizar las instancias, detectar los contornos, codificar la posición de los módulos, o una combinación entre estas tareas. La rama que genera los prototipos “Protonet” predice un conjunto de k prototipos de máscara para la imagen entera. Esto se implementa con una red convolucional, figura 2.20, ya que estas son buenas en producir máscaras espaciales coherentes. Los valores de entrada vienen dados por P3, que es la capa más profunda y por ende la que mayores propiedades contiene, de la red piramidal de características (FPN) [37], esto para producir máscaras con mayor calidad y buen rendimiento en objetos pequeños. Cada paso 31 convolucional se da con un kernel 3 x 3, excepto el último que es de 1 x 1 y resulta en una capa con k canales. La salida es activada con una función ReLU. Figura 2.20 Arquitectura de Protonet. Fuente [3] En esta arquitectura que segmenta instancias mediante un enfoque de anclas, se tienen tres ramas en su cabeza de predicciones, figura 2.21: una para representar los c factores para pronosticar la clase, otra para predecir los cuatro puntos que forman la caja, y una última que revela los k coeficientes para la máscara. Por lo que se producen 4 + c + k coeficientes por cada ancla. Como se puede observar en la figura 2.19, en la elaboración de la máscara final se permite la sustracción de prototipos, por lo que se aplica una función de activación tanh a los k coeficientes para producir salidas estables que permitan la operación antes mencionada durante el montaje de prototipos y coeficientes. Figura 2.21 Arquitectura de la cabeza de predicción. Fuente [3] Después de producir los coeficientes para cada ancla, se efectúa NMS “Non-Maximum Suppression” [38, 66], un algoritmo de postprocesamiento encargado de agrupar las detecciones que pertenecen al mismo objeto. Esto se realiza al calcular una 32 matriz c x n x n de puntuaciones de unión por intersección (IoU) por pares para las n mejores detecciones ordenadas de forma descendente para cada una de las c clases. A continuación, se elimina por fila las detecciones que sean menores dado un umbral t. Para producir la máscara de la instancia, como se mencionó anteriormente, se combinan linealmente los prototipos con los coeficientes. Finalmente se utiliza una función de activación “sigmoid“. Esta operación se representa mediante: 2.25𝑀 = σ(𝑃𝐶𝑇) donde P es una matriz h x w x k de prototipos y C es una matriz n x k de coeficientes donde n son las instancias que sobrevivieron al NMS [38, 66], que elimina detecciones dobles, y al umbral “Threshold” para tomar un coeficiente como detección correcta de la instancia. Durante este proceso se utilizan tres tipos de pérdida para entrenar el modelo: error de clasificación Lcls, error de caja Lbox, y error de máscara Lmask, con los valores iniciales de 1, 1.5 y 6.125, respectivamente. El ajuste que se realiza para cada uno es el siguiente: pérdida L1 suave para Lbox, en la predicción de clase se usa la entropía cruzada softmax y para Lmask se toma la entropía cruzada binaria por píxel entre la máscara final M y la máscara verdadera Mgt mask = BCE(M, Mgt) 2.26𝐿 Una vez teniendo la máscara final, esta es recortada para que se acote a los coeficientes de la caja propuesta durante la validación. Este proceso es diferente durante el entrenamiento, donde es recortada usando la caja verdadera que se extrae de las anotaciones de la imagen y se divide Lmask entre el área de esta última para preservar los objetos pequeños en los prototipos. Los prototipos, al ser objetos aprendidos, son comprensibles. Esto quiere decir que si el “Protonet” combina las funcionalidades de múltiples prototipos en uno, la cabeza de predicciones puede aprender en qué situaciones se utilizan ciertas características, permitiendo rendimientos aceptables aun con una k pequeña, ya que, al incrementar el número de esta, se vuelve ineficiente debido a que predecir coeficientes es difícil. Si la red realiza un error grande en un solo coeficiente, debido a la naturaleza de la combinación lineal, la máscara producida puede desaparecer o incluir restos de otros objetos. Esto quiere 33 decir que la red está constantemente balanceando entre producir coeficientes correctos y utilizar la menor cantidad posible de prototipos. La estructura del detector prioriza la velocidad así como la abundancia de distinciones para pronosticar correctamente los prototipos y los coeficientes. Se utiliza una ResNet-50 [31] con una red piramidal de características (FPN) [37]. No preserva la relación de aspecto para no afectar en el tiempo de evaluación de cada imagen. A la FPN se le quitó la capa P2 por caber en una imagen de 550 x 550 y se le agregaron P6 y P7 como capas convolucionales sucesivas con kernel de 3 x 3 y un paso de 2 para obtener detalladamente las características de las instancias. A cada capa de la red piramidal se le colocan 3 anclas con relaciones de aspecto de [1, ½, 2]. El tamaño empieza en 24 píxeles cuadrados y se duplica en cada nivel, por lo que las dimensiones por capa son de [24, 48, 96, 192, 384]. La forma en que Yolact mide su desempeño de generación de máscara y caja es utilizando la métrica mAP “mean Average Precision” que se maneja equivalentemente con AP “Average Precision”. Esto por que es la que se emplea al evaluar usando COCO [41]. La precisión promedio es un tipo de métrica que mide la fiabilidad de los modelos al calcular el valor de la precisión, que mide la certeza de las detecciones, es decir, qué porcentaje de las detecciones fueron correctas [42, 44], sobre la exactitud en un rango de 0 a 1 [40]. La exactitud mide qué tan bien se encuentran las detecciones correctas, o sea, qué porcentaje de todas las correctas se localizaron [42, 44]. Otra medición para determinar el balance entre precisión y exactitud es la puntuación F1, que en vez de seguir el promedio entre ambos conceptos, en este se combinan ambas mediciones para encontrar el umbral de confianza donde se forma el valor máximo F1 [43]. Esta es la calificación que se tomó en este proyecto para medir el desempeño del clasificador. Los resultados que obtiene frente a otras arquitecturas se muestran en la tabla 2.2. En ella se puede observar que la diferencia que tiene Yolact frente MS R-CNN [36], la cual fue la más rápida del resto, es de 4 veces en la velocidad con apenas un ~30% menos en el rendimiento para generar la máscara. Esto hace a Yolact como la candidata deseable para proyectos que incursionan en el ramo de la segmentación por instancia en tiempo real como lo es este proyecto. 34 Tabla 2.2 Comparación entre arquitecturas de segmentación por instancia. Fuente [3] 2.1.8 Google Colab [21] Es un servicio de notebook alojado de Jupyter [22]. Su entorno de ejecución en la nube permite el uso de CPU, GPU o TPU, lo cual es ideal para proyectos de aprendizaje profundo, análisis de datos, entre otros temas sobre inteligencia artificial. Su uso es gratuito, sin embargo, los recursos proporcionados de RAM Y disco no están garantizados y tienen un límite de tiempo y capacidad, de esta manera pueden brindar este servicio sin costo. La cota de tiempo es de 12 horas de ejecución al día, por lo que el entrenamiento se tuvo que realizar en segmentos para que no cortaran el suministro y se perdiera el avance efectuado en esa corrida. En cuanto a las cantidades de RAM y disco, rondaron por lo general en 12 GB y 100 GB, respectivamente . Estos recursos fueron suficientes en cada una de las ejecuciones. Exposición 3.1 Desarrollo del proyecto En el siguiente apartado se presenta el proceso que implicó entrenar el prototipo, desde los pasos que se siguieron para reunir el dataset hasta la validación que se hizo para escoger el modelo más adecuado que lograra el objetivo. 35 Durante esta explicación se topará con comandos Unix, los cuales fueron ejecutados en el ambiente Google Colab por preferencia personal y por los beneficios que brinda un entorno en la nube, sin embargo estos se pueden ejecutar en un sistema local. 3.1.1 Planeación La lista subsecuente expone una breve descripción de la sucesión de eventos que se ejecutaron durante el proyecto, además de mostrarlos en la figura 3.1. Más adelante se elaborará con profundidad sobre cada uno de ellos: 1. Obtener imágenes que contengan personas sin cubrebocas, con cubrebocas y usando mal el cubrebocas. 2. Hacer las anotaciones que usará la arquitectura del proyecto para poder llevar a cabo el entrenamiento y la evaluación. 3. Ajustar las configuraciones y parámetros de Yolact para que acepte el dataset de entrenamiento y evaluación. 4. Iniciar el entrenamiento. 5. Analizar los resultados para llegar a una conclusión. Si los resultados todavía no son favorables, se vuelve al punto 3. 6. Probar el modelo con una detección de video. 36 Figura 3.1 Diseño global del proyecto 3.1.2 Obtención de datos Se recopilaron las imágenes desde dos diferentes datasets públicos en la página kaggle [46, 47] y de búsquedas en Google. De un total aproximado de 8000 imágenes se escogieron 979 para que conformaran el repertorio. Por temas de tiempo y disponibilidad que más adelante se justifican, se acordó recopilar menos de 1000 imágenes. Para cumplir con esta estipulación, se aplicaron distintas depuraciones para desechar imágenes que no satisfacieran los siguientes criterios. El primer filtro fue seleccionar las imágenes que contuvieran mínimo a una persona usando mal el cubrebocas; se encontraron 306 imágenes con estas características dando un total de 338 personas usando mal el cubrebocas distribuidas entre ellas. Para llegar a un mínimo de 370 instancias de la clase (300 para entrenamiento, 60 para validación, 10 para prueba), se añadieron 24 imágenes más, que sumaban los 42 ejemplos de personas faltantes, desde una 37 búsqueda en Google. Este filtro se seleccionó como el más importante por que este experimento es “único” por el hecho de que no se limita a decir si se tiene o no el cubrebocas como en otros proyectos de esta índole, es por eso que se esperaba una cantidad reducida de este tipo de imágenes y se quiso pivotar el dataset alrededor de este número. El segundo filtro fue para las imágenes donde solo aparecen ejemplos con cubrebocas o sin cubrebocas, donde el número de personas no fuera mayor a 2, para disminuir el tiempo que tomaría hacer las anotaciones de cada imagen; se encontraron más o menos 5000 imágenes con estas características. Como se seguía teniendo un conjunto grande de imágenes, se decidió utilizar un tercer filtro, el cual fue que la imagen no podía pesar más de 500kb, para agilizar las iteraciones en el entrenamiento; después de este filtro se minimizó el dataset a 2611 imágenes, por lo que se tomaron al azar 609 imágenes para conformar el conjunto final de datos. Así, la división que tiene el dataset en términos de imágenes es: 775 para entrenamiento, 154 para validación y 50 para prueba. Esta extraña proporción se justifica por el hecho de que hay 300 ejemplares de cada clase en el conjunto de entrenamiento y 60 muestras de cada clasificación en el de validación, por lo que el dataset tiene un número equilibrado en torno a los tipos de detecciones que hará. Si se quiere conocer un mayor detalle del proceso que se realizó para llegar a esta decisión, se puede consultar el apéndice D. 3.1.3 Acondicionamiento de los datos Como las imágenes variaban en sus proporciones, el primer paso que se realizó fue ajustarlas a un tamaño 550 x 550 píxeles. Se llegó a este número por el hecho de que la red convolucional que se escogió para correr en Yolact fue la Resnet50 que acepta máximo dimensiones de 550 x 550. Esta adaptación se consiguió con un script en Python que hace uso de la librería OpenCV para poder encoger o aumentar la imagen. La figura 3.2 muestra el comando con los argumentos: ancho, altura, carpeta donde se encuentran las imágenes a procesar y carpeta donde se guardarán las imágenes procesadas, que requiere para hacer las transformaciones. 38 Figura 3.2 Comandos para redimensionar imágenes a 550x550 Cabe destacar que las proporciones de los objetos son muy importantes, ya que es una característica que la arquitectura toma en cuenta, por lo que si las dimensiones de las caras se encuentran distorsionadas, en el entrenamiento o en la validación, el modelo no tendría buenos resultados al enfrentarse a la prueba en video, donde las caras tendrán un tamaño normal. Es por eso que el ajuste se hace siempre respetando las proporciones originales de la imagen. Por ejemplo, cuando se llegaba al caso de que el largo alcanzaba su límite pero el ancho seguía menor a los 550, este faltante era rellenado con un fondo negro y viceversa. La figura 3.3 muestra las tres posibles formas de resultados después de acoplar las imágenes a las dimensiones deseadas. (a) (b) (c) Figura 3.3 Ejemplo de imágenes después del ajuste a sus dimensiones: (a) Imagen sin relleno. (b) relleno en la altura. (c) relleno en la anchura. Fuente [46] Una vez que se tuvo uniformidad en la superficie de cada dato, se procedió a hacer las anotaciones correspondientes a la imagen. Como este proceso es muy laborioso, y más, si se tiene un gran número de ejemplos, se usó una herramienta llamada labelme [55], figura 3.4, que facilita todo este procedimiento al permitir seleccionar los puntos que se quieren sobresalir y una vez concluido darle una etiqueta que viene siendo la clase a la que pertenece esa imagen. 39 Figura 3.4 Interfaz del programa labelme donde se realizan las anotaciones. Fuente de la imagen en labelme [46] El protocolo que se utilizó, como se muestra en la figura 3.5, para cada categoría fue el siguiente: ● Sin cubrebocas: Se tomó toda la cara como región de interés. ● Con cubrebocas y mal cubrebocas: La zona relevante fue incluir el contorno total de la cara y el cubrebocas. Los apéndices A, B y C muestran en detalle los experimentos que se realizaron para llegar a este tipo de etiquetas. 40 (a) (b) Figura 3.5 Ejemplos del tipo de anotaciones que cada clase tuvo. (a) muestra el ejemplo para con_cubrebocas del lado izquierdo y mal_cubrebocas del lado derecho. Fuente [48]. (b) presenta el caso para sin_cubrebocas. Fuente [46]. Esto creó un archivo JSON por imagen que posteriormente se tuvo que juntar en un solo archivo JSON que contuviera las anotaciones en formato COCO de cada imagen procesada. Para esta tarea, labelme ya proporciona el script labelme2coco.py que hace eso. La figura 3.6 muestra el comando y los argumentos necesarios como: la ruta a la carpeta de entrada, la ruta donde se guardarán los archivos y --labels que toma el registro, en este caso labels.txt, que contiene las categorías a las que cada instancia detectada puede ser clasificada. Figura 3.6 Comando para cambiar las anotaciones a formato COCO Cabe mencionar que para Yolact se hacen algunos cambios con respecto al formato original de COCO. Por ejemplo, los campos licenses e info se suprimen por completo. De igual manera en el campo image los valores license, flickr_url, coco_url y date_captured y en el campo categories el valor supercategory son omitidos. 41 Figura 3.7 Anotación COCO una vez que se aplicó labelme2coco.py En la figura 3.7 se muestran las anotaciones COCO de la figura 3.8, donde se indican los valores que tiene el campo images: nombre del archivo, las dimensiones y el identificador correspondiente; para el campo annotation se proporcionan: identificador de la imagen, a quien corresponden las anotaciones, la categoría a la pertenece la detección, la segmentación semántica de los píxeles, el área que cubre la región de interés, la cual se obtiene con los valores de bbox, que son las píxeles de inicio y final del objeto en la imagen; por último, se tiene el campo de categories que recopila las clases a las cuales se espera que el modelo clasifique a las personas presentes en las imágenes. 42 3.1.4 Ajuste de configuraciones y parámetros a Yolact Una vez que se contó con un dataset listo para el entrenamiento, se hicieron los ajustes necesarios para que Yolact supiera las características del nuevo modelo, así como la ruta de los datos de entrada que iba a leer. Figura 3.8 Valores del dataset separado en entrenamiento y validación En la figura 3.8 se muestra el nombre que se le dio al dataset, las anotaciones y carpeta de imágenes de entrenamiento y validación, también se informa que en los apuntes JSON viene la clasificación correcta de cada detección, esto es necesario cuando se va a evaluar el entrenamiento, ya que esas son las respuestas correctas con las que se califica el desempeño del modelo, y por último los nombres de las clases a las que cada detección podrá pertenecer. 43 Figura 3.9 Configuración del modelo en Yolact En la figura 3.9 se dan los valores: nombre que tendrá el modelo, dataset que usará y número de clases que acepta, el mas uno es por la clase “_background_” que toma las regiones no relevantes como fondo negro. Además, se pueden observar los valores que se utilizaron en los hiper parámetros del modelo. El campo más importante de estos es el ritmo de aprendizaje (lr) al cual, tras varios experimentos que se muestran en el apéndice E, se le dio un valor de 0.001; se continua con que al 35%, 75%, 88% y 93% del máximo de iteraciones, que se redujo a 40000, se disminuirá el valor lr por un factor de 0.1 que es la disminución de la tasa de aprendizaje (gamma), esto porque no se quiere que el modelo dé pasos muy bruscos en el valor paramétrico del peso, ya que conforme se avanza en el entrenamiento, se necesitan ajustes más finos para los valores de la red; al campo de impulso (momentum) y al de disminución de peso (decay) se les dejaron sus valores por defecto que eran 0.9 y 0.0005, respectivamente. No aparece en este diccionario de configuraciones pero Yolact toma un lote de 8 imágenes para procesarlas paralelamente y se continuó con ese valor. Como se puede apreciar, el único parámetro que se ajustó fue el número de iteraciones, ya que al no contar con un conjunto de datos muy grande, con esta cantidad de repeticiones el modelo ya puede identificar los patrones necesarios para la clasificación. Es importante mencionar que la decisión por utilizar los valores estándar de Yolact están sustentados por los resultados que se obtuvieron en los apéndices E y F. 44 De igual manera, se trató de ajustar las configuraciones del detector. Primero se optó por la arquitectura con la cual correría, que dado los resultados expuestos en el apéndice G, resultó ser Yolact usando Resnet50. Por último se concluyó, por temas de límite de tiempo, en calcular el número de anclas que tendría cada capa del generador de prototipos, como se puede observar en el desarrollo del apéndice H, se utilizó la configuración estándar que corresponde a tres anclas, una del tamaño dado a su respectiva capa, otra a la mitad de esta dimensión y por último una que sea el doble de su volumen original. 3.1.5 Entrenamiento con Yolact Después de realizar los puntos anteriores, había llegado el momento de entrenar la arquitectura con los datos. Se escogió una sesión en Colab con uso de GPU, ya que al hacer las manipulaciones de la red con Pytorch, por temas de eficacia y velocidad en la ejecución, Yolact obliga el uso de un procesador gráfico. Se clonaron los repositorios que se requerirían, figura 3.10, facemask-yolact [63], contiene la arquitectura y facemask-dataset [64], comprende el dataset (entrenamiento, validación y prueba) que se armó. Los dos son almacenados en la página Github [65]. Figura 3.10 Comando para clonar repositorios Se procedió con la importación del archivo con los valores iniciales que se le cargarían a la red, para esto primero se creó la carpeta donde se almacenarían estos. Como el archivo se encontraba fuera del Google Drive local, se usó el script download_gdrive.py, para guardarlo en la ruta especificada como muestra la figura 3.11, tal mecanismo necesitó que se le proporcionara el identificador del archivo así como el directorio y nombre que tendría en su ruta destino. 45 Figura 3.11 Comando para importar archivo a carpeta weights Es necesario indicar que los pesos que se importaron anteriormente, fueron entrenados previamente por el autor de Yolact con el conjunto entero de COCO y son capaces de detectar personas (entre otros objetos). Se propuso esta maniobra por el hecho de que el objetivo del proyecto es detectar el uso de un cubrebocas entre individuos. Su elección se sustentó por los resultados del apéndice D, de ahí que convino emplear transferencia de aprendizaje. Para realizar el entrenamiento se tuvo que efectuar el comando que se examina en la figura 3.12. Figura 3.12 Comando para empezar el entrenamiento En este script train.py se encuentra un objeto tipo parser, figura 3.13, el cual obtiene el nombre de la configuración a utilizar, los pesos que se le proporcionarán a la red, la iteración sobre la cual se empezará, el número de lote de entrada, las carpetas en las que respectivamente se guardarán los pesos del modelo y la bitácora del entrenamiento, entre otros valores. Figura 3.13 Parser en train.py 46 Una función que es muy importante al empezar el entrenamiento es cargar el archivo donde se almacenan los valores que se le proveen a la red. Ya que se están utilizando unos que ya han sido entrenados, estos se toman como si se estuviera reanudando el entrenamiento, no obstante, sólo interesa extraer los parámetros que pueden ser modificados (peso y sesgo), eso se logra invocando load() como se muestra en la figura 3.14. Puesto que la arquitectura (capas convolucionales, capas lineales) con la que se llegaron a esos valores no incumbe, a menos de que se esté resumiendo el entrenamiento desde algún punto en específico, se ignoran esas características que devuelve load_state_dict(). Figura 3.14 Función para cargar pesos ya inicializados Finalmente, el entrenamiento se dio por 40,000 iteraciones. Una vez que terminó, el siguiente paso fue probar el modelo. 3.1.6 Evaluación de Yolact Teniendo listo el modelo, se continuó a evaluar el desempeño con imágenes que nunca trató en la fase anterior, esto para asegurarse de que la red neuronal sí advirtió patrones generales para detectar las clases objetivo y no que simplemente estaba memorizando los patrones específicos de las imágenes que procesaba. De inicio se empezó por crear la carpeta donde se guardarían las imágenes una vez clasificadas. Se siguió con el comando para evaluar el modelo, la figura 3.15 muestra la 47 llamada al script eval.py junto con el parámetro --images con las rutas de la carpeta de entrada y dónde guardar las de salida. Figura 3.15 Comando para evaluar las imágenes de prueba Con esto se obtuvieron las clasificaciones visuales del dataset de prueba, y aunque un análisis visual de los resultados es útil, puede no ser objetivo y determinante a la hora de equiparar distintos modelos, por lo que se ejecutó el comando de la figura 3.16 para que produzca las cifras estadísticas del entrenamiento y así poder comparar distintos prototipos. Figura 3.16 Comando para evaluar el desempeño del modelo Del mismo modo que train.py cuenta con un parser para extraer los valores que usará, eval.py tiene el suyo para obtener los valores de parámetros similares a los del entrenamiento, sin embargo cuenta con unos propios como --images entre otros. Por último, se tomó la bitácora que se genera durante el entrenamiento y con la clase LogVisualizer, figura 3.17 que está incluida en Yolact, se produjeron las gráficas que representan el desempeño que se tuvo para generar la máscara y la caja del objeto a clasificar, además de la función de costo que se acarreó durante el ejercicio. Figura 3.17 Código para graficar los valores del archivo log que se generó durante el entrenamiento. 48 Desenlace 4.1 Resultados Una vez realizadas las evaluaciones del modelo, se analizaron los niveles de certeza para generar tanto la máscara como la caja alrededor del objeto a clasificar. Sus resultados se pueden consultar en la gráfica 4.1, la cual refleja la precisión media (mAP) del promedio de los distintos rangos de la unión sobre la intersección (IoU), un desglose de cada uno aparece en la tabla 4.1. (a) (b) Gráfica 4.1 Calificación en la formación de la máscara (a) y la caja (b) del objeto. media .50 .55 .60 .65 .70 .75 .80 .85 .90 .95 máscara 88.68 98.61 98.61 98.61 97.95 97.95 97.27 97.27 94.76 77.99 27.80 caja 85.71 98.61 98.61 97.95 97.95 97.95 96.92 95.61 89.62 68.48 15.39 Tabla 4.1 Precisión media (mAP) de acierto en la generación de la máscara y la caja de acuerdo a cada rango de la unión sobre la intersección 49 Otro indicador importante es la función de error, esta se plasma en la gráfica 4.2, en ella se puede extraer que la red tuvo un entrenamiento correcto, ya que la diferencia en sus valores entre iteraciones fue disminuyendo conforme este avanzaba. Gráfica 4.2 Función que representa la diferencia de los pesos entre iteraciones Ahora se compara el número de detecciones que hizo el modelo de cada categoría en la etapa de validación. El conteo se muestra en la tabla 4.2, en ella se observa que se detectaron 59 ejemplos con cubrebocas, una de ellas era errónea y faltaron dos para localizar las 60 que había; se encontraron las 60 instancias sin cubrebocas, sin embargo se contó una de más, lo cual dio 61 detecciones; en la categoría de mal cubrebocas se clasificaron 62 localidades de 60 posibles, eso quiere decir que 2 de ellas eran incorrectas. Categoría Total de detecciones Total de posibles Detecciones equivocadas Detecciones faltantes con_cubrebocas 59 60 1 2 sin_cubrebocas 61 60 1 0 mal_cubrebocas 62 60 2 0 Tabla 4.2 Lista el número de detecciones, el número máximo de correctas y sus respectivos falsos positivos y falsos negativos en la validación. Una vez que se sabe la cantidad de positivos verdaderos, falsos positivos y falsos negativos, se realizan los cálculos de precisión, exactitud y F1 que se muestran en las 50 ecuaciones 4.1, 4.2, y 4.3, respectivamente. Estos resultados se muestran en la tabla 4.3. Se comienza listando los casos con cubrebocas en la cual el modelo consiguió una precisión del 96.6%, una exactitud del 95% y un F1 de 95.7%. En el siguiente conjunto, sin cubrebocas, la precisión fue del 98.3%, la exactitud del 100% y con eso dio un F1 del 99.1%. Para terminar, en los ejemplos con mal cubrebocas el F1 tuvo un 98.3% debido a que la exactitud fue del 100% y la precisión del 96.7%. 4.1𝑃𝑟𝑒𝑐𝑖𝑠𝑖ó𝑛 = 𝑇𝑜𝑡𝑎𝑙 𝑑𝑒 𝑑𝑒𝑡𝑒𝑐𝑐𝑖𝑜𝑛𝑒𝑠 − 𝐷𝑒𝑡𝑒𝑐𝑐𝑖𝑜𝑛𝑒𝑠 𝑒𝑞𝑢𝑖𝑣𝑜𝑐𝑎𝑑𝑎𝑠 𝑇𝑜𝑡𝑎𝑙 𝑑𝑒 𝑑𝑒𝑡𝑒𝑐𝑐𝑖𝑜𝑛𝑒𝑠 4.2𝐸𝑥𝑎𝑐𝑡𝑖𝑡𝑢𝑑 = 𝑇𝑜𝑡𝑎𝑙 𝑑𝑒 𝑑𝑒𝑡𝑒𝑐𝑐𝑖𝑜𝑛𝑒𝑠 − 𝐷𝑒𝑡𝑒𝑐𝑐𝑖𝑜𝑛𝑒𝑠 𝑓𝑎𝑙𝑡𝑎𝑛𝑡𝑒𝑠 𝑇𝑜𝑡𝑎𝑙 𝑑𝑒 𝑝𝑜𝑠𝑖𝑏𝑙𝑒𝑠 4.3𝐹1 = 2 * 𝑃𝑟𝑒𝑐𝑖𝑠𝑖ó𝑛 * 𝐸𝑥𝑎𝑐𝑡𝑖𝑡𝑢𝑑 𝑃𝑟𝑒𝑐𝑖𝑠𝑖ó𝑛 + 𝐸𝑥𝑎𝑐𝑡𝑖𝑡𝑢𝑑 Categoría Precisión Exactitud F1 con_cubrebocas 96.6% 95% 95.7% sin_cubrebocas 98.3% 100% 99.1% mal_cubrebocas 96.7% 100% 98.3% Tabla 4.3 Porcentaje que obtuvo cada cálculo en la validación. Con esto se terminó el análisis de los resultados que arrojó la validación del modelo mientras este estaba siendo entrenado. Se procedió a analizar las detecciones al conjunto de imágenes de prueba. El primer paso es contabilizar las detecciones para cada categoría en la etapa de prueba. Este proceso se muestra en la tabla 4.4, donde se revela que se contabilizaron 23 detecciones con cubrebocas sin falsos positivos o negativos; para los ejemplos sin cubrebocas estos se contaron en 24, sin embargo, entre ellas había un falso positivo; por último, de los 13 casos que existían usando mal el cubrebocas, faltó una de ellas de ser detectada por el modelo. 51 Categoría Total de detecciones Total de posibles Detecciones equivocadas Detecciones faltantes con_cubrebocas 23 23 0 0 sin_cubrebocas 24 23 1 0 mal_cubrebocas 12 13 0 1 Tabla 4.4 Lista el número de detecciones, el número máximo de correctas y sus respectivos falsos positivos y falsos negativos en la prueba. Una vez conocidas estas proporciones, es posible conocer las métricas, tabla 4.5, para evaluar el desempeño del clasificador en la etapa de prueba. La precisión fue de 100% cuando había un cubrebocas; 95.8% para los ejemplos sin cubrebocas; y 100% en los de mal cubrebocas. La exactitud tuvo los valores de: 100% para con cubrebocas; 100% en los de sin cubrebocas; 92.3% cuando está mal puesto. La calificación F1 para los ejemplos con cubrebocas, sin cubrebocas y mal cubrebocas fue 100%, 97.8% y 96%, respectivamente. Categoría Precisión Exactitud F1 con_cubrebocas 100% 100% 100% sin_cubrebocas 95.8% 100% 97.8% mal_cubrebocas 100% 92.3% 96% Tabla 4.5 Porcentaje que obtuvo cada cálculo en la prueba. Finalmente, se presentan en la figura 4.1 imágenes del conjunto de prueba para que sirvan como demostración de cómo el clasificador realizó las detecciones. En los ejemplos a y b, están presentes un cubrebocas por persona, mas este está mal colocado, de ahí que el color de la máscara y la caja esté de color amarillo. En los ejemplos posteriores se exhibe la forma de las detecciones con cubrebocas, c, d y f, la cual se identifica con una clasificación en color verde y en las instancias c y e, el formato en color rojo para cuando no se localice un cubrebocas en la persona. 52 (a) (b) (c) (d) (e) (f) Figura 4.1 Algunas detecciones del conjunto de prueba. Fuente [46] 4.2 Discusión de los resultados Esta examinación inicia con los valores mAP obtenidos. En la tabla 4.1 se puede observar que la red realizó un mejor trabajo produciendo la máscara que la caja, esto puede deberse a que las anotaciones para los casos con cubrebocas y mal cubrebocas, al seguir el contorno que formaban estos dos, resultaban un tanto irregular para representarla con una caja, ocasionando que en el entrenamiento la máscara generada de la imagen en cuestión estuviera más conforme con la original, no siendo el caso para la caja, dando como resultado el 15.39 de la caja frente al 27.80 de la máscara en el rango mAP@.95. Esto se puede comprobar en la detección del individuo a la derecha del ejemplo a de la figura 4.1, donde se percibe que la máscara no toma en cuenta los dedos de esta persona como relevantes para la clasificación, sin embargo, como hay un pedazo de cubrebocas a lado de ellos, que sí es relevante, la superficie de la caja si los incluye, provocando que la sensibilidad del calificador map@.95 tome como incorrecta una detección de caja que solo una que esté generada hasta donde empiezan los dedos. Comentando acerca de la producción de detecciones que se generó en la validación, no resulta sorprendente que la categoría de sin_cubrebocas haya sido la que se clasificó mejor, con un 99.1% de f1, ya que los pesos que se utilizaron para entrenar el modelo ya lograban detectar personas, ya habían pasado por miles de iteraciones e imágenes para 53 saber cómo detectar individuos. Sin embargo, el hecho de que la clase mal cubrebocas haya sido exacta en todos los ejemplos de este tipo resulta algo sospechoso, dando así un 98.3% de f1, ya que se esperarían unos resultados en esta calificación algo más parecidos a los alcanzados en la clasificación de con cubrebocas, 95.7% de f1, como ocurrió con la métrica precisión de ambas clases. Esto podría indicar que las imágenes utilizadas no fueron lo suficientemente diversas, con respecto al entrenamiento, como para que el modelo cultivara patrones generales de aprendizaje en vez de memorizar los detalles específicos de las imágenes suministradas. Algo contrario sucedió en la etapa de prueba, donde esta vez, la categoría con mejor calificación en precisión y exactitud fue con_cubrebocas, con un 100% en ambas. Cabe mencionar que lo esperado serían las notas que se consiguieron para los ejemplos de mal_cubrebocas que llevaron a un 96% de f1. La suposición para este caso es similar, las imágenes del conjunto de prueba eran parecidas a las que estuvo expuesto el modelo durante todo el proceso de entrenamiento, ocasionando esta posible memorización de las respuestas. Para la clase sin_cubrebocas el clasificador volvió a obtener una nota sobresaliente, lo que no levanta desconfianza por lo mencionado anteriormente. Para cerrar, se comenta acerca de las detecciones realizadas al conjunto de imágenes de prueba. Estas resultan muy destacables, por ejemplo, en a y b de la figura 4.1 donde el cubrebocas se encuentra a la altura del cuello, que quiere decir que la cara estaba completamente sin un cubrebocas, se logró clasificarlo como mal puesto. Esto significa que el tipo de anotaciones hechas para esta categoría fueron las adecuadas. Otro punto es sobre la calidad que tienen las máscaras en cada detección, cubren exactamente la región del rostro y cortan objetos que no formen parte de la cara y que se encuentran a la altura de esta, ejemplo a y f de la figura 4.1, como dictan las anotaciones de entrenamiento y prueba. 4.3 Conclusiones Se cumplió el objetivo de desarrollar un clasificador que pueda catalogar imágenes con personas dependiendo de donde usan un cubrebocas. Esto ayuda mucho para el monitoreo, tanto para fines estadísticos como de cumplimiento, necesarios hoy en día por la situación de pandemia que se vive. Además este proyecto es relevante por el tipo de tecnología que se utilizó, ya que Yolact es el primer método que segmenta las instancias a velocidades que pueda procesar 54 un video en tiempo real. Es por eso que además del uso práctico que se le puede dar al clasificador, este puede ser utilizado como guía en la elaboración de modelos que utilicen Yolact o algún segmentador por instancia que pueda salir en un futuro. Esto contribuye en el actual desarrollo de la visión por computadora que promete muchos beneficios para la sociedad. Pasando a comentarios relacionados al mismo clasificador, el hecho de utilizar menos de 1000 imágenes (775 de entrenamiento y 154 de validación) en el proyecto, cobró importancia en la segmentación de cada instancia y en el desempeño del clasificador. Aun así se sostiene que fue correcta esta resolución por la razón de que se contaba con tiempo limitado como para ahondar en: uno, obtener las imágenes con las características requeridas (personas usando mal el cubrebocas), ya que, como se mencionó en la obtención de datos, estas carecieron en los conjuntos de imágenes que se consultaron; dos, hacer las anotaciones correspondientes a cada fotografía que, aunque se utilizó la herramienta labelme, sigue siendo un paso muy laborioso y al cual no se encontró una forma de automatizar más allá de darle al JSON resultante el contenido en formato COCO. Asimismo, la decisión de no incluir objetos, que no fuera el cubrebocas, que aparecieran a la altura del rostro resultó negativa en la formación de la caja y eso conllevo a una menor certeza frente a la máscara. Se cree que con un número mayor de ejemplos, y por consiguiente un incremento en las iteraciones del entrenamiento, mayor diversificación en el tipo de imágenes que conforman el conjunto de datos, especialmente para las categorías con_cubrebocas y sin_cubrebocas, y además de contar con un tipo de anotación que cubra toda la zona del rostro, aun cuando haya algún otro objeto en medio, se conseguirán resultados superiores en la segmentación de la instancia y en la certeza de las clasificaciones. Finalmente, se evidenció que actualmente existen todos los componentes necesarios para desarrollar proyectos de visión por computadora con buen rendimiento sin tener que invertir grandes cantidades de dinero para acceder a recursos computacionales necesarios, y completarlos en un tiempo relativamente corto, ya que no es necesario implementar la red neuronal desde cero. Existen varias fuentes para acceder a conjuntos de imágenes, por lo que la recolección de datos es un paso sencillo, en varias ocasiones. El proceso de las anotaciones es relativamente sencillo, ya que la herramienta que se utilizó agiliza mucho este paso, pero consume mucho tiempo, es por eso que se cree que en un futuro aparecerá nuevo software que acelere aún más este procedimiento. En cuanto a la red neuronal, se 55 encuentran varias librerías para diseñar una arquitectura, como Pytorch, o en dado caso, que fue en este proyecto, se puede utilizar una arquitectura ya diseñada como Yolact y uno se ocupa de los cambios necesarios a las configuraciones para llevar a cabo el entrenamiento y posiblemente en mejoras para un desempeño superior. También es importante mencionar que la posibilidad de tener acceso a los recursos de la nube de Google posibilitaron enormemente la elaboración de este clasificador, ya que localmente no se contaban con los recursos computacionales necesarios para correr utilizar Yolact. 4.4 Trabajos futuros El primer paso que se propone realizar es aumentar el repertorio de fotografías, no obstante siempre manteniendo una proporción equilibrada entre los ejemplos de cada clase. Aunado a esto, se experimentará con el protocolo para elaborar las anotaciones. Labelme ofrece una variedad de formas geométricas para comentar las regiones de interés en la imagen, por lo que se examinará si esto conlleva a una etiquetación más rápida y que incluya toda la región del rostro y así mejorar en la segmentación de las detecciones, al puntuar mejor en el mAP@.95. Otra inquietud es la de incorporar Yolact++ como base de detección de la red, dado que en los experimentos que se realizaron no se logró producir los resultados que publica el autor de la red, los cuales, en teoría, son superiores a si se usa Yolact, conduciendo a una mejora en el clasificador. En el ramo de las utilidades a las cuales se puede aplicar el modelo están: incorporarlo en una página web y/o aplicación móvil y generar las detecciones leyendo los datos de entrada de la cámara del dispositivo; otra función sería montarlo sobre una placa de desarrollo como arduino, raspberry pi o jetson nano para armar un sistema de monitoreo que tenga una serie de respuestas dependiendo de lo que esté clasificando. Para ambas opciones se cree que se tendría que acoplar una red convolucional más ligera que Resnet como MobileNetV2 [8], la cual obtiene buenos resultados en dispositivos pequeños y su archivo de valores iniciales no llega a pesar más de 50 MB, comparado a los 120 MB que pesa si se usa Resnet50. Esto para que el sistema completo pueda ser más portable y no se tenga la preocupación de espacio reducido en el dispositivo a utilizar. Otra posibilidad interesante para atacar las propuestas anteriores sería migrar a una nueva arquitectura Yolact. A finales del año pasado se publicó YolactEdge [9], la cual sigue 56 utilizando la estructura propuesta en Yolact, sin embargo, está dirigida específicamente para que el modelo sea operado en dispositivos pequeños, por lo que no se tendría que pasar por todo el proceso de acoplar una nueva red convolucional a Yolact e irse directo al desarrollo de este clasificador utilizando el mismo conjunto de datos y posteriormente cargar el modelo en el dispositivo seleccionado. Referencias [1] “When and how to use masks,” World Health Organization, 2020. [Online]. Available at: [2] T. Lin, M. Maire, S. Belongie, L. Bourdev, R. Girshick, J. Hays, P. Perona, D. Ramanan, C. Zitnick, and P. Dollár, “Microsoft COCO: Common Objects In Context,” 2020 [online] arXiv.org. Available at: [3] D. Bolya, C. Zhou, F. Xiao and Y. Lee, “YOLACT: Real-Time Instance Segmentation,” 2020 [online] arXiv.org. Available at: [4] B. Roy, S. Nandy, D. Ghosh, D Dutta, P. Biswas, T. Das, “MOXA: A deep learning based unmanned approach for real-time monitoring of people wearing medical masks,” Springer, 2020. [5] M. Loey, G. Manogaran, M. H. N. Taha, N. E. M Khalifa, “A hybrid deep transfer learning model with machine learning methods for face mask detection in the era of the COVID-19 pandemic,” Elsevier, 2020. [6] S. Rostianingsih, A. Setiawan, C. I. Halim, “COCO (Creating Common Object in Context) dataset for chemistry apparatus,” Elsevier, 2020. 57 https://www.who.int/emergencies/diseases/novel-coronavirus-2019/advice-for-public/when-and-how-to-use-masks https://www.who.int/emergencies/diseases/novel-coronavirus-2019/advice-for-public/when-and-how-to-use-masks https://arxiv.org/abs/1405.0312 https://arxiv.org/abs/1904.02689v2 [7] F. López Saca, “Clasificación de imágenes usando redes neuronales convolucionales,” Proyecto terminal, Maestría en Ciencias de la Computación, Universidad Autónoma Metropolitana Azcapotzalco, México, 2019. [8] M. Sandler, A. Howard, M. Zhu, A. Zhmoginov and L. Chen, "MobileNetV2: Inverted Residuals and Linear Bottlenecks", arXiv.org, 2021. [Online]. Available: https://arxiv.org/abs/1801.04381v4. [9] H. Liu, R. Soto, F. Xiao and Y. Lee, "YolactEdge: Real-time Instance Segmentation on the Edge (Jetson AGX Xavier: 30 FPS, RTX 2080 Ti: 170 FPS)", arXiv.org, 2021. [Online]. Available: https://arxiv.org/abs/2012.12259. [10] Y. LeCun, Y. Bengio and G. Hinton, "Deep learning", Nature, vol. 521, no. 7553, pp. 436-444, 2015. Available: 10.1038/nature14539. [11] S. Albawi, T. Mohammed and S. Al-Zawi, "Understanding of a convolutional neural network", 2017 International Conference on Engineering and Technology (ICET), 2017. Available: 10.1109/icengtechnol.2017.8308186. [12] A. Voulodimos, N. Doulamis, A. Doulamis and E. Protopapadakis, "Deep Learning for Computer Vision: A Brief Review", Computational Intelligence and Neuroscience, vol. 2018, pp. 1-13, 2018. Available: 10.1155/2018/7068349. [13] I. Mihajlovic, "Everything You Ever Wanted To Know About Computer Vision. Here’s A Look Why It’s So Awesome.", Medium, 2021. [Online]. Available: https://towardsdatascience.com/everything-you-ever-wanted-to-know-about-computer-visio n-heres-a-look-why-it-s-so-awesome-e8a58dfb641e. [14] F. Lin, B. Li, W. Zhou, H. Li and Y. Lu, "Single-stage Instance Segmentation", ACM Transactions on Multimedia Computing, Communications, and Applications, vol. 16, no. 3, pp. 1-19, 2020. Available: 10.1145/3387926. 58 [15] C. Goutte and E. Gaussier, "A Probabilistic Interpretation of Precision, Recall and F-Score, with Implication for Evaluation", Lecture Notes in Computer Science, pp. 345-359, 2005. Available: 10.1007/978-3-540-31865-1_25. [16] W. McCulloch and W. Pitts, "A logical calculus of the ideas immanent in nervous activity", The Bulletin of Mathematical Biophysics, vol. 5, no. 4, pp. 115-133, 1943. Available: 10.1007/bf02478259. [17] G. Piccinini, "The First Computational Theory of Mind and Brain: A Close Look at Mcculloch and Pitts's “Logical Calculus of Ideas Immanent in Nervous Activity”", Synthese, vol. 141, no. 2, pp. 175-215, 2004. Available: 10.1023/b:synt.0000043018.52445.3e. [18] J. Choi et al., "Convolutional Neural Network Technology in Endoscopic Imaging: Artificial Intelligence for Endoscopy", Clinical Endoscopy, vol. 53, no. 2, pp. 117-126, 2020. Available: 10.5946/ce.2020.054. [19] E. Kutlugun and C. Eyupoglu, "Artificial Intelligence Methods Used in Computer Vision", 2020 5th International Conference on Computer Science and Engineering (UBMK), 2020. Available: 10.1109/ubmk50275.2020.9219385. [20] L. Fei-Fei, J. Deng and K. Li, "ImageNet: Constructing a large-scale image database", Journal of Vision, vol. 9, no. 8, pp. 1037-1037, 2010. Available: 10.1167/9.8.1037. http://image-net.org/ [21] "Colaboratory – Google", Research.google.com, 2021. [Online]. Available: https://research.google.com/colaboratory/faq.html#resource-limits. [22] "Project Jupyter", Jupyter.org, 2021. [Online]. Available: https://jupyter.org/. [23] "NumPy", Numpy.org, 2021. [Online]. Available: https://numpy.org/. 59 https://research.google.com/colaboratory/faq.html#resource-limits [24] A. Paszke et al., "PyTorch: An Imperative Style, High-Performance Deep Learning Library", arXiv.org, 2021. [Online]. Available: https://arxiv.org/abs/1912.01703. [25] "A Gentle Introduction to torch.autograd — PyTorch Tutorials 1.7.1 documentation", Pytorch.org, 2021. [Online]. Available: https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html#sphx-glr-beginner-blitz-a utograd-tutorial-py. [26] “Tensors,” Tensors - PyTorch Tutorials 1.7.1 documentation. [Online]. Available: https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tens or-tutorial-py. [27] L. Fei-Fei, J. Deng and K. Li, "ImageNet: Constructing a large-scale image database", Journal of Vision, vol. 9, no. 8, pp. 1037-1037, 2010. Available: 10.1167/9.8.1037. http://image-net.org/ [28] M. Everingham, L. Van Gool, C. K. I. Williams, J. Winn, and A. Zisserman, “The PASCAL visual object classes (VOC) challenge,” IJCV, vol. 88, no. 2, pp. 303–338, Jun. 2010. http://host.robots.ox.ac.uk/pascal/VOC/ [29] R. Ribani and M. Marengoni, "A Survey of Transfer Learning for Convolutional Neural Networks," 2019 32nd SIBGRAPI Conference on Graphics, Patterns and Images Tutorials (SIBGRAPI-T), Rio de Janeiro, Brazil, 2019, pp. 47-57, doi: 10.1109/SIBGRAPI-T.2019.00010. [30] S. J. Pan and Q. Yang, "A Survey on Transfer Learning," in IEEE Transactions on Knowledge and Data Engineering, vol. 22, no. 10, pp. 1345-1359, Oct. 2010, doi: 10.1109/TKDE.2009.191. [31] K. He, X. Zhang, S. Ren, and J. Sun, “Deep Residual Learning for Image Recognition,” arXiv.org, 10-Dec-2015. [Online]. Available: https://arxiv.org/abs/1512.03385. 60 [32] S. Liu, L. Qi, H. Qin, J. Shi and J. Jia, "Path Aggregation Network for Instance Segmentation," 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition, Salt Lake City, UT, USA, 2018, pp. 8759-8768, doi: 10.1109/CVPR.2018.00913. [33] C. Fu, M. Shvets and A. Berg, "RetinaMask: Learning to predict masks improves state-of-the-art single-shot detection for free", arXiv.org, 2021. [Online]. Available: https://arxiv.org/abs/1901.03353. [34] Y. Li, H. Qi, J. Dai, X. Ji and Y. Wei, "Fully Convolutional Instance-Aware Semantic Segmentation," 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Honolulu, HI, USA, 2017, pp. 4438-4446, doi: 10.1109/CVPR.2017.472. [35] K. He, G. Gkioxari, P. Dollár and R. Girshick, "Mask R-CNN," 2017 IEEE International Conference on Computer Vision (ICCV), Venice, Italy, 2017, pp. 2980-2988, doi: 10.1109/ICCV.2017.322. [36] Z. Huang, L. Huang, Y. Gong, C. Huang and X. Wang, "Mask Scoring R-CNN," 2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), Long Beach, CA, USA, 2019, pp. 6402-6411, doi: 10.1109/CVPR.2019.00657. [37] T. Lin, P. Dollár, R. Girshick, K. He, B. Hariharan and S. Belongie, "Feature Pyramid Networks for Object Detection," 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Honolulu, HI, USA, 2017, pp. 936-944, doi: 10.1109/CVPR.2017.106. [38] A. Neubeck and L. Van Gool, "Efficient Non-Maximum Suppression," 18th International Conference on Pattern Recognition (ICPR'06), Hong Kong, China, 2006, pp. 850-855, doi: 10.1109/ICPR.2006.479. [39] W. Liu et al., "SSD: Single Shot MultiBox Detector", Computer Vision – ECCV 2016, pp. 21-37, 2016. Available: 10.1007/978-3-319-46448-0_2. 61 [40] K. Kasuaki, "Property of average precision and its generalization : An examination of evaluation indicator for information retrieval experiments", researchgate, 2005. [Online]. Available: https://www.researchgate.net/publication/242072790_Property_of_Average_Precision_and _its_Generalization_An_Examination_of_Evaluation_Indicator_for_Information_Retrieval _Experiments. [41] “Common Objects in Context,” COCO. [Online]. Available: https://cocodataset.org/#detection-eval. [42] J. Hui, “mAP (mean Average Precision) for Object Detection,” Medium, 03-Apr-2019. [Online]. Available: https://jonathan-hui.medium.com/map-mean-average-precision-for-object-detection-45c121 a31173. [43] J. Solawetz, “What is Mean Average Precision (mAP) in Object Detection?,” Roboflow Blog, 05-Oct-2020. [Online]. Available: https://blog.roboflow.com/mean-average-precision/. [44] S. Yohanandan, “mAP (mean Average Precision) might confuse you!,” Medium, 09-Jun-2020. [Online]. Available: https://towardsdatascience.com/map-mean-average-precision-might-confuse-you-5956f1bf a9e2. [45] “Common Objects in Context,” COCO. [Online]. Available: https://cocodataset.org/#format-data. [46] “Face mask detection,” Kaggle, 16-Jun-2020. [Online]. Available: https://www.kaggle.com/ayushimishra2809/face-mask-detection/data. [47] J. Zhu, “FaceMask_Yolov5_Pytorch,” Kaggle, 27-Nov-2020. [Online]. Available: https://www.kaggle.com/jiadongzhu/facemask-yolov5-pytorch. 62 [48] “Are you wearing your face mask correctly?,” Reusable Face Masks, 18-May-2020. [Online]. Available: https://yoursimpleaccessory.com/blogs/blogs/are-you-wearing-your-face-mask-correctly. [49] D. Bolya, “Very low .95 mAP · Issue #312 · dbolya/yolact,” GitHub, 04-Feb-2020. [Online]. Available: https://github.com/dbolya/yolact/issues/312#issuecomment-582158654. [50] N. Zhang, “How to Tune Hyper-Parameters in Deep Learning,” Medium, 17-Jul-2017. [Online]. Available: https://medium.com/@aiii/how-to-tune-hyper-parameters-in-deep-learning-a0fa4bc1d782. [51] K. Katanforoosh, D. Kunin and J. Ma, "AI Notes: Parameter optimization in neural networks - deeplearning.ai", deeplearning.ai, 2021. [Online]. Available: https://www.deeplearning.ai/ai-notes/optimization/. [52] D. Bolya, “Which hyperparameters to tune? · Issue #246 · dbolya/yolact,” GitHub, 11-Dec-2019. [Online]. Available: https://github.com/dbolya/yolact/issues/246#issuecomment-564667630. [53] F. Rosenblatt, "The perceptron: A probabilistic model for information storage and organization in the brain.", Psychological Review, vol. 65, no. 6, pp. 386-408, 1958. Available: 10.1037/h0042519 [54] K. Fukushima, S. Miyak