Menu Fermer

Animation faciale en temps réel pour les avatars

L’expression faciale est une étape essentielle dans la marche de Roblox vers l’intégration du métavers dans la vie quotidienne des gens, grâce à des interactions naturelles et crédibles entre avatars. Cependant, l’animation en temps réel des visages de personnages virtuels en 3D représente un énorme défi technique. Malgré les nombreuses avancées de la recherche, il existe peu d’exemples commerciaux d’applications d’animation faciale en temps réel. C’est particulièrement difficile à Roblox, où nous prenons en charge un éventail vertigineux de dispositifs d’utilisateurs, de conditions du monde réel et de cas d’utilisation très créatifs de la part de nos développeurs.

Dans ce billet, nous décrirons un cadre d’apprentissage profond pour la régression des commandes d’animation faciale à partir de la vidéo qui permet à la fois de relever ces défis et de nous ouvrir à un certain nombre d’opportunités futures. Le cadre décrit dans cet article a également été présenté lors d’une conférence au SIGGRAPH 2021.

Animation faciale

Il existe plusieurs options pour contrôler et animer une matrice de visage 3D. Celle que nous utilisons s’appelle le Facial Action Coding System ou FACS, qui définit un ensemble de contrôles (basés sur le placement des muscles faciaux) pour déformer le maillage du visage 3D. Bien qu’il ait plus de 40 ans, le FACS reste la norme de facto, car ses commandes sont intuitives et facilement transférables d’un rig à l’autre. Vous pouvez voir ci-dessous un exemple d’exercice d’un rig FACS.

Méthode

L’idée est que notre méthode basée sur l’apprentissage profond prenne une vidéo en entrée et produise un ensemble de FACS pour chaque image. Pour y parvenir, nous utilisons une architecture en deux étapes : détection des visages et régression des FACS.

Détection des visages

Pour obtenir les meilleures performances, nous mettons en œuvre une variante rapide de l’algorithme de détection des visages MTCNN, relativement bien connu. L’algorithme MTCNN original est assez précis et rapide, mais pas assez pour permettre la détection des visages en temps réel sur la plupart des appareils utilisés par nos utilisateurs. Ainsi, pour résoudre ce problème, nous avons modifié l’algorithme pour notre cas d’utilisation spécifique : une fois qu’un visage est détecté, notre implémentation MTCNN n’exécute que l’étape finale de l’O-Net dans les images successives, ce qui se traduit par une accélération moyenne de 10 fois. Nous utilisons également les points de repère du visage (emplacement des yeux, du nez et des coins de la bouche) prédits par le MTCNN pour aligner la boîte de délimitation du visage avant l’étape de régression suivante. Cet alignement permet un recadrage serré des images d’entrée, ce qui réduit le calcul du réseau de régression FACS.

Régression FACS

Notre architecture de régression FACS utilise une configuration multitâche qui co-entraîne les points de repère et les poids FACS en utilisant une colonne vertébrale partagée (connue sous le nom d’encodeur) comme extracteur de caractéristiques.

Cette configuration nous permet d’augmenter les poids de FACS appris à partir de séquences d’animation synthétiques avec des images réelles qui capturent les subtilités de l’expression faciale. Le sous-réseau de régression FACS qui est entraîné avec le régresseur de points de repère utilise des convolutions causales ; ces convolutions opèrent sur les caractéristiques dans le temps par opposition aux convolutions qui opèrent uniquement sur les caractéristiques spatiales comme on peut le trouver dans l’encodeur. Cela permet au modèle d’apprendre les aspects temporels des animations faciales et le rend moins sensible aux incohérences telles que la gigue.

Formation

Nous entraînons d’abord le modèle pour la seule régression des points de repère en utilisant des images réelles et synthétiques. Après un certain nombre d’étapes, nous commençons à ajouter des séquences synthétiques pour apprendre les poids du sous-réseau de régression FACS temporel. Les séquences d’animation synthétiques ont été créées par notre équipe interdisciplinaire d’artistes et d’ingénieurs. Un rig normalisé utilisé pour toutes les différentes identités (face meshes) a été mis en place par notre artiste qui a été exercé et rendu automatiquement en utilisant des fichiers d’animation contenant des poids FACS. Ces fichiers d’animation ont été générés à l’aide d’algorithmes classiques de vision par ordinateur exécutés sur des séquences vidéo de calisthénie faciale et complétés par des séquences animées à la main pour les expressions faciales extrêmes qui manquaient dans les vidéos de calisthénie.

