Skip to content
This repository has been archived by the owner on Dec 20, 2022. It is now read-only.

Progreso marzo 2022

Javier Martínez edited this page Mar 29, 2022 · 28 revisions

Índice

SEMANA 1 (9/03/2022 - 16/03/2022)

SEMANA 2 y 3(16/03/2022 - 30/03/2022)

Semana 1 (9/03/2022 - 16/03/2022)

Objetivo: mejorar la eficiencia de nuestro entrenamiento y analizar un rostro 3D para comprobar que nuestra hipótesis de distancias se cumple.

Mejoras en el proceso del entrenamiento

En este apartado llevaremos a cabo posibles mejoras en el proceso de entrenamiento, con el objetivo principal de mejorar el porcentaje de acierto que actualmente el mejor resultado es 48%.

Mejora 1 (uso de distancias 3D en vez de 2D)

En la última prueba, para calcular las distancias, únicamente estábamos usando las variables (x, y) de cada uno de los puntos elegidos. En cambio, MediaPipe además es capaz de predecir la profundidad de los puntos de la malla obteniendo así coordenadas 3D (x, y, z). La coordenada z representa la profundidad siendo el origen el centro de la cabeza.

# Matriz de confusión
[[ 40   9 193 294  75  57]
 [ 19  22 131 289  92 119]
 [ 11   8 923 230  81  53]
 [  6  13  78 671  80  28]
 [  9  13 126 426 189  28]
 [  9  14  71 113  12 354]]

              precision    recall  f1-score   support

           0       0.43      0.06      0.10       668
           1       0.28      0.03      0.06       672
           2       0.61      0.71      0.65      1306
           3       0.33      0.77      0.46       876
           4       0.36      0.24      0.29       791
           5       0.55      0.62      0.58       573

    accuracy                           0.45      4886
   macro avg       0.43      0.40      0.36      4886
weighted avg       0.44      0.45      0.39      4886

Sorprendentemente los resultados han sido todavía peores y he llegado a la conclusión de que es culpa del dataset de imágenes, así que la siguiente mejora será cambiar de imágenes al crear nuestro dataset de distancias.

Proyectos de interés

Durante esta semana he encontrado varios proyectos que podrían ser de interés para el desarrollo del TFG.

Análisis de las expresiones con modelos 3D

Como hemos dicho anteriormente, MediaPipe es capaz de generar una malla 3D que cubra nuestra cara ofreciéndonos distintos puntos faciales con profundidad. Sabiendo esto sería interesante analizar en 3D distintas expresiones faciales de cara a realizar nuestro entrenamiento de la manera más precisa posible.

  • Face Builder + Live Link Face

Tras estar investigando descubrí que hay disponible un Add-On (FaceBuilder) para Blender que permite crear un modelo en 3D de tu cara usando fotos realizadas desde distintos ángulos. Únicamente tienes que ajustar la malla que proporciona el plugin en cada una de las fotos.

Tras realizar este proceso, el plugin procesa automáticamente las mallas y crea un modelo en 3D con la forma de tu cabeza.

Llegados a este paso quería poder cambiar las expressiones de ese modelo, en principio la idea más fácil era usar las herramientas de deformación pero de esa manera no conseguía un resultado nada preciso y deformaba mucho el rostro. Buscando una manera de poder animar la cara de manera automática con algún otro puglin me encontré con la aplicación Live Link Face para IPhone y IPad que dispongan de cámaras de profundidad.

Esta aplicación te permite animar personajes de Unreal Engine en tiempo real, pero además te permite realizar grabaciones directamente desde el IPad y guardar los datos en un fichero csv. Este fichero lo he podido cargar en Blender y de esta manera animar mi modelo 3D con mis propias expresiones.

  • MediaPipe en Blender

Indagando más en este mundo encontré un script de Python que se podía usar en Blender para visualizar en tiempo real la malla facial de MediaPipe que justo estamos usando en este proyecto. Este script es PosePipe.py de SpectralVector/PosePipe

Control de un personaje 3D usando MediaPipe

