Projet image 2016 : Transfert d'animation: animer des personnages virtuels par le jeu et le mime

De Ensiwiki
Aller à : navigation, rechercher
Project schedule.png
Titre du projet Transfert d'animation 3D : animer des personnages virtuels par le jeu et le mime
Cadre Projets de spécialité
Page principale Projets de spécialité image

Encadrants Remi Ronfard, Adela Barbulescu

Étudiants

Présentation et objectifs

Ce projet est le produit de la collaboration des équipes IMAGINE et PRIMA de l'INRIA et a déjà été l'objet d'un sujet de projet de spécialité l'an dernier. Le principe global du projet est le suivant : permettre à un utilisateur de jouer avec des figurines devant un système de capture, tel un enfant s'amusant avec ses jouets, et créer une scène en trois dimensions à partir de ces données. Le but final serait de permettre à des enfants d'utiliser ce système et qu'ils voient le résultat de leur jeu sous forme de dessin animé.

Le système de capture se présente comme suit :

Système de capture du projet Figurines

Il est constitué de deux caméras Kinect, une filmant le narrateur, et une filmant la scène d'au dessus. Les figurines sont également équipées d'accéléromètres.

Notre sujet de projet se concentre sur la performance d'acteur du narrateur devant le système de capture. Il s'agit de reporter sur les personnages de ma scène 3D les expressions du narrateur en train de jouer, afin de donner une illusion de dialogue. Pour cela, trois objectifs nous ont été donnés :

- Déterminer quel personnage a le focus. En effet le narrateur a un rôle de marionnettiste, il doit animer plusieurs figurines en même temps, et il faut pouvoir décider à quel personnage dans la scène on affecte ses performances, notamment la parole.

- Transférer les expressions du narrateur. Il se trouve qu'on ne souhaite pas transférer directement toutes les expressions du narrateur au personnage, par exemple puisque le narrateur regarde les figurines qui sont en dessous de lui sur une table, il regarde vers le bas, et on souhaite relever ce regard dans la scène animée pour les personnages.

- Animer l'interlocuteur. Avec les deux parties précédentes on détermine quel personnage doit être animé et quelles expressions lui attribuer. Mais de fait l'interlocuteur n'a aucune donnée pour être animé, or il faut lui affecter un comportement pour que la scène reste réaliste.

Travail effectué

Suite au travail que nous avons effectué et que nous décrivons si après, nous avons réussi à obtenir le résultat final suivant :

Fichier:C VideoFinale.avi

Données d'entrée

Pour ce projet nous avons eu trois types de données à analyser :

- Le son de la performance : analysé à l'aide du logiciel Praat, on peut en extraire des caractéristiques à chaque frame, comme la hauteur, l'intensité, le timbre.

- Les expressions du narrateur : le logiciel Faceshift permet d'extraire 59 paramètres de performance du narrateur : l'orientation (un quaternion donc 4 paramètres), les translations (3 paramètres), la direction du regard pour chaque œil (un pitch et un yaw) et 48 blendshapes qui sont la représentation des muscles faciaux pour le logiciel Blender.

- Le mouvement des figurines : chaque figurine est équipée d'accéléromètres, et ceux-ci permettent, à l'aide de la caméra Kinect située au dessus de la scène, d'avoir les données des positions des figurines à chaque instant de la performance.


Insérer les données d'entrée dans la scène directement permet d'avoir le résultat suivant : les figurines en mouvement, les expressions du narrateur, et le son.


Données brutes dans la scène

Détermination du focus

Quand on voit une performance d'un conteur avec des figurines, comment sait-on qui il fait parler ?

On peut s'appuyer sur le ton qu'il prend, sur les mouvements qu'il donne aux figurines, et l'orientation de son regard.

On a donc trois scripts pythons qui donnent chacun leur interprétation de la scène, et on a un script qui détermine en fonction de ces données comment on répartit finalement les expressions faciales du conteur

Analyse de la voix

La voix est le facteur auquel on pense en premier quand on se demande comment identifier le locuteur à partir de la performance d'un narrateur. A quelles données en particulier pense-t-on ?

