Experiment: Aged-Up Deepfakes

Door Glenn van Waesberghe

Vanuit dit TETRA onderzoeksproject AI in productie hebben we een inleidende workshop rond deepfakes voorbereid om aan de DAE studenten te geven van de VFX-major. Tijdens de jaarlijkse creaweek worden alle gewone cursussen van de eerste en tweedejaarsstudenten geannuleerd en vervangen door creatieve sessies. Ons doel was om vanuit de onderzoeksgroep een introductie over deepfakes te geven: wat is deepfake technologie, wat kan je met standaard software zonder zelf zwaar te programmeren, waar liggen aandachtspunten als je ermee aan de slag wil gaan, ...

Omwille van de lockdown werd de creaweek dit academiejaar geannuleerd, maar de voorbereidingen van de workshop was al klaar. De workshop met studenten zal naar een later tijdstip worden verplaatst in een van de VFX lessen, maar we delen hier al graag de aanpak van de workshop met de begeleidingsgroep. Lees mee waar de grenzen van deze technologie liggen, en hoe we met de combinatie van verschillende tools Star Wars onder handen namen in een hands-on use case.

Deepfakes?

Laat ons eenvoudig beginnen. Deepfakes zijn videoclips waarin een gefilmd persoon wordt vervangen met de gelijkenis van iemand anders, dit met het gebruik van deep-learning algoritmes. Eindresultaat kan soms zo realistisch zijn dat men een echte en fake video soms moeilijk van elkaar kan onderscheiden. Het is dan ook technologie die al in opspraak kwam, zeker in het geval dit zonder toestemming van de afgebeelde persoon wordt gebruikt.

Een voorbeeld van deepfakes is hieronder te vinden:

FaceApp

Het is zeer waarschijnlijk dat je afgelopen zomer eens experimenteerde met "FaceApp.", de app ging viraal en social media stond vol met foto’s. Met deze app kan je een foto opladen van een persoon, die persoon wordt dan door de app verouderd, met gebruik van AI. Nog specifieker, je kon zelfs de leeftijd, het haarkleur en zelfs het geslacht veranderen. Maar ons viel op dat vooral de feature om te veranderen van leeftijd bijzonder indrukwekkend goed werkte.

Enkele mensen vergeleken zelfs hoe goed de app overeen kwam met de realiteit, door enkele foto’s uit de oude doos van bekende oude acteurs op te laten, ze te verouderen in de app en dan te vergelijken met hoe die acteurs er nu echt uitzien. Geniet even mee met de geweldige resultaten:

Zoals u kunt zien, is het resultaat dat FaceApp genereert vrij indrukwekkend, en verdere tests bewijzen ook dat de technologie relatief stabiel is wanneer ze op grotere hoeveelheden afbeeldingen wordt losgelaten.

Maar hoe werkt dat? Hoe maakt deze app mensen ouder? Hoe voorspelt het hoe mensen zullen verouderen?

Generatieve Adversarial Networks

Deze vraag niet eenvoudig te beantwoorden. De makers van de app verklappen alleen dat er "AI" wordt gebruikt, maar er zijn natuurlijk veel soorten slimme algoritmes. Men speculeert dat de makers gebruik maakten van Generative Adversarial Networks, oftewel GAN's.

GAN's zijn een vorm van machine learning waarbij twee neurale netwerken met elkaar wedijveren om nieuwe gegevens te genereren met dezelfde statistieken als de trainingsset. Dit is een techniek die bijvoorbeeld wordt gebruikt om beelden te genereren van gezichten of vogels die aan specifieke criteria voldoen. Bijvoorbeeld: Ik wil een zwarte en groene vogel met een zeer korte snavel (zie foto).

Resultaat van Generative Adversarial Text to Image Synthesis

Onderzoekers hebben geprobeerd om GAN’s ook te gebruiken om de leeftijd van een persoon in een beeld te veranderen. Maar het lijkt echter vrij onwaarschijnlijk dat Faceapp enkel GAN’s gebruikt. Alle recent gepubliceerde academische resultaten op dit gebied met betrekking tot veroudering via GAN’s komen zelfs niet in de buurt van de resultaten die met Faceapp worden bereikt.

Resultaten van Learning Face Age Progression: A Pyramid Architecture of GANs

Voor meer informatie over het gebruik van GAN's in deze context, zie:
Age Progression/Regression by Conditional Adversarial Autoencoder (2017)
Face Aging with Identity-Preserved Conditional GANs (2018)
Learning Face Age Progression: A Pyramid Architecture of GANs (2019)