Fuente: https://github.com/AlexanderNT24/Control-De-Un-Personaje-3D-Usando-MediaPipe
Proyecto para controlar un personaje 3D mediante expresiones faciales usando el cálculo de distancias entre distintos puntos de la malla de Mediapipe.

Detección de emociones basado en malla facial MediaPipe

Fuente: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8828335/
Proyecto interesante en el que al igual que nosotros, entrenan un modelo de aprendizaje automático para detectar emociones. Ellos en vez de usar las distancias entre puntos están creando una malla (partiendo de MediaPipe) a la que llaman "emotion face mesh" la cual se usará de la siguiente manera.

The mesh yields 27 vertices and 38 edges. Deformation of emotion face mesh measured by the deviation of angles between edges reflects facial muscle contraction and relaxation, which will be used to identify facial emotions.

image

Semana 2 (16/03/2022 - 23/03/2022)

Definición de los parámetros de rendimiento de un modelo de clasificación

Algo que tendría que haber hecho desde hace tiempo es informarme del significado de cada uno de los parámetros que nos reportan el rendimiento de nuestro modelo: confusion matrix, precision, recall, f1-score, accuracy

En este apartado explicaré en que consiste cada uno de ellos para así estudiar los resultados de los modelos de manera más precisa:

  • Confusion Matrix: matriz en la que se enfrentan los datos reales con las predicciones.

Por ejemplo en la tabla anterior hay 16 personas que están felices de verdad y de esas 16 el modelo ha dicho que 12 están felices, 3 tristes y 1 sorprendida. Viendo la matriz podemos ver que la clase Triste estaría obteniendo los peores resultados.

  • Precision: de las predicciones que ha hecho indica que porcentaje de ellas son realmente correctas.

  • Recall: de los datos reales indica que porcentaje están bien predichos.

  • F1-Score: la media ponderada entre Precision y Recall, es útil cuando tratamos con datos equilibrados (osea la misma cantidad de datos para todas las clases)

  • Accuracy: la suma de los aciertos entre el número total de muestras, osea el porcentaje de acierto. Pero esto sólo es fiable cuando poseemos datos equilibrados.

Más información aquí.

Mejoras en el proceso de entrenamiento

Mejora 2 (cambio de dataset)

Seguimos con el apartado de mejoras en el proceso de entrenamiento que habíamos dejado aparcado aquí. En este caso realizaré el entrenamiento con un nuevo dataset de imágenes más acorde a nuestras necesidades que el anterior.

El dataset es The Extended Cohn-Kanade Dataset (CK+)[1][2]