- Le pitch de la voix (une voix aigue pour les femmes et les enfants, une voix grave pour les hommes et les monstres)

- Le speechrate (les monstres et les méchants parlent plus lentement)

On a utilisé le logiciel d'analyse phonologique Praat, et avons écrit des scripts permettant de générer pour chaque phrase le pitch moyen et le speechrate moyen de la phrase.

PitchTestLong.png

Ce diagramme correspond à un test on on réalise un dialogue en parlant avec une voix très aiguë et une voix très grave. Les phrases sont triées par ordre de pitch moyen. On voit distinctement deux courbes, et nous avons réalisé un script qui établit le pitch limite au-delà duquel on attribue à un personnage ou à l'autre.

PitchTestSystemePrinceSorciere.png

En revanche, dans un test plus réaliste, le conteur ne peut pas tenir la cadence en alternant entre une voix très aiguë et une voix très grave : il finit par se calmer et donne aux personnages des voix tout juste différentiables. On voit sur cet histogramme que sur le test final, il n'est plus possible de réaliser de distinction entre deux personnages, bien qu'il soit possible de différencier les voix quand on écoute le dialogue.

Il s'agit là d'une difficulté de ce travail : il est plus simple de différencier deux locuteurs différents, qui ont des timbres de voix différents, que de différencier deux personnages joués par un même conteur.

Ainsi, face à l'impossibilité de l'exploitation du pitch et du speechrate, nous avons établi une nouvelle stratégie :

Dans sa version finale, le script d'analyse de la voix se sert de l'intensité et abandonne le pitch et le speechrate s'ils ne sont pas clairement différenciés. Sa fonction principale est devenue de déterminer si oui ou non un locuteur parle, et le travail d'identification du locuteur est reporté sur l'analyse du mouvement des figurines et du regard du narrateur.

Analyse du regard

eyeAnalysis v1

Nous avons implémenté différentes versions de ce script que nous allons présenter ci-dessous.


La première version consiste à simplement détecter si le narrateur regarde à droite ou à gauche, en supposant que les personnages ne vont pas trop se déplacer.


Nous avons également testé divers paramètres pour cette version :

- le paramètre d'écart, qui fait en sorte que l'on juge qu'il y a du silence si le narrateur regarde à peu près en face

- le paramètre de variation, afin d'enlever les mouvements parasites lorsque l'on change rapidement de regard entre les personnages 1 et 2. En effet nous ne voulons pas transférer cette rotation de la tête à nos personnages en 3D, donc ce paramètre permet de juger qu'il y a du silence lorsque l'on regarde à peu près en face et que le regard a beaucoup varié sur les dernières frames.

eyeAnalysis v2


La seconde version est ambitieuse, il s'agit de faire des cônes de visions autour des personnages, puis de juger si on est dans un cône ou non pour savoir si l'on regarde un personnage ou non, en gérant le cas des cônes non disjoints. Cette version était toutefois difficile à implémenter, notamment en raison de la complexité du système d'axes (les deux kinects avaient des axes, unités et origines différentes), et de l'imprécision des mesures en général, notamment la position des figurines.


De plus, nous avons constaté à ce moment là que l'analyse du regard était peu fiable pour détecter les silences, nous avons donc pensé à faire en sorte que le regard détermine uniquement quel personnage parle, en supposant qu'il y en ait un qui parle.


eyeAnalysis v3


Dans cet esprit là, nous avons implémenté une dernière version plus simple, qui calcule l'angle de regard correspondant à un regard entre les deux figurines, puis détermine de quel côté on est en train de regarder.


C'est assez largement la méthode la plus fiable que nous ayons obtenue : Si l'on sait qu'un personnage parle à une frame donnée, il y a en moyenne 85% de chances que l'analyse du regard détermine qui parle, dans le cas d'un cas non pathologique (nous allons expliciter la méthode de test un peu plus bas)

Analyse des mouvements