De meest aannemelijke verklaring lijkt te zijn dat Faceapp een AI van een ander type gebruikt. In plaats van het genereren van nieuwe gezichten, zoekt het algoritme waarschijnlijk naar soortgelijke gezichten in een grote dataset van beelden, en morpht/blendt ze de originele en doelgezichten met elkaar. Mogelijks gebruikt de app ergens in dat proces ook een GAN, maar het is zeker niet het enige algoritme wat hier aan het werk is.

Conclusie: er bestaat nog geen almachtige GAN die de leeftijd van iemand in eender welk beeld kan veranderen, maar Faceapp bewijst dat een slimme workaround resultaten kan opleveren die net zo goed zijn als echte beelden.

Stel nu dat we eerst iemand ouder maken met FaceApp, zou het dan mogelijk zijn om die  "gegenereerde" oude gezichten te gebruiken in een deepfake? Kunnen we een resultaat krijgen met een volledig functioneel bewegend gezicht zijn van een filmpersonage die niet dezelfde leeftijd zou hebben als de origineel gefilmde acteur? Dat is precies wat we hebben onderzocht in een use case van de TETRA die dan aanleiding gaf tot deze workshop voor studenten.  

Het Proces van onze use case

Voor de use case van deze workshop hebben we gebruik gemaakt van DeepFaceLab. DeepFaceLab is een gratis, uiterst gebruiksvriendelijk softwarepakket. Je kan hier een uitstekende tutorial vinden over hoe het precies werkt.

Bij aanvang van de use case was onze hypothese dat we het AI model nog laat in de training zouden kunnen aanpassen om het fysieke uiterlijk van de acteur licht aan te passen. Wat zou betekenen dat we het model zouden kunnen trainen op een grote dataset van originele input gezichten van de originele acteur, en pas later zouden kunnen aanpassen naar een kleine dataset van verouderde gezichten (persoon die we in beeld willen verwerken). Dit bleek correct te zijn en is instrumenteel in het laten werken van dit proces.

Dus, hoe zag het proces er precies uit?

Bron- en Bestemmingsbeelden

De use case begon met het zoeken van goede bron- en bestemmingsvideo's. We hadden beelden nodig van een jonge acteur die we konden verouderen en aan beelden van een oudere acteur wiens gezicht vervangen kon worden door de Faceapp gegenereerde beelden. Hoedanook, er moest een grote hoeveelheid beeldmateriaal beschikbaar zijn om te gebruiken in het trainingsproces.

Zoals weggegeven in de intro van deze blogpost viel de keuze op Ewan McGregor en Alec Guiness; beide acteurs speelden respectievelijk de jonge en oude versies van Obi-Wan Kenobi in de Star Wars films Episodes 3(2005) en 4(1977). Dit deepfake experiment zou ons toelaten om te zien hoe de film er zou kunnen hebben uitgezien als Ewan McGregor de rol van de oude Obi-Wan Kenobi had gespeeld die nu vertolkt werd door de 63-jarige Alec Guiness in 1977.

links: Alec Guiness (1977), rechts: Ewan McGreggor (2005)

Voor het Deepfake model zijn twee sets beelden nodig: bronfoto’s en bestemmingsfoto’s. De destination footage is de video waarin we het gezicht willen vervangen, en de source footage zijn video's met de acteur wiens gezicht we op de destination footage willen "plakken".

Voor de destination footage hebben we een fragment gebruikt van ongeveer 20 minuten met acteur Alec Guiness uit Star Wars Episode 4. Voor de bronbeelden hebben we een mix van beelden gekozen uit Episode 3, maar ook enkele recente interviews met Ewan McGregor. In totaal hadden we iets meer dan een uur bronbeelden.

Zowel de bron- als de bestemmingsbeelden bevatten een grote verscheidenheid aan gezichtshoeken en lichtsituaties. Dit is erg belangrijk om een evenwichtig model te krijgen, en we lichten straks op het eind van dit artikel bij tips enkele belangrijke aandachtspunten mee als je zelf aan de slag wilt. 

Vervolgens knipten we deze video's frame voor frame, waarna we een algoritme deze duizenden beelden lieten doorzoeken om alle gezichten in het beeldmateriaal te detecteren en te exporteren naar foto’s.

