Die Inhalte dieser Website wurden mithilfe künstlicher Intelligenz (KI) oder maschineller Übersetzungstechnologie übersetzt und können Fehler enthalten.

Skip to content

Echtzeit-Gesichtsanimation für Avatare

Gesichtsausdrücke sind ein entscheidender Schritt auf Roblox’ Weg, das Metaversum durch natürliche und glaubwürdige Avatar-Interaktionen zu einem Teil des Alltags der Menschen zu machen. Die Animation virtueller 3D-Charaktergesichter in Echtzeit stellt jedoch eine enorme technische Herausforderung dar. Trotz zahlreicher Forschungsdurchbrüche gibt es nur wenige kommerzielle Beispiele für Anwendungen zur Echtzeit-Gesichtsanimation. Dies stellt bei Roblox eine besondere Herausforderung dar, da wir eine verwirrende Vielfalt an Benutzergeräten, realen Umgebungsbedingungen und äußerst kreativen Anwendungsfällen unserer Entwickler unterstützen.

In diesem Beitrag beschreiben wir ein Deep-Learning-Framework zur Regression von Gesichtsanimationssteuerungen aus Videos, das sowohl diese Herausforderungen angeht als auch uns eine Reihe zukünftiger Möglichkeiten eröffnet. Das in diesem Blogbeitrag beschriebene Framework wurde auch als Vortrag auf der SIGGRAPH 2021 vorgestellt.

Gesichtsanimation

Es gibt verschiedene Möglichkeiten, ein 3D-Gesichts-Rig zu steuern und zu animieren. Wir verwenden das sogenannte Facial Action Coding System (FACS), das eine Reihe von Steuerelementen (basierend auf der Position der Gesichtsmuskeln) definiert, um das 3D-Gesichts-Mesh zu verformen. Obwohl FACS bereits über 40 Jahre alt ist, gilt es nach wie vor als De-facto-Standard, da die FACS-Steuerelemente intuitiv und leicht zwischen Rigs übertragbar sind. Ein Beispiel für die Anwendung eines FACS-Rigs ist unten zu sehen.

Methode

Die Idee besteht darin, dass unsere auf Deep Learning basierende Methode ein Video als Eingabe nimmt und für jedes Einzelbild einen Satz von FACS ausgibt. Um dies zu erreichen, verwenden wir eine zweistufige Architektur: Gesichtserkennung und FACS-Regression.

Gesichtserkennung

Um die beste Leistung zu erzielen, implementieren wir eine schnelle Variante des relativ bekannten MTCNN-Gesichtserkennungsalgorithmus. Der ursprüngliche MTCNN-Algorithmus ist zwar recht genau und schnell, aber nicht schnell genug, um eine Echtzeit-Gesichtserkennung auf vielen der von unseren Nutzern verwendeten Geräte zu unterstützen. Um dieses Problem zu lösen, haben wir den Algorithmus für unseren spezifischen Anwendungsfall angepasst: Sobald ein Gesicht erkannt wurde, führt unsere MTCNN-Implementierung in den nachfolgenden Bildern nur noch die letzte O-Net-Stufe aus, was zu einer durchschnittlichen Beschleunigung um das Zehnfache führt. Außerdem verwenden wir die von MTCNN vorhergesagten Gesichtsmerkmale (Position von Augen, Nase und Mundwinkeln), um die Gesichtsbegrenzungsbox vor der nachfolgenden Regressionsstufe auszurichten. Diese Ausrichtung ermöglicht einen präzisen Ausschnitt der Eingabebilder, wodurch der Rechenaufwand des FACS-Regressionsnetzwerks reduziert wird.

FACS-Regression 

Unsere FACS-Regressionsarchitektur nutzt ein Multitask-Setup, das Landmarken und FACS-Gewichte gemeinsam trainiert, wobei ein gemeinsames Backbone (bekannt als Encoder) als Merkmalsextraktor dient.

Dieses Setup ermöglicht es uns, die aus synthetischen Animationssequenzen gelernten FACS-Gewichte durch reale Bilder zu ergänzen, die die Feinheiten des Gesichtsausdrucks erfassen. Das FACS-Regressions-Subnetzwerk, das zusammen mit dem Landmarken-Regressor trainiert wird, verwendet kausale Faltungen; diese Faltungen wirken auf Merkmale über die Zeit hinweg, im Gegensatz zu Faltungen, die nur auf räumliche Merkmale wirken, wie sie im Encoder zu finden sind. Dies ermöglicht es dem Modell, zeitliche Aspekte von Gesichtsanimationen zu lernen, und macht es weniger empfindlich gegenüber Inkonsistenzen wie Jitter.

Training

Zunächst trainieren wir das Modell ausschließlich für die Landmark-Regression unter Verwendung von realen und synthetischen Bildern. Nach einer bestimmten Anzahl von Schritten fügen wir synthetische Sequenzen hinzu, um die Gewichte für das zeitliche FACS-Regressions-Subnetzwerk zu lernen. Die synthetischen Animationssequenzen wurden von unserem interdisziplinären Team aus Künstlern und Ingenieuren erstellt. Ein für alle verschiedenen Identitäten (Gesichtsmeshes) verwendetes normalisiertes Rig wurde von unserem Künstler eingerichtet und automatisch unter Verwendung von Animationsdateien mit FACS-Gewichten trainiert und gerendert. Diese Animationsdateien wurden mithilfe klassischer Computer-Vision-Algorithmen generiert, die auf Videosequenzen von Gesichtsgymnastik laufen, und durch handanimierte Sequenzen für extreme Gesichtsausdrücke ergänzt, die in den Gymnastikvideos fehlten. 