Les mouvements des figurines sont la troisième donnée à analyser pour déterminer le personnage qui a le focus. Nous avons étudié nos comportements naturels lors de la capture et constaté qu'un narrateur à tendance à plus mouvoir la figurine qui est en train de parler, donc qui a le focus, que son interlocuteur. Ainsi pour déterminer grâce aux mouvements quel personnage doit être animé avec les expressions du narrateur à une frame donnée, nous calculons les variations des mouvements des deux figurines sur les X dernières frames (X étant un paramètre qui nous avons fait varier pour détecter lequel correspondait le mieux au résultat souhaité), et le personnage ayant eu le plus de variations est celui à qui aura le focus.

Variations des mouvements des figurines

Choix du focus en fonction des résultats des trois méthodes

ProcessDiagram.png

Comme on le voit sur ce diagramme, après avoir analysé le son, les mouvements des figurines et les expressions faciales, il faut décider comment trancher parmi les trois informations renvoyées : comment faire si l'analyse des yeux dit qu'il faut choisir le personnage 1 et si l'analyse des mouvements de figurine dit qu'il faut choisir le personnage 2 ?

C'est un problème complexe, et il a été résolu en faisant appel à une technique d'apprentissage automatisé :

On étiquette les données d'entrée pour obtenir une vérité terrain qui fixe de façon certaine : "Le personnage 1 parle de la frame 1 à la frame 100 et le personnage 2 parle de la frame 101 à la frame 350" etc.

On utilise le logiciel Praat pour réaliser l'étiquetage facilement, et on a écrit un script permettant de le formater correctement pour l'utiliser dans l'apprentissage automatisé.

L'apprentissage automatisé compare les données renvoyées par le son, les mouvements et le regard à la vérité terrain et choisi pour ces trois fonctions les meilleurs paramètres. Ces trois fonctions utilisent des paramètres qu'on a gardé variables (par exemple, le seuil d'intensité à partir duquel on considère qu'un son est du silence, le coefficient de lissage des mouvements, le meilleur offset angulaire à appliquer pour le regard, etc. Il existe en tout une quinzaine de ces paramètres, et on détermine par force brute la meilleure combinaison pour être le plus proche de la vérité terrain.

La première version de cet apprentissage ne renvoyait pas de résultats convaincants, notamment parce que la première version de l'analyse de la voix renvoyait de mauvais résultat.

On a donc codé une deuxième version de cet apprentissage, qui tire de la voix seulement l'information "une phrase est prononcée" et qui tire de l'analyse de la voix et du regard qui prononce ladite phrase.

Cette seconde version donne des résultats très convaincants pour l'attribution des phrases : sur le rendu final 85% des frames sont attribuées correctement.

On note que notre système nécessite une première phase d'apprentissage du narrateur et de sa façon de conter pour bien fonctionner, et mémorise les meilleurs paramètres pour le conteur.

Transfert des expressions

La deuxième partie du projet consiste à transférer les bonnes expressions du narrateur sur le personnage qui a le focus. Pour cela on veut automatiser certaines actions :

- Relever les têtes et les regards des personnages

- Orienter les bustes pour que les personnages se regardent

- Accentuer l'ouverture des yeux des personnages (le fait de regarder vers le bas donnant une impression d'yeux fermés)


Expressions transférées


En addition de ces actions, une problématique se pose vis à vis des silences. En effet certaines performances du narrateur ne sont pas liées au dialogue et doivent être transmises au bon personnage sans avoir pourtant de données indiquant auquel elles s'appliquent, par exemple un sourire. En revanche d'autres performances ne doivent pas être transmises, par exemple le mouvement de tête lié au passage du regard d'un personnage à l'autre entre deux répliques. La distinction entre ces deux expressions n'est pas détectable à notre niveau de données, mais une analyse sémantique poussée des expressions du visage pourrait permettre de détecter quelles performances silencieuses sont à transférer ou non.

Animation idle

Le troisième grand objectif de ce projet est de donner une animation idle au personnage qui ne parle pas.

FocusIdle.png