Dit proces detecteert ook de andere acteurs in het bronmateriaal die we niet willen gebruiken, en leverde ook een behoorlijke hoeveelheid false positives aan. Soms detecteerde het algoritme geen gezichten waar ze wel gedetecteerd zouden moeten worden.

DeepFaceLab, de tool die we gebruikt hebben, beschikt over enkele features die je helpen om dit op te ruimen, maar er is nog steeds een behoorlijke hoeveelheid handmatig werk voor nodig.

Het verwerken van de bronvideo (1 uur beeldmateriaal) resulteerde uiteindelijk in 50.000 aparte beelden waarmee we ons model trainden.

Trainen van het Model 

Dus, de dataset van 50000 beelden lieten toe ons deepfake-model te trainen. Binnen deze stap moeten we ook diverse parameters en settings instellen op de behoeften van de use case. Dit kan soms wat trial en error zijn, maar de tutorial in het begin van dit artikel helpt zeer met de correcte keuzes te maken. Bepaalde opties worden pas aangezet nadat het model een tijdje is getraind, omdat ze hiervoor een averechts effect zouden kunnen hebben. Belangrijk om op te merken is dat hoe hoger je de kwaliteit van je deepfake wilt hebben, hoe meer geheugen er nodig is en hoe langer het duurt om te trainen. Niet elke PC kan het trainen van een deepfake met hoge kwaliteit aan.

Veroudering van de bronacteur

Nu het deepfake model getraind werd op de jonge acteur, kunnen we naar de volgende stap in het proces. We willen de bronacteur ouder maken. Hiervoor is een kleinere dataset van verouderde gezichten nodig. We hadden zo’n 300 frames uit de bronvideo geselecteerd om te verouderen. Deze 300 frames werden gekozen om zoveel mogelijk verschillende lichtomstandigheden en enkele gevarieerde gezichtsuitdrukkingen te bevatten. Om de acteur zelf te verouderen werd FaceApp gebruikt op deze 300 frames.

De verouderde beelden moesten vervolgens worden samengevoegd tot een videobestand, dat vervolgens hetzelfde proces kan doorlopen als de bronvideo (alle frames + gezichten uit de frames halen).

Overdracht van het model

Nu ons model zo ver stond dat beide acteurs herkenbaar zijn, maar nog steeds geen detail/scherpte hebben, is het tijd om het model over te brengen naar de nieuwe, kleinere dataset van verouderde gezichten. In ons geval kostte dit 180.000 iteraties, die samen ongeveer drie dagen training hebben gekost. Het model trainde vervolgens op de kleine dataset op nog eens 135.000 extra iteraties, ongeveer twee extra trainingsdagen. Onze use case kent zijn eindresultaat dus na 315.000 iteraties of ongeveer vijf dagen training.

Samenvoeging & Nabewerking

Voor we de finale deepfake video kunnen renderen, moeten we het getrainde model samenvoegen, wat betekent dat we de bestemming video frame voor frame moeten doorlopen en het model per frame het juiste gezicht laten genereren. We kunnen ook verschillende instellingen aanpassen, zoals de overvloeiing van het masker, de scherpte van het gezicht, en de kleurmenging modus, dit voor elk frame. We vonden dat voor elke scène een andere combinatie van kleurmengselmodi geschikt was. De kleurmengingsmodus is ook een setting in het trainingsprocess. Het kan ook de moeite waard zijn om verschillende modellen met verschillende overvloeimodi te trainen, aangezien zowel de setting binnen het trainen, als de setting binnen de nabewerking de resultaten drastisch beïnvloeden. Nu de samenvoeging van beelden compleet is, kunnen we beginnen renderen.

EbSynth

Als allerlaatste stap introduceerden we nog een laatste bestaande tool: EbSynth. Die liet ons toe om eventuele restfouten die door het model waren geslopen nog te herstellen. EbSynth is een gratis hulpmiddel om videobeelden om te zetten in gestileerde 'bewegingsschilderijen'.

De software brengt het uiterlijk van een of meer handmatig gegenereerde stijlframes over naar die van de doelvideo en creëert zo het effect van een handgeschilderde animatie.

In de context van onze Obi-Wan use case, lieten we EbSynth los op kleine framesets waarin enkele kleine fouten waren geslopen door het deepfakeproces. Enkele goede voorbeelden van waar EbSynth kan worden gebruikt zijn wanneer het gezicht (on)verborgen raakt en wanneer een paar frames niet worden gedetecteerd (bijvoorbeeld wanneer het gezicht in een zijperspectief staat of wanneer het gezicht te klein is op het scherm). Een voorbeeld van het gebruik van EbSynth in deze context is hier te zien:

