-
Notifications
You must be signed in to change notification settings - Fork 0
Progreso marzo 2022
SEMANA 1 (9/03/2022 - 16/03/2022)
SEMANA 2 y 3(16/03/2022 - 30/03/2022)
- Definición de los parámetros de rendimiento de un modelo de clasificación
- Mejoras en el proceso del entrenamiento
- Nuevo método para abordar el entrenamiento (ángulos)
Objetivo: mejorar la eficiencia de nuestro entrenamiento y analizar un rostro 3D para comprobar que nuestra hipótesis de distancias se cumple.
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%.
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.
Durante esta semana he encontrado varios proyectos que podrían ser de interés para el desarrollo del TFG.
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
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.
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.
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í.
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.
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.
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
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.
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.