Animazione facciale in tempo reale per avatar


In questo post descriveremo un framework di deep learning per la regressione dei controlli dell'animazione facciale dai video che affronta queste sfide e ci apre a numerose opportunità future. Il framework descritto in questo post del blog è stato presentato anche in una conferenza al SIGGRAPH 2021.
Animazione facciale
Esistono varie opzioni per controllare e animare un rig facciale 3D. Quello che utilizziamo si chiama Facial Action Coding System o FACS, che definisce una serie di controlli (basati sulla posizione dei muscoli facciali) per deformare la mesh facciale 3D. Nonostante abbia più di 40 anni, il FACS è ancora lo standard di fatto grazie ai suoi controlli intuitivi e facilmente trasferibili tra i rig. Di seguito è possibile vedere un esempio di un rig FACS in funzione.

Metodo
L'idea è che il nostro metodo basato sul deep learning prenda un video come input e produca un insieme di FACS per ogni fotogramma. Per ottenere questo risultato, utilizziamo un'architettura in due fasi: rilevamento dei volti e regressione FACS.

Rilevamento dei volti
Per ottenere le migliori prestazioni, implementiamo una variante veloce del relativamente noto algoritmo di rilevamento dei volti MTCNN. L'algoritmo MTCNN originale è piuttosto accurato e veloce, ma non abbastanza da supportare il rilevamento dei volti in tempo reale su molti dei dispositivi utilizzati dai nostri utenti. Per risolvere questo problema, abbiamo ottimizzato l'algoritmo per il nostro caso d'uso specifico: una volta rilevato un volto, la nostra implementazione MTCNN esegue solo la fase finale O-Net nei fotogrammi successivi, ottenendo un aumento di velocità medio di 10 volte. Utilizziamo inoltre i punti di riferimento facciali (posizione degli occhi, del naso e degli angoli della bocca) previsti da MTCNN per allineare il riquadro di delimitazione del volto prima della fase di regressione successiva. Questo allineamento consente un ritaglio preciso delle immagini in ingresso, riducendo il carico di calcolo della rete di regressione FACS.

Regressione FACS
La nostra architettura di regressione FACS utilizza una configurazione multitasking che addestra congiuntamente i punti di riferimento e i pesi FACS utilizzando un backbone condiviso (noto come encoder) come estrattore di caratteristiche.
Questa configurazione ci permette di potenziare i pesi FACS appresi da sequenze di animazione sintetica con immagini reali che catturano le sottigliezze dell’espressione facciale. La sottorete di regressione FACS, addestrata insieme al regressore dei punti di riferimento, utilizza convoluzioni causali; queste convoluzioni operano sulle caratteristiche nel tempo, a differenza delle convoluzioni che operano solo sulle caratteristiche spaziali, come quelle presenti nell'encoder. Ciò consente al modello di apprendere gli aspetti temporali delle animazioni facciali e lo rende meno sensibile a incongruenze quali il jitter.