Er zijn online referenties te vinden waarbij men EbSynth ook wel al eens gebruikte voor het rechtstreeks verouderen van een persoon in een video, maar dit resultaat is niet zo effectief.

Eindresultaat

We zijn klaar voor rock and roll.  In de  video van ons experiment vergelijken we het resultaat van onze deepfake use case met een deepfake die geen verouderingsproces heeft gebruikt én met het oorspronkelijke ongewijzigde resultaat.
Voor uw kijkgemak, hier zijn de twee originele acteurs uit Star Wars nog een keer:

links: Alec Guiness (1977), rechts: Ewan McGreggor (2005)

Tips voor als je zelf aan de slag gaat

Tijdens het doorlopen van dit hele proces kwamen kwamen wij nog enkele duidelijke beperkingen tegen. Hierbij geven we dus enkele praktische tips mee voor als je zelf aan de slag gaat met een deepfake video.

1) Let op de grootte van het gezicht op de originele beelden

De grootte van het gezicht in de originele video heeft een grote invloed op een vlot deepfake verwerkingsproces. Wanneer het gezicht van de acteur te klein in beeld is (doordat de acteur te ver weg van de camera staat), dan heeft DeepFaceLab moeite om een gezicht te detecteren. In het deepfake video zal dan vaak flikkering optreden. Wanneer het gezicht dan weer te groot op het originele beeld staat (bv te veel close-ups in het bronmateriaal), dan mist ons deepfake model details. Kies je brondbeelden dus met deze opmerking in gedachten.

2) Verlichtingsomstandigheden

Idealiter werk je met bron- en bestemmingsvideo's waarin vergelijkbare lichtomstandigheden zitten. Niet al onze beelden hebben dezelfde condities nodig, maar het hebben van vergelijkbare condities helpt om het getrainde model robuuster te maken. Extreme verschillen in lichtomstandigheden zoals bijna volledige duisternis, of extreme helderheid, resulteren bijna altijd in slechte eindresultaten.

3) Zijperspectieven

Deepfacelab heeft ernstige problemen met het opsporen van gezichten in zijperspectief. Zelfs wanneer het gezicht consequent wordt gedetecteerd, zal het getrainde resultaat vaak flikkeren en er onrealistisch uitzien. EbSynth kan helpen om dit wat glad te strijken, maar over het algemeen moet zijperspectief worden vermeden als je voor een geloofwaardig resultaat wil gaan.

4) Op en neer kijken

Als het gefilmde personage naar boven of naar beneden kijkt, krijgen we omstandigheden die voor ons deepfake model onbekend zijn. Dit resulteert in mogelijks zeer wispelturige resultaten. Het enige wat je kan doen om dit soort issues te vermijden is proberen om beelden van de bronacteur te vinden met dezelfde unieke kijkrichting, maar dit is misschien niet altijd mogelijk.

Conclusie

We kunnen besluiten dat wanneer je rekening houdt met de bestaande beperkingen via de 4 bovenstaande tipis, je op zeer korte tijd verbazingwekkend realistische deepfake video’s kan maken met bestaande tools. Zolang je geen close-ups in beeld hebt en de acteur in een normaal naar voren gericht perspectief wil filmen, zou ons aangeleverde proces moeten werken. Natuurlijk kan elk van deze opgesomde beperkingen worden overwonnen met maatwerk en moeite.

We hopen dat we aan de hand van dit kleine experiment een duidelijker idee hebben kunnen geven  van wat deepfake video technologie kan wanneer je bestaande AI tools met elkaar combineert.  

Zoals we aan de resultaten in onze finale showcase video kunnen zien, is het mogelijk om een kleine aangepaste dataset te gebruiken om de gelaatstrekken in een beperkte mate zelfs op het einde van het project nog te veranderen. Zo zou je bovenop dit resultaat nog gezichtshaar kunnen toevoegen, het haarkleur van de personages nog kunnen veranderen, littekens toevoegen …   Dit laat zien hoe veelzijdig en flexibel deze technologieën kunnen zijn en hoe makkelijk ze binnen VFX projecten kunnen geïmplementeerd worden.

Onze studenten moeten nog even wachten op de workshop, maar jullie kunnen zeker al aan de slag. Bedankt om tot het einde van deze blogpost te lezen. Als je vragen hebt, aarzel dan niet om contact met ons op te nemen via daeresearch@howest.be