[1] Kanade, T., Cohn, J. F., & Tian, Y. (2000). Comprehensive database for facial expression analysis. Proceedings of the Fourth IEEE International Conference on Automatic Face and Gesture Recognition (FG'00), Grenoble, France, 46-53.

[2] Lucey, P., Cohn, J. F., Kanade, T., Saragih, J., Ambadar, Z., & Matthews, I. (2010). The Extended Cohn-Kanade Dataset (CK+): A complete expression dataset for action unit and emotion-specified expression. Proceedings of the Third International Workshop on CVPR for Human Communicative Behavior Analysis (CVPR4HB 2010), San Francisco, USA, 94-101.


Los tipos de emociones generales disponibles en dicho dataset son:

  • Clase 1: anger
  • Clase 2: contempt
  • Clase 3: disgust
  • Clase 4: fear
  • Clase 5: happy
  • Clase 6: sadness
  • Clase 7: surprise

Generando un dataset de distancias 3D para todas esas clases los resultados fueron los siguientes.

# Matriz de confusión
[[ 3  0  5  0  0  0  0]
 [ 3  0  2  0  0  0  0]
 [ 0  0 11  0  2  0  0]
 [ 0  0  1  0  3  2  1]
 [ 0  0  0  0 12  0  0]
 [ 1  0  6  0  0  0  0]
 [ 0  0  1  0  0  0 13]]

precision    recall  f1-score   support

           1       0.43      0.38      0.40         8
           2       0.00      0.00      0.00         5
           3       0.42      0.85      0.56        13
           4       0.00      0.00      0.00         7
           5       0.71      1.00      0.83        12
           6       0.00      0.00      0.00         7
           7       0.93      0.93      0.93        14

    accuracy                           0.59        66
   macro avg       0.36      0.45      0.39        66
weighted avg       0.46      0.59      0.51        66

Con la estrategia actual el modelo es incapaz de hacer predicciones correctamente para las clases 2, 4 y 6. Probando a generar un nuevo dataset (igual que el anterior) sin dichas clases, los resultados del entrenamiento son los siguientes.

# Matriz de confusión
[[ 1  5  0  0]
 [ 0  9  1  0]
 [ 0  2 17  0]
 [ 0  0  0 17]]

              precision    recall  f1-score   support

           1       1.00      0.17      0.29         6
           3       0.56      0.90      0.69        10
           5       0.94      0.89      0.92        19
           7       1.00      1.00      1.00        17

    accuracy                           0.85        52
   macro avg       0.88      0.74      0.72        52
weighted avg       0.90      0.85      0.83        52

Tenemos un porcentaje de acierto del 85%, pero al no tener la misma cantidad de datos para todas las clases no debemos fiarnos de ese dato. Mirando las demás columnas podemos observar que para la clase 5 y 7 los resultados son muy buenos, para la clase 3 son decentes (tirando a malos) y para la clase 1 son muy malos.

Nuevo método para abordar el entrenamiento (ángulos)

En este apartado iniciaré una nueva estrategia para abordar nuestro problema. Hasta ahora estábamos usando distancias para entrenar nuestro modelo, pues la nueva estrategia será usar ángulos.

Esta idea es propuesta en esta investigación y como primer acercamiento lo que haré será replicar lo mismo que han hecho ellos.

Construcción de una "Emotional Mesh"

Empezaré explicando qué es el Facial Action Coding System (FACS), este se utiliza para denominar movimientos faciales humanos. El movimiento de uno o más músculos faciales se puede codificar con lo que se conoce como AUs (Action Units), estas son independientes de cualquier interpretación.

AU FACS name
1 Inner brow raiser
2 Outer brow raiser
4 Brow lowerer
5 Upper lid raiser
6 Cheek raiser
7 Lid tightener
8 Lips toward each other
9 Nose wrinkler
10 Upper lip raiser
11 Nasolabial deepener
12 Lip corner puller
13 Sharp lip puller
14 Dimpler
15 Lip corner depressor
16 Lower lip depressor
17 Chin raiser
18 Lip pucker
19 Tongue show
20 Lip stretcher
21 Neck tightener
22 Lip funneler
23 Lip tightener
24 Lip pressor
25 Lips part
26 Jaw drop
27 Mouth stretch
28 Lip suck
29 Jaw thrust
30 Jaw sideways
31 Jaw clencher

Por otro lado EMFACS se basa en estudiar la combinación de esas AUs que expresan emociones simples.

Emotion AU
Felicidad 6+12
Tristeza 1+4+15
Sorpresa 1+2+5+26
Miedo 1+2+4+5+7+20+26
Coraje 4+5+7+23
Disgusto 9+15+16
Desprecio 12+14

Sabiendo esto, en el estudio citado al comienzo de este apartado, crean una malla facial basándose en el movimiento de dichos músculos faciales. Dicho en otras palabras, eligen los puntos de la cara más representativos atendiendo a lo que dice FACS y las AUs. Una vez tienen dichos puntos los unen y obtienen una malla como la que podéis ver a continuación. Esta malla es la que denominan "Emotional Mesh".

De esa malla extraerán algunos ángulos y serán esos los que utilicen como datos de entrenamiento.

Estos son los resultados que he conseguido siguiendo sus mismos pasos, nada comparable con lo suyo... Aunque por lo menos ya hemos conseguido predecir más o menos bien todas las clases (desde la 1 a la 7).

# Matriz de confusión
[[ 5  1  1  0  0  1  0]
 [ 1  3  0  0  1  0  0]
 [ 1  0 10  2  0  0  0]
 [ 0  1  1  5  0  0  0]
 [ 0  0  0  1 11  0  0]
 [ 1  1  0  0  0  5  0]
 [ 0  1  0  0  0  0 13]]

precision    recall  f1-score   support

           1       0.62      0.62      0.62         8
           2       0.43      0.60      0.50         5
           3       0.83      0.77      0.80        13
           4       0.62      0.71      0.67         7
           5       0.92      0.92      0.92        12
           6       0.83      0.71      0.77         7
           7       1.00      0.93      0.96        14

    accuracy                           0.79        66
   macro avg       0.75      0.75      0.75        66
weighted avg       0.81      0.79      0.79        66

Elección de los ángulos de entrenamiento (estudio 1)

Como hemos visto anteriormente, el estudio ha elegido los ángulos que indico en el mapa del apartado anterior. Ellos han llegado a la conclusión de que dichos ángulos son los que mejor representan geométricamente cada emoción simple, además nombran que al ser únicamente 10 pues el entrenamiento y desempeño del modelo será mucho más rápido.

Yo propongo estudiar si realmente dichos ángulos son los que **más representan **las emociones del dataset que estamos usando. Para ello en primer lugar partiremos de un mapa con todos y cada uno de los ángulos de la "Emotional Mesh". Únicamente usaremos los de un lado de la cara porque en este primer estudio daremos por hecho que todas las emociones son simétricas.

Para estudiar cuáles de ellos son los más influyentes calcularemos la variación que existe en los ángulos desde una pose neutral de un sujeto hasta la máxima expresión de cada emoción. Esto lo realizaremos para cada imagen del dataset y finalmente haremos la media de cada uno de los ángulos en cada emoción para obtener los siguientes resultados.

Una vez tengamos todos los datos lo siguiente es elegir los 5 ángulos más influyentes en cada expresión:

  • Anger: 2, 12, 1, 16, 15
  • Contempt: 2, 1, 4, 0, 19
  • Disgust: 12, 16, 2, 15, 1
  • Fear: 2, 4, 6, 1, 14
  • Happy: 4, 2, 18, 12, 8
  • Sadness: 2, 1, 12, 16, 14
  • Surprise: 1, 2, 0, 4, 19

Combinándolos todos obtenemos que finalmente los ángulos que más varían son: 2, 12, 1, 16, 15, 4, 6, 14, 18, 8, 0, 19

Los resultados entrenando con dichos ángulos son los siguientes:

# Matriz de confusión
[[ 5  0  1  0  0  2  0]
 [ 1  3  0  0  1  0  0]
 [ 2  0 11  0  0  0  0]
 [ 0  0  0  6  0  1  0]
 [ 0  0  0  2 10  0  0]
 [ 0  1  1  0  0  5  0]
 [ 0  1  0  0  0  0 13]]

              precision    recall  f1-score   support

           1       0.62      0.62      0.62         8
           2       0.60      0.60      0.60         5
           3       0.85      0.85      0.85        13
           4       0.75      0.86      0.80         7
           5       0.91      0.83      0.87        12
           6       0.62      0.71      0.67         7
           7       1.00      0.93      0.96        14

    accuracy                           0.80        66
   macro avg       0.77      0.77      0.77        66
weighted avg       0.81      0.80      0.81        66

Aunque el accuracy sea muy similar al último entrenamiento con los otros ángulos, el f1-score de cada una de las clases es bastante superior por lo tanto hemos conseguido un mejor rendimiento real.

Elección de los ángulos de entrenamiento (estudio 2)

En este segundo estudio (partiendo de los ángulos obtenidos en el apartado anterior) comprobaremos si existe una real asimetría en alguna de las emociones. Para ello calcularemos la variación que hay entre los ángulos del lado izquierdo y del lado derecho. Al igual que en el apartado anterior calcularemos la media para cada uno de los ángulos en cada emoción.

El estudio arroja los siguientes datos.