Addestramento
Inizialmente addestriamo il modello solo per la regressione dei punti di riferimento utilizzando immagini sia reali che sintetiche. Dopo un certo numero di passaggi, iniziamo ad aggiungere sequenze sintetiche per apprendere i pesi per la sottorete di regressione FACS temporale. Le sequenze di animazione sintetiche sono state create dal nostro team interdisciplinare di artisti e ingegneri. Il nostro artista ha configurato un rig normalizzato utilizzato per tutte le diverse identità (mesh facciali), che è stato utilizzato e renderizzato automaticamente utilizzando file di animazione contenenti i pesi FACS. Questi file di animazione sono stati generati utilizzando classici algoritmi di visione artificiale eseguiti su sequenze video di ginnastica facciale e integrati con sequenze animate a mano per le espressioni facciali estreme che mancavano nei video di ginnastica.
Perdite
Per addestrare la nostra rete di deep learning, combiniamo linearmente diversi termini di perdita per regredire i punti di riferimento e i pesi FACS:
- Perdite posizionali. Per i punti di riferimento, l'RMSE delle posizioni regresse (Llmks ), e per i pesi FACS, l'MSE (Lfacs ).
- Perdite temporali. Per i pesi FACS, riduciamo il jitter utilizzando perdite temporali su sequenze di animazione sintetiche. Una perdita di velocità (Lv ) ispirata a [Cudeiro et al. 2019] è l'MSE tra le velocità target e quelle previste. Incoraggia la fluidità complessiva delle espressioni dinamiche. Inoltre, viene aggiunto un termine di regolarizzazione sull'accelerazione (Lacc ) per ridurre il jitter dei pesi FACS (il cui peso è mantenuto basso per preservare la reattività).
- Perdita di coerenza. Utilizziamo immagini reali senza annotazioni in una perdita di coerenza non supervisionata (Lc ), simile a [Honari et al. 2018]. Ciò favorisce la predizione di punti di riferimento equivariante sotto diverse trasformazioni dell'immagine, migliorando la coerenza della posizione dei punti di riferimento tra i fotogrammi senza richiedere etichette di punti di riferimento per un sottoinsieme delle immagini di addestramento.
Prestazioni
Per migliorare le prestazioni dell'encoder senza ridurre la precisione o aumentare il jitter, abbiamo utilizzato in modo selettivo convoluzioni non paddate per diminuire la dimensione della mappa delle caratteristiche. Questo ci ha dato un maggiore controllo sulle dimensioni delle mappe delle caratteristiche rispetto alle convoluzioni con stride. Per mantenere il residuo, suddividiamo la mappa delle caratteristiche prima di aggiungerla all'output di una convoluzione non paddata. Inoltre, abbiamo impostato la profondità delle mappe delle caratteristiche su un multiplo di 8, per un uso efficiente della memoria con set di istruzioni vettoriali come AVX e Neon FP16, ottenendo un aumento delle prestazioni di 1,5 volte.
Il nostro modello finale ha 1,1 milioni di parametri e richiede 28,1 milioni di operazioni di moltiplicazione-accumulazione per l'esecuzione. A titolo di riferimento, il Mobilenet V2 standard (su cui si basa la nostra architettura) richiede 300 milioni di operazioni di moltiplicazione-accumulazione per l'esecuzione. Utilizziamo il framework NCNN per l'inferenza del modello sul dispositivo e i tempi di esecuzione a thread singolo (incluso il rilevamento dei volti) per un fotogramma di video sono elencati nella tabella sottostante. Si noti che un tempo di esecuzione di 16 ms consentirebbe l'elaborazione di 60 fotogrammi al secondo (FPS).

Prossimi passi
La nostra pipeline di dati sintetici ci ha permesso di migliorare in modo iterativo l'espressività e la robustezza del modello addestrato. Abbiamo aggiunto sequenze sintetiche per migliorare la reattività alle espressioni mancanti e abbiamo anche bilanciato l'addestramento tra diverse identità facciali. Otteniamo animazioni di alta qualità con un carico di calcolo minimo grazie alla formulazione temporale della nostra architettura e delle perdite, a un backbone accuratamente ottimizzato e a una ground truth priva di errori derivante dai dati sintetici. Il filtraggio temporale effettuato nella sottorete dei pesi FACS ci permette di ridurre il numero e le dimensioni dei livelli nel backbone senza aumentare il jitter. La perdita di coerenza non supervisionata ci permette di addestrare il modello con un ampio set di dati reali, migliorando la generalizzazione e la robustezza del nostro modello. Continuiamo a lavorare per affinare e migliorare ulteriormente i nostri modelli, al fine di ottenere risultati ancora più espressivi, privi di jitter e robusti.
Se sei interessato a lavorare su sfide simili all'avanguardia nel tracciamento facciale in tempo reale e nell'apprendimento automatico, dai un'occhiata ad alcune delle posizioni aperte nel nostro team.


