Ansiktsuttryck är ett kritiskt steg i Roblox marsch mot att göra metaversen till en del av människors dagliga liv genom naturliga och trovärdiga avatarinteraktioner. Att animera virtuella 3D-karaktärers ansikten i realtid är dock en enorm teknisk utmaning. Trots många forskningsgenombrott finns det begränsade kommersiella exempel på applikationer för ansiktsanimering i realtid. Detta är särskilt utmanande på Roblox, där vi stödjer en svindlande mängd användarenheter, verkliga förhållanden och väldigt kreativa användningsfall från våra utvecklare.
I det här inlägget kommer vi att beskriva ett ramverk för djupinlärning för att regressera ansiktsanimeringskontroller från video som både tar itu med dessa utmaningar och öppnar oss för ett antal framtida möjligheter. Ramverket som beskrivs i detta blogginlägg presenterades också som ett prata på SIGGRAF 2021.
Ansiktsanimering
Det finns olika alternativ för att styra och animera en 3D face-rig. Den vi använder heter Facial Action Coding System eller FACS, som definierar en uppsättning kontroller (baserat på ansiktsmuskelplacering) för att deformera 3D-ansiktsnätet. Trots att de är över 40 år gamla är FACS fortfarande de facto-standarden på grund av att FACS-kontrollerna är intuitiva och lätta att överföra mellan riggar. Ett exempel på en FACS-rigg som utövas kan ses nedan.
Metod
Tanken är att vår djupinlärningsbaserade metod ska ta en video som ingång och mata ut en uppsättning FACS för varje bildruta. För att uppnå detta använder vi en tvåstegsarkitektur: ansiktsdetektion och FACS-regression.
Ansiktsigenkänning
För att uppnå bästa prestanda implementerar vi en snabb variant av den relativt välkända ansiktsdetektionsalgoritmen MTCNN. Den ursprungliga MTCNN-algoritmen är ganska exakt och snabb men inte tillräckligt snabb för att stödja ansiktsdetektion i realtid på många av de enheter som används av våra användare. För att lösa detta har vi justerat algoritmen för vårt specifika användningsfall där när ett ansikte detekteras kör vår MTCNN-implementering endast det sista O-Net-steget i de på varandra följande bildrutorna, vilket resulterar i en genomsnittlig 10x hastighetsuppgång. Vi använder också landmärkena för ansiktet (placering av ögon, näsa och munhörn) som förutspåtts av MTCNN för att justera ansiktets avgränsning innan det efterföljande regressionsstadiet. Denna justering möjliggör en snäv beskärning av ingångsbilderna, vilket minskar beräkningen av FACS-regressionsnätverket.
FACS-regression
Vår FACS-regressionsarkitektur använder en multitask-inställning som samtränar landmärken och FACS-vikter med hjälp av en delad ryggrad (känd som kodaren) som funktionsextraktor.
Denna inställning låter oss utöka FACS-vikterna som lärts från syntetiska animationssekvenser med riktiga bilder som fångar ansiktsuttryckets subtiliteter. FACS-regressionsundernätverket som tränas tillsammans med de landmärken som regressorn använder kausala vändningar; dessa veckningar fungerar på funktioner över tid i motsats till veck som bara fungerar på rumsliga egenskaper som kan hittas i kodaren. Detta gör att modellen kan lära sig tidsmässiga aspekter av ansiktsanimationer och gör den mindre känslig för inkonsekvenser som jitter.
Träning
Vi tränar inledningsvis modellen för enbart landmärkesregression med både verkliga och syntetiska bilder. Efter ett visst antal steg börjar vi lägga till syntetiska sekvenser för att lära oss vikterna för det temporala FACS-regressionsundernätverket. De syntetiska animationssekvenserna skapades av vårt tvärvetenskapliga team av konstnärer och ingenjörer. En normaliserad rigg som användes för alla olika identiteter (ansiktsmaskor) sattes upp av vår artist som tränades och renderades automatiskt med hjälp av animationsfiler som innehåller FACS-vikter. Dessa animationsfiler genererades med hjälp av klassiska datorseende-algoritmer som kördes på videosekvenser för ansikts-calisthenics och kompletterades med handanimerade sekvenser för extrema ansiktsuttryck som saknades i de calisthenic-videorna.
Förluster
För att träna vårt nätverk för djupinlärning kombinerar vi linjärt flera olika förlusttermer för att regressera landmärken och FACS-vikter:
- Positionella förluster. För landmärken, RMSE för de regresserade positionerna (Llmks ), och för FACS-vikter, MSE (Lfacs ).
- Temporala förluster. För FACS-vikter minskar vi jitter genom att använda tidsmässiga förluster över syntetiska animationssekvenser. En hastighetsförlust (Lv ) inspirerad av [Cudeiro et al. 2019] är MSE mellan målet och förutsagda hastigheter. Det uppmuntrar övergripande jämnhet av dynamiska uttryck. Dessutom finns en regleringsterm om accelerationen (Lenl ) läggs till för att minska FACS-vikternas jitter (vikten hålls låg för att bevara responsen).
- Konsistensförlust. Vi använder riktiga bilder utan anteckningar i en oövervakad konsistensförlust (Lc ), Liknande [Honari et al. 2018]. Detta uppmuntrar förutsägelser om landmärken att vara likvärdiga under olika bildtransformationer, vilket förbättrar konsistensen av landmärkesplats mellan bildrutor utan att kräva landmärkesetiketter för en delmängd av träningsbilderna.
Prestanda
För att förbättra kodarens prestanda utan att minska noggrannheten eller öka jitter, använde vi selektivt opaddade veck för att minska storleken på kartan. Detta gav oss mer kontroll över storleken på kartstorleken än vad stegade veck skulle göra. För att bibehålla resten delar vi upp funktionskartan innan vi lägger till den i utdata från en opadd faltning. Dessutom ställer vi in djupet på funktionskartorna till en multipel av 8, för effektiv minnesanvändning med vektorinstruktionsuppsättningar som AVX och Neon FP16, vilket resulterar i en prestandaökning på 1,5 gånger.
Vår slutliga modell har 1,1 miljoner parametrar och kräver 28,1 miljoner multiplikationsackumulerade för att exekvera. Som referens, vanilj Mobilenet V2 (som vår arkitektur är baserad på) kräver 300 miljoner multipliceringsackumulerade för att exekvera. Vi använder NCNN ramverk för slutledning av modeller på enheten och den entrådade exekveringstiden (inklusive ansiktsdetektion) för en videoram listas i tabellen nedan. Observera att en exekveringstid på 16ms skulle stödja bearbetning av 60 bilder per sekund (FPS).
Vad kommer härnäst
Vår syntetiska datapipeline gjorde det möjligt för oss att iterativt förbättra uttrycksförmågan och robustheten hos den tränade modellen. Vi lade till syntetiska sekvenser för att förbättra lyhördheten för missade uttryck, och även balanserad träning över olika ansiktsidentiteter. Vi uppnår högkvalitativ animering med minimal beräkning på grund av den tidsmässiga formuleringen av vår arkitektur och förluster, en noggrant optimerad ryggrad och felfri grundsanning från syntetiska data. Den tidsmässiga filtreringen som utförs i FACS-viktundernätverket låter oss minska antalet och storleken på lager i ryggraden utan att öka jitter. Den oövervakade konsistensförlusten låter oss träna med en stor uppsättning riktiga data, vilket förbättrar vår modells generalisering och robusthet. Vi fortsätter att arbeta med att ytterligare förfina och förbättra våra modeller för att få ännu mer uttrycksfulla, jitterfria och robusta resultat.
Om du är intresserad av att arbeta med liknande utmaningar i framkanten av ansiktsspårning i realtid och maskininlärning, vänligen kolla in några av våra öppna positioner med vårt team.