Verluste

Um unser Deep-Learning-Netzwerk zu trainieren, kombinieren wir mehrere verschiedene Verlustterme linear, um Landmarken und FACS-Gewichte zu regressieren: 

  • Positionsverluste. Für Landmarken den RMSE der regressierten Positionen (Llmks) und für FACS-Gewichte den MSE (Lfacs). 
  • Zeitliche Verluste. Für die FACS-Gewichte reduzieren wir den Jitter mithilfe zeitlicher Verluste über synthetische Animationssequenzen. Ein von [Cudeiro et al. 2019] inspirierter Geschwindigkeitsverlust (Lv) ist der MSE zwischen der Ziel- und der vorhergesagten Geschwindigkeit. Er fördert die allgemeine Glätte dynamischer Ausdrucksformen. Zusätzlich wird ein Regularisierungsterm für die Beschleunigung (Lacc) hinzugefügt, um den Jitter der FACS-Gewichte zu reduzieren (dessen Gewicht niedrig gehalten wird, um die Reaktionsfähigkeit zu bewahren). 
  • Konsistenzverlust. Wir verwenden reale Bilder ohne Annotationen in einem unüberwachten Konsistenzverlust (Lc ), ähnlich wie in [Honari et al. 2018]. Dies fördert die Äquivarianz der Landmark-Vorhersagen unter verschiedenen Bildtransformationen und verbessert die Konsistenz der Landmark-Positionen zwischen den Frames, ohne dass Landmark-Labels für eine Teilmenge der Trainingsbilder erforderlich sind.

Leistung

Um die Leistung des Encoders zu verbessern, ohne die Genauigkeit zu verringern oder den Jitter zu erhöhen, haben wir selektiv unpadded Convolutions verwendet, um die Größe der Feature-Maps zu verringern. Dies gab uns mehr Kontrolle über die Größe der Feature-Maps als es bei Strided Convolutions der Fall wäre. Um den Residualwert beizubehalten, schneiden wir die Feature-Map in Segmente, bevor wir sie zum Ausgang einer unpadded Convolution hinzufügen. Zusätzlich haben wir die Tiefe der Merkmalskarten auf ein Vielfaches von 8 festgelegt, um eine effiziente Speichernutzung mit Vektorbefehlssätzen wie AVX und Neon FP16 zu erreichen, was zu einer 1,5-fachen Leistungssteigerung führt.

Unser endgültiges Modell verfügt über 1,1 Millionen Parameter und benötigt zur Ausführung 28,1 Millionen Multiplikations-Akkumulations-Operationen. Zum Vergleich: Das Standard-Mobilenet V2 (auf dem unsere Architektur basiert) benötigt zur Ausführung 300 Millionen Multiplikations-Akkumulations-Operationen. Wir verwenden das NCNN-Framework für die Modellinferenz auf dem Gerät, und die Ausführungszeit im Single-Thread-Modus (einschließlich Gesichtserkennung) für einen Videoframe ist in der folgenden Tabelle aufgeführt. Bitte beachten Sie, dass eine Ausführungszeit von 16 ms die Verarbeitung von 60 Frames pro Sekunde (FPS) ermöglichen würde. 

Was kommt als Nächstes

Unsere Pipeline für synthetische Daten ermöglichte es uns, die Ausdruckskraft und Robustheit des trainierten Modells schrittweise zu verbessern. Wir fügten synthetische Sequenzen hinzu, um die Reaktionsfähigkeit auf fehlende Ausdrucksformen zu verbessern, und sorgten zudem für ein ausgewogenes Training über verschiedene Gesichtsidentitäten hinweg. Dank der zeitlichen Formulierung unserer Architektur und Verluste, eines sorgfältig optimierten Backbones und fehlerfreier Ground-Truth-Daten aus den synthetischen Daten erzielen wir hochwertige Animationen bei minimalem Rechenaufwand. Die im FACS-Gewichtungs-Subnetzwerk durchgeführte zeitliche Filterung ermöglicht es uns, die Anzahl und Größe der Schichten im Backbone zu reduzieren, ohne den Jitter zu erhöhen. Der unüberwachte Konsistenzverlust ermöglicht es uns, mit einem großen Satz realer Daten zu trainieren, was die Generalisierungsfähigkeit und Robustheit unseres Modells verbessert. Wir arbeiten weiterhin daran, unsere Modelle weiter zu verfeinern und zu verbessern, um noch ausdrucksstärkere, jitterfreie und robuste Ergebnisse zu erzielen. 

Wenn Sie daran interessiert sind, an ähnlichen Herausforderungen an der Spitze der Echtzeit-Gesichtsverfolgung und des maschinellen Lernens zu arbeiten, schauen Sie sich bitte einige unserer offenen Stellen in unserem Team an.