Pertes

Pour entraîner notre réseau d’apprentissage profond, nous combinons linéairement plusieurs termes de perte différents pour régresser les points de repère et les poids des FACS :

Pertes positionnelles. Pour les points de repère, la RMSE des positions régressées (Llmks ), et pour les poids FACS, la MSE (Lfacs ).
Pertes temporelles. Pour les poids FACS, nous réduisons la gigue en utilisant des pertes temporelles sur des séquences d’animation synthétiques. Une perte de vitesse (Lv ) inspirée de [Cudeiro et al. 2019] est l’EQM entre la vitesse cible et la vitesse prédite. Elle favorise la fluidité globale des expressions dynamiques. En outre, un terme de régularisation sur l’accélération (Lacc ) est ajouté pour réduire la gigue des poids FACS (son poids maintenu faible pour préserver la réactivité).
Perte de cohérence. Nous utilisons des images réelles sans annotations dans une perte de cohérence non supervisée (Lc ), similaire à [Honari et al. 2018]. Cela encourage les prédictions de repères à être équivariantes sous différentes transformations d’images, améliorant la cohérence de l’emplacement des repères entre les images sans nécessiter d’étiquettes de repères pour un sous-ensemble des images d’entraînement.

Performance

Pour améliorer les performances de l’encodeur sans réduire la précision ou augmenter la gigue, nous avons utilisé de manière sélective des convolutions non compensées pour réduire la taille de la carte des caractéristiques. Cela nous a permis de mieux contrôler la taille de la carte de caractéristiques que les convolutions stridées. Pour conserver le résidu, nous découpons la carte de caractéristiques avant de l’ajouter à la sortie d’une convolution non compensée. En outre, nous avons fixé la profondeur des cartes de caractéristiques à un multiple de 8, pour une utilisation efficace de la mémoire avec les jeux d’instructions vectorielles tels que AVX et Neon FP16, ce qui se traduit par un gain de performance de 1,5 fois.

Notre modèle final comporte 1,1 million de paramètres et nécessite 28,1 millions de multiplications-accumulations pour être exécuté. À titre de référence, le modèle Mobilenet V2 (sur lequel notre architecture est basée) nécessite 300 millions de multiplications-accumulations pour être exécuté. Nous utilisons le cadre NCNN pour l’inférence de modèle sur le dispositif et le temps d’exécution à un seul fil (y compris la détection des visages) pour une image de la vidéo sont répertoriés dans le tableau ci-dessous. Veuillez noter qu’un temps d’exécution de 16 ms permet de traiter 60 images par seconde (FPS).

Prochaines étapes

Notre pipeline de données synthétiques nous a permis d’améliorer de manière itérative l’expressivité et la robustesse du modèle formé. Nous avons ajouté des séquences synthétiques pour améliorer la réactivité aux expressions manquées, et nous avons également équilibré l’entraînement sur des identités faciales variées. Nous obtenons des animations de haute qualité avec un minimum de calcul grâce à la formulation temporelle de notre architecture et de nos pertes, à une colonne vertébrale soigneusement optimisée et à la vérification de base sans erreur des données synthétiques. Le filtrage temporel effectué dans le sous-réseau des poids FACS nous permet de réduire le nombre et la taille des couches dans le backbone sans augmenter la gigue. La perte de cohérence non supervisée nous permet de nous entraîner avec un grand ensemble de données réelles, améliorant ainsi la généralisation et la robustesse de notre modèle. Nous continuons à travailler pour affiner et améliorer nos modèles, afin d’obtenir des résultats encore plus expressifs, sans gigue et robustes.

Si vous souhaitez travailler sur des défis similaires à l’avant-garde du suivi facial en temps réel et de l’apprentissage automatique, veuillez consulter les postes ouverts au sein de notre équipe.

La publication Animation faciale en temps réel pour les avatars est apparue en premier sur le blog Roblox.