Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y ELÉCTRICA UNIDAD CULHUACAN Clasificador en tiempo real de gestos anímicos utilizando Deep Learning para apoyo al profesor, por medio de una plataforma web Tesina Que para obtener el título de Ingeniero en Computación Presentan Espinosa Juárez Alberto Vega Reyes Diego Asesores Dr. Jorge Fernando Veloz Ortiz Dra. Iovanna Alejandra Rodríguez Moreno México, Ciudad de México Mayo, 2020 CONTENIDO RESUMEN ............................................................................................................................................................ 1 INTRODUCCIÓN .................................................................................................................................................. 3 1.1 OBJETIVO GENERAL ........................................................................................................................................ 4 1.1.2 OBJETIVOS ESPECÍFICOS ...................................................................................................................... 4 1.2 PLANTEAMIENTO DEL PROBLEMA ............................................................................................................. 4 1.3 JUSTIFICACIÓN .................................................................................................................................................. 5 1.4 ESTADO DE ARTE ............................................................................................................................................. 6 MARCO TEÓRICO ............................................................................................................................................... 7 2.1 LA EDUCACIÓN 4.0 ........................................................................................................................................... 8 2.2 INTELIGENCIA ARTIFICIAL ............................................................................................................................. 9 2.2.1 MACHINE LEARNING .............................................................................................................................. 10 2.2.2 REDES NEURONALES ARTIFICIALES ............................................................................................... 11 2.2.3 DEEP LEARNING ...................................................................................................................................... 13 2.3 EMOCIONES HUMANAS ................................................................................................................................. 14 2.4 PATRONES Y EXPRESIONES FACIALES .................................................................................................. 16 2.5 VISIÓN ARTIFICIAL .......................................................................................................................................... 16 2.5 PYTHON .............................................................................................................................................................. 17 2.6 TENSORFLOW Y KERAS ............................................................................................................................... 18 2.7 DJANGO ............................................................................................................................................................. 19 DESARROLLO ................................................................................................................................................... 20 3.1 EMOCIONES HUMANAS UNIVERSALES ................................................................................................... 21 3.2 INSTALACIÓN Y CONFIGURACIÓN DEL ENTORNO DE DESARROLLO ........................................... 23 3.3 BASES DE DATOS PÚBLICAS DE RECONOCIMIENTO DE EXPRESIONES FACIALES Y TRATAMIENTO DE DATOS ........................................................................................................................................ 27 3.3 DISEÑO DE ARQUITECTURA DE RED NEURONAL ................................................................................ 33 3.4 ANÁLISIS DE LA EFICACIA DE RED NEURONAL ................................................................................... 41 3.5 DISEÑO DE APLICACIÓN DE CLASIFICACIÓN EN TIEMPO REAL ..................................................... 44 3.6 CREACIÓN DE LA PLATAFORMA WEB UTILIZANDO DJANGO ......................................................... 47 3.6.1 CREACIÓN DE LA BASE DE DATOS ........................................................................................................ 48 3.6.2 CREACIÓN DEL PROYECTO DJANGO ..................................................................................................... 49 3.6.3 CREACIÓN DE APLICACIÓN “GESTOS” Y VISTA PRINCIPAL .......................................................... 50 3.6.4 CREACIÓN DE VISTAS Y ENLACES URLs ............................................................... 56 3.6.5 DESARROLLO HTML Y CSS ....................................................................................................................... 60 PRUEBAS Y RESULTADOS ............................................................................................................................. 61 CONCLUSIONES Y TRABAJO A FUTURO ..................................................................................................... 68 5.1 CONCLUSIONES .............................................................................................................................................. 69 5.2 TRABAJO A FUTURO ...................................................................................................................................... 70 REFERENCIAS .................................................................................................................................................. 71 INDICE DE FIGURAS Figura 1-Ciclo del Learning Analytics .................................................................................................... 9 Figura 2-Arquitectura básica de una red neuronal .............................................................................. 11 Figura 3-Arquitectura de una neurona ................................................................................................ 12 Figura 4-Funciones de activaciones ................................................................................................... 13 Figura 5-Atlas de emociones .............................................................................................................. 15 Figura 6-Rasgos faciales característicos de cada emoción. ............................................................... 21 Figura 7-Anaconda Suite .................................................................................................................... 23 Figura 8-Instrucciones para acceder a tmp ......................................................................................... 24 Figura 9-Comprobación HASH ........................................................................................................... 24 Figura 10-Ejecución del instalador ...................................................................................................... 24 Figura 11-Terminos de uso de Anaconda ........................................................................................... 25 Figura 12-Bibliotecas que contiene el entorno de desarrollo. ............................................................. 26 Figura 13-Visualización del conjunto de datos FER2013. ................................................................... 27 Figura 14-Ejemplos presentes en FER2013....................................................................................... 28 Figura 15-Adecuación del conjunto de datos JAFFE a tamaño 48x48 pixeles y en escala de grises. 29 Figura 16-Muestra de imágenes por clase .......................................................................................... 30 Figura 17-Representación en forma de gráfica ................................................................................... 31 Figura 18-Generador de muestras ...................................................................................................... 32 Figura 19-Importación de datos FER2013. ......................................................................................... 33 Figura 20-Un ejemplo de FER2013 .................................................................................................... 34 Figura 21-Código que representa una imagen en pixeles. ................................................................. 34 Figura 22-Normalización de los pixeles .............................................................................................. 36 Figura 23-Arquitectura de una CNN .................................................................................................... 37 Figura 24-Ejemplo de convolución ...................................................................................................... 38 Figura 25-Stride de 1 .......................................................................................................................... 38 Figura 26-Stride de dos ...................................................................................................................... 38 Figura 27-Indicación de tamaño de kernel,activación ReLu y strides en nuestro proyecto ................. 38 Figura 28-Función de activación ReLu ............................................................................................... 39 Figura 29-Arquitectura final ................................................................................................................. 40 Figura 30-Accuracy final ..................................................................................................................... 41 Figura 31-Reporte de clasificación ...................................................................... 43 Figura 32-Asignación de colores ......................................................................................................... 44 Figura 33-Utilización de la red preentrenada de OpenCV .................................................................. 45 Figura 34-Resultado final de la aplicación .......................................................................................... 46 Figura 35-pgAdmin 4 .......................................................................................................................... 48 Figura 36-Muestra de exactitud .......................................................................................................... 62 Figura 37-Campeonato Kaggle ........................................................................................................... 63 Figura 38-Prueba con rostro enojado. ................................................................................................ 63 Figura 39-Prueba con rostro neuronal. ............................................................................................... 63 Figura 40-Reconocimiento en tiempo real .......................................................................................... 64 Figura 41-Inicio de sesión ................................................................................................................... 66 Figura 42-Vista principal ..................................................................................................................... 67 Figura 43-Reconocimiento por plataforma web .................................................................................. 67 Agradecimientos Alberto Espinosa Juárez A mis padres, María del Carmen y José Espiridión: Por guiarme durante todo mi trayecto estudiantil, por apoyarme en mis decisiones y prestarme gran apoyo emocional y moral durante los periodos de gran dificultad. Su ejemplo es mi mayor guía para seguir adelante. A mis hermanos, Nathalia y Moisés, y amigos: Por compartir conmigo parte de su vida, por apoyarme, por reír juntos y seguir compartiendo momentos de gran felicidad y apoyo en momentos difíciles. A mis asesores, Iovanna Alejandra Rodríguez Moreno y Jorge Fernando Veloz Ortiz, Por convertirse en mano derecha de este proyecto, por compartir de su conocimiento conmigo y brindarme la experiencia de trabajar con ustedes. Diego Vega Reyes A mis padres, Guadalupe Reyes Marín y Julián Vega Almazán: Por brindarme las herramientas que necesite durante todo mi periodo estudiantil y del que presento un gran reto, la universidad. También, por brindarme todo su apoyo y cariño en las etapas más difíciles de mi vida. A mi hermana, Jazmín del Carmen Vega Reyes: Por representar a la persona que siempre quise ser y algún día superarla, como también ser una persona que siempre me brindo sus consejos, felicidad y grandes recuerdos en todo mi periodo estudiantil, y en mí vida. A mis asesores, Iovanna Alejandra Rodríguez Moreno y Jorge Fernando Veloz Ortiz: Por brindarme todo su apoyo en este proyecto, por compartir su conocimiento conmigo y por ayudarme en diversas situaciones correspondientes al aprendizaje. 1 RESUMEN Para poder clasificar gestos anímicos en tiempo real es necesario hacer un estudio de emociones presentes en los seres humanos, para ello, nos basamos en el trabajo de Paul Ekman, Doctor en psicología cuyas investigaciones en las emociones humanas y expresiones faciales lo llevaron a que en 1972 definiera que existen seis emociones universales y, por lo tanto, seis expresiones faciales que las distinguen: Asco, miedo, sorpresa, alegría, enojo y tristeza. Lo siguiente en realizar fue una búsqueda de bases de datos públicas que permitieran extraer de ellas los datos necesarios para su análisis. Encontramos tres conjuntos de datos: FER2013 (Facial Expression Recognition 2013), FER2013+ (Facial Expression Recognition 2013+) y JAFFE (Japanese Female Facial Expression). De los tres conjuntos de datos, decidimos utilizar FER2013 y JAFFE, puesto que su forma de representar los datos era más similar, por lo que nos evitaba el uso de mezcla de técnicas para la extracción de datos. Posteriormente diseñamos una red neuronal capaz de clasificar dichas expresiones faciales, de todos los tipos de redes neuronales, optamos por utilizar redes neuronales convolucionales (CNN), esto debido a que a comparación de las redes neuronales de perceptrón multicapa, las redes CNN no conectan cada neurona con todas y cada una de las siguientes, sino, que por medio de un Pooling o una capa de reducción se elige un subgrupo de ellas (donde se encuentra la mayor cantidad de datos). Esto permite reducir el uso de neuronas necesarias y la complejidad de las operaciones computacionales para su ejecución. Después de varias pruebas de arquitectura, logramos diseñar una que nos permitía lograr una eficacia de hasta el 80% en pruebas, lo que redujo de forma significativa el margen de error al clasificar expresión facial. Lo siguiente en realizar fue una aplicación en Python cuyo propósito era la clasificación de dichas expresiones faciales en tiempo real. Para ello fue necesario recurrir a la librería de OpenCV y a una arquitectura ya compilada que permite la detección de rostros humanos, esto para poder centrarnos únicamente en las expresiones faciales, es una excelente forma de ahorrar tiempo y recursos, pues ya no es necesario fijar primero un rostro humano y de ese rostro humano realizarla extracción de las expresiones, sino, dejamos que el archivo ya compilado anteriormente detecte automáticamente los rostros, descartando el resto. 2 Finalmente, para poder hacerlo amigable con los usuarios finales (los profesores), utilizamos Django, un Framework que nos permite utilizar código Python y presentarlo por medio de una plataforma web cuyo código vertebral o estructural contiene código HTML5 y CSS3. HTML5 para la estructura y CSS3 para su diseño. La aplicación web permite un inicio de sesión para profesores y la posibilidad de cargar a clasificación una imagen o un vídeo por medio de una cámara, tomando en cuenta los posibles casos de implementación: Imágenes fijas en distintos periodos de tiempo o un vídeo a lo largo de la clase 3 CAPITULO 1 INTRODUCCIÓN 4 1.1 OBJETIVO GENERAL Desarrollar un clasificador de gestos anímicos en tiempo real, utilizando Deep Learning, programado en Python junto con las bibliotecas de Keras y TensorFlow para ayudar a detectar estados anímicos durante las clases y así, servir de apoyo al profesor para retroalimentación por medio de una plataforma web, siendo el feedback (retroalimentación) una característica fundamental de la educación 4.0. 1.1.2 OBJETIVOS ESPECÍFICOS • Reconocer los estados anímicos universales en las personas • Clasificar gestos faciales que representen estados de ánimo por medio de una base de datos • Diseñar un modelo de red neuronal convolucional para aprendizaje supervisado • Utilizar el modelo para segmentar y detectar los estados de ánimo de personas en un vídeo o imagen • Realizar un reporte automático del promedio general en estado anímico del grupo por medio de una plataforma web 1.2 PLANTEAMIENTO DEL PROBLEMA Actualmente en distintas partes del mundo se hacen esfuerzos por integrar inteligencia artificial en la educación, no como sustituto del profesor, sino, como ayuda, debido a los grandes beneficios que se pueden obtener. Por ejemplo, en China por medio de “diademas” monitorean ondas cerebrales en busca de patrones que afecten la concentración; En Estados Unidos la universidad de Princeton cuenta con cámaras en aulas que mide el nivel de distracción. En México no existe una gran cantidad de proyectos enfocados a lo anterior a pesar de existir ya un enfoque 4.0 en la educación. 5 1.3 JUSTIFICACIÓN Cada vez más instituciones educativas apuestan por implementar herramientas de IA en aulas de clase. En el Instituto Politécnico Nacional, ya se habla de una educación 4.0 donde una característica fundamental es el feedback o Learning Analytics. Con este proyecto se busca ayudar en esa característica puesto que los gestos anímicos son muy particulares en el proceso de aprendizaje y son reflejo del estado en las clases. 6 1.4 ESTADO DE ARTE 7 CAPITULO 2 MARCO TEÓRICO 8 2.1 LA EDUCACIÓN 4.0 Desde hace un par de años, la educación 4.0 ha llegado a México de una forma parcial, sin embargo, a pesar de que universidades como el ITESM ya la viven por medio de sus modelos educativos, en el Instituto Politécnico Nacional aún no es el caso; debemos recordar que la educación 4.0 es un modelo educativo en el que la educación no está centrada en el contenido, sino, está centrada en hacer alumnos competentes, en lograr que los alumnos identifiquen qué saben hacer y cómo lo pueden aplicar, es decir, qué saben ser. Para ello, la dinámica y programas escolares cambian drásticamente, donde se consideran todos los estilos de aprendizaje, las inteligencias múltiples predominantes1 y se hace uso de tecnología para realizar un feedback (retroalimentación) Ese feedback o Learning Analytics, como algunos autores lo llaman, tiene como finalidad obtener información para mejorar la práctica educativa, optimizando el rendimiento de alumnos y profesores, así como del modelo educativo en sí. Además del Learning Analytics, también se distingue el Academic Analytics, que funciona de la misma manera, pero orientado a instituciones educativas, comunidades o gobiernos, siendo implementadas concretamente en profesores o centros. Las posibilidades de aplicar un feedback de forma correcta puede: • Guiar a los estudiantes a través de itinerarios personalizados • Predecir el abandono y desempeño de los participantes de un curso o clase • Adaptar las clases a los conocimientos reales • Identificar necesidades de aprendizaje • Conocer el comportamiento de los estudiantes en relación a la plataforma de trabajo • Optimizar los recursos formativos • Mejorar la comunicación 9 Figura 1-Ciclo del Learning Analytics Eduliticas, una empresa dedicada a la Analítica del Aprendizaje fijó cinco pasos por los cuales el Learning Analytics pasa. En nuestro proyecto está enfocado en los primeros tres pasos del ciclo. Donde definimos el estudio de las expresiones faciales humanas, recolectamos los datos presentes en un aula de clase y finalmente los analizamos y visualizamos por medio de una plataforma web. 2.2 INTELIGENCIA ARTIFICIAL Muchas instituciones educativas apuestan por utilizar la inteligencia artificial en la Analítica del aprendizaje. La IA definida por primera vez en 1956, en la Universidad de Dartmouth Collage2 por J.McCarthy, M. Minsky, N. Rochester y C.E Shannon, como “Ciencia de crear maquinas que se comporten como un ser humano” nos ha permitido desde 1994 controlar tareas básicas en la industria así como hacer supervisiones. Hacer búsquedas a través de grandes masas de datos (Bishop, 1995) así como hacer análisis de textos que permitían a los usuarios encontrar un documento entre billones de sitios web con escribir solo palabras clave (Lowe, 2001). A pesar de que hoy en día existan tantos titulares acerca de que la IA supera la capacidad humana en ciertas actividades, no es nuevo, pues está presente en la industria desde 1980. 10 Huang J, decía en “Isolation of Cytokinetic Actomyosin Rings from Saccharomyces cerevisiae and Schizosaccharomyces pombe. Methods Mol” que “La inteligencia artificial es un subconjunto estricto de la computación, es decir, de transformación de la información. Hay que tener en cuenta que la computación es un proceso físico, no matemático: Requiere tiempo, espacio y energía. La inteligencia artificial es el subconjunto de la computación que transforma un contexto en acción. 2.2.1 MACHINE LEARNING De la definición anterior de Inteligencia Artificial, nace el término de Machine Learning, que es muy importante ya que es una de las vertientes más importante de este proyecto. BBVA define el Machine Learning como una rama de la inteligencia artificial que permite que las maquinas aprendan sin ser expresamente programadas para ello, en definitiva, un maestro del reconocimiento de patrones, capaz de convertir una muestra de datos en un programa informático capaz de extraer inferencias de nuevos conjuntos de datos para los que no ha sido entrenado previamente3. El machine Learning hoy en día presenta un sinfín de aplicaciones como las recomendaciones de Netflix o Spotify, las respuestas automáticas de Gmail o el habla de Siri, Alexa y Cortana. En las décadas de 1950 y 1960, distintos científicos empezaron a investigar el cómo se podría aplicar la biología de las redes neuronales del cerebro humano en computadoras, cuya idea derivó en la creación de las redes neuronales artificiales. Uno de los primeros experimentos en usar dichas redes neuronales artificiales fue realizado por Marvin Minsky y Dean Edmonds. Lograron crear un programa capaz de aprender de la experiencia para salir de un laberinto. Esa fue la primera computadora en capaz de aprender de sí misma para resolver una tarea sin haber sido programada para ello de forma explícita, si no, que lo aprendió a partir de ejemplosdados a ella previamente. El gran hito del machine Learning es que permitió pasar de programación mediante reglas a un modelo cuyas reglas salían de manera desasistida. Todo gracias a los datos. 11 Sin embargo, el machine Learning parecía no tener mucho futuro debido a la falta de datos y la poca potencia de cálculo de las computadoras de ese entonces. Fue hasta finales del siglo XX cuando las computadoras fueron capaces de realizar millones de operaciones en cuestión de segundos o minutos y la gran cantidad de datos con la llegada de Internet que en 1997 se marcó un hitó, el sistema IBM Deep Blue entrenado a partir de ver miles de partidas de ajedrez fue capaz de vencer al campeón mundial de ese juego, Garry Kasparov. 2.2.2 REDES NEURONALES ARTIFICIALES Las redes neuronales artificiales son modelos simples del funcionamiento del sistema nervioso biológico. Las unidades básicas de dichas redes, son las neuronas, que generalmente se organizan en capas, tal como se muestra en la siguiente figura. Figura 2-Arquitectura básica de una red neuronal Las redes neuronales emulan el modo en que el cerebro humano procesa la información: Funciona simultaneando un número elevado de unidades de procesamiento interconectadas que parecen versiones abstractas de neuronas. Como en la figura 2 se muestra, las redes neuronales artificiales se organizan en capas. Normalmente hay tres partes: La primera, con campos de entrada; una o “n” 12 capas ocultas; y una capa de salida, con la unidad o unidades que representan los destinos. Las redes neuronales artificiales aprenden a través de un entrenamiento, donde se le presentan a la red ejemplos para los que va conociendo su resultado y las respuestas que proporciona se comparan con resultados conocidos. Los resultados se pasan hacia atrás a través de la red, cambiando gradualmente. Como se mencionó anteriormente, las redes neuronales están compuestas de neuronas. Figura 3-Arquitectura de una neurona La neurona, tal como se muestra en la figura 3 está conformada por entradas, que serán datos (a1,a2,an), también contendrán pesos, (w1,w2,w1n), que son coeficientes entrenables que permiten determinar en que medida es importante e influye cada variable de entrada en la salida y bias, una compensación para offsets o desviaciones producidos por los valores de entrada y sus escalas. Finalmente conformada por una función de activación que eliminará la “linealidad” y dará una salida. Las funciones de activación son las encargadas de encender la neurona y decidir en qué medida se activa la función de salida. 13 Figura 4-Funciones de activaciones De forma matemática quedaría de la siguiente manera: 𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆 = 𝑆𝑆𝑎𝑎𝑎𝑎𝑆𝑆𝑎𝑎𝑆𝑆𝑎𝑎𝑆𝑆ó𝑛𝑛(𝑆𝑆1 · 𝑤𝑤1 + 𝑆𝑆2 · 𝑤𝑤2+. . .𝑆𝑆𝑛𝑛 · 𝑤𝑤𝑛𝑛 + 𝑏𝑏𝑆𝑆𝑆𝑆𝑆𝑆) Como se ha mencionado anteriormente, es necesario un entrenamiento de la red neuronal, para ello utilizamos el algoritmo “Descenso por gradiente estocástrico”, que consiste en comparar las salidas expedidas por la red neuronal diseñada con respecto a las salidas etiquetadas que deberían ser. Calcula un error respecto a las mismas y modifica los pesos. Esto lo hace varias veces ya que los datos no son enviados en una sola exhibición, es decir, es enviado por paquetes de datos o “batch” en los cuales se encuentran un número de muestras de la base de datos. De esa forma se permite calcular errores por cada paquete de datos que al final resultarán en una modificación de pesos. 2.2.3 DEEP LEARNING Teniendo como base el machine learning y las redes neuronales, podemos empezar a sumergirnos más dentro del terreno de la inteligencia artificial y definir entonces por qué decimos que utilizamos Deep learning (aprendizaje profundo)7, que podemos definirla como una sub-categoría del machine learning que fue descrita en 1960, que permite que los sistemas no solo aprendan de la experiencia, sino, que sean capaces de entrenarse a sí mismas para hacerlo cada vez mejor utilizando los datos. Nosotros hicimos uso de fotografías de gestos anímicos públicos que contiene FER2013 (Facial Expression Recognition v2013) y JAFFE (The Japanese Female Facial Expression) y después de unos cuantos entrenamientos mejoramos su capacidad de detección de patrones. 14 El Deep Learning hoy en día es una de las bases de la IA, puesto que es utilizado en la industria e investigación para clasificar imágenes, reconocer el habla, detectar objetos y describir contenido. Asistentes personales como Siri o Cortana son potenciados, en parte por el aprendizaje profundo (DP). Una aplicación popular es la impresión automática de subtítulos en imágenes o descripción de escenas. En 2016, Facebook anunció que usaría Deep Learning para interpretar y describir fotos y vídeos, para poder identificarla más fácilmente y en su posibilidad, ser descrita a personas ciegas. Esta descripción de fotos, también es utilizada actualmente para marketing, pues, por medio de un algoritmo de aprendizaje profundo, Facebook puede saber qué tipo de fotografías, vídeos y texto son publicados más por una persona y de esa manera personalizar sus anuncios. 2.3 EMOCIONES HUMANAS Una emoción es un estado psicológico complejo que implica tres componentes distintos: Una experiencia subjetiva, una respuesta fisiológica y una respuesta conductual o expresiva (Hockenbury y Hockenbuty, 2007). La experiencia subjetiva, a pesar de que científicos han afirmado que existen emociones básicas universales y que todas las personas experimentan dichas emociones independientemente de su origen o su cultura, las emociones no siempre las expresamos en forma “pura”, es decir, podemos tener una mescla de emociones derivadas de acontecimientos o situaciones de vida y las personas pueden reaccionar de forma diferente a ellas. 15 Figura 5-Atlas de emociones Es por ello que, el Dr. Paul Ekman y su hija Eve Ekman han diseñado un “Atlas de emociones” cuya finalidad es ayudar a identificar y reconocer la subjetividad de las emociones. De esa forma se puede visualizar de manera gráfica cómo, por ejemplo, para la emoción “alegría” se pueden mostrar hasta trece estados ordenados de menor a mayor intensidad, siete acciones relacionadas y ejemplos de disparadores asociados a dicha emoción. La respuesta fisiológica, por su parte es el cómo reacciona el cuerpo ante ellas, por ejemplo, un “nudo” en el estómago, palpitaciones fuertes o alguna otra respuesta en el organismo ante los estímulos estresores. Finalmente, la respuesta conductual, que es el componente con el que más estamos familiarizados, por ser la expresión real de la emoción (objeto de estudio en nuestro proyecto). 16 Cada explosión de productos químicos emocionales, desde el momento en que se produce en el hipotálamo hasta el momento en que se descompone y absorbe por completo, tiene una duración aproximadamente de seis segundos. Si una persona algo por más de seis segundos, de algún modo no consciente, el cuerpo está tratando de recrear y reabastecer esas sensaciones. Si bien no es posible medir directamente una emoción, los cambios producidas en el cuerpo humano, por ejemplo, en el rostro, sí es medible, permitiendo precisar así las características de esa determinada emoción. 2.4 PATRONES Y EXPRESIONES FACIALES Se ha hablado ya de un patrón y hemos mencionado los patrones presentes en las emociones, sin embargo, ¿Qué es patrón? Un patrón, según la RAE, es un modelo que sirve de muestra para sacar otra cosa igual, esto puede ser interpretado como aquello que se repite o es común en “algo”5 y sirve para poder identificarlo, modificarlo o replicarlo. Esos modelos pueden buscarse en las expresiones faciales, de tal forma que podemos saber con cierta exactitud la emoción presente en una persona.Ray Birdwhistell, antropólogo estadunidense, sostenía que a pesar de que las expresiones faciales podían disimularse, exagerarse o ocultarse por completo, existen expresiones anatómicas que son imposibles de alterarse, cuyo significado no difiere según la cultura a la que pertenezcan. 2.5 VISIÓN ARTIFICIAL La visión artificial se puede definir como un campo de la inteligencia artificial que, mediante la utilización de técnicas adecuadas permite la obtención, procesamiento y análisis de cualquier tipo de información especial obtenida a través de imágenes digitales. La visión artificial la componen un conjunto de procesos destinados a realizar el análisis de imágenes. Esos procesos son: La captación de imágenes, memorización de la información, procesado e interpretación de resultados. 17 Las principales aplicaciones de la visión artificial en la industria actual son: • Identificación e inspección de objetos • Determinación de la posición de objetos en el espacio • Establecimiento de relaciones espaciales entre varios objetos • Realización de mediciones angulares • Mediciones tridimensionales 2.5 PYTHON Utilizamos el lenguaje de programación Python8, un lenguaje de programación en alto nivel que trabaja por medio de interpretación, orientado a objetos que gracias a sus características no es necesario compilar ni enlazar. Sin embargo, la razón principal por la que se opta por utilizar Python de Matlab, por ejemplo, es que Python, hoy en día es uno de los lenguajes de programación más utilizados en el mundo9 no sólo en el área de la investigación, sino, también en el área de desarrollo empresarial, especialmente, dominante en el área de inteligencia artificial. El creador de Python es Guido Van Rossum, cuyo objetivo era cubrir la necesidad de un lenguaje orientado a objetos de sencillo uso que sirviese para tratar diversas tareas dentro de la programación que habitualmente se hacía en C. Python contiene características muy peculiares, como: • Ser un lenguaje de propósito general, es decir, se pueden crear todo tipo de programas y aunque no es un lenguaje creado específicamente para web, actualmente es uno de las áreas donde más se ocupa Python, por ejemplo: Netflix y Spotify lo ocupan para predecir las recomendaciones de series y música a sus usuarios. • Multiplataforma, Python aunque fue originalmente desarrollado para Unix, actualmente es compatible con cualquier sistema operativo siempre y cuando exista en la computadora un intérprete programado para él. 18 • Python a su vez su vez es interactivo, pues dispone de un intérprete por línea de comandos el que se pueden introducir sentencias. Cada sentencia ser ejecutada y producir un resultado visible, es decir, no es necesario ejecutar todo el código, puede ejecutarse por pasos. Actualmente empresas como Yahoo, Google, Walt Disney, NASA, Red Hat, entre otras, utilizan Python dentro de sus servicios que ofrecen a su usuarios finales, así como también para las áreas de investigación de dichas empresas. 2.6 TENSORFLOW Y KERAS Dentro de Python, existen dos bibliotecas de suma importancia para nosotros, la primera es TensorFlow, biblioteca de código abierta creada por el equipo de Google para satisfacer las necesidades de sistemas capaces de construir y entrenar redes neuronales, detectar y descifrar patrones y correlaciones, así como también para la emulación de razonamiento humano. Los modelos matemáticos utilizados por TensorFlow son redes neuronales, que en función de la arquitectura de capas y neuronas que la conforman se podrá modelizar desde un simple modelo de regresión línea, hasta una arquitectura mucho más completa de machine Learning. Por su parte Keras es la librería base de TensorFlow (a partir de TensorFlow 2.0), su principal función es la construcción de redes neuronales y es capaz de ejecutarse tanto en TF como en Theano (otra biblioteca para machine Learning). Entre las principales características de Keras se encuentran: • Su fácil y rápido prototipado gracias a su modularidad, minimalismo y extensibilidad • Su soporte a redes neuronales convoluciones y recurrentes (así como la combinación de ambas) 19 • Soporta esquemas de conectividad arbitrarios (incluyendo entrenamientos multi-entrada y multi-salida) • Es capaz de ser ejecutado tanto en CPU como en GPU • Es compatible desde la versión de Python 2.7 hasta la más reciente, 3.7 2.7 DJANGO Una de las cosas que Python ofrece es la integración con decenas de otros lenguajes, así como su gran extensión de Frameworks para el desarrollo, uno de los más conocidos es Django, un framework que permite a Python una integración en web, que fue diseñado principalmente para la gestión de varias páginas web complejas, colocando énfasis en el re-uso, la conectividad y extensibilidad de componentes10. Con todo esto mencionado, basta decir que el uso del Framework Django como extensión de Python fue utilizado en este proyecto para el desarrollo de una plataforma web en la cual se mostrarán los resultados obtenidos por la red neuronal, de esta forma nos aseguramos de que todos los profesores tengan acceso a la información requerida sin importar el dispositivo por el cual se encuentren conectados, pues no será necesario tener una conexión web para su consulta. 20 CAPITULO 3 DESARROLLO 21 3.1 EMOCIONES HUMANAS UNIVERSALES El Dr. Paul Ekman en 1972 define las seis emociones humanas universales después de que en 1968 viaja a Nueva Guinea para estudiar el lenguaje no verbal de la tribu Fore11, cuyo viaje dejó como evidencia fuerte que, hasta la fecha, las expresiones faciales son universales, pues sin importar las diferencias de la sociedad, éstas se encuentran presentes Figura 6-Rasgos faciales característicos de cada emoción. Como se observa en la Figura 6 cada emoción humana descrita por el Dr. Paul Ekman, tiene características particulares, cuyos rasgos ayudan de forma importante a la red neuronal para poder clasificar correctamente dichas expresiones faciales. Con lo identificado anteriormente, sabemos que el estudio de las expresiones faciales emocionales dentro de la educación puede ser de gran ayuda, así como lo es en la política, en el marketing, la Experiencia de Usuario dentro de aplicaciones y en contenido audiovisual. La razón es que las expresiones faciales son probablemente la variable que más observamos para obtener información de las personas, que, si bien tenemos cierto control sobre ellas, parece estar demostrado que cuando una persona utiliza una expresión facial no acorde a su verdadero 22 estado de ánimo, durante un periodo corto de tiempo, en su rostro se expresa la emoción verdadera que muchas veces pasa desapercibida. Esto nos ayuda a identificar las emociones humanas que posteriormente se buscaría en bancos de datos públicos para poder utilizarlos en el análisis posterior, es decir, dentro de la red neuronal. 23 3.2 INSTALACIÓN Y CONFIGURACIÓN DEL ENTORNO DE DESARROLLO Para poder empezar a programar utilizando técnicas de Deep Learning, fue necesario la instalación de librerías específicas, así como también hacer uso de “Entornos virtuales”. Para este proyecto utilizamos como entorno de desarrollo Jupyter Notebook12, perteneciente a Anaconda Distribution, una suite de desarrollo para ciencia de datos. Anaconda nos ofrece un entorno de desarrollo, un gestor de paquetes y una colección de más de 720 paquetes de código abierto que podemos utilizar dentro de nuestro proyecto. Figura 7-Anaconda Suite 24 En la Figura 7 se puede observar como en el apartado color azul (librerías) existe un apartado específico para Machine Learning, que contiene ya una preconfiguración para la utilización de TensorFlow, así como también de las bibliotecas Matplotlib,Numpy, Pandas y Scipy. Se instaló Anaconda Distribution en una computadora con las siguientes especificaciones: • Sistema Operativo Linux Ubuntu 20.04 • Procesador Intel Core i5 de 7ma generación con 4 CPUs a 2.5Ghz • Tarjeta de vídeo dedicada de 1GB Nvidia 940MX • 12 GB de memoria RAM La forma de instalación de Anaconda Suite consistió de los siguientes pasos: 1. Se abrió la terminal de Ubuntu y se procedió a la carpeta /tmp para desde allí descargar el archivo instalador. Figura 8-Instrucciones para acceder a tmp 2. Se verificó la integridad del archivo instalador por medio de una cadena hash criptográfica SHA-256. Figura 9-Comprobación HASH 3. Ejecución de la secuencia de comandos de Anaconda Figura 10-Ejecución del instalador 25 4. Revisión y acuerdo de la licencia de producto. Figura 11-Terminos de uso de Anaconda Dentro de Anaconda, creamos un Entorno de Desarrollo, que en palabras coloquiales se podría definir como un laboratorio independiente de la suite que contiene herramientas específicas para el uso del espacio. Las bibliotecas que utilizamos fueron: • Keras • TensorFlow • Scipy • Pandas • Scikit-Learn • Scikit-Image • Imageio • Flask-Socketio 26 Figura 12-Bibliotecas que contiene el entorno de desarrollo. En la Figura 12 se puede observar cada una de las bibliotecas que conformó nuestro laboratorio, así como también la versión que es utilizó. Fue de suma importancia que ambos autores de este proyecto tuviéramos las mismas versiones de bibliotecas, puesto que, en caso de diferir en alguna de ellas, se pudieron haber provocado errores de sintaxis debido al cambio en muchas de ellas. 27 3.3 BASES DE DATOS PÚBLICAS DE RECONOCIMIENTO DE EXPRESIONES FACIALES Y TRATAMIENTO DE DATOS Una vez que conocemos las emociones humanas universales y con ello también los rasgos faciales que las representan, se ha decidido realizar la búsqueda de bases de datos públicas que contengan dentro la información que nosotros estamos buscando, eso, antes de declinarnos en realizar nuestra propia base de datos. Para la búsqueda hemos utilizado primeramente Kaggle, una empresa subsidiaria de Google, cuyo propósito general es formar una comunidad de científicos de datos y profesionales de Machine Learning. Dentro de Kaggle hemos logrado obtener un conjunto de datos (dataset) llamado FER2013 (Facial Expression Recognition 2013)13 cuyo contenido se encuentra dentro de un archivo .CSV. Este conjunto de datos contiene 35,887 imágenes de tamaño 48x48 pixeles en una escala de grises, organizado en tres columnas: Figura 13-Visualización del conjunto de datos FER2013. Columna A: Emociones, representadas del cero al seis (0=Enojado, 1=Disgusto, 2=Miedo, 3=Feliz, 4=Triste, 5=Sorpresa, 6=Neutral), como se puede observar, se agrega una emoción más, “neutral” cuya agregación se debe a cuando la persona no se encuentra mostrando físicamente alguna emoción. Columna B: Imágenes, organizadas en una matriz de pixeles. Columna C: Uso, cuyas categorías son “Training Test” para uso de entrenamiento, “Public Test” para uso de pruebas y “Private test” para uso de validación. 28 Utilizamos este dataset porque se encuentra ya dividido para su utilización en redes neuronales, es decir, se encuentra ya dividido en los tres grupos importantes: Entrenamiento, conjunto de datos que necesita la red neuronal para “aprender” dichos patrones. Validación, conjunto de datos que necesita la red neuronal para evaluar el aprendizaje de la red neuronal y Prueba, conjunto de datos que necesitamos para comprobar el último aprendizaje de la red neuronal. Hacemos énfasis que este conjunto de datos pertenece a un Reto Kaggle cuyo propósito es servir de conjunto base para realizar un clasificador de gestos anímicos. FER2013 nos presenta una cantidad de datos increíble, sin embargo, hemos decidido utilizar otro conjunto de datos más para poder alcanzar un mayor porcentaje de efectividad después de haber entrenado nuestra red neuronal (aunque no depende solo de la cantidad de datos como se mostrará a continuación, siempre es recomendable utilizar la mayor cantidad de datos posibles). Figura 14-Ejemplos presentes en FER2013 Para elegir un nuevo conjunto de datos, se ha optado por utilizar un dataset presentado en el tercer IEEE International Conference on Automatic Face and Gesture Recognition de 1998, The Japanese Female Facial Expression (JAFFE)14. 29 Este conjunto de datos contiene 213 imágenes organizadas en las mismas siete categorías que FER2013 para los cuales se han utilizado 10 modelos femeninas japonesas. A diferencia de FER2013, JAFFE contiene las imágenes en un formato .tiff sin compresión y en un tamaño de 256x256 pixeles, también en escala de grises. Para poder utilizar ambos conjuntos de datos, es necesario realizar un ajuste dentro de JAFFE, ese ajuste es redimensionar las imágenes a un tamaño de 48x48 pixeles y posteriormente pasarlo a una matriz de pixeles para tenerlas en el mismo formato que FER2013. Figura 15-Adecuación del conjunto de datos JAFFE a tamaño 48x48 pixeles y en escala de grises. En la Figura 15, un extracto de nuestro código hace referencia al método remove que dentro contiene dos archivos, README y .DS_Store, la razón por la cual estamos eliminando esos archivos de la carpeta, es que son archivos que no contienen información relevante del conjunto de imágenes, es decir, son datos basura para nuestra utilización. 30 Una vez importados nuestros datos, verificamos la cantidad de imágenes presentes en cada una de las clases (emociones) de nuestro dataset. Figura 16-Muestra de imágenes por clase Como se muestra en la Figura 16 nuestra clase minoritaria fue la clase número 1, con tan solo 547 muestras. El código construido indica lo siguiente: Imprimir la cantidad de imágenes y, además, imprimir la cantidad de imágenes por “emotion” (que dentro del dataset corresponde a la columna que representa la emoción) presentes en el archivo .CSV. 31 Para obtener una visión más detallada de nuestros datos, diseñamos una gráfica de barras que muestra con precisión la repartición. Esto nos sirvió porque posteriormente debimos utilizar métodos de compensación de datos, de esta forma se lograría una mayor generalización y, por lo tanto, un mejor entrenamiento. Figura 17-Representación en forma de gráfica Como se puede visualizar en la Figura 17, se confirma que tenemos una clase con muy pocas imágenes. Para poder compensar las imágenes, utilizamos un generador de imágenes15. Este generador viene incluido dentro de Keras y su función es crear muestras artificiales tomando como base las originales. A estas se les aplican filtros, rotaciones, aumentos de zoom y otros, para mejorar la cantidad de imágenes por clase. 32 Figura 18-Generador de muestras En la Figura 18 se puede apreciar con claridad, como hemos aplicado ImageDataGenerator de Keras a nuestro conjunto de entrenamiento, aplicando un escalado, una rotación, un zoom, así como también manejando los bordes de la imagen y los rangos. La razón por la cual fue aplicado sólo al conjunto de datos de entrenamiento fue porque son esos datos los que alimentan la red neuronal y de los cuales depende el qué tan bien o mal reconozca patrones. 33 3.3 DISEÑO DE ARQUITECTURA DE RED NEURONAL Una vez que se realizó la selección de los datos a utilizar, se procedió a importar los datos anteriormente mencionados, para ello, fue necesario utilizar la biblioteca de Python “Pandas”16 que nos permite manejar con facilidad los datos dentro de archivos, como, por ejemplo, los CSV, que nosotros tenemos en FER2013. Figura 19-Importación de datos FER2013. Dentro del mundo de las redes neuronales existen bastantes tipos, sinembargo, nosotros hemos optado por utilizar una red neuronal convolucional por la facilidad que nos da al manejar imágenes, además de necesitar menos neuronas y en algunos casos obtener mayor cantidad de parámetros de aprendizajes. Las redes neuronales convolucionales imitan la visión generada por el ojo humano, especializándose en visión por jerarquías, esto quiere decir, que primero se detectan líneas, después curvas y se va profundizando hasta poder reconocer formas complejas como siluetas o más específicamente, rostros. 34 En estado puro una computadora no puede saber qué contiene una imagen, sin embargo, sabemos que sí puede identificarlas debido a sus pixeles. Por ejemplo, una computadora no verá la imagen como en la Figura 20, sin embargo, sí las verá como en la Figura 21. Figura 20-Un ejemplo de FER2013 Figura 21-Código que representa una imagen en pixeles. La Figura 21, es un código escrito en Python que permite visualizar la Figura 20 en forma de pixeles. Se puede identificar fácilmente el resultado observado en la matriz, debido a que en la imagen 5 se puede ver el comienzo con un color negro y la finalización de la imagen en tonos grises. Si se analiza la matriz de la imagen 6 se obtienen valores de entre 184 y 186, siendo pixeles correspondientes a colores grises. Los pixeles observados en la Figura 21 representan la entrada de la red convolucional, por lo que haciendo una operación básica 48x48 podemos obtener que tendremos 2,304 neuronas de entrada y eso sólo para las imágenes a escalas de grises, si en lugar de tener imágenes en escalas de gris, tuviéramos imágenes totalmente a color (RGB)17 tendríamos que hacer la siguiente operación 48x48x3 y en total tendríamos 6,912 neuronas de entrada. 36 Nosotros podíamos trabajar normalmente con los pixeles que toman valores de 0 a 255, sin embargo, se acostumbra a normalizar los datos entre 0 y 1, esto, de manera práctica para hacer el entrenamiento de la red neuronal más rápida y reducir el atascamiento del entrenamiento. Además, está confirmado que calcular los pesos de las conexiones de red neuronal se puede hacer mejor si los datos se encuentran normalizados, al final de cuentas, es más rápido operar con valores de entre 0 y 1, que valores entre 0 y 255. Figura 22-Normalización de los pixeles En la Figura 22 se puede observar la normalización de 0 a 1 que se ha realizado en el proyecto. Para ello hemos utilizado variables como X_train o X_test estas variables contienen las imágenes dedicadas para Entrenamiento y Prueba, en la imagen no se muestra, pero existe otra variable X_val la cual contendrá imágenes de validación. Por su parte las variables Y_train,Y_test y Y_val contendrán las etiquetas correspondientes a cada imagen, esa etiqueta, es en este caso un número de entre 0 y 6 que corresponde como se ha indicado anteriormente a una emoción. 37 Figura 23-Arquitectura de una CNN Hasta el momento conocemos la entrada de la red neuronal, que en la Figura 23 sería “Imagen de entrada”, cuando hablamos de la convolución, es decir, ese proceso que le da nombre a la red neuronal, hablamos de seleccionar un grupo de pixeles cercanos entre ellos en la matriz que forma la imagen de entrada e ir realizando productos escalares contra una matriz más pequeña llamada “kernel”18. Esto se puede expresar de la siguiente manera matemática 𝑆𝑆(𝑎𝑎) = (𝑓𝑓 ∗ 𝑔𝑔)(𝑎𝑎) = � 𝑓𝑓(𝜑𝜑)𝑔𝑔(𝑎𝑎 − 𝜑𝜑)𝑆𝑆𝜑𝜑∞−∞ Donde f es el argumento de entrada y g el kernel. 38 Figura 24-Ejemplo de convolución La convolución se puede interpretar como observamos en la Figura 24, cuyo argumento de entrada lo tomaremos como la matriz “Input” y el kernel como la matriz “Kernel”. Como salida de las operaciones tenemos la sumatoria de dicho producto escalar. El movimiento que hace el kernel sobre el argumento de entrada, es de izquierda-derecha, de abajo-arriba. El movimiento que hacer el kernel por la matriz de entrada, se llama “stride” y está definido por valores enteros. Figura 25-Stride de 1 Figura 26-Stride de dos 38 Como se puede observar en las imágenes anteriores, el valor del Stride será el número de columnas que el kernel se moverá para realizar otro producto escalar. Esta operación se realizará tantas veces como sea necesarias para recorrer la matriz del argumento de entrada. Como se observa en la Figura 24 dicha operación genera una matriz de salida, esa matriz es llamada “matriz de rasgos” o “mapa de activación”. Esta operación se realiza para obtener las propiedades o rasgos más relevantes de la matriz de inicio. En lugar de que la red neuronal “se fije” en toda la matriz, se busca “fijar” la atención en las características más importantes. La convolución se puede realizar varias veces y al proceso se le llama “aplicar filtros” que no es más que aplicar varios kernel, aunque en realidad no dejamos de tener solamente una matriz de rasgos o mapa de activación, eso sí, con varias capas al fondo representadas por los filtros. Figura 27-Indicación de tamaño de kernel,activación ReLu y strides en nuestro proyecto 39 Una vez que se obtuvo la matriz de rasgos, se aplicó una función rectificadora (ReLu)19 para no incrementar la “linealidad” del resultado, pues esta función rompe la “linealidad”. La función Relu se define como: 𝑟𝑟𝑟𝑟𝑆𝑆𝑟𝑟(𝑧𝑧) = max (0, 𝑧𝑧) Donde convertimos todos los valores menores a menores a cero, en cero, y todos los valores positivos los deja tal cual. Figura 28-Función de activación ReLu La razón por la que utilizamos la función de activación ReLu en nuestra red neuronal, fue que cuando procesamos un imagen, cada capa de convolución debe capturar algún patrón en la imagen y pasarla a la siguiente capa de convolución, sin embargo, todos los valores negativos no son importantes en el procesamiento de imágenes, por lo tanto, es mejor establecerlos en cero, justo lo que hace ReLu; los valores positivos sí son importantes, esos valores se quedan como están y pasan a la siguiente capa de convolución. 40 Finalmente se utilizó una red neuronal multicapa, esta fue utilizada como clasificador y tenía la función de activación Softmax, que filtra sólo el mejor resultado y lo muestra en pantalla, es decir, es esta función de activación la que elige cual de todas las neuronas pertenecientes a la red neuronal multicapa fue la más activa o la que más “se encendió”. La arquitectura final de la red neuronal fue la observada en la siguiente figura. Figura 29-Arquitectura final Como se puede observar en la Figura 29, nuestra arquitectura final constó de tres capas convolucionales con activación RELU, así como también una red neuronal multicapa que compone la capa final junto con la capa con activación Softmax. 41 3.4 ANÁLISIS DE LA EFICACIA DE RED NEURONAL Una vez realizado este procedimiento, se procedió a ejecutar el entrenamiento, es decir, a pasar una y otra vez los batch de imágenes para hacer que la red neuronal diseñada previamente, analice las imágenes, encuentre los rasgos más importantes. Una vez realizado el entrenamiento, se ha verificado la eficacia de nuestra red neuronal en primer término utilizando solamente el “accuracy”20. Obteniendo como resultado una exactitud de hasta el 80% tal como se muestra en la Figura 30. Figura 30-Accuracy final Cabe recalcar que con obtener solamente un buen “accuracy” no es indicativo suficiente para decir que la red neuronal es eficiente. Para poder lograr que nuestra red neuronal sea eficiente, debemos checar otros índices, tales como la Precisión, con cuya métrica podemos medir la calidad del modelo de Deep Learning. La forma en que se calcula la precisión es: 𝑝𝑝𝑟𝑟𝑟𝑟𝑎𝑎𝑆𝑆𝑆𝑆𝑆𝑆𝑝𝑝𝑛𝑛 = 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 + 𝐹𝐹𝑇𝑇 Donde:TP = Positivos verdaderos FP = Falsos positivos Además de esto, otra métrica importante es el Recall21 (Exhaustividad), cuya métrica nos informa sobre la cantidad que el modelo creado es capaz de identificar. Es decir, ¿qué porcentaje de los datos somos capaces de identificar correctamente? 42 La forma en la que se calcula el Recall es la siguiente: 𝑟𝑟𝑟𝑟𝑎𝑎𝑆𝑆𝑆𝑆𝑆𝑆 = 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 + 𝐹𝐹𝐹𝐹 Donde: TP = Positivos verdaderos FN = Falsos negativos Finalmente tenemos el valor F122, que se utiliza para combinar las medidas de precisión y recall en un sólo valor. Es el valor más práctico porque hace más fácil el poder comparar el rendimiento combinado de la precisión y exhaustividad entre varias soluciones. El valor F1 se calcula haciendo la media armónica entre la precisión y la exhaustividad. 𝐹𝐹1 = 2 · 𝑝𝑝𝑟𝑟𝑟𝑟𝑎𝑎𝑆𝑆𝑆𝑆𝑆𝑆ó𝑛𝑛 · 𝑟𝑟𝑟𝑟𝑎𝑎𝑆𝑆𝑆𝑆𝑆𝑆𝑝𝑝𝑟𝑟𝑟𝑟𝑎𝑎𝑆𝑆𝑆𝑆𝑆𝑆ó𝑛𝑛 + 𝑟𝑟𝑟𝑟𝑎𝑎𝑆𝑆𝑆𝑆𝑆𝑆 El valor F1 asume que nos importa de igual forma la precisión y la exhaustividad. Aunque esto no tiene que ser así en todos los problemas, en el caso de la clasificación que nosotros realizamos, sí es importante. 43 La forma en la que se obtuvieron estos valores utilizando Python, fue haciendo uso de la librería scikit-learn, especialmente de la función classification_report. Figura 31-Reporte de clasificación Como se puede observar en la Figura 31, los valores arrojados en precisión, Recall y f1-score son muy altos. En global, tenemos un promedio de 0.80 en f1-score, cuya conclusión rápida nos dice que obtuvimos que nuestra red neuronal lograra detectar y clasificar hasta en un 80% los casos presentados. 44 3.5 DISEÑO DE APLICACIÓN DE CLASIFICACIÓN EN TIEMPO REAL Una vez finalizado el proceso de creación de la red neuronal, fue necesario diseñar y programar una aplicación que pudiera clasificar en tiempo real, por medio de una cámara de vídeo, las emociones presentes en las personas. La aplicación diseñada hace uso de una webcam, sin embargo, es posible conectar una cámara de vídeo (como se explica en el trabajo a futuro) para lograr clasificar los estados anímicos de los alumnos presentes en una clase. Las especificaciones de la webcam utilizada son: • Cámara HD HP Wide Vision • Micrófono integrado • Matriz digital de doble integrado • 2.4Mpx La aplicación hace uso de la biblioteca Open CV23, Keras y Numpy24. OpenCV para la asignación de perímetros, Keras para la carga y función de la red neuronal y Numpy para el manejo de números. Lo primero que se hizo fue asignar a cada emoción un color, esto para hacerlo más representativo. Figura 32-Asignación de colores En la Figura 32 se puede observar, como, además de asignar colores a las emociones, se crea un diccionario de nombre “imotions” a los cuales se les agrega un valor número (que representa la emoción) y su texto. Esto para posteriormente utilizarlo en una gráfica en tiempo real. Además, para evitar inconvenientes con el dataset utilizado. Posteriormente se realizó la carga de la red neuronal previamente diseñada y entrenada y hizo uso de un archivo de nombre “haarcascade_frontalface_default”. 45 Este archivo contiene un clasificador de rostros humanos ya preentrenado, de uso libre y disponible para descarga desde el repositorio en github de OpenCV. Figura 33-Utilización de la red preentrenada de OpenCV En la Figura 33 se puede apreciar con claridad, como se cargó la red neuronal, así como también se hizo uso del clasificador de OpenCV. Se habilitó la cámara por medio del modulo VideoCapture de la misma biblioteca y se procedió a utilizar la función “detectMultiScale” que permite por si sola detectar los rostros. Cabe alcarar que al hacer uso de detectMultiScale, fue necesario pasar la imagen detectada a escala de grises, esto, porque como se mencionaba en apartados superiores, nuestra red neuronal sólo hace clasificaciones en escala de grises y en un tamaño de 48x48 pixeles, tal como se indica en la función resize de opencv dentro de la Figura 33. Finalmente se hace uso de la función rectangle de OpenCV que permite encerrar en un rectángulo el rostro detectado y dentro de ese rectángulo clasificar la emoción presente, para ello, dentro de los parámetros se indica que recibirá los colores y “imotions” que al inicio del programa fueron configurados. 46 El resultado de dicha aplicación es el siguiente: Figura 34-Resultado final de la aplicación Como se aprecia en la Figura 34 la detección del rostro sirve para poder encerrar en un rectángulo que se colorea dependiendo de la emoción detectada, además de que, en la parte inferior del rectángulo, muestra en color y texto la emoción clasificada. Es importante recalcar que en la aplicación existe un retraso de transmisión de vídeo, esto debido a la calidad de la cámara, así como también del hardware de la computadora utilizada, pues tiene que hacer cálculos muy extensos para lograr intentar clasificar lo que recibe en forma de vídeo por medio de la webcam. 47 3.6 CREACIÓN DE LA PLATAFORMA WEB UTILIZANDO DJANGO Una vez creado el modelo de la red neural convolucional se procedió a la creación del Front End. Como se mencionó anteriormente, todo esto se desarrolló con el framework Django en su versión 3 para la respectiva versión de Python utilizada en el desarrollo de Back End. Django nos ofreció una serie de herramientas que nos ayudó a tener una mejor organización de los recursos empleados para el desarrollo de una interfaz. En nuestro caso se utilizó lo siguiente: • Creación de la base de datos. • Creación del proyecto django. • Creación de la aplicación captura y vista principal. • Configuración de django. • Creación del modelo de la aplicación captura y vista principal. • Creación de vistas y enlaces URLs. • Desarrollo html y css. Cabe aclarar que el modelo no se creó mediante las herramientas que ofrece Django, si no en un entorno de desarrollo diferente, ya que, si esto fuera así la aplicación web se vería muy afectada en su rendimiento y necesitaría muchos recursos en cuestión de hardware, puesto que nosotros no contábamos con estos recursos y queríamos que fuera lo más optimo posible se trabajó en dos entornos de desarrollo diferente. 48 3.6.1 CREACIÓN DE LA BASE DE DATOS Para poder manipular las imágenes que se quieran tomar o subir a la aplicación web, como también proveer un login a los usuarios que utilicen la aplicación supervisada por un admin, se creó una base de datos en postgrees mediante el gestor de BD pgAdmin 4. En la base de datos se almacenan las imágenes subidas por el mismo usuario o las capturas tomadas mediante la webcam en tiempo real desde la página web y los datos de registro del usuario para el login. La información se almacenó en dos tablas creadas a partir de los modelos previamente hechos en Django (se habla de esto más a profundidad en su apartado correspondiente), introducidos desde su propio gestor y mediante la página web ya creada. Figura 35-pgAdmin 4 49 3.6.2 CREACIÓN DEL PROYECTO DJANGO Para la realización del proyecto en Django, se creó un entorno virtual para prevenir ciertos errores y compatibilidades a la hora que se realizó el software, dentro de este entorno virtual se instaló Django 3.0. También, como se mencionó anteriormente se creó la base de datos del proyecto en postgrees pero como la configuración predeterminada de Django trabaja con mysql se instaló una herramienta o aditamento que permite conectar la BD de postgrees a django, esta se llama psycopg2 en su versión 2.8.4. Al instalar Django se creó automáticamente los archivos predeterminados correspondientes a la creación de la aplicación web junto al archivo manage.py, sin este archivo Djangono reconoce el proyecto por consiguiente no se va poder migrar los modelos creados a la base de datos y lo más importante es que no correría la página web. Figura 36-Archivos generados por Django 50 3.6.3 CREACIÓN DE APLICACIÓN “GESTOS” Y VISTA PRINCIPAL Estas dos aplicaciones fueron creadas desde los comandos que brinda Django en el CMD, con el beneficio de tener una mayor organización a la hora de crear las vistas que tiene cada aplicación, ya que cada una tiene funciones diferentes y lo que se pretende como trabajo futuro es mejorar estas dos, por lo que los modelos creados dentro de estas serán solo correspondientes a la función que tenga su vista. Django cuenta con un archivo de configuración en lenguaje python el cual se llama settings.py, en este se configuró la base de datos en la cual previamente como se comentó. Se tuvo que instalar un aditamento para que se pudiera enlazar la base de datos y despues se configuró en ese archivo con los siguientes datos: • Engine: el codigo de enlace para la base de datos. • Name: el nombre de la base de datos. • User: admin de la base de datos (por defecto dejamos el de postgrees). • Password: la contraseña de la BD. • Host: el servidor que da soporte y conexión a la base de datos, en nuestro caso trabajamos corremos todo desde nuestra computadora local o en la que trabajamos la interfaz, por lo que seria un localhost. • Port: es el puerto de conexión virtual donde se envian datos y vicebersa. Figura 37-Aplicaciones login y vista general 51 Tambien se configuró dentro del codigo de configuración la parte del reconocimiento de las apliaciones creadas, ya que Django permite crearlas pero al no tener un forma de reconocer en que carpeta estan se tienen que meter “manualmente”. Figura 38-Apps configuradas Como se puede observar en la Figura 38 en los dos ultimos datos de la tupla se encuentra señalado entre comillas primero la capeta apps dentro del proyecto seguido de un punto y por ultimo la app que se creo, dividos por una coma. Por ultimo y no menos importante se configuraron los archivos estaticos que se utilizaron para la realización de todo lo referente al front end, como son archivos css, js y json, para ello se tuvo que anexar una linea de codigo proporcionada por la pagina oficial de Django. Figura 39-Configuración de archivos estáticos Lo que hace esta linea de código a grandes rasgos es la vinculación de la carpeta creada para fines ya dichos (en nuestro caso la carpeta “static”) dentro de la carpeta del proyecto encontrada en el manage.py. Dentro de la carpeta static se introduciran todos los archivos locales utilzados para el proyecto. 52 Para fines prácticos tambien se configuró una carpeta especial para los templates o los archivos html de manera similar a la carpeta static, unas lineas debajo de donde esta la tupla de aplicaciones del archivo settings.py se encuentra el apartado de los templates, detro de esa configuración se le introdujó la linea de código remarcada. Figura 40-Configuración de la carpeta templates. Dentro de la carpeta static se agregaron otras carpetas para fines de ordenamiento, por ejemplo imágenes,archivos css, js y una para la red neuronal, pero ya que estan dentro de esta carpeta ya no se tienen que configurar, ya que al estar configurada la carpeta proncipal todo lo de adentro de igual manera de reconocera por django, ya sean carpetas o archivos. 53 Dentro de django, como ya se comentó, al crear un aplicación se crea automaticamente un archivo llamado models.py. Se crearon dos modelos: • Registro para login: en este se crearon todos los campos correspondientes con el registro del usuario, esto gracias a que en django se pueden crear campos especificos para cada cosa a nivel codigo con facilidad, ya que todo el back end es python y solo se tienen que migrar a la base de datos con los comandos que ofrece django. Todo cambio que se haga en los modelos y se quiera migrar, se vera reflejado en la base de datos. Figura 41- Modelo registro • Imágenes para vista_principal: este modelo solo se creó como un apartado extra y desarrollo futuro para poder guardar las imágenes tomadas desde la pagina web, por lo que solo va tener un campo de almacenamiento. Figura 40-Modelo imágenes Ya habiendose elaborado los modelos, se migraron a la base de datos para que estos tengan funcionalidad, sino, no se verian reprensentados dentro del gestor propio de django conectado a postgrees. Todas estas migraciones se guardan en una carpeta llamada migrations, ahí se pueden observar los cambios que se hagan a los campos del los modelos como el mismo codigo que se exporta a la base de datos para su ingreso. 54 Figura 41-Migración de modelo registro De esta forma django representa de una forma no tan compleja las migraciones que se hagan. Dentro del objeto migrations se encuentran tres variables: • Initial. • Dependencies. • Operations. La variable initial se activa cuando se hace la migración del primer modelo por lo que la base de datos la toma como la tabla principal en la cual se van desprender las demas tablas o modelos. En nuestro caso se puso el modelo registro para poder vincular el modelo imágenes, ya que del login va depender la captura de la imagen. Figura 42-Migración de modelo imágenes 55 Como se observa en la “tupla dependencias” se encuentra el nombre de la app y la migración del modelo con el que esta realcionado la migracion de imágenes, parecido o igual a lo que seria una llave foranea. Esto se puede hacer manualmente o en nuestro caso al ser muy siemple la relación de una tabla a otra se opto que lo hiciera automaticamente django, haciendo primero la migración del modelo registro y depues la de imágenes. En la “tupla operaciones” se pueden observar en nuestro caso el nombre del modelo y los campos creados, pero si se modifica algun campo del modelo se vera reflejado en esta tupla. Cabe aclarar que antes de que se migrar los modelos se tuvieron que crear estos archivos con la instrucción makemigrations, pues si no se hace esto y se migra de forma directa no se podran borrar los campos que se hallan hecho, por lo que se tendria que reacer la base de datos. Figura 43-Modelos migrados a la BD. 56 3.6.4 CREACIÓN DE VISTAS Y ENLACES URLs Las vistas en Django serían las paginas dentro de la aplicación web enlazadas unas con otras mediante URLs, los cuales se declaran dentro de carpeta principal de Django dentro del archivo urls.py. En el archivo mencionado se tiene que importar primero el archivo views.py indicando la carpeta donde se encuentran almacenadas las apps e indicando cual es esa app. Figura 43-URL’S Como se puede observar en la Figura 43, se crearon cuatro URLs correspondientes a cuatro vistas y una URL creada automáticamente por Django. Las tres primeras están ligadas con views.py de login, ya que en este se encuentran almacenadas estas tres vistas por lo que cada una tuvo su propia URL (cada vista será explicada más adelante). La cuarta URL se vinculó con la vista principal que sería la captura o toma de foto de la imagen mediante la webcam, o subiendo una imagen desde la computadora donde se esté utilizando esta página web. En la última parte del contenido de la tupla se encuentra la url del acceso al administrador de Django, aquí el administrador puede ingresar a los usuarios que requirieran la utilización de esta página, para poder así tener un mayor control de registros a la aplicación web y no cualquiera se meta. 57 De igual manera el administrador del sitio tendrá todos los privilegios para poder observar, quitar y agregar contenido relacionado con los modelos que se crearon,pues como ya se comentó Django está ligado en casi toda su totalidad con la base de datos. Figura 44- Ejemplo de administrador de Django. Por obvias razones a la hora que se crean las URLs se tiene que haberse creado previamente las vistas de las aplicaciones, ya que si no fuera así la página web te direccionaría a la URL solicitada pero no tendría ningún contenido y al mismo tiempo ninguna funcionalidad. Las vistas creadas para la aplicación login son las siguientes: • Welcome. • Login. • Logout. 58 La primera vista autentifica el inicio de sesión mediante una función proporcionada por una de sus tantas librerías de Django y carga el template principal (principal.html), si no se puede autentificar se redirecciona a la vista login mediante su URL. Figura 45-Vista “welcome” La segunda vista consta de toda la funcionalidad principal del login, iniciando con un formulario de autentificación el cual recibe los datos escritos a través de las casillas del html principal que indican el usuario y la contraseña, después se valida esta información con la introducida en la base de datos por el administrador de Django y por último si existen estos datos se redirecciona a la vista “welcome”, y se encarga de lo que se dijo anteriormente. Figura 46-Vista login 59 La tercera es la vista más simple que se hizo, ya que solo se usó la función lo_logout de Django y solo va a recibir una petición del usuario si quiere cerrar sesión y a su misma vez lo redireccionara a la template que tiene el login. Figura 47-Vista logout La última vista que se desarrollo fue una especialmente dirigida al modelo de la red neuronal mencionada anteriormente, ya que en esta se va a llevar a cabo todo el reconocimiento anímico que pase atreves de la webcam o al subir alguna imagen a la plataforma web. Una cosa a tomar en cuenta es que el reconocimiento en tiempo real se lleva a cabo a través de una ventana en el sistema operativo llamada ‘”img”, pues el modelo al ser un archivo local se reconocería como un archivo estático por lo que aplicación web llama de manera local al modelo y su interfaz, y se ejecuta fuera de la página. Figura 48-Vista_principal 60 Para no explicar de nuevo todo el código respecto al uso o carga del modelo creado, lo único diferente que se hizo fue la adaptación de ello a django, solamente generando una función con un request hacia la carga del modelo y por último redirigiéndose a la pagina principal de la página web. 3.6.5 DESARROLLO HTML Y CSS Por último, lo que su hizo al desarrollo del proyecto fue darle un front end de fácil uso con un login de igual manera, por lo que se hicieron dos archivos html con sus respectivos css y un js para el uso de la webcam en la aplicación web. Para no hablar de los estilos que se pusieron, se habla de los aspectos importantes agregados a las plantillas (todos estos comentados anteriormente), los cuales fueron los siguientes: • Botones de inicio de sesión y logout. • Selección de herramientas a utilizar (reconocimiento de archivo imagen y reconocimiento en vivo o en tiempo real). • Implementación de permiso y uso de la cámara web. • Captura de imagen de la webcam. • Direccionamiento a la carga de imágenes y reconocimiento en tiempo real a la red neuronal. 61 CAPITULO 4 PRUEBAS Y RESULTADOS 62 Durante el proceso de desarrollo, el diseño de la red neuronal pasó por varios prototipos, así como también fueron probados diversos tipos de arquitecturas para evaluar la eficacia final. A su vez, fueron programados aplicaciones individuales que formarían parte del trabajo final. Estos desarrollos pasaron por cambios visuales que permitieron elegir uno que lograra englobar todos los elementos principales e importantes para el usuario final. La versión final de nuestra arquitectura de red neuronal arrojó un resultado de hasta un 80.61% de exactitud en pruebas, es decir, que el entrenamiento de la red neuronal fue tan eficaz que, al ingresar un dato de prueba (es decir, una imagen cuyo índice no indica qué tipo de emoción es representada en los gestos físicos faciales), la red neuronal fue capaz de detectarla correctamente hasta en un 80.6%. Figura 36-Muestra de exactitud Uno de los dataset que se utilizó para el entrenamiento de la red neuronal, fue extraído de Kaggle (especialmente de un concurso donde se proporcionaba el conjunto de datos y cuya meta era lograr la mayor exactitud posible). Tomando como base ese concurso, a pesar de haber terminado ya hace un par de años, logramos colocar nuestra red neuronal en primera posición, hasta un 10% con mayor exactitud que el primer lugar de la competición. Esto, lo tomamos como referencia, pues basarnos solamente en dicho concurso no haría ni significaría que nuestra red neuronal funcionara a la perfección, además, utilizamos un dataset más para nuestro entrenamiento, lo cual significa que teníamos mayores probabilidades de lograr una mejor exactitud al tener muchos más datos de entrenamiento. 63 Figura 37-Campeonato Kaggle Tal como se puede observar en la Figura 37, si analizamos la exactitud de nuestra red neuronal y la comparamos, por ejemplo, con el equipo de nombre RBM que logró el primer lugar de la competencia, nuestro rendimiento fue mucho mayor y esto habla de una arquitectura de red neuronal adaptada al problema, es decir, no genérica. Las primeras versiones de nuestras aplicaciones individuales permitían únicamente la carga de una imagen estática para su análisis posterior. La razón principal por la cual una de nuestras primeras pruebas fueron gráficas estáticas que representaban imágenes estáticas, fue porque nos permitían observar con claridad si nuestra red neuronal estaba funcionando perfectamente, de esa forma, si cargábamos una fotografía y esta respondía con una gráfica donde la barra mayoritaria fuera la expresión correcta, podíamos comprobar el funcionamiento. 63 Figura 38-Prueba con rostro enojado. Figura 39-Prueba con rostro neuronal. En la Figura 38 y Figura 39, la red neuronal en principio trabaja de forma correcta, pues, en la primera figura de la página de izquierda a derecha, podemos observar que se encuentra el rostro de uno de los autores, Alberto Espinosa, para ser exactos, con rostro enojado y en la gráfica estática la red neuronal la evalúa de esa manera, sin embargo, observa también un rostro posiblemente feliz, como se muestra en una siguiente barra. Lo anterior se debe a varias posibles razones, aquí expresamos las dos detectadas principalmente y que se corrigieron posteriormente. 1. La calidad de la fotografía, al ser tomada con una webcam de apenas 2 Mega Pixeles, la calidad de información en la imagen es muy pobre si lo comparamos a una prueba realizada, por ejemplo, con una cámara cuyo sensor sea de más de 13 Mega Pixeles. 2. Por otro lado, nos encontramos con la exactitud de la red neuronal, como se pudo observar, tiene una exactitud de 80.6%, lo que quiere decir que aún existe un 19.4% de posible error, a eso aumentarle que, en la Figura 31 del capitulo 3 “Desarrollo”, se puede observar como cada emoción contiene un porcentaje de F1 (explicado en el mismo capítulo) distinto, lo que quiere decir que, en cada emoción, la detectará con cierto porcentaje de eficacia, diferente en cada uno. 64 La forma en la que trabaja el reconocimiento estático es el siguiente: 1. Se toma la fotografía vía webcam y por medio de un script, automáticamente se renombra el archivo (para que el nombre nunca cambie y se pueda hacer de forma automático el reconocimiento). 2. Se recorta la fotografía a un tamaño de 48x48 pixeles. 3. Se aplica un filtro de grises perteneciente a Python 4.
Compartir