reconocimiento de expresiones faciales mediante imágenes

Anuncio
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 -
Descargar