Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI) INGENIERO INFORMÁTICO RECONOCIMIENTO DE EXPRESIONES FACIALES MEDIANTE IMÁGENES ADQUIRIDAS CON CÁMARA KINECT Autor: Rodrigo Ruiz Martín Directores: Rafael Palacios Hielscher Antonio Muñoz San Roque Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Visto bueno del proyecto Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Papeles legales Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI) INGENIERO INFORMÁTICO RECONOCIMIENTO DE EXPRESIONES FACIALES MEDIANTE IMÁGENES ADQUIRIDAS CON CÁMARA KINECT Autor: Rodrigo Ruiz Martín Directores: Rafael Palacios Hielscher Antonio Muñoz San Roque Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect “Be sure you put your feet in the right place, then stand firm.” - Abraham Lincoln “In any moment of decision, the best thing you can do is the right thing, the next best thing is the wrong thing, and the worst thing you can do is nothing.” - Theodore Roosevelt Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect En primer lugar me gustaría agradecer profundamente a mi familia el apoyo incondicional que me ha brindado en todos los aspectos. Sin su ayuda no me habría sido posible alcanzar el sueño de llegar a ser ingeniero. A mis directores de proyecto, Rafael y Antonio por haber guiado mis pasos en el desarrollo del proyecto y por haberme ayudado a conseguir los objetivos marcados. A mis compañeros de clase, especialmente Miguel y Andrés, por haber aportado una visión crítica del proyecto que ha ayudado a corregir y mejorar diversos aspectos del mismo. A los alumnos y amigos que se presentaron voluntarios para participar en las sesiones de grabación, sin cuya colaboración no habría sido posible este proyecto: Daniel, Andrés, Jorge, Beatriz, Margarita, Marina, Diego, Jaime y Javier. Por último a mi hermana Sofía, por aconsejarme sabiamente y haberme animado con especial ahínco a que diera siempre lo mejor de mí. Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect RECONOCIMIENTO DE EXPRESIONES FACIALES MEDIANTE IMÁGENES ADQUIRIDAS CON CÁMARA KINECT Autor: Ruiz Martín, Rodrigo Directores: Palacios Hielscher, Rafael. Muñoz San Roque, Antonio. RESUMEN DEL PROYECTO El objetivo de este proyecto es el desarrollo de una herramienta capaz de reconocer las expresiones de alegría (risa o sonrisa) y desagrado en el rostro de las personas, de forma automática e intuitiva, basándose para ello en la adquisición de información facial por parte de la cámara Kinect de Microsoft. La herramienta está compuesta por tres entornos que se corresponden con la adquisición de información, procesado de datos y análisis de resultados. Como base para el reconocimiento de las expresiones se han empleado los estudios del psicólogo Paul Ekman, pionero en el reconocimiento de expresiones y microexpresiones faciales. Introducción En la actualidad el campo de la psicología ha alcanzado un grado de madurez elevado en cuanto al reconocimiento de expresiones faciales. Un gran número de prestigiosos psicólogos han realizado estudios en profundidad obteniendo información sólida sobre el reconocimiento de expresiones faciales y su vinculación con las emociones humanas. El reconocimiento automático de expresiones faciales resulta especialmente interesante porque permite detectar sentimientos y estados de ánimo en -I- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect las personas, y el reconocimiento de estos estados de ánimo se puede aplicar en campos tan diversos como la psicología, la enseñanza o el marketing. Por otro lado, los avances tecnológicos acontecidos en los últimos años permiten llevar a cabo tareas que en el pasado hubieran sido impensables. La capacidad de procesamiento y de cálculo de las máquinas se ha incrementado de forma exponencial, por lo que la tendencia actual es mecanizar y automatizar la mayor cantidad posible de procesos, permitiendo a los expertos concentrar sus esfuerzos en tareas menos triviales. El objetivo del proyecto surge de la unión lógica de estos dos hechos, ya que las condiciones actuales de madurez de ambas áreas son propicias para el desarrollo de una herramienta informática capaz de reconocer automáticamente la ubicación del rostro de una persona, y analizar sus expresiones faciales a lo largo de un período de tiempo determinado. Estado del Arte La literatura al respecto muestra estudios en dos direcciones. La primera de ellas en el campo de la psicología, para entender el grado de comprensión actual existente acerca de las expresiones faciales y los rasgos que las caracterizan. La identificación y clasificación de las emociones se basa eminentemente en el trabajo del psicólogo Paul Ekman, considerado uno de los psicólogos más influyentes del siglo XX. Sus estudios acerca de las expresiones faciales comenzaron en el año 1965[PAUL_EKMAN] y su culminación se alcanzó en el año 2002 con la publicación de un manual que permite determinar las emociones sentidas por una persona a partir de sus expresiones faciales codificadas mediante una serie de características llamadas Action Units.[EKMA02] - II - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect En el campo del reconocimiento automático de las expresiones faciales destaca el trabajo realizado por el profesor Ifran A. Essa [ESSA97] por haber obtenido resultados muy exactos basados en el análisis de secuencias de imágenes. No obstante, a día de hoy no existe una herramienta de reconocimiento de expresiones faciales lo suficientemente sencilla, asequible, automática y completa como para poder ser empleada satisfactoriamente por una persona no experta en el campo de la psicología. Asimismo, la gran versatilidad de una herramienta de estas características en cuanto a sus posibles campos de aplicación supone una motivación añadida. Implementación La herramienta se ha descompuesto a su vez en tres herramientas dedicadas a: La adquisición de información facial en forma de imágenes y parámetros en tiempo real. El tratamiento de dicha información y extracción de conclusiones. El análisis gráfico de los resultados obtenidos. Esta descomposición se ha realizado para aprovechar al máximo las características de los distintos lenguajes de programación, con el fin de obtener el mayor rendimiento posible y conseguir un alto grado de compatibilidad. - III - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Tecnología empleada Como mecanismo de adquisición de la información facial y las imágenes se ha escogido la cámara Kinect para Xbox360 de Microsoft debido a sus características especialmente enfocadas a la captación y seguimiento del rostro y el cuerpo humano [KINECT], lo que facilita en gran medida la adquisición de los datos necesarios para realizar el análisis de las expresiones faciales. La herramienta de adquisición de la información facial se ha desarrollado en C# para sacar el mayor partido posible a las librerías de Microsoft para Kinect. C# es una versión ampliada del lenguaje C enfocada a la programación visual y orientada a objetos, que actualmente es ampliamente usado por su versatilidad en diversos ámbitos, entre los que destaca Windows Phone. El análisis de datos y clasificación de resultados son llevados a cabo mediante una serie de funciones elaboradas en Matlab. La principal razón de que haya sido este el entorno elegido para esta fase de la aplicación es que Matlab es una plataforma enfocada al cálculo matemático y al procesamiento de grandes cantidades de datos, actividades que constituyen el pilar fundamental de esta parte de la herramienta. - IV - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Para la elaboración de los árboles clasificadores de la alegría y el desagrado se ha empleado el programa de clasificación y aprendizaje automático Weka. Posteriormente, los clasificadores obtenidos con Weka han sido implementados dentro de funciones Matlab. La fase final del ciclo de vida de la herramienta lo constituye una aplicación visual de análisis de resultados. Esta aplicación permitirá observar y comparar la información inicial con la respuesta proporcionada, así como la evolución temporal de los parámetros relevantes. El lenguaje elegido para el desarrollo de esta herramienta es C#, ya que su potencia visual permite crear interfaces de gran complejidad. -V- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Resultados Obtenidos Para obtener los datos faciales y visuales necesarios se organizaron nueve sesiones de grabación con voluntarios, que visualizaron un vídeo dividido en cuatro secuencias ideadas para generar diferentes emociones. Con los datos recogidos se realizó una clasificación manual fotograma a fotograma en función de la presencia o ausencia de alegría y desagrado. Posteriormente se empleó esos datos en la conformación de los árboles clasificadores en un proceso de tres iteraciones en el que se añadían al conjunto de entrenamiento casos nuevos que anteriormente hubiesen sido clasificados erróneamente. Tras la optimización de los árboles de clasificadores en las tres iteraciones, éstos han alcanzado la capacidad de reconocer de forma automática las expresiones de desagrado y alegría presentes en el rostro de una persona con un porcentaje de acierto del 96% para el desagrado y un 97.5% para la alegría. Tras haber realizado la adquisición de la información facial y visual, y de haber procesado dicha información, la herramienta permite realizar dos análisis diferentes de dichos resultados. Por un lado, la herramienta diseñada en C# sirve para analizar las expresiones faciales de desagrado o sonrisa presentes en la persona fotograma a fotograma. Por otro lado, se puede emplear una función Matlab para detectar la predominancia de la alegría y el desagrado en intervalos de un segundo (diez fotogramas), lo que permite obtener una idea general del estado de ánimo de la persona, así como corregir errores puntuales. También han sido elaboradas una serie de funciones que aportan información del conjunto de sesiones en suma, y del porcentaje de tiempo que cada emoción es manifestada para cada secuencia de vídeo mostrada. - VI - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Conclusiones A modo de conclusión, el resultado final de este proyecto consiste en un conjunto de herramientas basadas en el uso de la cámara Kinect como mecanismo de adquisición de información facial, que permiten reconocer de forma precisa las expresiones de alegría y desagrado. Los resultados obtenidos permiten demostrar la viabilidad de Kinect como mecanismo de adquisición de información facial y visual y ,por otro lado, se ha podido apreciar su concordancia con la teoría darwiniana de las expresiones faciales. Además, se han elaborado una serie de funciones y una aplicación que proporcionan información detallada y completa para realizar el análisis de los datos y los resultados extraídos. Esta información puede ser proporcionada fotograma a fotograma o por secciones del vídeo y también puede analizarse de forma individual o para la suma de todos los voluntarios del experimento, Referencias [EKMA02] – “Facial Action Coding System”. Paul Ekman, Wallace V. Friesen, Joseph C. Hager. Estados Unidos 2002. [PAUL_EKMAN] - http://www.paulekman.com/ [ESSA97] "Coding, Analysis Interpretation, Recognition of Facial Expressions". I. Essa, A. Pentland. Julio 1997. [KINECT] - http://www.microsoft.com/en-us/kinectforwindows/ - VII - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect FACIAL EXPRESSIONS RECOGNITION THROUGH IMAGES ACQUIRED WITH KINECT CAMERA Author: Ruiz Martín, Rodrigo Supervisors: Palacios Hielscher, Rafael. Muñoz San Roque, Antonio. PROJECT ABSTRACT The main goal of this project is the development of an application capable of recognizing the expressions of joy (laughter or smile) and displeasure on people’s faces in an automatic and intuitive way, basing on the facial information acquired using the Microsoft Kinect camera. The application consists of three tools which respectively acquire facial information, process data and analyze the results. The facial expression recognition system developed is based on the research done by the psychologist Paul Ekman, which is a pioneer on facial expression and micro expression recognition Introduction At the present time psychology has reached a high degree of development in facial expression recognition. A great number of prestigious psychologists have done deep research obtaining detailed information about facial expression recognition and its bond with human emotions. Automatic facial expression recognition is especially interesting because it allows detecting the feelings and mood of people, and recognizing this can be used in a very wide range of fields such as psychology, teaching or marketing. - VIII - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect On the other hand, technology has evolved so fast in the last years that now we can perform tasks that once would have been unconceivable. Processing and computing capabilities of computers have increased exponentially, so the actual trend is to automatize as much processes as possible, allowing the experts to focus their efforts on less trivial tasks. The aim of this project comes from the logical union of these two facts, because now both areas have reached a progress state suitable for developing a computing tool capable of recognizing automatically the location of a person’s face and analyzing its facial expressions for a specific amount of time. State of Art Literature shows two main research directions. The first one has been done in the field of psychology, in order to perceive the understanding level that has been reached about facial expressions and the main features that characterize them. Identification and classification of emotions is mainly based on psychologist Paul Ekman’s research, considered as one of the most influential psychologists of the twentieth century. His research about facial expressions began in 1965[PAUL_EKMAN] and their apex was reached in the year 2002 when he published a complete guide on how to determine the feelings felt by a person from its facial expressions coded using a series of facial features called Action Units.[EKMA02]. In the field of automatic facial expressions recognition, the most relevant research has been made by Ifran A. Essa [ESSA97], which has achieved very accurate results based on image sequence analysis. However, in the present time there hasn’t been developed a facial expression recognition tool easy to use, affordable, automatic and complete enough to be able to be used successfully by a non-expert in the field of - IX - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect psychology. Furthermore, the great versatility that a tool with these characteristics can offer about its possible uses creates an extra motivation. Implementation The application has been divided into three tools, which are mainly focused on: Gathering real-time facial information as images and parameters. Dealing with that information and extracting conclusions. Showing graphical information to allow users to analyze the results achieved and compare them with the inputs of the camera. This breakdown has been made to take the most advantage possible of the characteristics of each programming language and environment, looking to get the best performance possible and achieve a high compatibility. -X- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Technology used As facial information acquisition mechanism, Microsoft’s Kinect for Xbox360 has been chosen due to its features, mainly focused on detecting and following human body and face [KINECT], which makes it easier to acquire the necessary data to analyze facial expressions. The facial information acquisition tool has been developed using C# in order to take the most of Microsoft’s libraries designed to be used with Kinect. C# is an extended and more complex version of C language focused on visual programming and object-oriented, which now is widely used due to its versatility in a wide range of fields, especially Windows Phone applications. Data analysis and results classification are done using a series of functions programmed using Matlab. The main reason why this was the chosen environment for developing this phase of the application is because Matlab is a platform focused on mathematic computation and processing great amounts of data, activities that form the main goal of this part of the tool. - XI - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect In the development of the classifying trees of joy and displeasure the program chosen was Weka, specially focused on classifying data and machine learning. Subsequently, the classifiers built using Weka have been implemented into Matlab functions. The final phase of the application’s lifecycle consists of a visual tool for analyzing the results obtained. This tool allows the user to see and compare the inputs acquired by the camera with the classification given, and also how relevant parameters change with time. The programming language chosen to create this tool is C#, because its visual capabilities are ideal for easily creating complex user interfaces. - XII - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Results To obtain the necessary visual and facial data nine recording sessions were organized with volunteers, who were shown a video divided into four scenes designed to generate different emotions. With the data acquired, each frame was manually classified depending on the presence or absence of joy and displeasure. Afterwards, these data were used in the development of the classifying trees in a process of three iterations in which the previously incorrectly classified instances were added to the training set. Having optimized the classifying trees through the three iterations, they reached the capability of recognizing automatically the expressions of displeasure and joy featured in the faces of people with a success rate of 96% for displeasure recognition and 97.5% for joy. After having acquired the facial and visual information, and having processed that information, the tool allows the users to do two different types of analysis from the results gathered. On one hand, the application developed using C# can be used to analyze the facial expressions of smile and displeasure detected in a person frame by frame. On the other hand, there have been created a series of Matlab functions to detect the main expressions of joy and displeasure noticed for each second of recording and to see the graphics of a whole recording at a glance, or even the sum of all of the recordings done. This makes it possible to get a general idea of a person’s mood and correct isolated errors. - XIII - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Conclusions To summarize all that has been said before, the final result of this project consists of a set of tools based on the Kinect camera as a mechanism of facial information acquisition, capable of recognizing the expressions of displeasure and joy in different people in a very accurate way. Results achieved have allowed to demonstrate the viability of Kinect as a mechanism of facial and visual information acquisition and, on the other hand, it was possible to confirm that the results agreed with Darwin’s theory about facial expressions. Besides, a group of functions and an application have been developed with the aim of providing detailed and complete information to analyze the data and results obtained. This information can be given for each frame or for each complete scene of the video, and can also be analyzed individually or for the sum of all the volunteers of the experiment. References [EKMA02] – “Facial Action Coding System”. Paul Ekman, Wallace V. Friesen, Joseph C. Hager. United States 2002. [PAUL_EKMAN] - http://www.paulekman.com/ [ESSA97] "Coding, Analysis Interpretation, Recognition of Facial Expressions". I. Essa, A. Pentland. July 1997. [KINECT] - http://www.microsoft.com/en-us/kinectforwindows/ - XIV - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect ÍNDICE Sección Página 1. Objetivos 1 2. Motivación 5 3. Estado del Arte 7 4. Tecnología Empleada 21 4.1 Cámara Kinect 21 4.1.1 Especificaciones Técnicas 22 4.1.2 Interfaz de Seguimiento Facial de Kinect 27 4.2 C# 43 4.3 XAML 51 4.4 Weka 58 4.5 MATLAB 62 5. Solución Propuesta 67 5.1 Introducción 67 5.2 Visión global de la herramienta 68 5.3 Aplicación de adquisición de información 70 5.3.1 Desarrollo 71 5.3.2 Modificaciones 79 5.4 Herramienta de procesado de datos 80 5.4.1 Desarrollo 80 5.4.2 Modificaciones 88 5.5 Aplicación de análisis de resultados 90 5.5.1 Desarrollo 90 5.5.2 Modificaciones 92 6. Resultados Obtenidos 93 6.1 Diseño del experimento 94 -I- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 6.2 Elaboración de árboles clasificadores de desagrado y alegría 98 6.2.1 Árbol clasificador de la Alegría 100 6.2.1 Árbol clasificador de la Alegría 102 6.3 Resultados individuales 104 6.3.1 Análisis por fotogramas 6.3.2 Análisis por vídeos 6.4 Resultados colectivos 124 6.4.1 Análisis por fotogramas 6.4.2 Análisis por vídeos 7 Conclusiones 133 8 Trabajos Futuros 137 9 Guía de Uso de la Herramienta 141 9.1 Requisitos del sistema 141 9.2 Herramienta de Captura 142 9.3 Herramienta de Extracción y Análisis de Resultados 144 9.4 Herramienta de Análisis Visual de Resultados 145 10 Bibliografía 147 ÍNDICE DE TABLAS Tabla Página 3.1-1 Primeros métodos para el análisis automático de expresiones faciales 8 3.1-2 Trabajos recientes sobre el análisis automático de expresiones faciales 9 4.1.1-2 Formatos soportados por DepthImageStream 23 4.1.1-4 Formatos soportados por ColorImageStream 25 4.1.2-2 Principales Interfaces de Kinect 28 - II - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Tabla Página 4.1.2-3 Shape Units de IFTFaceTracker 33 4.1.2-4 Estructuras de datos de Kinect 36 4.1.2-9 Explicación de los ángulos medidos por Kinect 42 5.4.1-1 Comparación entre rostro neutro inferido y real 84 6.3-1 Alegría debida al nerviosismo al inicio de las sesiones 110 6.3-2 Explicación de los resultados anómalos de la grabación 2 122 ÍNDICE DE FIGURAS Figura Página 3.2-1 Plantilla espacio-temporal de sorpresa 12 4.1-1 Cámara Kinect y Sensores 21 4.1.1-1 Rango Válido del Sensor de Profundidad 22 4.1.1-3 Ejemplo de imágenes en los diferentes formatos 23 4.1.1-5 Comparativa entre resoluciones 26 4.1.2-1 Espacio de la cámara 27 4.1.2-5 Puntos supuestamente reconocibles por Kinect 38 4.1.2-6 Puntos reconocibles por Kinect 39 4.1.2-7 Mapeado de puntos reconocibles por Kinect 40 4.1.2-8 Ángulos de la postura de la cabeza 41 4.2-1 Imagen RGB captada por Kinect 46 4.2-2 Superposición de Puntos Faciales 48 4.3-1 Interfaz de usuario en XAML 56 4.4-1 Árbol clasificador de Weka 61 - III - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Figura Página 5.2-1 Estructura de la herramienta 69 5.3-1 Interfaz de la aplicación de adquisición de información 70 5.3.1-1 Confirmación de detección del rostro 76 5.3.1-2 Estructura del fichero de puntos faciales 77 5.3.2-1 Recorte de la imagen adquirida 79 5.4.2-1 Puntos faciales con un tiempo de refresco mayor 89 5.5.1-1 Interfaz de la aplicación de análisis de resultados 91 6.1-1 Esquema del vídeo del experimento 95 6.1-2 Participantes en el experimento 96 6.3-1 Explicación de una gráfica por fotogramas 105 6.3-2 Secuencia de imágenes de la grabación 4 115 6.4-1 Fotogramas del punto caliente de alegría 126 6.4-2 Fotogramas del punto caliente de desagrado 129 - IV - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Capítulo 1 OBJETIVOS En este proyecto se pueden diferenciar tres objetivos que descompondrán el desarrollo del mismo en dos fases. La primera de ellas consiste en un completo estudio del estado del arte del reconocimiento de expresiones faciales, y de las características de la cámara Kinect y la información que es capaz de proporcionar. Por otro lado, la segunda fase se basa en el propio desarrollo de la herramienta Por lo tanto, los objetivos del proyecto son: 1. Realizar un estudio en profundidad del estado del arte Este objetivo constituye el primer paso para el desarrollo de la herramienta de detección automática de expresiones faciales, ya que el estudio del estado del arte permite obtener una visión detallada del reconocimiento de expresiones faciales en la actualidad. Para ello ha sido necesario realizar un análisis en profundidad sobre las investigaciones y métodos existentes, así como las expresiones faciales reconocibles y las características que las identifican. 2. Analizar la viabilidad de la cámara Kinect como mecanismo de obtención de datos faciales Este objetivo se ha establecido debido a que la cámara Kinect es capaz de detectar la ubicación de rostros mediante el uso de las librerías proporcionadas por Microsoft y seguir su posición a lo largo del tiempo, lo que facilita en gran medida el análisis de las expresiones faciales. No obstante, los datos proporcionados por la cámara podrían no ser los deseados para desempeñar dicha tarea. -1- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Para lograr este objetivo se ha realizado un estudio en profundidad sobre el funcionamiento de Kinect, y de él se ha extraído la información facial que es capaz de obtener, su precisión y su completitud. En función de los resultados obtenidos en este estudio y en el estudio del estado del arte se puede determinar qué clase de análisis es posible realizar con los datos extraídos por Kinect. 3. Elaborar un software capaz de procesar los datos extraídos por Kinect y conformar conclusiones de forma automática, fiable y eficiente. Este es el objetivo principal del proyecto. El programa debe ser capaz de recoger la información obtenida a través de Kinect y procesarla para poder mostrar los resultados obtenidos, que deberán ser lo más precisos posibles. Para cumplir este objetivo es necesario definir una estructura óptima de la herramienta, que debe sacar provecho de los distintos lenguajes de programación y librerías disponibles para desempeñar cada una de sus tareas. La fiabilidad vendrá dada por la forma en que la herramienta extraiga los resultados, y de las pruebas ejecutadas para la construcción de los algoritmos de reconocimiento de las expresiones faciales del desagrado y la alegría. 4. Evitar la necesidad de identificar un “rostro neutro” del sujeto En la actualidad, uno de los problemas presentes en el reconocimiento automático de expresiones faciales es la necesidad de determinar manualmente una -2- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect expresión que se corresponda con el rostro neutro del sujeto, es decir, aquél que no presenta ninguna emoción. Esta tarea implica dos inconvenientes, el primero es la necesidad de una persona con experiencia en el campo de la psicología que sea capaz de determinar un rostro neutro del sujeto. El segundo es que la precisión del análisis dependerá de lo acertada que haya sido la elección del rostro neutro. Por ello se ha desarrollado un método de inferencia del rostro neutro de una persona a partir de una cantidad de datos suficientemente grande, todo ello basándose en las conclusiones extraídas de los estudios de Paul Ekman. -3- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect -4- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Capítulo 2 MOTIVACIÓN La principal motivación de este proyecto la surge de la gran cantidad de campos de aplicación de una herramienta capaz de detectar automáticamente expresiones faciales y emociones. En la actualidad los campos de aplicación del análisis de expresiones faciales abarcan disciplinas tan dispares como el marketing, la pedagogía y la seguridad entre otros. Desde la segunda mitad del siglo XX hasta la actualidad, los estudios de numerosos psicólogos se han centrado en determinar los rasgos que caracterizan las diferentes expresiones faciales humanas, y su vinculación con las emociones manifestadas durante dichas expresiones. Tales estudios han determinado que todos los seres humanos, independientemente del entorno sociocultural en que nos hayamos criado y de nuestras características fisiológicas, manifestamos de forma similar las emociones más básicas. Y esta manifestación se traduce en la articulación de expresiones faciales involuntarias que cumplen unos patrones claramente reconocibles. En la actualidad, una de las limitaciones que han surgido en el análisis automático de expresiones faciales, es la necesidad de que un psicólogo o una persona con amplia experiencia en el reconocimiento de expresiones faciales identifique un rostro neutro de la persona a analizar para que los algoritmos de detección de expresiones puedan actuar de forma fiable. La existencia de esta limitación supone una de las principales motivaciones de este proyecto, que consiste en tratar de desarrollar un método capaz de inferir de forma aproximada el rostro neutro de una persona sin la necesidad de que intervenga un especialista. -5- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect -6- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Capítulo 3 ESTADO DEL ARTE Desde mediados de la década de 1970 se han propuesto distintas aproximaciones para el análisis de expresiones faciales, tanto con imágenes faciales estáticas como secuencias de imágenes. En 1992, Samal e Iyengar mostraron una visión global de los avances realizados en el campo. Este documento explora y compara los distintos trabajos sobre análisis automático de expresiones faciales que habían sido desarrollados en los últimos años. [SAMA91]. Entre los años 1991 y 1995 esta área suscitó el interés de numerosos investigadores, que propusieron diversos sistemas para abordar el estudio del análisis de expresiones faciales. Para poder evaluar la bondad de dichos sistemas, Maja Pantic y Leon J.M. Rothkrantz definieron en el documento las características que debía tener un sistema de análisis de expresiones faciales ideal. Dichas características fueron resumidas en una tabla, para poder verificar posteriormente cuántas de ellas eran cumplidas por un determinado método. Propiedades de un analizador ideal [PANT00]: 1 Adquisición automática de la imagen facial 2 Sujetos de cualquier edad, etnia y perspectiva 3 Admite variación de luminosidad 4 Admite rostros parcialmente ocultos 5 No es necesario ningún maquillaje o marcas especiales 6 Admite movimientos rígidos de cabeza 7 Detección facial automática -7- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 8 Extracción automática de información de expresiones faciales 9 Tratamiento de información inexacta de expresiones faciales 10 Clasificación automática de expresiones faciales 11 Distingue todas las posibles expresiones 12 Tratamiento de cambios faciales unilaterales 13 Obedece reglas anatómicas Atendiendo a estas propiedades, se puede elaborar una tabla para analizar las virtudes y carencias de los primeros métodos de análisis automático de expresiones faciales que fueron elaborados: Tabla 3.1-1 Primeros métodos para el análisis automático de expresiones faciales Características del Sistema Ideal Sistema 1 2 3 4 5 6 7 8 9 10 11 12 13 X X X X X X X X X X X - X X X X X X X X X X Análisis de imágenes estáticas Cottrell.[COTT91] Kearney.[KEAR93] Hara.[KOBA92] Matsuno.[MATS93] Rahardja.[RAHA91] Ushida.[USHI93] Vanger.[VANG95] X X X X X X X X X X X X Análisis de secuencias de imágenes Mase.[MASE91] X Moses.[MOSE95] X X X Rosenblum.[ROSE94] X Yacoob.[YACO94] X X= SÍ, - = Dato ausente, Casilla en blanco: NO -8- X X X X X X X X X X X X X X X X Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Puede observarse que estos sistemas distan bastante de cumplir todos los requisitos enumerados por Maja Pantic y Leon J.M. Rothkrantz. No obstante, los trabajos más recientes proporcionan resultados mucho más completos. Tabla 3.1-2 Trabajos recientes sobre el análisis automático de expresiones faciales Características del Sistema Ideal Sistema 1 2 3 4 5 6 7 8 9 10 11 12 13 X X X X X X X X X X X X X X X X X X - X X X X X - Análisis de imágenes estáticas Edwards.[EDWA98] Hara.[KOBA97] Hong.[HONG98] Huang.[HUAN02] Lyons.[LYON99] Padget.[PADG96] Pantic.[PANT00] Yoneyama.[YONE92] Zhang.[ZHAN98] Zhao.[ZHAO96] X X X X X X X X X X 1 X X X X X X X X X 1 X X X X X X X X X 3 X X X X X 1 X X X X X X X X X Análisis de secuencias de imágenes Black.[BLAC96] X X X X Essa.[ESSA97] X X X X Kimura.[KIMU97] X X X Otsuka.[OTSU98] X X X Wang.[WANG98] X 1 X X= SÍ, - = Dato ausente, Casilla en blanco: NO X X - X X X X X X X - X X X X X X X X X X X X X X X X X X X Pese a los avances realizados, ninguno de estos sistemas es capaz de extraer información de la expresión facial de un rostro parcialmente oculto ni de realizar una clasificación cuantificada de la expresión facial en términos de acciones faciales, por ello estas propiedades han sido excluidas de la tabla. -9- Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Por otro lado, en los sistemas en los que la información de las expresiones faciales es extraída manualmente, se asume que éstos son capaces de tratar sujetos de cualquier etnia. En el caso de aquellos sistemas que adquieren esta información de forma automática, el valor de la columna 2 representa el rango de etnicidad en los sujetos de prueba. Estos sistemas estudian principalmente la animación de las expresiones faciales, y no tratan de clasificar la expresión facial observada tanto en términos de acciones faciales como de categorías de emociones. 3.2 Detección del Rostro La mayor parte del trabajo realizado sobre análisis automático de expresiones faciales se basa en unas condiciones controladas para la obtención de la imagen. Estas condiciones van desde un casco que se coloca el sujeto con la cámara integrada, hasta una imagen frontal perfecta del rostro del sujeto. [OTSU96]. [PANT00]. Siempre se parte del conocimiento de que en la imagen hay presente un rostro, y se conoce su ubicación aproximada dentro de ésta. Estas situaciones no representan la realidad, ya que en situaciones cotidianas difícilmente se van a dar las condiciones óptimas o se va a tener algún conocimiento a priori de la ubicación de un rostro dentro de la imagen a analizar. La detección de la posición exacta del rostro dentro de la imagen ha sido abordada desde dos perspectivas diferentes. En el método holístico (Essa, Hong) el rostro se determina como una única unidad, mientras que en el método analítico (Hara, Yoneyama) el rostro se detecta mediante la búsqueda de parámetros distintivos de un - 10 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect rostro (iris y fosas nasales). Posteriormente la posición relativa entre estas características determina la posición de la cara. Trabajo de Ifran A. Essa Actualmente, existe un trabajo que ha dado resultados muy exactos a la hora de reconocer y analizar las expresiones faciales y las emociones de un sujeto. Este es el trabajo del doctor Ifran A. Essa. Desarrolló un método basado en plantillas espacio-temporales de movimientoenergía. El método emplea el análisis de secuencia de imágenes, y se basa en los cambios que experimentan las distintas características del rostro a lo largo del tiempo, teniendo en cuenta su intensidad y velocidad (tanto de aparición como de desvanecimiento). Dicho método fue probado con 30 secuencias sobre 8 sujetos, proporcionando una exactitud del 100% para reconocer la expresión facial y de un 98% a la hora de clasificar las emociones del sujeto. Sus limitaciones son la necesidad de una perspectiva directa y frontal del rostro, y el uso de tan sólo dos acciones faciales, lo que proporciona un rango muy reducido de expresiones faciales reconocibles. Sus principales ventajas son la exactitud, y la flexibilidad al permitir realizar el análisis sobre sujetos con vello facial y gafas, así como cambios de luminosidad dentro de unos amplios márgenes. - 11 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Figura 3.2-1 Plantilla espacio-temporal de sorpresa. 3.3 Reconocimiento de las expresiones faciales Las expresiones faciales se generan por la contracción de músculos de la cara, que generar cambios temporales en características de ésta, llamados Action Units (AUs). [EKMA02]. Estos cambios son breves, durando por lo general entre 250 milisegundos y 5 segundos. Las expresiones faciales se pueden describir mediante tres parámetros temporales: - Comienzo (Ataque): Tiempo durante el que la expresión se genera. - Cumbre: Mientras la expresión se mantiene en el rostro del sujeto. - Fin (Relajación): Desde que la expresión comienza a desvanecerse hasta que ésta ha desaparecido por completo. - 12 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Aunque la importancia de una correcta medición de los tiempos es ampliamente aceptada, sólo unos pocos estudios han investigado este aspecto sistemáticamente, sobre todo para estudiar la sonrisa. La intensidad de las expresiones faciales se puede medir mediante la deformación de ciertos parámetros de la cara o por la densidad de las arrugas que aparecen en ciertas áreas de ésta. Debido a las diferencias existentes entre la amplitud de las acciones faciales de las personas, es difícil determinar la intensidad de éstas sin recurrir a una expresión neutra del sujeto a analizar. Otro problema que aparece al intentar reconocer las expresiones faciales de una persona reside en las diferencias culturales, ya que personas de lugares muy diferentes probablemente no reaccionen de forma semejante ante emociones similares. No obstante los estudios de Paul Ekman al respecto revelan que, independientemente de la cultura, las personas reaccionamos de forma más parecida ante los estímulos de lo que cabría esperar, al menos en cuanto a las emociones básicas se refiere. 3.4 Definición de Action Units (AUs). Las Action Units (AUs) son unidades de acción que van asociadas a distintos elementos del rostro. Una sola AU por sí sola no suele ser suficiente para poder reconocer expresiones faciales, pero en conjunto pueden llegar a proporcionar información bastante exacta sobre dichas expresiones, siempre y cuando las AUs se hayan obtenido con suficiente exactitud. [EKMA02]. - 13 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Las AUs, aparte de asociarse a características concretas del rostro, también llevan asociada la intensidad con la que se producen. A continuación se muestra un listado de las AUs más relevantes a la hora de determinar la presencia de expresiones faciales en el rostro de un sujeto. Action Units de la parte superior del rostro AU 1: Elevar el interior de las cejas. AU 2 : Elevar el exterior de las cejas. AU 4: Bajar las cejas. AU 5: Elevar el párpado superior. AU 6: Elevar las mejillas y comprimir el párpado. AU 7: Elevar o tensar el párpado inferior. AU 43: Cerrar los ojos (Sólo cuando están completamente cerrados) AU 45: Pestañear (Opcional) AU46 : Guiñar un ojo (Opcional) Action Units de la parte inferior del rostro Action Units Verticales AU 9: Arrugar la nariz. AU 10: Levantar el labio superior. - 14 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect AU 15: Bajar los extremos de los labios. AU 16: Bajar el labio inferior. AU 17: Levantar el mentón. AU 25: Separar los labios. AU 26: Separar los dientes (Relajar mandíbula). AU 27: Abrir la boca. Action Units Horizontales AU 14: Arrugar los extremos de la boca AU 20: Estirar lateralmente los labios. Action Units Oblicuas AU 11: Profundizar el surco nasolabial. AU 12: Estirar de los extremos de los labios. AU 13: Estirar los extremos de los labios en una línea delgada. Action Units Orbitales AU 18: Fruncir los labios. AU 22: Fruncir los labios y separarlos (Labios con forma de embudo). AU 23: Apretar los labios hacia dentro. - 15 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect AU 24: Apretar los labios. AU 28: Chuparse los labios. También son relevantes los cambios de la posición de la cabeza (tanto giros laterales como bajar y subir la cabeza), así como la dirección de la mirada. Por ejemplo la cabeza gacha y mirada hacia abajo podrían indicar vergüenza o arrepentimiento. 3.5 Emociones humanas y sus expresiones Universalidad de las expresiones de las emociones A mediados de la década de los años cincuenta, la creencia que se imponía en el ámbito de la psicología era que las expresiones asociadas a las emociones venían fuertemente determinadas por la cultura y eran aprendidas por contacto social. Dicha línea de pensamiento, propugnada por antropólogos tan destacados como Margaret Mead, se oponía frontalmente con las ideas de Charles Darwin, quien afirmaba que las expresiones eran innatas, y por tanto universales. Debido a la falta de estudios intensivos que pudieran refutar categóricamente una de las dos teorías, Paul Ekman inició un estudio con personas de cinco países diferentes (Argentina, Brasil, Japón y Estados Unidos). En dicho estudio, Ekman mostró fotografías para que los sujetos identificasen las emociones de las imágenes, y en todos los países las interpretaciones coincidieron. En la siguiente fase del estudio, evaluó el comportamiento facial en un laboratorio y descubrió que las reacciones de japoneses y estadounidenses coincidían por completo al observar en solitario vídeos de escenas quirúrgicas y accidentes, - 16 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect moviendo ambos los mismos músculos de la cara. No obstante, en presencia de un científico, los japoneses disimulaban las expresiones de desagrado con sonrisas. Desconcertado por este hecho, Paul Ekman decidió realizar las mismas pruebas con una cultura aislada de la civilización, y para ello convivió durante dos años con el pueblo Foré en Papúa Nueva Guinea. De estar Margaret Mead en lo cierto, y ser las expresiones un comportamiento aprendido de la cultura, las expresiones de la civilización Foré deberían ser completamente diferentes a las de cualquier otra. Los resultados, por el contrario, mostraron emociones completamente reconocibles por Ekman. Por lo tanto este estudio sirvió para refutar definitivamente la línea de pensamiento de Margaret Mead, y fortalecer la teoría de Charles Darwin. Esto hizo posible la demostración de que las expresiones de alegría, tristeza, ira, sorpresa, asco y miedo son universales, independientemente de la cultura o sociedad a la que pertenezca una persona. Principales expresiones y sus rasgos En la actualidad, los principales estudios realizados acerca de las expresiones faciales de las emociones han determinado que existen seis expresiones básicas que son alegría, tristeza, ira, sorpresa, asco y miedo. Alegría Es una de las emociones más comunes y en su realización participa el músculo cigomático. Sus principales características son: - 17 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect - Elevación de las mejillas - Aparición de arrugas en los laterales exteriores de los ojos o “patas de gallo” - Aumento de la anchura de los labios - Curvatura de las comisuras de los labios hacia arriba Tristeza Es una de las emociones más difíciles de detectar debido a su parecido con la expresión neutra excepto en sus manifestaciones más pronunciadas. Sus principales características son: - Caída de los párpados superiores - Elevación del interior y caída del exterior de las cejas - Aparición de arrugas en el entrecejo - Estiramiento horizontal de los labios - Cabeza y mirada gachas Ira Es una emoción fácilmente reconocible, aunque difícil de generar genuinamente en un entorno experimental. Sus características son: - Mirada fija - Elevación pronunciada del párpado superior - Cejas juntas - Caída del interior de las cejas - Elevación del exterior de las cejas - Mandíbula apretada - 18 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Sorpresa Es la emoción más breve y posteriormente suele desencadenar otras, por lo tanto es muy difícil de detectar. Principales características: - Elevación de los párpados superiores - Párpados inferiores relajados - Caída de la mandíbula - Elevación de las cejas - Aparición de arrugas en la frente Asco Es una de las expresiones más sencillas de reconocer, ya que suele producirse de forma clara, marcada y prolongada en el tiempo. Sus características son: - Contracción del músculo que frunce la nariz - Estrechamiento de los ojos - Elevación del labio superior - Caída de las cejas - Contracción de las mejillas Miedo Puede ir precedido de sorpresa, en sus fases menos pronunciadas guarda un gran parecido con el rostro neutro, de ahí su dificultad de ser generado en un entorno experimental. Sus principales características son: - 19 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect - Párpados inferiores tensos - Párpados superiores pronunciadamente elevados - Elevación y acercamiento de las cejas - Prolongación de los labios hacia atrás - 20 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Capítulo 4 TECNOLOGÍA EMPLEADA En este capítulo se va a ofrecer una visión detallada de las principales tecnologías empleadas en la elaboración de las diferentes herramientas que componen el proyecto. Para ello se explicarán en profundidad sus características y su utilidad dentro del proyecto, así como las ventajas y desventajas que presentan frente a otras posibles alternativas en el caso de haberlas. 4.1 Cámara Kinect La cámara Kinect es un dispositivo físico creado por Microsoft para permitir a los usuarios de la videoconsola Xbox 360 interactuar con ésta sin necesidad de emplear un controlador de videojuegos tradicional. Para ello, Kinect ha sido dotada con un interfaz capaz de reconocer gestos, comandos de voz, objetos e imágenes. El dispositivo cuenta con una cámara RGB, un sensor de profundidad, un micrófono y un procesador incorporado capaz de realizar captura de movimiento 3D en tiempo real de todo el cuerpo, así como reconocimiento facial y comandos de voz. Además cuenta con un motor para ajustar la inclinación de la cámara. Figura 4.1-1 Cámara Kinect y Sensores - 21 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 4.1.1 Especificaciones Técnicas Sensor de Profundidad El sensor de profundidad permite tener una visión 3D del entorno de Kinect. El emisor genera rayos infrarrojos y el sensor detecta los rayos que rebotan en los objetos o personas de la habitación. Los rayos reflejados son convertidos en información de profundidad para poder medir la distancia entre un objeto y el sensor, lo que permite generar la imagen de profundidad. Esto es especialmente relevante para el proyecto, al hacer posible conocer con precisión la distancia de los diferentes puntos del rostro a la cámara. El sensor de profundidad cuenta con un rango válido que va desde 0.8 hasta 4 metros de distancia, tal como se muestra en la figura 5.1.1-1 Figura 4.1.1-1 Rango Válido del Sensor de Profundidad - 22 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect La información tridimensional del entorno del sensor es enviada desde Kinect hasta el ordenador a través de un flujo de datos llamado DepthImageStream, que se puede configurar para enviar la información con distintos grados de precisión y tasas de refresco. Tabla 4.1.1-2 Formatos soportados por DepthImageStream Nombre de la Propiedad Descripción Imágenes de 320x240 píxeles a 30 Resolution320x240Fps30 imágenes por segundo Imágenes de 640x480 píxeles a 30 Resolution640x480Fps30 Resolution80x60Fps30 imágenes por segundo Imágenes de 80x60 píxeles a 30 imágenes por segundo Undefined Formato sin definir Figura 4.1.1-3 Ejemplo de imágenes en los diferentes formatos - 23 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Dicha información es almacenada en un buffer denominado DepthImageFrame, que contiene la información de profundidad de un fotograma, por lo que es refrescado cada vez que el sensor captura un nuevo fotograma. Esto implica que, si los cálculos a realizar con dicho fotograma necesitan más tiempo para ejecutarse que el tiempo entre fotogramas, se deberá almacenar la información en otro buffer aparte; y probablemente no se podrá analizar la información de los fotogramas producidos durante dichos cálculos en tiempo real. A continuación se muestra el proceso de apertura del stream de imágenes de profundidad, configuración del buffer y actualización de éste con la llegada de nuevos fotogramas en el lenguaje de programación C#. //Método que se ejecuta cada vez que se crea un fotograma nuevo private void OnAllFramesReady(object sender, AllFramesReadyEventArgs allFramesReadyEventArgs) { newSensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30); newSensor.DepthStream.Range = DepthRange.Default; if (this.depthImageFormat != depthImageFrame.Format) { depthImageFrame = allFramesReadyEventArgs.OpenDepthImageFrame(); this.depthImage = null; this.depthImageFormat = depthImageFrame.Format; } //Guardado de la información del buffer en un buffer auxiliar this.depthImage = new short[depthImageFrame.PixelDataLength]; depthImageFrame.CopyPixelDataTo(this.depthImage); } - 24 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Cámara RGB Kinect cuenta con un sensor óptico que permite obtener imágenes a color en tiempo real. Dicho sensor cuenta con un campo de visión de 43° en vertical por 57° en horizontal y es capaz de capturar fotogramas a razón de 30 imágenes por segundo. Al igual que el sensor de profundidad, crea un flujo de datos de la cámara al ordenador llamado ColorImageStream, cuyos fotogramas son almacenados en el buffer ColorImageFrame. También admite diferentes formatos en los que capturar y transmitir las imágenes. El formato elegido dependerá de las necesidades de velocidad de captura y de precisión de la información recibida; y se puede elegir visualizar la imagen infrarroja para poder observar la escena en casos de luminosidad muy baja. Tabla 4.1.1-4 Formatos soportados por ColorImageStream Nombre de la Propiedad RawYuvResolution640x480Fps15 RgbResolution1280x960Fps12 RgbResolution640x480Fps30 YuvResolution640x480Fps15 Descripción Imágenes Raw YUV de 640x480 píxeles a 15 imágenes por segundo Imágenes RGB de 1280x960 píxeles a 12 imágenes por segundo Imágenes RGB de 640x480 píxeles a 30 imágenes por segundo Imágenes YUV de 640x480 píxeles a 15 imágenes por segundo Undefined Formato sin definir - 25 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Para la elaboración de este proyecto, los dos formatos que se consideró más adecuado elegir fueron RgbResolution1280x960Fps12 y RgbResolution640x480Fps30. El primero debido a la gran precisión que proporciona, y el segundo debido a que permite una tasa de captura de imágenes más elevada. En la siguiente imagen se muestra una comparativa entre ambos formatos de captura. Figura 4.1.1-5 Comparativa entre resoluciones Finalmente, debido a la gran diferencia de calidad entre las imágenes se decidió optar por el formato RgbResolution1280x960Fps12. A pesar de la menor tasa de fotogramas por segundo que permite, la importancia de obtener imágenes de gran calidad de los rostros de los sujetos se impuso. La principal causa de esta decisión es la relevancia que tiene dentro del proyecto poder realizar un análisis de las expresiones faciales de forma precisa. - 26 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 4.1.2 Interfaz de Seguimiento Facial de Kinect El Kit de Desarrollo Estándar de Kinect (SDK), contiene una serie de librerías e interfaces que permiten obtener información facial en tiempo real a partir de los datos que es capaz de recoger la cámara Kinect. El motor de seguimiento facial de Kinect analiza los datos recogidos por la cámara Kinect, deduce la posición de la cara y las principales características del rostro, y hace esa información disponible para cualquier aplicación en tiempo real. Sistema de Coordenadas La API de Seguimiento Facial usa el sistema de coordenadas de Kinect para obtener sus resultados de seguimiento en 3D. El origen de coordenadas se localiza en el centro óptico de la cámara; el eje Z apunta hacia el usuario, el eje Y apunta hacia arriba y el eje X hacia la izquierda del sensor. Las medidas se obtienen en metros para las distancias y en grados para los ángulos de rotación. Figura 4.1.2-1 Espacio de la cámara - 27 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Imágenes de entrada La API de Seguimiento Facial acepta como entrada imágenes de color y profundidad de Kinect. La calidad del seguimiento puede verse afectada por la calidad de esas imágenes de entrada, ya que las imágenes oscuras o borrosas dificultan la tarea del seguimiento y reconocimiento facial. Por otro lado, las caras más grandes o cercanas son más fáciles de seguir. Descripción de la API Visión General La API de Seguimiento Facial de Kinect fue diseñada para funcionar en tiempo real durante el procesado de las imágenes de entrada. Para poder funcionar correctamente se sirve de una serie de interfaces, que son los encargados de extraer, actualizar y procesar la información facial fotograma a fotograma. Tabla 4.1.2-2 Principales Interfaces de Kinect Interfaz Función IFTFaceTracker Principal interfaz de seguimiento facial IFTResult Resultado de una operación de seguimiento IFTImage Una interfaz de apoyo que agrupa varios buffers de imágenes IFTModel Un modelo 3D ajustado al rostro seguido - 28 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Interfaces IFTFaceTracker El interfaz principal es IFTFaceTracker, y se puede instanciar mediante el método FTCreateFaceTracker. this.faceTrackerInteropPtr = NativeMethods.FTCreateFaceTracker(IntPtr.Zero); if (this.faceTrackerInteropPtr == null) { throw new InsufficientMemoryException("Cannot create face tracker."); } Tras su inicialización, permite seguir un rostro de forma síncrona enviando imágenes de color y profundidad mediante el uso del objeto IFTImage. Estos resultados son devueltos por medio de una instancia de IFTResult. IFTFaceTracker proporciona el método CreateFTResult para crear una instancia de IFTResult en la que se almacenen los resultados específicos para el modelo que está empleando la instancia de IFTFaceTracker. Una aplicación necesitará crear una instancia de IFTResult para poder comenzar el seguimiento facial, y puede usar el método de IFTFaceTracker para obtener una matriz de áreas que potencialmente contengan caras a partir de los datos de imagen (FT_SENSOR_DATA) proporcionados por la aplicación. Depende del programador interpretar los resultados y decidir qué caras seguir. - 29 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect internal FaceTrackFrame CreateResult(out int hr) { IFTResult faceTrackResultPtr; FaceTrackFrame faceTrackFrame = null; this.CheckPtrAndThrow(); hr = this.faceTrackerInteropPtr.CreateFTResult(out faceTrackResultPtr); if (faceTrackResultPtr != null) { faceTrackFrame = new FaceTrackFrame(faceTrackResultPtr, this); } return faceTrackFrame; } Para comenzar el seguimiento de una cara se necesita llamar al método StartTracking. Éste es un método sencillo que busca en la imagen de entrada una cara, determina su orientación y comienza a seguirla. Se pueden proporcionar instrucciones indicando en qué región de la imagen buscar una cara (pROI) o enviar NULL para buscar en toda la imagen, la primera cara que se encuentre será a la que se siga. Otro parámetro obtenible es la orientación de la cabeza. Dicho parámetro se puede obtener a partir de los datos del Esqueleto proporcionados por Kinect. Sin este parámetro se podrá realizar un seguimiento facial, pero los resultados iniciales podrían no ser óptimos. Por ello se ha decidido emplear este parámetro en la detección facial de este proyecto. - 30 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Una vez StartTracking ha comenzado a seguir un rostro de la forma indicada por IFTResult, la aplicación deberá continuar el seguimiento facial mediante llamadas sucesivas a ContinueTracking, que usa información de las llamadas anteriores a StartTracking o ContinueTracking para mantener un seguimiento facial preciso. Se debe seguir llamando a ContinueTracking hasta que se desee terminar el seguimiento facial o éste haya fallado, por ejemplo debido a que la persona cuya cara se estaba siguiendo salga fuera de la imagen de la cámara. Un fallo en el seguimiento facial es indicado mediante el estado de IFTResult. Para comenzar de nuevo el seguimiento facial, la aplicación llama a StartTracking de nuevo y después a ContinueTracking de forma secuencial. //Determina si ya se estaba realizando un seguimiento facial this.startOrContinueTrackingStopwatch.Start(); if (this.trackSucceeded) //Se debe continuar el seguimiento facial { hr = this.faceTrackerInteropPtr.ContinueTracking(ref faceTrackSensorData, headPointsObj, this.frame.ResultPtr); } else//Se debe iniciar un nuevo seguimiento facial { hr = this.faceTrackerInteropPtr.StartTracking( ref faceTrackSensorData, ref regionOfInterest, headPointsObj, this.frame.ResultPtr); } this.startOrContinueTrackingStopwatch.Stop(); this.trackSucceeded = hr == (int)ErrorCode.Success && this.frame.Status == ErrorCode.Success; this.trackStopwatch.Stop(); - 31 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect ContinueTracking es una función relativamente rápida que usa la información existente del estado de una cara seguida, por ello es mucho más eficiente que StartTracking, que debe generar la información facial por completo. En algunas ocasiones es necesario llamar continuamente a StartTracking, especialmente si la aplicación tiene una tasa de imágenes baja o si la cara se mueve demasiado rápido entre imágenes, por lo que no es posible hacer un seguimiento continuo. Por otro lado, es posible seguir hasta dos caras de forma simultánea. Para ello se deben determinar las caras que se desea seguir instanciando mediante un objeto IFTFaceTracker y realizando una llamada al método DetectFaces. Después se crea una instancia de IFTFaceTracker por cada cara adicional que se desee seguir. También se pueden recuperar y editar Shape Units (SUs) mediante los métodos GetShapeUnits y SetShapeUnits. Las Shape Units sirven para determinar las medidas de ciertas características del rostro, lo que facilita la tarea de seguir rostros ya conocidos mediante el uso del método ContinueTracking. Suministrando SUs para usuarios conocidos, el seguimiento facial proporciona mejores resultados al principio ya que no tiene que aprender las SUs de la cara a seguir. Se necesita un período aproximado de un minuto para aprender las SUs en tiempo real para un usuario determinado. Una vez aprendidas las SUs para un usuario determinado, IFTFaceTracker continúa generando las SUs para mejorar su precisión. Si no se desea que esto suceda en una aplicación, se puede indicar no elaborar las SUs enviando False al método SetShapeComputationState. La API de Seguimiento Facial de Kinect es capaz de almacenar 11 Shape Units a través del objeto IFTFaceTracker. Cada SU indica los vértices a los que afecta y su desplazamiento en los ejes X, Y y Z. - 32 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Tabla 4.1.2-3 Shape Units de IFTFaceTracker Shape Unit Número Asignado Altura de la cabeza 0 Posición vertical de las cejas 1 Posición vertical de los ojos 2 Anchura de los ojos 3 Altura de los ojos 4 Separación de los ojos 5 Posición vertical de la nariz 6 Posición vertical de la boca 7 Anchura de la boca 8 Distancia vertical entre ojos 9 Anchura de la Barbilla 10 IFTResult La interfaz IFTResult proporciona acceso a los datos obtenidos como resultado de las llamadas de seguimiento facial realizadas mediante los métodos IFTFaceTracker.StartTracking e IFTFaceTracker.ContinueTracking. IFTResult se crea llamando al método IFTFaceTracker. CreateFTResult. IFTFaceTracker proporciona el método CreateFTResult ya que los resultados están relacionados con el modelo subyacente con el que IFTFaceTracker ha sido inicializado, y por lo tanto su creación depende en gran medida de éste. Para determinar si el seguimiento facial ha tenido éxito (en cuyo caso se devuelve S_OK) se debe llamar al método GetStatus. - 33 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Sobre una llamada exitosa de seguimiento facial, IFTResult proporciona acceso a la siguiente información: GetFaceRect: Un rectángulo expresado en función de las coordenadas de la imagen devuelta por la cámara que rodea la cara que se está siguiendo. Get2DShapePoints: Coordenadas 2D de los puntos clave sobre la cara alineada en coordenadas de imagen de vídeo. Incluye los 87 puntos 2D indicados en la siguiente imagen (además de otros 13 no representados). IFTImage Los datos de imagen (video y profundidad) para el seguimiento facial se proporcionan mediante FT_SENSOR_DATA, una estructura de datos que contiene punteros a una imagen de vídeo y a una imagen de profundidad. Se debe usar el método FTCreateImage para crear instancias de IFTImage. IFTImage encapsula los datos de una imagen usada en seguimiento facial y especifica los formatos de imagen soportados mediante el atributo FTIMAGEFORMAT. Además, proporciona buffer para guardar la imagen (Allocate) y también permite realizar un almacenamiento externo para ésta en disco (Attach). En el primer caso (Allocate) IFTimage libera la memoria asignada cuando se llama al método Reset. En el caso de Attach el programador es responsable de gestionar la memoria para indicar cómo guardar la imagen. IFTImage proporciona varios métodos de acceso a la información sobre la imagen: el formato, altura, anchura, tamaño de imagen y bytes por pixel. Además, - 34 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect IFTImage proporciona acceso al buffer. A esta interfaz también pertenecen métodos para la copia rápida de imágenes y la visualización de líneas de depuración, lo que la convierte en una interfaz sumamente útil desde el punto de vista del desarrollador. IFTModel La interfaz IFTModel proporciona un sistema para convertir los puntos de seguimiento facial en una malla de vértices 3D en el espacio de cámara, que se superponen sobre el rostro de la persona que está siendo seguida. Su instancia es devuelta por el método IFTFaceTracker.GetFaceModel. Esta interfaz proporciona múltiples métodos para obtener varias propiedades del modelo: GetSUCount, GetAUCount: Devuelve el número de Shape Units (SUs) o Animation Units (AUs) usadas en el modelo lineal 3D. GetTriangles: Devuelve los triángulos expresados mediante sus vértices en coordenadas 3D de la malla del modelo facial. Cada triángulo tiene el índice de sus tres vértices listado en sentido horario. GetVertexCount: Devuelve el número de vértices existentes en la malla del modelo 3D. Además, IFTModel proporciona dos métodos para obtener un modelo de cara 3D en el espacio de vídeo de la cámara o proyectado en el plano de vídeo de la cámara. Estos métodos son: Get3DShape: Devuelve los vértices del modelo de cara 3D transformados mediante las SUs, AUs, la escala de dimensionado, rotación y translación enviados. - 35 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect GetProjectedShape: Devuelve los vértices del modelo de cara 3D transformados mediante las SUs, AUs, la escala de dimensionado, rotación y translación enviados, y los proyecta sobre la imagen de vídeo. Es especialmente útil a la hora de superponer la malla 3D o los puntos faciales detectados sobre el rostro de la persona seguida y poder cotejar los datos. Puede usarse el método FTCreateFaceTracker para crear una instancia de IFTFaceTracker y el método FTCreateImage sirve para crear una instancia de IFTImage. IFTResult e IFTModel son creados partir de IFTFaceTracker. Aparte de los objetos e interfaces mencionados anteriormente, la API de Seguimiento Facial de Kinect emplea las siguientes estructuras de datos para poder llevar a cabo el seguimiento facial. Tabla 4.1.2-4 Estructuras de datos de Kinect ESTRUCTURA Descripción Contiene todos los datos de los sensores que FT_SENSOR_DATA proporcionan información para realizar una operación de seguimiento facial. FT_CAMERA_CONFIG FT_VECTOR2D Contiene la configuración del sensor de vídeo o profundidad cuyas imágenes se están siguiendo. Contiene los puntos de un vector en 2D. - 36 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect FT_VECTOR3D FT_TRIANGLE FT_WEIGHTED_RECT Contiene los puntos de un vector en 3D. Contiene un triángulo de un modelo de un rostro en 3D. Contiene un triángulo ponderado según su distancia a la cámara. Outputs del Seguimiento Facial Ahora se pasará a explicar los detalles de los Outputs del motor de Seguimiento Facial. Cada vez que los métodos StartTracking o ContinueTracking sean llamados, FTResult se actualizará. FTResult contiene la siguiente información de un usuario seguido: 1) Estado del Seguimiento 2) Puntos 2D 3) Postura 3D de la cara 4) AUs, aunque su precisión es insuficiente para poder ser empleadas en el reconocimiento de expresiones faciales. Puntos Faciales reconocibles por Kinect En este punto del proyecto, se pudo comprobar que la información proporcionada por la documentación de Microsoft acerca de los puntos faciales que es capaz de detectar Kinect era errónea. Supuestamente, la API de Seguimiento Facial rastrea los 87 puntos 3D indicados en la siguiente imagen, además de otros 13 que no aparecen en la figura y que se explican a continuación. - 37 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Figura 4.1.2-5 Puntos Supuestamente Reconocibles por Kinect Los 13 puntos restantes no mostrados en la imagen se corresponden con: 87: Centro del ojo izquierdo 88: Centro del ojo derecho 89: Centro de la nariz 90-94: Interior de la ceja izquierda 95-99: Interior de la ceja derecha - 38 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect No obstante, las pruebas realizadas a la hora de captar los puntos faciales empleando la cámara Kinect demostraron que la información proporcionada por Microsoft no era correcta. En lugar de los 100 puntos que se esperaba obtener, se pudo comprobar que la cámara realizaba un seguimiento de 121 puntos faciales, que son los mostrados en las figuras 5.1.2-6 y 5.1.2-7. Este cambio puso de manifiesto uno de los puntos débiles de la cámara Kinect como mecanismo de reconocimiento automático de expresiones faciales, y este es que Kinect es incapaz de detectar el grado de apertura de los ojos de un rostro. Esto se debe a que no todos los puntos faciales son actualizados por Kinect fotograma a fotograma, si no que existen regiones como el contorno de los ojos y la nariz que sólo son empleados a la hora de reconocer y seguir la cara. Figura 4.1.2-6 Puntos reconocibles por Kinect - 39 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Figura 4.1.2-7 Mapeado de puntos reconocibles por Kinect - 40 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Postura 3D de la cara La posición (X,Y,Z) de la cabeza del usuario se reporta basándose en un sistema de coordenadas diestro, es decir, establecido con el origen en el sensor, el eje Z apuntando hacia el usuario, el eje Y apuntando hacia arriba y el eje X apuntando hacia la izquierda del sensor. Las distancias se miden en metros. La postura de la cabeza del usuario queda definida mediante tres ángulos: Cabeceo o Pitch, Alabeo o Roll, y Guiñada o Yaw. Figura 4.1.2-8 Ángulos de la postura de la cabeza Los ángulos se expresan en grados, con valores que varían entre -180º y +180º. - 41 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Tabla 4.1.2-9 Explicación de los ángulos medidos por Kinect Ángulo Valor y Posición de la Cabeza -90º = Mirando al suelo Ángulo de Cabeceo o +90º = Mirando al techo Pitch El Seguimiento Facial capta cuando la cabeza del 0º = neutral usuario tiene un ángulo de Cabeceo inferior a 20º, pero funciona de forma óptima cuando éste es inferior a 10º. -90º = Horizontal y paralela al hombro derecho del sujeto. Ángulo de Alabeo o Roll 0º = neutral +90º = Horizontal y paralela al hombro izquierdo del sujeto. El Seguimiento Facial capta cuando la cabeza del usuario tiene un ángulo de Alabeo inferior a 90º, pero funciona de forma óptima cuando éste es inferior a 45º. -90º = Girada completamente hacia el hombro derecho del sujeto. Ángulo de Guiñada o Yaw 0º = neutral +90º = Girada completamente hacia el hombro izquierdo del sujeto. El Seguimiento Facial capta cuando la cabeza del usuario tiene un ángulo de Guiñada inferior a 45º, pero funciona de forma óptima cuando éste es inferior a 30º. - 42 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 4.2 C Sharp (C#) El lenguaje de programación C Sharp, también llamado C# es un lenguaje de programación orientado a objetos desarrollado por Microsoft e incluido en la plataforma .NET. Emplea una sintaxis derivada de C y C++, aunque C Sharp fue diseñado como una mejora de ambos lenguajes. Este lenguaje ha supuesto uno de los pilares fundamentales en la elaboración del proyecto, ya que su potencia visual y su gran sinergia con el SDK de Kinect lo convierten en el lenguaje más adecuado para la elaboración de las herramientas de adquisición de la información y de análisis de resultados. El lenguaje C Sharp, junto con el entorno de desarrollo Microsoft Visual Studio, permite el desarrollo de aplicaciones visualmente atractivas de una forma rápida, sencilla e intuitiva. A continuación se mostrarán y explicarán algunos fragmentos del código de la aplicación para comprender mejor el funcionamiento de ésta y del propio lenguaje de programación. public MainWindow() { InitializeComponent(); //Se crean las carpetas de guardado de imágenes y puntos si no existen System.IO.Directory.CreateDirectory(".\\FaceData"); System.IO.Directory.CreateDirectory(".\\ImageData"); var faceTrackingViewerBinding = new Binding("Kinect") { Source = sensorChooser }; faceTrackingViewer.SetBinding(FaceTrackingViewer.KinectProperty, faceTrackingViewerBinding); - 43 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect sensorChooser.KinectChanged += SensorChooserOnKinectChanged; sensorChooser.Start(); } La función mostrada se ejecuta al crear la ventana principal del programa, llamada MainWindow. En primer lugar se deben crear las carpetas donde posteriormente se guardarán las imágenes y los ficheros que contendrán los datos del seguimiento facial asociados a cada fotograma. Posteriormente, se prepara el programa para crear un vínculo con el sensor Kinect y poder empezar a recibir información de él. Finalmente, con la instrucción sensorChooser.Start se inicia la búsqueda de sensores Kinect conectados al equipo. En caso de que la búsqueda tenga éxito, la variable sensorChooser será la que contenga la información del sensor a partir de ahora, y permitirá acceder a los parámetros de éste, como se podrá observar posteriormente. private void KinectSensorOnAllFramesReady(object sender, AllFramesReadyEventArgs allFramesReadyEventArgs) { using(var colorImageFrame = allFramesReadyEventArgs.OpenColorImageFrame()) { if (colorImageFrame == null) { return; } // Copia de la imagen RGB para mostrarla en pantalla var haveNewFormat = this.currentColorImageFormat != colorImageFrame.Format; if (haveNewFormat) { this.currentColorImageFormat = colorImageFrame.Format; - 44 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect this.colorImageData = new byte[colorImageFrame.PixelDataLength]; this.colorImageWritableBitmap = new WriteableBitmap( colorImageFrame.Width, colorImageFrame.Height, 96, 96, PixelFormats.Bgr32, null); ColorImage.Source = this.colorImageWritableBitmap; } colorImageFrame.CopyPixelDataTo(this.colorImageData); this.colorImageWritableBitmap.WritePixels( new Int32Rect(0, 0, colorImageFrame.Width, colorImageFrame.Height), this.colorImageData,colorImageFrame.Width * Bgr32BytesPerPixel,0); } } El método KinectSensorOnAllFramesReady es ejecutado cada vez que la cámara Kinect envía un nuevo fotograma a la aplicación, por lo tanto puede emplearse para capturar la información de dicho fotograma con el fin de realizar los cálculos pertinentes sobre él o mostrar la información RGB por pantalla. En este caso, el fotograma capturado por la cámara RGB será mostrado por pantalla con el fin de permitir al usuario de la aplicación apreciar la información que está siendo captada por la cámara Kinect. Para ello, en primer lugar es necesario comprobar que se ha recibido correctamente una imagen RGB mediante el método allFramesReadyEventArgs.OpenColorImageFrame, que devolverá NULL en caso negativo. Una vez asegurada la recepción de la imagen se comprueba que el formato sea correcto, si no lo fuera es necesario adaptar el formato de la imagen recibida a la superficie donde la imagen será mostrada. Finalmente, las dos últimas funciones sirven para guardar el fotograma en memoria y mostrarlo por pantalla. - 45 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Figura 4.2-1 Imagen RGB captada por Kinect A pesar de poder apreciar la información visual recibida por Kinect, en la Figura5.2-1 no es posible apreciar si el sensor ha sido capaz de detectar y seguir el rostro de la persona, ni se puede visualizar dicha información facial. Para ello se deberá indicar que cada vez que se genere un nuevo fotograma, se superpongan los datos faciales recibidos con la imagen RGB. Este resultado se puede conseguir introduciendo una llamada al método DrawFaceModel cada vez que se produzca una ejecución del método KinectSensorOnAllFramesReady. - 46 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect public void DrawFaceModel(DrawingContext drawingContext) { if (!this.lastFaceTrackSucceeded || this.skeletonTrackingState != SkeletonTrackingState.Tracked) { return; } var pointsModel = new List<Point>(); var facePointsGroup = new GeometryGroup(); Point p = new Point(); foreach (var pt in facePoints) { //Ajuste para 1280 x 960 p.X = (pt.X - 170)/2; p.Y = (pt.Y - 12)/2; pointsModel.Add(p); drawingContext.DrawEllipse(System.Windows.Media.Brushes.Green,new System.Windows.Media.Pen(System.Windows.Media.Brushes.Yellow,1.0), p, 1, 1); } } El método DrawFaceModel comprueba que se haya detectado un rostro y actualmente esté siendo seguido. En caso negativo, la función finaliza al no ser posible dibujar los puntos faciales. En caso afirmativo, procede a almacenar todos los puntos faciales devueltos por Kinect en la lista de puntos bidimensionales pointsModel y finalmente los dibuja en la superficie de dibujo drawingContext. - 47 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect De ese modo, los puntos faciales detectados quedarán superpuestos con la imagen RGB captada por Kinect, y será posible determinar la precisión del seguimiento facial. Esta característica añadida resulta especialmente útil ya que la cámara Kinect necesita que se den unas condiciones de luz y proximidad del sujeto adecuadas, a pesar de los márgenes admitidos; y la superposición de los puntos faciales permite la detección de deficiencias en alguna de estas variables. En la figura 5.2-2 se puede apreciar el resultado final de esta operación. Figura 4.2-2 Superposición de Puntos Faciales - 48 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Ventajas y Desventajas frente a otros lenguajes Ventajas Permite el paso de parámetros a las funciones por valor por defecto, o por referencia mediante el uso de la palabra reservada ref. Asimismo, es posible enviar un número variable de parámetros a un mismo método mediante la sobrecarga de éste, es decir, mediante su definición sucesiva con diferente número de parámetros. Esto permite una gran flexibilidad en el uso de funciones. En C# están disponibles una mayor cantidad de tipos de datos que en C++ o Java, lo que permite llevar a cabo tareas más completas y específicas. C# permite realizar declaraciones en el espacio de nombres, es decir, al iniciar la programación de una aplicación es posible declarar las clases dentro del propio espacio de nombres. A diferencia de Java, C# permite la utilización de cualquier clase como un objeto, por lo que permite la definición de propiedades en cualquier clase. C# permite la ejecución de diferentes versiones de un mismo software de forma simultánea- Esto es posible gracias a la capacidad mantener múltiples versiones de una misma clase, colocándolas en diferentes espacios de nombres. Permite la implementación de aplicaciones multi-hilo de forma muy simplificada. - 49 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Desventajas Es necesario disponer de una versión reciente de Visual Studio para poder programar eficientemente en C#. C# es un lenguaje complejo de aprender debido a su gran potencia y gran cantidad de librerías disponibles. Los programas desarrollados en C# sólo pueden ser ejecutados en entornos Windows. Para el desarrollo de este proyecto este no es un verdadero inconveniente, ya que las librerías de Kinect han sido diseñadas por Microsoft para ser empleadas exclusivamente en un entorno Windows. - 50 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 4.3 XAML XAML ha sido el lenguaje de programación elegido para la estructuración de la interfaz de usuario de la herramienta de adquisición de imágenes e información facial debido a su facilidad de uso e interpretación. El origen de XAML se remonta a los años 70, cuando IBM creó un lenguaje llamado GML (Generalized Markup Language) con el objetivo de almacenar grandes cantidades de información. Debido al éxito de GML, en 1986 la Organización Internacional de Normalización (ISO) decidió normalizar el lenguaje, lo que dio lugar a la aparición de SGML. Con la aparición de la web y el lenguaje HTML en 1989, SGML aumentó considerablemente su popularidad. No obstante, las páginas web exclusivamente creadas en HTML resultaron ser caóticas y presentaban una gran cantidad de errores. XML surgió entonces con el objetivo de mitigar los errores de sintaxis y facilitar la tarea al programador. XAML es una versión de XML optimizada para la creación sencilla de interfaces de usuario visualmente potentes .XAML proviene de las siglas en inglés de Lenguaje de Etiquetado de Aplicaciones Extensible (eXtensible Application Markup Language). Es un lenguaje declarativo basado en el uso de etiquetas al igual que HTML, lo que permite que la programación esté muy bien estructurada y diferenciada. En la actualidad XAML ha experimentado un gran crecimiento, al haber sido el lenguaje de programación elegido para la estructuración de la interfaz de usuario de las aplicaciones para dispositivos Android en su entorno de desarrollo nativo. - 51 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Estructura típica de un documento XAML Todos los archivos XAML deben tener un elemento raíz, es decir, un objeto que será la base conceptual de toda la estructura de programación del documento. Este objeto típicamente será una ventana, un lienzo (canvas) o un gráfico. <Window Name ="VentanaPrincipal" Height ="50" Width ="50" > <Window.Fill> <SolidColorBrush Color="Black"/> </Window.Fill> <Circle Height ="10" Width ="10" Colour="White" > </Circle> </Window> En el fragmento de código anterior se puede apreciar la estructura típica de un documento XAML. En este caso, se crea una ventana como elemento raíz con el nombre VentanaPrincipal y con una altura de 50 píxeles de alto por 50 de ancho. Después la ventana es coloreada de negro y finalmente se dibuja dentro de esa ventana un círculo de color blanco y 10 píxeles de ancho por 10 de alto. Como se puede apreciar, la estructura de la interfaz ha sido definida de forma muy sencilla e intuitiva. A continuación se muestra el código XAML de la interfaz de la aplicación de adquisición de información. - 52 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Código XAML de la herramienta de adquisición de información <Window x:Class="FaceTrackingBasics.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:FaceTrackingBasics" Title="Seguimiento Facial Kinect" Closed="WindowClosed" Height="735" Width="770" > <Window.Resources> <SolidColorBrush x:Key="MediumGreyBrush" Color="#ff6e6e6e"/> <SolidColorBrush x:Key="KinectPurpleBrush" Color="#ff52318f"/> <SolidColorBrush x:Key="KinectBlueBrush" Color="#ff00BCF2"/> <Style TargetType="{x:Type Image}"> <Setter Property="SnapsToDevicePixels" Value="True"/> </Style> </Window.Resources> Inicialmente se establece como elemento raíz del documento una ventana con el título de “Seguimiento Facial Kinect” con unas dimensiones de 735 píxeles de alto por 770 píxeles de ancho. Sobre esta ventana se definen una serie de recursos (Resources) que posteriormente serán empleados en la elaboración del estilo de la ventana. Finalmente se indica a la aplicación que se debe emplear la resolución nativa del dispositivo sobre el que está corriendo a la hora de renderizar la ventana. - 53 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect <Grid Name="layoutGrid" Margin="10 0 10 10"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <DockPanel Grid.Row="0" Margin="0 0 0 20"> <Image DockPanel.Dock="Left" Source="Images\Logo.png" Stretch="None" Margin="0 10 0 5" Height="38" Width="102" /> <TextBlock DockPanel.Dock="Right" Margin="0 0 -1 0" VerticalAlignment="Bottom" Foreground="{StaticResource MediumGreyBrush}" FontFamily="Segoe UI" FontSize="18"> Reconocimiento Facial</TextBlock> <Image Grid.Column="1" Source="Images\Status.png" Stretch="None" HorizontalAlignment="Center" Margin="0 0 0 5"/> </DockPanel> En este fragmento del código se crea una cuadrícula (Grid) que contiene y organiza los elementos dentro de la interfaz, y se establece que la altura de sus filas (Rows) se adapte automáticamente al tamaño de la ventana. Después se crea un panel que ocupa la primera fila de la cuadrícula, y que contiene una imagen con el logo de Kinect a la izquierda, el estado actual de la conexión con la cámara en el centro y el texto “Reconocimiento Facial” a la derecha. - 54 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect <Viewbox Grid.Row="1" Stretch="Uniform" HorizontalAlignment="Center"> <Grid Name="MainGrid" Width="640" Height="480"> <Image Name="ColorImage"/> <local:FaceTrackingViewer x:Name="faceTrackingViewer"/> <Button Content="^" Height="24" Name="button2" Width="17" HorizontalAlignment="Center" VerticalAlignment="Bottom" Click="Subir_camara" VerticalContentAlignment="Bottom" Margin="290,0,333,-30" /> <Button Content="v" Height="24" Name="button3" Width="17" HorizontalAlignment="Center" VerticalAlignment="Bottom" Click="Bajar_camara" VerticalContentAlignment="Center" Margin="332,0,291,-30" /> <Button Content="o" Height="24" Name="button4" Width="17" HorizontalAlignment="Center" VerticalAlignment="Bottom" Click="Centrar_camara" VerticalContentAlignment="Center" Margin="311,0,312,-29" /> </Grid> </Viewbox> </Grid> </Window> Finalmente se crea una segunda fila de la cuadrícula en la que se ubican el lienzo en el que poder mostrar la información visual de Kinect (ColorImage) y los tres botones que permiten controlar la inclinación de la cámara desde la propia aplicación. El botón que permite iniciar y detener la grabación de los datos en tiempo real se ha definido dentro de otro fichero XAML llamado FaceTrackingViewer. - 55 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect A continuación se muestra el resultado final de la interfaz de usuario de la aplicación de adquisición de información facial. Figura 4.3-1 Interfaz de usuario en XAML - 56 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Ventajas del lenguaje XAML Es un lenguaje capaz de ejecutar tareas típicas de lenguajes más complejos, como pueden ser la asignación de variables o la creación y asignación de listas y colecciones. Permite establecer una clara separación entre la programación de la interfaz de usuario y de la propia aplicación, lo que facilita en gran medida las labores de depuración del software. Debido a su diseño eminentemente enfocado a la creación de interfaces, con XAML es posible crear estructuras visuales muy complejas mediante el empleo de un número reducido de instrucciones sencillas, permitiendo enfocar los esfuerzos del desarrollo a la parte funcional de las aplicaciones. Permite la elaboración de aplicaciones que realicen un uso intensivo de gráficos complejos ya que, al permitir interoperabilidad con DirectX, la renderización de los gráficos será acelerada por hardware. - 57 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 4.4 Weka Weka es una herramienta de procesamiento y clasificación de datos desarrollada en Java. Está compuesta por una colección de algoritmos de aprendizaje automático que pueden ser aplicados directamente sobre un conjunto de datos suministrado a la herramienta o llamados desde un programa Java. Weka contiene herramientas de pre procesado de datos, clasificación, regresión, agrupación y visualización de resultados. También está diseñado para el desarrollo de nuevos esquemas de aprendizaje automático. La principal ventaja de Weka es que es software de código abierto bajo la licencia GNU GPL (General Public License), lo que permite mostrar, distribuir y modificar libremente todo o parte del código de la aplicación.[GNU_WEB]. A continuación se mostrará un ejemplo típico de utilización de Weka para poder comprender más profundamente su funcionamiento. En este caso se clasificará un conjunto de datos empleando un árbol J48 con poda, ya que es la variedad más flexible y versátil, y es el tipo de clasificador que ha sido empleado para clasificar las expresiones faciales en el proyecto. Ejemplo de uso de Weka En primer lugar se debe generar un fichero en formato ARFF, que contiene el conjunto de datos que será la entrada para la clasificación de Weka. - 58 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect @relation expresiones @attribute boca {normal, estirada} @attribute ojos {abiertos,cerrados} @attribute nariz {arrugada,normal} @attribute felicidad {si, no} @data normal,abiertos,arrugada,no normal,abiertos,normal,no normal,cerrados,arrugada,no normal,cerrados,normal,no estirada,abiertos,arrugada,no estirada,abiertos,normal,si estirada,cerrados,arrugada,no estirada,cerrados,normal,si En este fichero se ha creado un conjunto de datos relativo a expresiones faciales. Los atributos que se pueden medir en cada cara son boca, ojos, nariz y la presencia o no de felicidad en dicho rostro. Cada atributo tiene unos valores determinados explicitados entre llaves, aunque Weka también admite valores numéricos con infinitos valores posibles. En este conjunto de datos se dispone 8 datos procedentes de diferentes rostros que se desea clasificar según si manifiestan o no felicidad. Para ello se debe introducir dicho conjunto de datos en Weka. - 59 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Una vez introducido en Weka el conjunto de datos, se procede a realizar su clasificación con un árbol J48 con poda, y el resultado devuelto por el programa es el siguiente. === Classifier model (full training set) === J48 pruned tree -----------------boca = normal: no (4.0) boca = estirada | nariz = arrugada: no (2.0) | nariz = normal: si (2.0) Number of Leaves : Size of the tree : 3 5 Time taken to build model: 0seconds === Evaluation on test set === === Summary === Correctly Classified Instances Incorrectly Classified Instances Kappa statistic Mean absolute error Root mean squared error Relative absolute error Root relative squared error Total Number of Instances 8 0 1 0 0 0 0 8 100 0 % % % % Weka ha procesado los datos y los ha clasificado creando un árbol J48 compuesto por 5 nodos, de los cuales 3 son raíces. Posteriormente ha realizado una de evaluación de la bondad del árbol clasificador con un conjunto de test y ha demostrado una efectividad del 100%. Finalmente, sólo queda visualizar el árbol creado por Weka y emplearlo para clasificar nuevas instancias que puedan darse en el futuro. - 60 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Figura 4.4-1 Árbol clasificador de Weka Realizando un análisis visual del árbol de la figura anterior se puede apreciar cómo el estado de la boca es el atributo más potente para la clasificación, ya que una boca normal implica no felicidad. Por otro lado, si la boca está estirada sólo depende la expresión del estado de la nariz. Por lo tanto, la representación gráfica del árbol sirve para deducir intuitivamente la importancia de cada atributo en la clasificación, así como para detectar atributos que puedan ser redundantes. En este caso el atributo ojos no aparece en el árbol, lo cual indica que es un atributo no relevante en esta clasificación y por tanto podría ser omitido. - 61 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 4.5 MATLAB Matlab es actualmente es uno de los entornos y lenguajes de programación orientado al cálculo numérico más potentes que existen, por ello ha sido considerado como el más adecuado para realizar la herramienta de procesado de los datos extraídos por Kinect, así como una serie de funciones que permiten visualizar los resultados obtenidos de dichos datos. Su nombre proviene de una abreviatura de las palabras “Matrix Laboratory”, que en inglés significa laboratorio de matrices. Matlab fue creado por Cleve Moler en 1984 con la idea de poder emplear funciones programadas en el lenguaje Fortran sin necesidad de tener que elaborar programas completos en dicho lenguaje. El lenguaje de programación Matlab tiene una sintaxis muy sencilla, similar a otros lenguajes ampliamente usados como C, lo que permite un aprendizaje rápido e intuitivo. Otro de sus aspectos más destacables es su versatilidad y la gran cantidad de herramientas disponibles, lo que lo convierte en un lenguaje de programación idóneo para desempeñar una gran variedad de tareas de forma eficiente. Con el objetivo de ilustrar la sintaxis y la potencia del lenguaje Matlab, a continuación se muestra una breve función capaz de leer datos de un fichero de texto y asignarlos a los distintos elementos de una matriz. function [ datos ] = CargarResultados( fichero ) fichero=strcat(fichero,'.txt'); datos = dlmread(fichero,','); end - 62 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect La función mostrada se llama “CargarResultados”, y recibe como parámetro una cadena de caracteres llamada “fichero”. Esta cadena indica el nombre del archivo del que se van a cargar los datos. A continuación, el comando strcat añade al final de la cadena fichero la extensión del archivo que se desea abrir, que en este caso es un fichero de texto. Finalmente, el comando dlmread almacena en la matriz “datos” todos los elementos que se encuentren en el archivo escogido, que se encuentran en éste separados mediante una coma. La utilización de la función dlmread es especialmente relevante dentro del proyecto, ya que es un comando sumamente potente que permite la lectura sencilla de extensos ficheros de datos si éstos han sido debidamente organizados, y por lo tanto determina la forma en la que deben guardarse los datos faciales asociados a cada fotograma para poder ser leídos de forma eficiente. Dado que la extracción de resultados a partir de los datos faciales obtenidos por la cámara Kinect se efectúa empleando las funciones creadas con Matlab, resulta de gran relevancia analizar la dificultad que supone representar los árboles clasificadores creados en Weka mediante un algoritmo programado usando Matlab. Esta representación resulta sumamente sencilla, ya que un árbol clasificador se puede entender como un conjunto de cláusulas if anidadas, siendo la más externa el nodo raíz del árbol. Para ilustrar la forma en la que se han representado los árboles clasificadores del desagrado y la alegría, a continuación se muestra el código Matlab del árbol generado en Weka en el caso ejemplo del apartado anterior. function [ sonrisa ] = CargarResultados( fotograma ) boca = 1; ojos = 2; - 63 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect nariz = 3; if fotograma(boca) == ‘normal’ sonrisa = no; else if fotograma(nariz) == ‘arrugada’ sonrisa = no; else sonrisa = si; end end end Al ser los valores de los atributos del ejemplo de tipo binario, con las cláusulas if y else se cubren todos los posibles valores de cada atributo. No obstante, en los árboles clasificadores del desagrado y la alegría los parámetros faciales hacen referencia a distancias, que son valores de tipo continuo. En este caso las cláusulas if y else también pueden cubrir todos los posibles intervalos de valores si se organizan de la siguiente forma. if parametro_a <= x sonrisa = no; else sonrisa = si; De esta forma, se hace una división binaria de los valores del parámetro a, dividiéndolos en aquellos menores o iguales que x y en aquellos que sean mayores. En caso de ser necesaria una diferenciación más profunda de valores de un atributo, se pueden anidar varios if para ir creando efectuando divisiones en intervalos más reducidos. - 64 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Ventajas de Matlab La principal ventaja de Matlab frente a otros entornos y lenguajes de programación es su potencia de cálculo y su gran versatilidad, debida en gran medida a la propia estructura del lenguaje y a la gran cantidad de herramientas y funciones disponibles. La sencillez del lenguaje y su gran parecido con otros lenguajes de programación tradicionales, permite que el aprendizaje de este lenguaje sea muy ágil. Al ser uno de los entornos de cálculo matemático más populares en la actualidad, existe una amplia cantidad de información a disposición de los usuarios, así como diversas comunidades en las que poder apoyarse a la hora de resolver problemas con el entorno. Además Mathworks, la compañía propietaria de Matlab, imparte periódicamente cursos y seminarios especializados en áreas muy diversas de forma gratuita. Desventajas de Matlab La principal desventaja que presenta Matlab es que se trata de software de pago cuyas versiones de prueba ofrecen un período de validez excesivamente reducido como para poder desarrollar funciones y herramientas complejas. No obstante, el coste de adquisición del producto se reduce en gran medida con las licencias de ámbito académico y científico. - 65 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect - 66 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Capítulo 5 SOLUCIÓN PROPUESTA 5.1 Introducción En este capítulo se tratará de ofrecer una visión en profundidad de la estructura y el funcionamiento de la herramienta elaborada. Esto permitirá comprender todos los procesos que es necesario llevar a cabo desde la adquisición de la información visual y facial hasta la emisión de una conclusión sólida por parte de la aplicación. Para ello, en primer lugar se mostrará una visión global de la herramienta en su totalidad, realizando un análisis de su estructura y mostrando los que serán generados en cada fase. Posteriormente se procederá a explicar con gran detalle la estructura interna de cada una de las herramientas que componen la solución desarrollada en este proyecto. En este apartado se expondrá el funcionamiento de cada una de ellas y se explicarán las funciones más relevantes. Por último se realizará un análisis en profundidad de las pruebas realizadas sobre cada herramienta, y el impacto que éstas han tenido en la reestructuración del software previamente existente. - 67 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 5.2 Visión global de la herramienta Tras realizar un profundo estudio del estado del arte acerca del reconocimiento automático de expresiones faciales, se puso de manifiesto la necesidad de crear un software capaz solventar las principales carencias existentes en la actualidad. La principal carencia que se quiso abordar fue la necesidad de poder inferir automáticamente el rostro neutro de una persona. Para ello, se determinó que la mejor alternativa sería adquirir la información visual y facial proporcionada por Kinect en tiempo real, y almacenarla para su posterior procesado automático. La herramienta creada para desempeñar esta tarea es esencial dentro del proyecto, ya que de la exactitud y fiabilidad con que son recogidos los datos depende todo su posterior análisis y los resultados obtenidos. El procesado de la información adquirida por la cámara Kinect se desarrolló principalmente en el entorno MATLAB debido a su gran potencia y velocidad de cálculo, ya que las grandes cantidades de datos generadas en cada sesión de grabación requerían un tratamiento óptimo. Dicho procesado toma como entrada los datos generados por la herramienta de adquisición de información, realiza sobre ellos los análisis de las expresiones faciales presentes y finalmente guarda los resultados. La última fase del análisis de los resultados consiste en una aplicación eminentemente visual, que permite examinar de forma detallada las conclusiones extraídas por la herramienta y compararlas con la información visual obtenida inicialmente. También han sido creados una serie de recursos en MATLAB que ofrecen la posibilidad de observar los resultados asociados a una sesión de grabación de forma global, y permiten apreciar tendencias comunes a las distintas grabaciones realizadas. - 68 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Figura 5.2-1 Estructura de la herramienta - 69 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 5.3 Aplicación de adquisición de información El cometido principal de esta herramienta es permitir la captura en tiempo real de las imágenes RGB y la información de los puntos faciales captada por la cámara Kinect, y al mismo tiempo ofrecer al usuario una visualización de dichas imágenes. De esta forma, el usuario puede determinar la adecuación de las condiciones de la grabación y modificar cualquiera de ellas en caso de ser necesario. Además, también permite apreciar si Kinect está detectando un rostro mediante la superposición en la interfaz de los puntos faciales detectados con el rostro de la persona. Esta visión aporta información adicional acerca de la validez de la grabación, ya que la no detección del rostro o su detección defectuosa podrían deberse a unas condiciones de grabación no óptimas en cuando a luminosidad o distancia de la persona a la cámara. Figura 5.3-1 Interfaz de la aplicación de adquisición de información - 70 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 5.3.1 Desarrollo La aplicación de adquisición de información constituye la fase inicial del ciclo de vida de la herramienta de reconocimiento automático de expresiones faciales. Su funcionamiento se descompone en las siguientes fases: 5) Establecimiento de la comunicación con el sensor Kinect 6) Detección y seguimiento del rostro de una persona 7) Almacenamiento de la información facial y visual de la persona Establecimiento de la comunicación con el sensor Kinect Para comenzar a recibir información del sensor Kinect, el primer paso a ejecutar es la búsqueda de sensores conectados al ordenador y detectar la validez de los mismos. private void SensorChooserOnKinectChanged(object sender, KinectChangedEventArgs kinectChangedEventArgs) { KinectSensor oldSensor = kinectChangedEventArgs.OldSensor; KinectSensor newSensor = kinectChangedEventArgs.NewSensor; if (oldSensor != null) { oldSensor.AllFramesReady -= KinectSensorOnAllFramesReady; - 71 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect oldSensor.ColorStream.Disable(); oldSensor.DepthStream.Disable(); oldSensor.DepthStream.Range = DepthRange.Default; oldSensor.SkeletonStream.Disable(); oldSensor.SkeletonStream.EnableTrackingInNearRange = false; oldSensor.SkeletonStream.TrackingMode = SkeletonTrackingMode.Default; } En primer lugar se debe comprobar que no exista una conexión anteriormente establecida con un sensor Kinect. En caso de que ya existiera, la conexión se deshace mediante la ruptura de los flujos de datos con la cámara. if (newSensor != null) { try { newSensor.ColorStream.Enable( ColorImageFormat.RgbResolution1280x960Fps12); newSensor.DepthStream.Enable( DepthImageFormat.Resolution640x480Fps30); newSensor.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated; newSensor.SkeletonStream.Enable(); newSensor.AllFramesReady += KinectSensorOnAllFramesReady; } catch (InvalidOperationException){} } } - 72 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Después de romper la posible conexión con el sensor antiguo, se comprueba que haya un sensor conectado actualmente y se establece la nueva conexión. Durante el establecimiento se fija el formato en que la imagen RGB (En este caso 1280x960 píxeles a 12 fps) y la imagen tridimensional (640x480 a 30 fps) serán transmitidas por la cámara. También se indica a la cámara que envíe la información del esqueleto de la persona detectada, lo cual proporciona una mayor fiabilidad a la hora de ubicar tridimensionalmente su rostro. El modo de captar el esqueleto se establece como “Seated”, por lo que no es necesario disponer de información sobre la parte inferior del cuerpo, y por tanto es más flexible que el modo estándar. Detección y seguimiento del rostro de una persona Una vez se ha establecido correctamente la conexión con la cámara Kinect, el programa comienza a mostrar en pantalla las imágenes RGB enviadas por ésta. A continuación inicia la búsqueda de rostros dentro del espacio captado por Kinect, apoyándose para ello en la información visual y tridimensional. private void OnAllFramesReady(object sender, AllFramesReadyEventArgs allFramesReadyEventArgs) { try { colorImageFrame = allFramesReadyEventArgs.OpenColorImageFrame(); depthImageFrame = allFramesReadyEventArgs.OpenDepthImageFrame(); skeletonFrame = allFramesReadyEventArgs.OpenSkeletonFrame(); - 73 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect if (colorImageFrame == null || depthImageFrame == null || skeletonFrame == null) { return; } colorImageFrame.CopyPixelDataTo(img); colorImageFrame.CopyPixelDataTo(this.colorImage); depthImageFrame.CopyPixelDataTo(this.depthImage); skeletonFrame.CopySkeletonDataTo(this.skeletonData); if (grabando == 1 && this.skeletonData!= null) { numimg++; } Como ya se explicó en el capítulo de la tecnología empleada del proyecto, la función OnAllFramesReady se ejecuta cada vez que Kinect captura un nuevo fotograma y lo envía a la aplicación a través de varios flujos de datos. Por ello, este es el método más adecuado en el que incluir las actualizaciones del seguimiento facial. En primer lugar los datos de la imagen RGB, la imagen de profundidad y el esqueleto detectado deben ser abiertos y asignados a unas variables que permitirán su posterior tratamiento (ColorImageFrame, DepthImageFrame y skeletonFrame). Si alguno de los tipos de datos no existiera (null) la función se termina ya que no es posible realizar el seguimiento facial. A continuación se guarda la imagen RGB en una nueva variable y se muestra por pantalla para que el usuario de la herramienta pueda visualizar la información captada por Kinect. - 74 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect foreach (Skeleton skeleton in this.skeletonData) { if (skeleton.TrackingState == SkeletonTrackingState.Tracked || skeleton.TrackingState == SkeletonTrackingState.PositionOnly) { if (!this.trackedSkeletons.ContainsKey(skeleton.TrackingId)) { this.trackedSkeletons.Add(skeleton.TrackingId, new SkeletonFaceTracker()); } SkeletonFaceTracker skeletonFaceTracker; if (this.trackedSkeletons.TryGetValue(skeleton.TrackingId, out skeletonFaceTracker)) { skeletonFaceTracker.OnFrameReady(this.Kinect, colorImageFormat, colorImage, depthImageFormat, depthImage, skeleton); skeletonFaceTracker.LastTrackedFrame = skeletonFrame.FrameNumber; if (grabando == 1) { Grabar(numimg, skeleton.TrackingId, skeletonFaceTracker); Guardar_Imagen(numimg, skeleton.TrackingId, skeletonFaceTracker); } } } } } En este último fragmento de la función, se ejecuta un bucle para el tratamiento de todos los esqueletos detectados en el fotograma. Por cada esqueleto se comprueba si ya estaba siendo seguido o se trata de un esqueleto nuevo, en el caso de ser nuevo se incluye a la lista de esqueletos activos. Si un esqueleto activo no es detectado durante - 75 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect un intervalo de 100 fotogramas consecutivos se borrará de la lista para ahorrar espacio en memoria. A continuación se asigna al rastreador facial del esqueleto el nuevo valor para actualizar el estado del rostro. Además, esta operación es empleada por la API de seguimiento facial de Kinect para aumentar la fiabilidad de las características faciales reconocidas. Esto es posible gracias a una serie de algoritmos de aprendizaje que mejoran la precisión del reconocimiento facial con cada nuevo fotograma que envía la cámara. El punto óptimo de dicho aprendizaje se alcanza cuando se han recibido unos 300 fotogramas, lo que equivale a 26 segundos con la resolución escogida en la herramienta. Cuando existen esqueletos activos con información válida de sus rastreadores faciales (rostro visible correctamente), la aplicación permite apreciar visualmente el seguimiento facial realizado superponiendo los 121 puntos reconocidos con la imagen RGB captada por Kinect. Esto permite apreciar de forma sencilla si se está produciendo un seguimiento facial correcto, o si se deben ajustar las condiciones de adquisición de información. Figura 5.3.1-1 Confirmación de detección del rostro - 76 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Finalmente, se procede a guardar la información visual y facial mediante las funciones Grabar y Guardar_Imagen. Por lo tanto, por cada fotograma capturado por la cámara Kinect se guardará una imagen de los rostros detectados y un fichero TXT que contiene todos los datos recopilados sobre el rostro rastreado para ese fotograma. La función Grabar se encarga de guardar la ubicación (en coordenadas del espacio de la cámara) de todos los puntos faciales rastreados y otros parámetros relevantes asociados a un fotograma en un fichero TXT de la forma más eficiente y limpia posible. Dichos datos se han estructurado de la siguiente forma dentro del fichero: 8) Las tres primeras líneas corresponden con las inclinaciones X, Y y Z del rostro expresadas en grados. 9) La cuarta línea determina la distancia del rostro a la cámara en metros. 10) Las siguientes 121 líneas expresan las distancias X,Y y Z de cada uno de los puntos faciales reconocibles a la cámara expresadas en metros y separadas por espacios. Figura 5.3.1-2 Estructura del fichero de puntos faciales 3.898828 6.999457 -3.755801 1.239609 -0.05188501 0.08215328 1.177098 -0.07630724 0.05825409 1.1415219 -0.06144999 0.02863599 1.126066 -0.06344151 0.002612622 1.122195 -0.06360445 -0.004371764 1.124082 - 77 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect La función Guardar_Imagen se encarga de almacenar en el disco duro una captura del rostro detectado. Para ello, debe emplear el atributo marco del reconocedor facial del esqueleto a seguir, que indica un rectángulo que contiene el rostro que se desea guardar. Posteriormente, se crea un nuevo fichero BMP (mapa de bits) con las mismas dimensiones que el marco del esqueleto y se realiza una copia píxel a píxel hasta haber rellenado por completo la imagen. Para poder asociar a cada sesión de grabación, a cada rostro detectado y a cada fotograma un fichero de datos TXT y una imagen facial BMP de forma ordenada y unívoca, se ha empleado la siguiente nomenclatura para la creación de los ficheros: DD-MM-AAAA_hh.mm_nnnnnn_s.txt Siendo: D = Día M = Mes A = Año h = hora m = minuto n = número de fotograma s = identificador único del esqueleto Con esta nomenclatura, las demás herramientas serán capaces de cargar automáticamente los datos asociados a una sesión de grabación de forma automática y ordenada cronológicamente. - 78 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 5.3.2 Modificaciones Almacenamiento de la imagen RGB Originalmente la imagen RGB captada por Kinect era guardada íntegramente por cada fotograma recibido de la cámara en el método Guardar_Imagen. Por lo tanto se debía guardar una imagen de 1280x960 píxeles por cada fotograma, lo que generaba una cantidad de datos sumamente elevada en breves períodos de tiempo. La solución se encontró en guardar sólo la región del marco que rodea el rostro de la persona grabada. Figura 5.3.2-1 Recorte de la imagen adquirida Como puede apreciarse, la reducción de los datos almacenados es considerable, siendo el nuevo formato 12,4 veces más ligero que el original sin provocar pérdida de información facial. Esta reducción del tamaño de los datos almacenados también permite una tasa de guardado mayor, que sin la mejora aplicada caía hasta las 6 imágenes por segundo, provocando una pérdida de la mitad de los fotogramas capturados por Kinect al no poder ser guardados a tiempo. - 79 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 5.4 Herramienta de procesado de datos La herramienta de procesado de datos conforma una parte esencial dentro del proyecto, ya que es la que permite extraer los resultados finales a partir de los datos capturados por la cámara Kinect. Está compuesta por una serie de funciones desarrolladas en Matlab capaces de leer los datos almacenados por la herramienta y generar los resultados para su análisis. Su funcionamiento está dividido en las siguientes fases: Carga de los datos faciales Extracción de los parámetros absolutos del rostro Inferencia del rostro neutro Extracción de los parámetros relativos del rostro Obtención, representación y tratamiento de resultados 5.4.1 Desarrollo Carga de los datos faciales Para poder emplear la herramienta de procesado de datos, la primera actividad que se debe realizar es la carga de los datos faciales guardados mediante la aplicación de adquisición de información facial. Esta carga de datos se lleva a cabo mediante la función CargarDatos, que se sirve principalmente del comando dlmread para asignar los datos contenidos en los ficheros de texto de cada fotograma generado en la sesión de grabación a los distintos elementos de una matriz de Matlab. Para poder funcionar correctamente, la función debe recibir como parámetro el nombre de la carpeta donde se encuentran ubicados los archivos de texto, y el resultado será asignado a la matriz datos. - 80 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect function [datos] = CargarDatos( carpeta ) carpeta = strcat(carpeta,'/'); lista = dir(strcat(carpeta,'*.txt')); n= size(lista); n = n(1); datos = zeros(n,125,3); for i=1:n datos(i,:,:) = dlmread(strcat(carpeta,lista(i).name)); if (mod(i,500)==0) fprintf('Datos cargados: %d \n', i); end end fprintf('Datos cargados correctamente.\n'); end Para poder cargar la información de los fotogramas en la matriz datos, primero se determina el número de fotogramas que componen la grabación que se desea cargar mediante la variable n. Una vez sabido el número de fotogramas, se crea la matriz datos como una matriz nula tridimensional cuya primera coordenada representa el número de fotograma. A continuación se cargan los datos fotograma a fotograma mediante el uso del comando dlmread, y se muestra el progreso de forma periódica al usuario. Extracción de los parámetros absolutos del rostro Una vez se han cargado los datos de los puntos faciales correspondientes a todos los fotogramas de una grabación, se puede proceder a extraer los parámetros del rostro. Estos parámetros, al igual que los puntos faciales, varían con cada fotograma. - 81 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Los parámetros empleados en el reconocimiento de las expresiones faciales del proyecto son nueve: 1) Altura del exterior de las cejas: Calculada como la distancia entre los puntos faciales 16 y 21. 2) Altura del interior de las cejas: Calculada como la distancia entre los puntos faciales 18 y 24. 3) Altura del labio superior: Calculada como la distancia entre los puntos faciales 42 y 88. 4) Anchura de la boca: Calculada como la distancia entre los puntos faciales 89 y 90. 5) Apertura de la mandíbula: Calculada como la distancia entre los puntos faciales 11 y 42. 6) Distancia entre labios: Calculada como la distancia entre los puntos faciales 41 y 88. 7) Grosor de los labios: Calculada como la distancia entre los puntos faciales 8 y 88. 8) Altura de las comisuras de los labios: Calculada como la media aritmética de la altura (coordenada Y) de los puntos 89 y 90. 9) Curvatura del labio inferior: Calculada como la diferencia de altura entre la altura de las comisuras de los labios y la altura del punto 41. La extracción de estos parámetros es efectuada mediante la función ExtraerParametros, que recibe como variable los datos faciales cargados y devuelve una matriz que contiene los parámetros faciales de cada fotograma calculados de forma absoluta. - 82 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Inferencia del rostro neutro Una vez se han calculado los parámetros faciales de una grabación, se puede proceder a inferir el rostro neutro de la persona. Esta inferencia es realizada mediante un método basado en el cálculo de la media aritmética de cada parámetro en todos los fotogramas de la grabación. De esta forma, el rostro neutro inferido consiste en un vector de nueve elementos que representan el valor medio total de cada uno de los nueve parámetros presentados anteriormente. Este tipo de inferencia tan inmediato es posible gracias a los estudios de Paul Ekman, que demuestran que durante períodos de tiempo superiores a tres minutos la expresión de mayor ocurrencia en una persona es el rostro neutro. [EKMA06]. Dado que las sesiones de grabación tienen una duración total superior a los diez minutos, realizando la media de los parámetros se puede obtener una estimación suficientemente precisa del rostro neutro de una persona de forma automática. La función encargada de realizar esta tarea es RostroNeutro, que recibe como variable de entrada la matriz de parámetros absolutos y a partir de ellos devuelve el vector de nueve posiciones que representa el rostro neutro inferido. La validación de este método de inferencia automática del rostro neutro de una persona se ha realizado seleccionando manualmente varios fotogramas correspondientes a cada grabación en los que la persona manifestaba un rostro neutro, y comparando los parámetros de esos fotogramas con los inferidos de forma automática. Dicha validación demostró una tasa de error muy reducida en la inferencia y, por tanto, la adecuación del método automático empleado, tal como se muestra en la tabla 5.4.1-1. - 83 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Tabla 5.4.1-1 Comparación entre rostro neutro inferido y real Rostro neutro real (Grabación 15, fotograma 4633) Parámetro Rostro neutro Inferido (Grabación 15) Desviación (valor absoluto) Altura del exterior de las cejas Altura del interior de las cejas 0.0161 0.0162 0.62% 0.0165 0.0164 0.61% Altura del labio superior 0.0106 0.0101 4.72% Anchura de la boca 0.0438 0.0431 1.59% Apertura de la mandíbula 0.0408 0.0393 3.67% Distancia entre labios 0.0067 0.0064 4.47% Grosor de los labios 0.0054 0.0053 1.85% Altura de las comisuras de los labios Curvatura del labio inferior 0.0059 0.0061 3.45% 0.0014 0.0013 3.62% Como puede apreciarse en la tabla, las diferencias existentes entre el rostro neutro inferido automáticamente y el escogido manualmente son mínimas, con el valor añadido de que la adecuación del rostro neutro escogido de forma manual depende del criterio subjetivo del experto y por tanto es menos robusto que el método automático. - 84 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Extracción de los parámetros relativos del rostro Una vez se han extraído los parámetros absolutos de la grabación de una persona y se ha inferido su rostro neutro, es posible obtener los parámetros relativos de la grabación. Este proceso lo lleva a cabo la función ExtraerRelativos, cuya operación principal consiste en dividir fotograma a fotograma los parámetros absolutos entre los parámetros del rostro neutro. De esta forma se obtiene una nueva matriz cuyos parámetros están expresados en función de los del rostro neutro, es decir, que un valor x para un determinado parámetro implica que ese parámetro es x veces el mismo parámetro del rostro neutro. Esta relativización de los parámetros faciales es necesaria a la hora de poder clasificar las expresiones faciales de forma universal, ya que con los parámetros expresados de forma absoluta no sería posible clasificarlas empleando los mismos árboles clasificadores para diferentes personas. Por otro lado, la relativización de los parámetros faciales puede producir un efecto de contextualización de las expresiones detectadas por los clasificadores. Dicho efecto se podría producir si la expresión facial predominante en el vídeo no fuese la del rostro neutro, lo que provocaría una deformación de los parámetros calculados para el rostro neutro inferido y por tanto, de los parámetros relativizados. La consecuencia sería que, en un vídeo en el que predominase una emoción, los clasificadores sólo detectarían como tal los fotogramas en los que ésta se manifestase con una mayor intensidad. - 85 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Obtención, representación y tratamiento de resultados A partir de los parámetros faciales relativos al rostro neutro de una persona, resulta muy sencillo obtener los resultados de la clasificación de las expresiones faciales. La función creada para obtener los resultados del análisis de expresiones faciales se llama Resultados. Esta función introduce los parámetros de cada fotograma dentro de los árboles clasificadores de alegría y desagrado generados mediante Weka y en función de la respuesta generada por los árboles guarda los resultados en una matriz llamada respuesta. A continuación se muestra el código que permite detectar una sonrisa a partir de los parámetros de un fotograma dado. if anchura_boca <= 1.083085 if apertura_mandibula <= 0.736139 if alt_labio_sup <= 0.559672 ventana(10)=0; else if distancia_labios <= 0.361732 ventana(10)=0; else ventana(10)=1; end end else ventana(10)=0; end else if apertura_mandibula <= 0.994042 if anchura_boca <= 1.255343 ventana(10)=0; else ventana(10)=1; end else if distancia_labios <= 1.460927 - 86 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect if alt_labio_sup <= 1.091233 ventana(10)=0; else ventana(10)=1; end else ventana(10)=1; end end end else ventana(10)=0; end Una vez se han obtenido los resultados de las expresiones faciales de todos los fotogramas se una grabación, se suavizan estos resultados empleando una ventana móvil de 10 fotogramas de extensión, que reduce en gran medida el ruido provocado por falsos positivos o falsos negativos aislados. Esta ventana móvil cuenta el número de fotogramas en los que se ha detectado la expresión en toda su extensión y si es mayor o igual que la mitad (cinco fotogramas) de su extensión clasifica ese fotograma con dicha expresión, de lo contrario se indica la ausencia de ésta. Tras realizar la clasificación, la ventana se desplaza un fotograma y se repite el proceso hasta llegar al último fotograma de la grabación. Además se han creado dos funciones para poder guardar y cargar los resultados llamadas GuardarResultados y CargarResultados, que permiten tener acceso a los resultados finales sin tener que volver a analizar todos los fotogramas cada vez que se inicie Matlab y que esos datos estén disponibles para exportar a la aplicación de análisis de resultados. Finalmente, han sido desarrolladas una serie de funciones que permiten apreciar visualmente los resultados obtenidos por los árboles clasificadores, tanto de forma individual como de forma colectiva: - 87 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect PintarAlegria y PintarDesagrado: Representan por cada fotograma de la grabación un punto que indica la presencia o ausencia de la emoción. La presencia se marca ubicando la coordenada Y del punto en 1 y pintando el punto de color verde, y la ausencia poniendo la coordenada Y a 0 y dibujando el punto de color rojo. Porcentajes: Es una función que permite apreciar en qué porcentaje de fotogramas de cada secuencia de vídeo se ha detectado una emoción determinada, lo que aporta una visión sobre la capacidad de cada vídeo para generar una determinada emoción. Se puede usar para una grabación concreta o con la suma de todas las grabaciones. PuntosCalientes: Esta función sirve para representar el número de personas que están manifestando una expresión facial en un fotograma determinado. Es especialmente útil a la hora de detectar tendencias generales y poder observar los puntos calientes de un vídeo, es decir, aquellos capaces de generar una emoción en el mayor número de personas. Los resultados generados por estas tres funciones se pueden apreciar en el capítulo que muestra los resultados obtenidos con la herramienta de análisis de expresiones faciales. - 88 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 5.4.2 Modificaciones Existencia de puntos con un tiempo de refresco mayor Tras realizar los primeros análisis visuales de los puntos obtenidos con Kinect y su evolución a lo largo del tiempo, se pudo comprobar existen ciertos puntos faciales que la cámara no actualiza con cada nuevo fotograma. Se trata de los puntos que representan los ojos y la nariz de la persona, que Kinect emplea para ubicar el rostro pero no actualiza con cada nuevo fotograma generado. Se demostró experimentalmente que estos puntos son actualizados cada 100 fotogramas (8 segundos aproximadamente) lo que los convierte en no aptos para realizar el reconocimiento de expresiones faciales. Por esto, fue necesario buscar parámetros faciales que no contuvieran alguno de esos puntos. A continuación se muestra una gráfica comparativa entre la variación de la altura de las cejas y la altura de las mejillas, lo que permite observar la conveniencia de usar el primero como parámetro facial frente a la inconveniencia del segundo. Figura 5.4.2-1 Puntos faciales con un tiempo de refresco mayor Altura del exterior de las cejas Altura de las mejillas - 89 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Creación de una ventana flotante Con el fin de reducir el ruido observado en los resultados, producido por falsos positivos y falsos negativos aislados, se decidió realizar un suavizado de las gráficas mediante el uso de una ventana flotante de 10 fotogramas de extensión. La extensión de la ventana flotante se determinó experimentalmente, ya que se pudo comprobar que una extensión menor no producía el suficiente efecto mitigador sobre el ruido original, y una extensión mayor provocaba la pérdida del reconocimiento correcto de expresiones faciales que se produjeran de forma breve. 5.5 Aplicación de análisis de resultados La aplicación de análisis de resultados constituye la fase final del ciclo de vida de la herramienta desarrollada. Figura 5.5.1-1 Interfaz de la aplicación de análisis de resultados - 90 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Su principal función es ofrecer a los usuarios de la herramienta una forma fácil e intuitiva de contrastar los resultados extraídos mediante los algoritmos clasificadores elaborados en Matlab con los datos obtenidos originalmente mediante Kinect y la herramienta de adquisición de información facial. 5.5.1 Desarrollo El desarrollo de esta aplicación se realizó atendiendo a las necesidades del usuario a la hora de realizar el análisis de los resultados obtenidos. Por ello se elaboró una interfaz de usuario esquemática e intuitiva, con la idea de ofrecer la mayor funcionalidad de la forma más sencilla posible. Como puede apreciarse en la figura 5.5.1-1, la interfaz de la aplicación queda dividida en tres partes, cada una de las cuales cumple con un propósito diferente: Sección de control: Situada en la zona inferior derecha de la pantalla, ofrece un control total sobre la aplicación. Permite conocer el fotograma que está siendo mostrado, así como reproducir la sesión de grabación automáticamente. También ofrece la posibilidad de pausar dicha sesión y de realizar un análisis fotograma a fotograma hacia delante y hacia atrás. Sección de análisis visual: Ubicada a la izquierda de la imagen, permite observar el rostro de la persona grabada y las imágenes que esta persona estaba percibiendo de forma simultánea. Esta información puede ser empleada tanto para contrastar los resultados obtenidos con el analizador de expresiones faciales como para determinar la capacidad de generar emociones del vídeo mostrado de forma manual. - 91 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Sección de análisis de resultados: Ocupa el área superior derecha de la pantalla, y muestra en dos gráficas los resultados proporcionados por el analizador de expresiones faciales, siendo el fotograma actual representado por el punto ubicado más a la izquierda de las gráficas. Además, permite avanzar a un fotograma determinado presionando doble clic sobre éste, lo que agiliza de forma drástica la tarea de avanzar y retroceder grandes períodos de tiempo. La única acción previa requerida por el usuario para poder trabajar con esta aplicación consiste en ubicar la carpeta que contiene las imágenes captadas por Kinect y el fichero de texto con los resultados generado con Matlab dentro de la carpeta del archivo ejecutable. 5.5.2 Modificaciones Adecuación del framerate del vídeo Al ser distinta la tasa de imágenes por segundo presentes en el vídeo reproducido de la tasa de captura realizada por Kinect, fue necesario realizar un ajuste para que ambas secuencias pudiesen reproducirse de forma síncrona. En este caso efectuar la equivalencia resulta sencillo, ya que la tasa media de captura de imágenes de Kinect es de 12 fotogramas/segundo mientras que el framerate del vídeo expuesto a los voluntarios es de 24 fotogramas/segundo. De esta forma, el ajuste realizado consiste en reproducir dos fotogramas del vídeo por cada fotograma de Kinect, tanto a la hora de avanzar como a la hora de retroceder en la sesión. - 92 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Capítulo 6 RESULTADOS OBTENIDOS En este capítulo se va a realizar un análisis en profundidad sobre los resultados obtenidos tras la creación y perfeccionamiento del conjunto de las herramientas que componen el proyecto. El objetivo de este análisis es valorar la eficacia de la herramienta y de la cámara Kinect como mecanismo de reconocimiento automático de expresiones faciales, así como la adecuación de los parámetros y los algoritmos elegidos para llevar a cabo esta tarea. Para poder comprender correctamente el significado y la relevancia de dichos resultados se ha descompuesto este análisis en tres fases, que siguen el orden lógico de obtención de resultados en el desarrollo de la herramienta: Diseño del experimento Elaboración de árboles clasificadores de desagrado y alegría Resultados individuales Resultados colectivos - 93 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 6.1 Diseño del Experimento El experimento se diseñó con la idea de recabar información facial de la forma más completa y fiable posible. Para ello se decidió crear una secuencia de vídeo especialmente diseñada para generar emociones en las personas grabadas de una forma controlada y bien diferenciada. Secuencia de vídeo del experimento El vídeo proyectado a las personas grabadas está compuesto por cuatro secuencias diseñadas para generar diferentes emociones. Dichas escenas han sido escogidas por el Departamento de Psicología de la Universidad Pontificia de Comillas por haber obtenido resultados positivos en estudios realizados anteriormente Dichas secuencias se encuentran separadas mediante breves escenas de transición para establecer una clara diferenciación entre ellas y evitar que las emociones se solapen. La duración total del vídeo es de 11 minutos y 7 segundos, tiempo suficiente para poder captar una gran cantidad de información sobre el rostro de una persona, pero lo suficientemente breve para mantener su atención. Por lo tanto, la estructura del vídeo creado es la siguiente: 1. Tensión / Miedo: La primera secuencia proyectada pertenece a la película “El proyecto de la bruja de Blair” (Eduardo Sánchez, 1999). En ella se muestra a unos jóvenes asustados en un bosque oscuro tratando de encontrar a un amigo suyo que se ha perdido. Esta secuencia está diseñada para generar tensión y miedo. - 94 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 2. Desagrado: La siguiente escena ha sido tomada de la película “Trainspotting” (Danny Boyle, 1996). En ella se puede ver a un hombre acudiendo a unos servicios que se encuentran en un estado deplorable, por lo que es una escena idónea para generar desagrado. 3. Tristeza: La tercera escena en ser mostrada pertenece a “La lista de Schindler” (Steven Spielberg, 1993) y muestra crudas escenas del holocausto judío, lo que la convierte en una escena idónea para generar tristeza. 4. Alegría: Finalmente se muestra una secuencia tomada de “Algo pasa con Mary” (Bobby Farrelly, 1998) en la que se retrata una divertida pelea entre una persona y un perro, lo que facilita la captura de expresiones alegres. A pesar de no llegar a reconocer todas las emociones que el vídeo está diseñado para generar en los voluntarios, el hecho de poder generar grabaciones con una gran variedad de emociones resulta especialmente útil a la hora de evitar el sobreaprendizaje de los algoritmos y la confusión de las emociones detectables con las demás. Figura 6.1-1 Esquema del vídeo del experimento - 95 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Sesiones de grabación Para llevar a cabo la adquisición de información facial suficiente como para poder tratar de reconocer expresiones faciales de forma automática, se organizaron nueve sesiones de grabación con diferentes personas. Para las grabaciones se empleó una sala aislada con buena iluminación y un foco especialmente dirigido hacia el rostro de la persona para asegurar el mejor reconocimiento facial posible. Por otro lado, al iniciarse la grabación se dejaba a la persona que estaba siendo grabada sola en la habitación hasta la finalización del vídeo para evitar que se produjera alguna alteración en los resultados producido por estrés o nervios. A continuación se muestra una imagen tomada de cada una de las 9 grabaciones para tener una idea de las personas de las que fueron tomados datos faciales durante el experimento. Figura 6.1-2 Participantes en el experimento Sesión 1 (D. A.) Sesión 2 (A. F.) - 96 - Sesión 3 (M. S.) Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Sesión 4 (B. S.) Sesión 5 (J. L.) Sesión 6 (D. R.) Sesión 7 (M. R.) Sesión 8 (J. B.) Sesión 9 (J. R.) Puede apreciarse que las grabaciones 6 y 7 fueron realizadas bajo peores condiciones lumínicas, aunque los resultados fueron positivos debido a que se encontraban dentro del rango válido de la cámara y a que la iluminación incidía de forma uniforme en el rostro de los voluntarios. En todas las grabaciones se inició la reproducción del vídeo de forma simultánea con el inicio de la grabación de Kinect, con el objetivo de poder realizar una correlación automática entre los fotogramas grabados con el instante del vídeo del experimento. - 97 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 6.2 Elaboración de árboles clasificadores En la elaboración de los árboles clasificadores del desagrado y la alegría se ha empleado un método manual de clasificación de las emociones. Este método consiste en determinar manualmente la ausencia o presencia de una emoción en un fotograma determinado. A la hora de incluir los fotogramas en el conjunto de entrenamiento de los árboles clasificadores sólo son escogidos aquellos en los que la ausencia o presencia de la emoción exista de una forma clara, con el objetivo de crear un árbol que contenga información de las emociones aprendidas de la forma más sólida posible. Para configurar el árbol clasificador del desagrado se tomaron 100 casos en los que existía desagrado y otros 50 casos en los que la emoción estaba ausente. Estos datos fueron tomados de las grabaciones 1, 3 y 4, resultando en un total de 300 casos positivos y 150 negativos. Por otro lado, para configurar el árbol clasificador de la alegría fueron tomados 200 casos en los que existía alegría y 100 casos en los que la emoción estaba ausente. Los casos fueron tomados de las mismas grabaciones que en el caso del árbol clasificador del desagrado, resultando en un total de 600 casos positivos y 300 negativos. Por cada fotograma extraído de los datos capturados por la cámara Kinect se obtienen 9 parámetros (explicados en el capítulo anterior) que son los que permiten caracterizar la expresión facial presente en dicho fotograma. Una vez tomados los datos iniciales, se siguió el mismo proceso para configurar finalmente ambos árboles de decisión. En primer lugar se construyó empleando el programa Weka un árbol con los datos iniciales con un índice de poda de 0.1 para evitar el sobreaprendizaje del mismo. Tras la construcción de ese árbol inicial se realizó - 98 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect un análisis de los resultados para determinar la bonanza de la clasificación del árbol elaborado. El proceso de este análisis se basó en la búsqueda de fotogramas no incluidos en el conjunto de entrenamiento en los que el árbol clasificador estuviera fallando, y su posterior inclusión dentro de un nuevo conjunto de entrenamiento. Este nuevo conjunto quedaría así más completo y podría generar un mejor árbol clasificador de la emoción. Este proceso de mejora de los árboles clasificadores se dio en tres iteraciones por cada árbol, ya que la cuarta iteración generaba un árbol mucho más complejo y cuyo grado de mejora era prácticamente imperceptible (inferior al 0.5%). A continuación se muestran los árboles de clasificación de ambas emociones que se obtuvieron tras realizar las tres iteraciones y, por tanto, los árboles definitivos que la aplicación emplea para poder clasificar las emociones detectadas en cada fotograma. - 99 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 6.2.1 Árbol clasificador de la Alegría Atendiendo al árbol generado mostrado a continuación, se pone de manifiesto que el atributo más importante para diferenciar la sonrisa de la ausencia de sonrisa es la anchura de la boca. Esto coincide con las observaciones de Paul Ekman, según las cuales uno de los rasgos más distintivos de la sonrisa de una persona es el ensanchamiento de la boca. Otro de los rasgos que más ayudan a discriminar la presencia o ausencia de sonrisa es la apertura de la mandíbula, ya que en el caso de que la boca se encuentre ampliamente ensanchada, la apertura de la mandíbula es indicador de una sonrisa pronunciada. En el caso de que la boca no se encuentre muy ensanchada, la apertura de la mandíbula descarta una posible sonrisa disimulada. También se puede apreciar cómo, en este caso, los parámetros que indican el grosor de los labios y la curvatura de los labios no han sido empleados en la clasificación. Esto puede deberse a su redundancia con algún otro parámetro o debido a su menor relevancia. En las pruebas realizadas para comprobar la precisión del árbol, se pudo apreciar una tasa de aciertos del 97.5391% sobre un conjunto de datos de test compuesto por 447 instancias procedentes de todas las grabaciones no incluidas en el conjunto de entrenamiento, de las cuales 228 pertenecían a fotogramas donde se había detectado alegría y las 219 restantes no mostraban dicha emoción. - 100 - Árbol clasificador de la Alegría Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect - 101 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 6.2.2 Árbol clasificador del Desagrado Observando el árbol clasificador del desagrado, se puede apreciar cómo la clasificación de dicha emoción es de una complejidad bastante mayor que la de la alegría. Esta mayor complejidad se debe al hecho de que tras las primeras iteraciones existían muchos casos en los que la alegría era clasificada como desagrado, lo que llevó a incluir dichos casos como negativos dentro del conjunto de entrenamiento. A pesar de su gran complejidad, no fue posible simplificar la estructura del árbol clasificador del desagrado, ya que al reducir el número de nodos del árbol la precisión de la clasificación efectuada se reducía de forma drástica. Debido al gran número de nodos del árbol, no es tan sencillo realizar un análisis visual de la importancia que cada atributo tiene en la clasificación. No obstante, se puede apreciar cómo una altura del exterior de las cejas elevada suele implicar la ausencia de desagrado, ya que una de las características distintivas de esta expresión es la contracción y descenso de las cejas. En las pruebas realizadas para comprobar la precisión de la clasificación realizada por el árbol, éste tuvo una tasa de aciertos del 96.0803% sobre un conjunto de datos de test compuesto por 573 instancias procedentes de todas las grabaciones no incluidas en el conjunto de entrenamiento, de las cuales 116 presentaban desagrado y las 457 restantes no mostraban dicha emoción. - 102 - Árbol clasificador del desagrado Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect - 103 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 6.3 Resultados Individuales En este apartado se va a proceder a mostrar los resultados individuales obtenidos tras analizar las grabaciones realizadas a cada una de las 9 personas que se prestaron voluntarias para el experimento. Estos resultados se descomponen en dos secciones diferentes. En la primera sección se muestran las emociones detectadas por los árboles de decisión en cada fotograma de cada grabación. En la segunda se realiza un análisis de tendencias, en el que se puede apreciar de forma global el porcentaje de fotogramas que contienen una determinada emoción por cada clip existente dentro del vídeo empleado en las grabaciones. 6.3.1 Análisis por fotogramas En esta sección se exponen los las conclusiones extraídas por la herramienta de análisis de resultados al realizar la detección de emociones fotograma a fotograma. Esto permite tener una idea visual de la precisión de los clasificadores de emociones creados en el desarrollo de la aplicación. Para ello se mostrarán las gráficas generadas por la herramienta de análisis de resultados al clasificar todos los fotogramas de cada grabación y luego filtrar los resultados con la ventana flotante explicada anteriormente. En cada gráfica se puede observar una serie de puntos cuya coordenada en X se corresponde con el número de fotograma (por lo que dichos puntos están ordenados cronológicamente de izquierda a derecha), y cuya coordenada en Y marca la presencia de la emoción con un valor de 1 y su ausencia con un valor de 0. Además los puntos en los que la emoción está presente - 104 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect se representan con color verde y los demás con color rojo para facilitar su diferenciación. Además en las gráficas se han insertado unas líneas verticales que permiten identificar fácilmente los distintos clips que componen el vídeo mostrado a los voluntarios así como los períodos de transición existentes entre ellos, tal cómo se muestra en la figura 6.1-1. En la figura 6.3-1 se muestra un ejemplo sencillo que permite apreciar cómo se deben interpretar las gráficas que serán mostradas a continuación. Figura 6.3-1 Explicación de una gráfica por fotogramas En primer lugar se mostrarán las gráficas correspondientes a la alegría detectada en las 9 grabaciones realizadas, y posteriormente se mostrarán las gráficas del desagrado. - 105 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Alegría Grabación 1 Alegría Grabación 2 Alegría - 106 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 3 Alegría Grabación 4 Alegría Grabación 5 Alegría - 107 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 6 Alegría Grabación 7 Alegría Grabación 8 Alegría - 108 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 9 Alegría Tras analizar visualmente las 9 gráficas correspondientes a la detección de la alegría, puede apreciarse la tendencia a detectar dicha emoción en el último clip, que es el que presenta la escena cómica. Por lo tanto los resultados obtenidos coinciden con lo que a priori se podría esperar obtener al efectuar la clasificación en las grabaciones. No obstante pueden observarse anomalías en algunas gráficas que a continuación serán explicadas. En primer lugar, es posible apreciar con frecuencia la detección alegría en el segundo clip de vídeo, que es el que muestra una escena pensada para generar desagrado. Este hecho se debe principalmente a lo impactante y ridículo de la escena mostrada, que provoca inicialmente desconcierto, posteriormente risa y finalmente desagrado. Este proceso quedará ilustrado en el apartado de resultados colectivos, en el que se mostrará el fragmento de la secuencia de desagrado que generó alegría en el mayor número de voluntarios de forma simultánea. En las grabaciones 2, 4 y 7 se pueden apreciar varios intervalos pertenecientes a la primera secuencia de vídeo en los que es posible apreciar alegría. La principal causa de la aparición de esta emoción en una fase tan temprana del vídeo es el nerviosismo - 109 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect existente en estas personas durante los primeros instantes de la grabación. A continuación se muestra una tabla con fotogramas que ilustran dicha situación. Tabla 6.3-1 Alegría debida al nerviosismo al inicio de las sesiones Fotograma: 220 229 238 247 28 37 46 55 75 82 Grabación 2 Fotograma: Grabación 4 Fotograma: 87 96 Grabación 7 Por otro lado, la segunda grabación constituye una anomalía, ya que dicho sujeto no respondió a los estímulos de la forma en que habría cabido esperar. La grabación 5 a priori podría considerarse otra anomalía, pero un análisis posterior sobre los porcentajes del tiempo en que cada emoción está presente para cada vídeo - 110 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect demostrará que los resultados son correctos a pesar de tratarse de un sujeto muy poco expresivo. Desagrado Grabación 1 Desagrado Grabación 2 Desagrado - 111 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 3 Desagrado Grabación 4 Desagrado Grabación 5 Desagrado - 112 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 6 Desagrado Grabación 7 Desagrado Grabación 8 Desagrado - 113 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 9 Desagrado La primera diferencia que puede apreciarse entre las gráficas de la detección de la alegría y las del desagrado es la mayor dificultad existente para detectar la segunda emoción, que se manifiesta en una mayor cantidad de fotogramas que presentan dicha emoción fuera del clip de vídeo diseñado para generar desagrado (clip número 2). Al igual que en el análisis de las gráficas por fotogramas de la alegría, en este caso también se observa que la grabación número 2 constituye una anomalía frente a las demás, ya que es posible observar desagrado en prácticamente cualquier clip de vídeo. También la grabación número 5 muestra el desagrado de forma correcta aunque con una presencia débil de dicha emoción debido a la poca expresividad del sujeto. La grabación 4 supone un caso interesante, ya que muestra una situación en la que el desagrado ha sido captado de una forma muy adecuada. A priori podría parecer que el desagrado detectado en el tercer vídeo es un error, pero en este caso el vídeo no generó tristeza si no que causó rechazo en la persona grabada, de ahí la detección de esa emoción. A continuación se muestra una secuencia de imágenes tomadas de dicha grabación en las que se detectó desagrado en el tercer clip de vídeo. - 114 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Figura 6.3-2 Secuencia de imágenes de la grabación 4 En la secuencia mostrada se puede apreciar cómo la detección de desagrado en el tercer vídeo está justificada para la grabación número 4. En este caso la crudeza de las imágenes mostradas para generar tristeza desencadenó un sentimiento de rechazo tan pronunciado que la persona no fue capaz de reprimir la expresión de desagrado. En las grabaciones restantes se pueden observar ciertos intervalos de detección de desagrado fuera del segundo vídeo. No obstante, la densidad de esos intervalos es muy inferior a la existente dentro de dicho vídeo. Este hecho no es fácil de apreciar en las gráficas mostradas anteriormente debido a la gran cantidad de puntos representados, por ello se han generado unos diagramas que permiten apreciar la predominancia de las distintas emociones para cada intervalo del vídeo reproducido. - 115 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 6.3.2 Análisis por vídeos Para complementar el análisis por fotogramas presentado anteriormente, a continuación se presenta un análisis que permite apreciar la presencia de las dos emociones identificadas para cada clip de vídeo y para cada grabación realizada. El principal objetivo de este tipo de análisis es la apreciación de una posible predominancia de las emociones analizadas en cada uno de los vídeos. Sin la elaboración de este análisis, del análisis realizado anteriormente se podría extraer una tasa de errores superior a la que realmente se ha encontrado. En este análisis se van a mostrar un conjunto de gráficas correspondientes a cada una de las grabaciones realizadas. Por cada grabación se mostrará una gráfica analizando la detección de la alegría y otra analizando el desagrado. Cada gráfica a su vez estará compuesta por cuatro columnas, cada una de las cuales representa un clip de vídeo, ordenados cronológicamente de izquierda a derecha. La altura de cada una de estas columnas indica el porcentaje de fotogramas de dicho vídeo en los que se ha detectado la emoción analizada. Por lo tanto, los resultados que a priori se esperaría obtener serían unos diagramas con una mayor altura de la segunda columna en las gráficas de análisis del desagrado y una predominancia de la cuarta columna en aquellas que representen el porcentaje de alegría detectada. A continuación se exponen las gráficas elaboradas tras realizar este tipo de análisis sobre los datos obtenidos en las 9 grabaciones realizadas. - 116 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 1 Grabación 2 - 117 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 3 Grabación 4 - 118 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 5 Grabación 6 - 119 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 7 Grabación 8 - 120 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Grabación 9 En las gráficas expuestas anteriormente se puede observar que los resultados obtenidos se asemejan en gran medida a los resultados que se podría esperar obtener en unas condiciones ideales. Las gráficas que más se aproximan a dichos resultados ideales son las pertenecientes a las grabaciones 1, 5, 7 y 8, mientras que en las demás grabaciones se pueden apreciar ciertas anomalías. Una de las anomalías más frecuentes es la detección de alegría en un porcentaje más elevado del que cabría esperar en el segundo vídeo. Como ya se explicó anteriormente, estos resultados aparecen como reacción de los voluntarios ante lo desconcertante de las escenas mostradas en algunos fragmentos de ese vídeo. Para dar soporte a esta explicación, en el apartado de análisis de resultados colectivos se mostrarán los fotogramas causantes de este suceso y las imágenes captadas por Kinect en esos instantes. - 121 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect El resultado de la grabación 2, por otro lado, también se muestra inconcluyente ante este análisis. Para poder determinar si estos resultados eran debidos a un error de los clasificadores de emociones o si se trataba de algún otro tipo de perturbación producida durante la sesión de grabación, fue necesario realizar un análisis manual de dicha sesión. El análisis consistió en una revisión fotograma a fotograma de las imágenes captadas mediante Kinect con el objetivo de observar las expresiones faciales del sujeto a lo largo de toda la sesión de grabación. De este análisis se pudo concluir que los resultados anómalos se debían a que dicho sujeto no reaccionó de la forma esperada ante los vídeos que le fueron mostrados, y que los clasificadores estaban identificando las expresiones de forma correcta. Tabla 6.3-2 Explicación de los resultados anómalos de la grabación 2 Fotograma: 2929 2938 Grabación 2 Película Mostrada - 122 - 6116 6125 Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Como ya se mencionó anteriormente, en el análisis por fotogramas de la grabación 5 es difícil apreciar el grado de acierto del reconocimiento de expresiones faciales debido a la baja tasa de detección de dichas expresiones. Sin embargo, en este nuevo análisis puede apreciarse cómo los porcentajes de detección de las emociones coinciden de forma precisa con los resultados que a priori se esperaba obtener. Por tanto, la baja tasa de reconocimiento de las emociones en esta grabación se debe a la poca expresividad del sujeto de esta grabación. Tras atender a las conclusiones extraídas de este análisis, se puede valorar cómo es capaz de complementar al análisis por fotogramas para evitar caer en conclusiones precipitadas o poder encontrar explicaciones a resultados que a priori pudiesen parecer erróneos. - 123 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 6.4 Resultados Colectivos Tras haber realizado un análisis en profundidad de los resultados obtenidos en las grabaciones de forma individual, a continuación se presenta un estudio completo de las 9 grabaciones analizadas en suma. Este análisis permite observar de forma sencilla tendencias generales y patrones que se hayan podido repetir en las emociones detectadas durante las sesiones. También puede utilizarse para detectar puntos calientes dentro del vídeo mostrado a los voluntarios, es decir, aquellos puntos que han despertado una determinada emoción en el mayor número de personas de forma simultánea. Para poder realizar este análisis, se han tomado los resultados extraídos para cada fotograma de cada una de las 9 grabaciones y se han sumado fotograma a fotograma para poder obtener una matriz cuyos valores oscilan entre 0 y 9, significando un 0 que ninguna persona manifiesta esa emoción para ese fotograma determinado y un 9 que todas las personas experimentan la emoción de forma simultánea en ese fotograma. 6.4.1 Análisis por fotogramas Al igual que en el análisis por fotogramas elaborado para los resultados individuales, en este análisis se muestran las emociones detectadas en cada fotograma de la grabación realizada. El eje X representa el fotograma analizado y el eje Y el número de personas que han manifestado una emoción en un fotograma. Los puntos se han representado en diferentes colores para permitir una apreciación más intuitiva e inmediata de los resultados. - 124 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Alegría En esta gráfica colectiva se observa la tendencia de los voluntarios a expresar unos niveles más elevados de alegría en la última grabación. El hecho de que coincidan estos elevados niveles en las nueve personas de forma prácticamente simultánea en el vídeo ideado para generar alegría, apoya los resultados positivos obtenidos en el apartado anterior y permite apreciar la presencia de un punto caliente de alegría entre los fotogramas 6063 y 6556, produciéndose los máximos de la gráfica en el fotograma 6162 y en el intervalo 6241-6247. Con el objetivo de ilustrar la información expresada en esta gráfica, a continuación se muestran los fotogramas del vídeo asociados a los puntos máximos de alegría, y los rostros de los nueve voluntarios captados por Kinect en esos instantes. - 125 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Figura 6.4-1 Fotogramas del punto caliente de alegría - 126 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect De esta forma se puede apreciar que efectivamente que los fotogramas pertenecientes al intervalo mostrado en la figura 6.4-1 suponen un punto caliente de alegría dentro del vídeo, ya que son capaces de generar alegría en siete de los nueve voluntarios de forma simultánea. Por otro lado, como ya se explicó en el apartado de resultados individuales, es observable un aumento de detección de alegría en el segundo vídeo como resultado de la reacción de los voluntarios a las imágenes desagradables. Esto se debe a que estas imágenes, además de ser desagradables presentan un carácter inverosímil y algo ridículo, lo que es capaz de provocar risa. Desagrado - 127 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect En el caso de la gráfica colectiva por fotogramas del desagrado, los resultados son tan claros como en el de la alegría. Se puede apreciar un claro incremento en la tasa de detección de desagrado durante el segundo vídeo, que conforma un punto caliente de dicha emoción prácticamente en su totalidad. Los puntos de máxima aparición simultánea de dicha emoción se alcanzan en los intervalos de los fotogramas 3440-3445, 3484-3489 y el fotograma 3524. Estos intervalos coinciden con el punto álgido del segundo vídeo, por lo que este resultado sirve para reforzar las conclusiones extraídas anteriormente acerca de la adecuada precisión del árbol clasificador del desagrado. Por otro lado, en el inicio de las grabaciones (fotogramas 1-1000) y en los fotogramas correspondientes al punto caliente de la alegría explicado en el apartado anterior, se detecta la aparición de un mayor número de falsos positivos ante la emoción del desagrado. Dado que el primer vídeo muestra una escena pensada para generar tensión e incluso miedo, se observaron ciertos gestos de incomodidad en los voluntarios a lo largo de la mayor parte del mismo, concentrándose especialmente en la parte inicial del vídeo al ser la tensión una emoción decreciente en el tiempo. Los falsos positivos detectados en el cuarto vídeo se deben a la gran complejidad que presenta la expresión facial del desagrado y a la similitud que guarda con la expresión de la alegría. Los rasgos que ambas expresiones presentan en común son el ensanchamiento de la boca, disminución de la apertura de la boca y descenso de las cejas. Ambos hechos provocan la confusión de algunos fotogramas que contienen alegría con desagrado, y que a la inversa sea un hecho menos frecuente. En la figura 6.4-2 se muestra una secuencia con algunos fotogramas pertenecientes al punto caliente del desagrado, lo que permite apreciar visualmente la información proporcionada por la gráfica anterior. - 128 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Figura 6.4-2 Fotogramas del punto caliente de desagrado - 129 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect En la figura 6.4-2, a parte de la expresión de desagrado presente en la mayoría de los voluntarios, se puede observar un hecho anteriormente descrito. Este hecho es la aparición de expresiones de alegría en el segundo vídeo, debido a lo cómico de la situación desagradable mostrada. Es especialmente apreciable en el tercer fotograma de la sesión 6, aunque también se puede observar una mezcla de desagrado y alegría en el segundo fotograma de las sesiones 3 y 4 6.4.2 Análisis por vídeos - 130 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect La gráfica del análisis colectivo por vídeos mostrada, aporta una visión global del experimento y de la precisión de los resultados obtenidos al aplicar los algoritmos de reconocimiento de expresiones faciales desarrollados a los datos faciales extraídos de los voluntarios en las sesiones de grabación. Dado que el vídeo mostrado a los voluntarios había sido ideado para generar desagrado en el segundo clip y alegría en el cuarto, los resultados del analizador de expresiones faciales que a priori se esperaba obtener debían ser acordes con la estructura del vídeo. En la gráfica de porcentajes de la alegría los resultados concuerdan en gran medida con los resultados que el vídeo idealmente debería generar en los voluntarios, es decir, un porcentaje de detección de la alegría muy superior en el cuarto vídeo que en los demás. La única salvedad que se puede observar es el incremento de detección de alegría en el segundo vídeo, hecho que resultó imprevisto pero no es provocado por errores en el clasificador. Por otro lado, en la gráfica que muestra los porcentajes del desagrado, los resultados obtenidos coinciden de forma prácticamente perfecta con los resultados que idealmente se habría esperado conseguir. Esto se debe a que el porcentaje de fotogramas en los que se ha detectado desagrado de forma errónea es prácticamente despreciable en comparación con el total de fotogramas de cada uno de los vídeos en los que se han producido dichas clasificaciones erróneas. - 131 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect - 132 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Capítulo 7 CONCLUSIONES Las conclusiones extraídas de la elaboración de este proyecto deben descomponerse en varias cuestiones, que recorren los diferentes aspectos que han sido tratados durante el desarrollo del mismo. Estas cuestiones comprenden los siguientes temas: Teoría Darwiniana de las expresiones faciales Viabilidad de Kinect como mecanismo de adquisición de información facial Capacidades del sistema de detección de expresiones faciales desarrollado Teoría Darwiniana de las expresiones faciales Los resultados obtenidos tras realizar el análisis de las expresiones faciales detectadas en las nueve grabaciones realizadas a los voluntarios, apoyan la teoría iniciada por Charles Darwin y seguida posteriormente por Paul Ekman. No obstante, al pertenecer los nueve voluntarios a un mismo grupo de edad y procedencia este apoyo no es lo suficientemente fuerte como para corroborar la teoría, simplemente se observa su cumplimiento dentro del conjunto escogido. La elaboración de los árboles clasificadores de las emociones habría arrojado resultados inconcluyentes en el caso de que la teoría darwiniana hubiese sido incorrecta. Por el contrario, ha sido posible caracterizar las expresiones del desagrado y la alegría de forma universal y los resultados obtenidos en las distintas grabaciones - 133 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect presentan unos patrones similares, despertando las mismas emociones en instantes de tiempo similares de forma común a muchas de ellas. Viabilidad de Kinect como mecanismo de adquisición de información facial La cámara Kinect posee una gran cantidad de cualidades que la convierten en una herramienta sumamente útil a la hora de adquirir información facial de forma automática. Tradicionalmente, la detección y el seguimiento automático de rostros suponían uno de los mayores problemas con los que los investigadores tenían que lidiar. Sin embargo, las capacidades de detección automática de rostros y el seguimiento automático de los 121 puntos faciales detectados por Kinect evitan este problema y permiten la obtención de información suficiente como para realizar el análisis de las expresiones faciales de forma satisfactoria. No obstante, la cámara presenta algunas limitaciones que reducen la complejidad del reconocimiento de expresiones faciales que con ella se puede realizar. La primera de ellas es la necesidad de unas condiciones lumínicas favorables, ya que Kinect experimenta dificultades e imprecisiones a la hora de reconocer rostros iluminados de forma irregular. También se experimentan imprecisiones a la hora de reconocer rostros parcialmente ocultos, aunque este problema es prácticamente inevitable y ningún sistema ha sido capaz de evitarlo. Otra de las grandes limitaciones de Kinect reside en la ausencia de información ocular que proporciona. Si bien es capaz de determinar la ubicación exacta de los ojos de una persona con gran precisión, no suministra información acerca del grado de apertura de los ojos ni la dirección de la mirada. Este hecho ha supuesto la mayor traba - 134 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect encontrada a la hora de diseñar los algoritmos de reconocimiento de expresiones faciales ya que los ojos suponen una fuente de información facial muy valiosa. Pese a estas limitaciones encontradas, la gran cantidad de facilidades que ofrece y la precisión con que es capaz de obtener la información facial convierten a Kinect en un mecanismo de adquisición de información facial perfectamente viable, ya que algunas de sus limitaciones podrían ser corregidas mediante el diseño de algoritmos, tal como se explicará en el capítulo de trabajos futuros. Capacidades del sistema de detección de expresiones faciales desarrollado Se ha logrado desarrollar un sistema de reconocimiento automático de expresiones faciales capaz de diferenciar dos emociones con una tasa de acierto muy elevada. Las emociones detectables por el sistema son el desagrado y la alegría. Estas emociones fueron elegidas por ser las más sólidamente obtenibles en un entorno experimental. Otras emociones como el miedo, la ira o la tristeza podrían ser detectables con la información proporcionada por Kinect, pero para poder provocarlas de forma genuina en los voluntarios se debería diseñar un experimento diferente del que fue ideado en este proyecto. A pesar de haberse detectado algunas anomalías en el reconocimiento de expresiones faciales, una gran mayoría de los resultados obtenidos coinciden con los resultados que a priori se esperaba obtener en unas condiciones ideales, con lo que la adecuación del sistema creado queda reforzada. No obstante, existe un ligero solapamiento entre el reconocimiento de ambas emociones debido a la incapacidad de Kinect de proporcionar información ocular del rostro, que supone una de las diferencias entre las expresiones de alegría y desagrado. - 135 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Finalmente, la creación de las funciones que permiten observar los resultados obtenidos de un conjunto de grabaciones ofrece una herramienta muy potente desde el punto de vista psicológico y con una versatilidad muy elevada. Estas funciones ponen a disposición del usuario información de las tendencias globales y de la capacidad que un vídeo determinado para generar emociones concretas en un conjunto de personas. A modo de conclusión final, el desarrollo de este proyecto ha permitido observar la coincidencia de los resultados con la teoría darwiniana de la universalidad de las expresiones faciales, a pesar de ser una muestra insuficiente como para permitir su corroboración de forma empírica; ha demostrado la viabilidad de la cámara Kinect como mecanismo de adquisición de parámetros faciales para el reconocimiento de expresiones faciales; ha servido para generar un sistema de detección automática de las emociones del desagrado y la alegría aplicable de forma universal , y ha dado lugar a un conjunto de herramientas de gran utilidad para el análisis de los resultados obtenidos tanto a nivel individual como colectivo. - 136 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Capítulo 8 TRABAJOS FUTUROS A la vista de los resultados obtenidos, a continuación se plantean una serie de trabajos que podrían ser realizados en el futuro con el objetivo de perfeccionar la herramienta desarrollada y aumentar la fiabilidad de las conclusiones extraídas por los clasificadores de emociones. Uso de algoritmos de detección de bordes en los puntos invariantes Una de las principales limitaciones detectadas en el funcionamiento de Kinect es la incapacidad de proporcionar información ocular completa. No obstante, la cámara suministra en cada fotograma la ubicación exacta de los ojos de la persona. Teniendo disponible la ubicación de los ojos de la persona, sería posible inferir el grado de apertura de sus ojos empleando algoritmos de detección de bordes. Estos algoritmos detectarían la posición de los párpados y el grado de apertura de los ojos podría ser calculado como la distancia entre éstos. Otros puntos faciales que Kinect no actualiza en todos los fotogramas son los correspondientes con el contorno de la nariz. Mediante el uso de algoritmos de detección de bordes se podrían actualizar de forma más precisa, lo que permitiría diferenciar gestos nasales aportando robustez al reconocimiento de expresiones faciales. - 137 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Detección de un mayor número de expresiones faciales Una vez la viabilidad de Kinect como mecanismo de adquisición de información facial ha quedado demostrada, una tarea a realizar en el futuro es la de elaborar los árboles clasificadores de las demás emociones universalmente reconocibles, es decir, la ira, la tristeza, el miedo y la sorpresa. No obstante, para poder generar estas emociones en los voluntarios es necesario diseñar un experimento completamente diferente del ideado en este proyecto. Esto se debe a que la proyección de un vídeo en un entorno experimental con condiciones lumínicas adecuadas no supone un estímulo lo suficientemente fuerte como para poder desencadenar estas emociones en los sujetos de forma suficientemente apreciable. Estudio de las características de Kinect v2 El 21 de mayo de 2013 Microsoft anunció el lanzamiento de la nueva versión del sensor Kinect, llamado Kinect v2. Sus características incluyen una gran cantidad de mejoras que podrían permitir un análisis facial mucho más completo y versátil que el que es capaz de hacer la primera versión del sensor. Entre estas características mejoradas con respecto a su predecesor, Kinect v2 es capaz de detectar y rastrear simultáneamente seis rostros, proporciona imágenes de 1920x1080 píxeles a una tasa de 30 imágenes por segundo, permite detectar 2000 puntos faciales frente a los 121 de Kinect, y la imagen tridimensional captada por la cámara posee una resolución mucho mayor. Todas estas mejoras con respecto del sensor empleado en el proyecto convierten a Kinect v2 en una herramienta con un gran potencial para incrementar la calidad y complejidad del análisis de expresiones faciales realizado. Por ello, una de las - 138 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect principales tareas a realizar sobre este proyecto sería estudiar en profundidad las características de este nuevo sensor y analizar la viabilidad de efectuar un cambio de tecnología. - 139 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect - 140 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Capítulo 9 GUÍA DE USO DE LA HERRAMIENTA En este capítulo se explican de forma esquemática y concisa los pasos que un usuario debe dar para emplear correctamente las herramientas desarrolladas. Para ello, este manual de usuario se ha descompuesto en los siguientes apartados: Requisitos del sistema. Conexión de la cámara y adquisición de la información facial. Extracción y análisis de resultados mediante las funciones de Matlab. Uso de la herramienta de análisis visual de resultados. 9.1 Requisitos del sistema Las herramientas desarrolladas en este proyecto han sido pensadas para funcionar en un ordenador con el sistema operativo Windows 7 o superior, y un procesador Intel Core i-7 para garantizar la estabilidad y velocidad de proceso necesaria. Además, para poder utilizar todas las herramientas el usuario debe disponer de los siguientes programas instalados en su ordenador: Matlab: Descargable desde la página www.mathworks.com, con un período de prueba de un mes. Windows Media Player 7 o superior: Disponible de forma nativa en todos los ordenadores con sistema operativo Windows 7 o posterior, y actualizable desde la página de Microsoft para aquellos sistemas operativos anteriores. - 141 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect 9.2 Herramienta de Captura Conexión de la cámara y adquisición de la información facial La conexión de la cámara con el ordenador se realiza de forma sumamente sencilla, siendo necesario conectar el cable de alimentación a una fuente de corriente y el cable USB a un puerto USB del ordenador. La primera vez que se conecte al ordenador, Windows buscará e instalará automáticamente los drivers necesarios para poder emplear la cámara en dicho ordenador. Una vez la cámara está conectada y los drivers instalados, se debe abrir la aplicación de adquisición “\Proyectos\Reconocimiento de información Facial\V facial, 2.0\Face ubicada en el directorio Tracking\bin\x86\Debug\ FaceTrackingBasics.exe”. Al abrir la aplicación aparecerá un interfaz como el que se muestra a continuación: - 142 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Los botones de la parte inferior sirven para variar la elevación del ángulo de la cámara. Para iniciar la adquisición de imágenes e información facial en tiempo real bastará con pulsar el botón “Grabar”, que cambiará su título por “Detener” hasta que se decida finalizar la grabación pinchando de nuevo sobre el botón. Al inicio de la grabación, se crearán automáticamente dos carpetas en el mismo directorio que el ejecutable de la aplicación llamadas “FaceData”, que contiene la información facial de todos los fotogramas almacenados en ficheros de texto, e “ImageData”, que almacena las imágenes captadas por la cámara Kinect. 9.3 Herramienta de extracción y análisis de resultados Una vez almacenados los datos con la aplicación de adquisición de información facial, se debe mover las carpetas “ImageData” y “FaceData” dentro del directorio que contiene las funciones de Matlab. Dicho directorio es “\MATLAB”. En primer lugar se deben extraer los parámetros faciales de los fotogramas almacenados empleando para ello la función ExtraerParametros de la siguiente forma: [Parametros] = ExtraerParametros('FaceData'); De este modo, la matriz Parametros contiene los nueve parámetros asociados a cada uno de los fotogramas de la grabación. A continuación, mediante la función RostroNeutro se infieren automáticamente los parámetros del rostro neutro de la persona. [Neutro] = RostroNeutro(Parametros); Una vez se ha inferido el rostro neutro de la persona, se puede proceder a extraer los parámetros relativos de todos los fotogramas. [Parametros] = ExtraerRelativos(Parametros,Neutro); - 143 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Una vez se han obtenido los parámetros relativos al rostro neutro inferido de la persona, se puede proceder a realizar una clasificación de los datos obtenidos. Para ello se debe llamar a la función resultados de la siguiente forma: [Respuesta] = Resultados(Parametros); De esta manera, la matriz respuesta queda conformada por dos columnas, la primera representando las respuestas del árbol de decisión de la alegría y la segunda las del árbol del desagrado. De esta forma cada fila representa un fotograma y contiene dos números, significando un 0 la ausencia de la emoción y un 1 su presencia. Si se desea se pueden guardar los resultados obtenidos en un fichero de texto mediante la función GuardarResultados con el fin de poderlos emplear en la herramienta de análisis visual de resultados y poder cargarlos usando CargarResultados para evitar tener que realizar el análisis de los datos de nuevo. GuardarResultados(Respuesta,’Fichero’); [Respuesta] = CargarResultados(‘Fichero’); Si se desea analizar gráficamente los resultados generados por los árboles de decisión, se debe emplear las funciones PintarAlegría y PintarDesagrado, que muestran en pantalla una nube de puntos que representa dichos resultados, como ya se explicó anteriormente. Presencia de la emoción Ausencia de la emoción Fotograma - 144 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Por otro lado, la función Porcentajes permite realizar un análisis segmentando el vídeo en las distintas escenas que lo dividen, y observar el porcentaje de tiempo que un usuario manifiesta una determinada emoción. La última función de análisis de resultados se llama PuntosCalientes que, tras sumar las matrices de resultados de las grabaciones que se quiera observar en conjunto, aporta una visión de los momentos de un vídeo que más despiertan una de las emociones analizadas. 9.4 Herramienta de análisis visual de resultados Para poder emplear esta herramienta, es necesario copiar en primer lugar el archivo de texto que contiene los resultados generados previamente en Matlab a la carpeta del archivo ejecutable: “\Proyectos\Análisis de Resultados \ Analizador\ bin\Debug\”. También es necesario copiar la carpeta que contiene las imágenes faciales captadas por Kinect “ImageData” dentro de ese mismo directorio. A continuación, dentro del mismo directorio se debe ejecutar la aplicación Analizador.exe, que abrirá una interfaz como la mostrada a continuación. - 145 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect La interfaz de la aplicación resulta sumamente sencilla, presentando en la parte inferior derecha un menú de navegación que permite reproducir la sesión fotograma a fotograma mediante el uso de los botones Anterior y Siguiente, reproducir de forma continua la grabación presionando el botón Play. Por otro lado, las gráficas de la parte superior derecha muestran los resultados de los árboles de clasificación para cada fotograma de la sesión, mientras que las imágenes de la izquierda permiten observar de forma simultánea la grabación expuesta a los voluntarios y la reacción de éstos. Finalmente, existe una forma de navegación rápida sobre la sesión, que consiste en desplazar las gráficas con la barra de control inferior y hacer doble clic en el fotograma deseado (indicado por el cuadro de fotograma actual). - 146 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect Capítulo 10 BIBLIOGRAFÍA [PANT00] - “Automatic Analysis of Facial Expressions: The State of the Art”. Maja Pantic, Leon J.M. Rothkrantz. Diciembre 2000 [SAMA91] – “Automatic Recognition and Analysis of Human Faces and Facial Expressions: A Survey”. A. Samal, P.A. Iyengar. Junio 1991. [EKMA02] – “Facial Action Coding System”. Paul Ekman, Wallace V. Friesen, Joseph C. Hager. Estados Unidos 2002. [OTSU96] - “Recognition of Facial Expressions Using HMM with Continuous Output Probabilities”. T. Otsuka, J. Ohya. Noviembre 1996. [EKMA92] – “Facial Expression and Emotion”. Paul Ekman. Abril 1992 [EKMA06] - “Darwin and Facial Expression: A Century of Research in Review”. Paul Ekman. Agosto 2006 [ALBA12] – “C# 5.0 in a Nutshell: The Definitive Reference”. J. Albahari, B. Albahari. Junio 2012. [HANS11] – “Mastering MATLAB”. Duane C. Hanselman, Bruce L. Littlefield. Octubre 2011. [TROE12] – “Pro C# 5.0 and the .NET 4.5 Framework (Expert's Voice in .NET)”. Andrew Troelsen. Agosto 2012. [BLAC97] “Recognizing Facial Expressions in Image Sequences Using Local Parameterized Models of Image Motion”. M.J. Black, Y. Yacoob. 1997. - 147 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect [COTT91] “EMPATH: Fface, Emotion, Gender Recognition Using Holons”. G.W. Cottrell, J. Metcalfe. 1991. [EDWA98] “Face Recognition Using Active Appearance Models”. G.J. Edwards, T.F. Cootes, C.J. Taylor. 1998. [ESSA97] "Coding, Analysis Interpretation, Recognition of Facial Expressions". I. Essa, A. Pentland. Julio 1997. [HONG98] "Online Facial Expression Recognition Based on Personalized Galleries". H. Hong, H. Neven, C. von der Malsburg, 1998. [HUAN02] “Facial Expression Recognition Using Model-Based Feature Extraction and Action Parameters Classification”. C.L. Huang, Y.M. Huang,. 2002 [KEAR93] "Machine Interpretation of Emotion: Design of Memory-Based Expert System for Interpreting Facial Expressions in Terms of Signaled Emotions (JANUS)". G.D. Kearney, S. McKenzie. 1993. [KIMU97] "Facial Expression Recognition and Its Degree Estimation". S. Kimura, M. Yachida. 1997. [KOBA97] "Facial Interaction between Animated 3D Face Robot and Human Beings". H. Kobayashi, F. Hara. 1997. [KOBA92] "Recognition of Six Basic Facial Expressions and Their Strength by Neural Network". H. Kobayashi, F. Hara. 1992. [LYON99] "Automatic Classification of Single Facial Images". M.J. Lyons, J. Budynek, S. Akamatsu. 1999. [MASE91] "Recognition of Facial Expression from Optical Flow". K. Mase. 1991. - 148 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect [MATS93] "Recognition of Facial Expression with Potential Net". K. Matsuno, C.W. Lee, S. Tsuji. 1993. [MOSE95] "Determining Facial Expressions in Real Time". Y. Moses, D. Reynard, A. Blake. 1995. [OTSU98] "Spotting Segments Displaying Facial Expression from Image Sequences Using HMM". T. Otsuka, J. Ohya. 1998. [PADG96] "Representing Face Images for Emotion Classification". C. Padgett, G.W. Cottrell. 1996. [PANT00] "Expert System for Automatic Analysis of Facial Expression". M. Pantic, L.J.M. Rothkrantz. 2000. [RAHA91] "A Neural Network Approach to Component versus Holistic Recognition of Facial Expressions in Images". A. Rahardja, A. Sowmya, W.H. Wilson. 1991. [ROSE94] "Human Emotion Recognition from Motion Using a Radial Basis Function Network Architecture". M. Rosenblum, Y. Yacoob, L. Davis. 1994. [USHI93] "Recognition of Facial Expressions Using Conceptual Fuzzy Sets". H. Ushida, T. Takagi, T. Yamaguchi. 1993. [VANG95] "Applications of Synergetics in Decoding Facial Expression of Eemotion". P. Vanger, R. Honlinger, H. Haken. 1995. [WANG98] "Expression Recognition from Time-Sequential Facial Images by Use of Expression Change Model". M. Wang, Y. Iwai, M. Yachida. 1998. [YACO94] "Recognizing Facial Expressions by Spatio-Temporal Analysis". Y. Yacoob, L. Davis. 1994. - 149 - Reconocimiento de expresiones faciales mediante imágenes adquiridas con cámara Kinect [YONE97] "Facial Expressions Recognition Using Discrete Hopfield Neural Networks". M. Yoneyama, Y. Iwano, A. Ohtake, K. Shirai. 1997. [ZHAN98] "Comparison between Geometry-Based and Gabor Wavelets-Based Facial Expression Recognition Using Multi-Layer Perceptron". Z. Zhang, M. Lyons, M. Schuster, S. Akamatsu. 1998. [ZHAO96] "Classifying Facial Emotions by Backpropagation Neural Networks with Fuzzy Inputs". J. Zhao, G. Kearney. 1996. [PAUL_EKMAN] http://www.paulekman.com/ [SCIENCE_DIRECT] http://www.sciencedirect.com/ [IEEEXPLORE] http://ieeexplore.ieee.org/ [MATHWORKS_HELP] www.mathworks.es [KINECT_SDK_HELP] http://msdn.microsoft.com/ [KINECT_WEB] http://www.microsoft.com/en-us/kinectforwindows/ [WEKA_WEB] http://www.cs.waikato.ac.nz/ml/weka/ [W3C_WEB] http://www.w3c.es/ [GNU_WEB] http://www.gnu.org/licenses/gpl.html - 150 -