Dans un premier temps, nous avons rempli les blancs en générant une interpolation linéaire depuis la dernière frame ou le personnage a le focus, jusqu'à la premièer frame où il le reprend. L'interpolation est réalisée sur les translations et rotations de la tête et des yeux, et sur les 48 blendshapes qui gèrent les mouvements faciaux. Il s'agit d'une version pas du tout naturelle bien sûr : la transition lente du personnage vers sa prochaine prise de parole lui donne un air figé qui ne convient pas.

C'est pourquoi intervient l'animation Idle. C'est quelque chose de fréquent en jeu vidéo par exemple : on anime le personnage lorsqu'aucun input ne lui dicte l'animation à prendre.

FocusIdle 2.png

Comme on le voit ci-dessus, on interpole sur une seconde entre la phase de focus et la phase Idle pour conserver la continuité.

Deux façons permettent de générer l'animation Idle :

- On filme avec kinect une personne qui ne fait rien et on enregistre ses mouvements comme l'animation Idle à retranscrire.

- On travaille directement sur les blendshapes, qui correspondent aux expressions faciales, pour donner une expression neutre à un personnage.

On a choisi cette deuxième option, et on a tenté de l'améliorer en ajoutant un bruit de Perlin pour simuler les variations naturelles du visage. Notre première approche, naïve, fut de l'appliquer sur tous les blendshapes du visage : le personnage Idle parait alors plus naturel, mais parfois des tics nerveux animent son visage. Il ne faut pas que ce personnage attire trop l'attention, alors nous n'avons pas gardé cette méthode pour l'implémentation finale ; mais c'est définitivement une direction intéressante à concevoir si on est judicieux dans le choix des Blendshapes à travailler.

Conclusion

Un pas dans le monde de la recherche

Ce projet était extrêmement intéressant, notamment parce qu'il s'agissait d'un projet de recherche : au commencement, nous ne savions pas ce qui était réalisable, et ce fut notre rôle de déterminer ce qui pouvait être réalisé, et de le réaliser. Ainsi, nous avons découvert certaines règles concernant le jeu et le mime - par exemple :

- Le mouvement d'une figurine détermine automatiquement le locuteur, à moins qu'il s'agisse d'une action trop complexe

- Le regard détermine assez bien le locuteur, mais il a tendance à changer avant la fin de la phrase : le narrateur passe déjà à la figurine suivante alors qu'il termine sa phrase

Limitations du projet

Ce projet comportait des limitations conséquentes, en particulier concernant les systèmes de tests : le système d'enregistrement était très contraint : deux kinects, un accéléromètre pour chaque figurine, et les son, et le tout doit être correctement synchronisé et formaté. Ce travail était réalisé par l'équipe nous encadrant, et prenait du temps. La mise en place du système était également chronophage : il nous fut possible de réaliser nos enregistrements le lundi de la dernière semaine seulement, et nous avons obtenu les données des mouvements des figurines le jeudi seulement, la veille de la soutenance.

Ainsi, nous avions très peu de tests unitaires, et nous avons travaillé sur des enregistrements fournis par Adela BARBULESCU, notre interlocutrice dans l'équipe Imagine.

Résultats et pérennité

Ainsi, les résultats sont plutôt prometteurs et laissent imaginer qu'il s'agit d'une voie dans laquelle il est possible de continuer :

- On rappelle qu'il existait l'année dernière un projet de spécialité sur le jeu et le mime, qui consistait à donner des animations de déplacement aux animations des figurines lorsqu'on les déplace, et il serait tout à fait envisageable de former un système abouti qui fusionne les deux projets

- Pour des projets de spécialité des années suivantes, on pourrait imaginer des interactions entre différentes figurines, par exemple pour mimer un baiser ou un combat.

Références

[1] Equipe Prima de l'Inria Grenoble, Projet Figurines

[2] M.Nitsche, A.Mazalek, P.Clifton, Moving Digital Puppets

[3] O.Mayora, C.Costa, A.Papliatseyeu, iTheater Puppets, Tangible Interactions for Storytelling