För några veckor sedan satt jag på ett möte på mitt jobb när min chef sa ”Vi behöver någon som tar över vårt A.I.-projekt.” Efter en liten stunds tystnad harklade sig en av mina kollegor och sa “Linus kan väl ta det?”.
När jag hörde någon yttra mitt namn tittade jag upp från min laptop, där jag antagligen satt och twittrade om handlingen i The Tomorrow War eller något, och sa lite förvirrat ”Mmmh?”, vilket tolkades som ett jakande svar. Och på så vis blev jag ansvarig för jobbets stora A.I.-projekt.
När man säger A.I. så väcks så klart direkt tankar på mördarrobotar med iskall logik, eller Haley Joel Osment med ett ansikte som buggar ur för att han ätit för mycket spenat. Men det är inte riktigt vad A.I. i en verklig kontext är, i alla fall inte än. Mer korrekt är att använda termen ”maskininlärning”, vilket är något bättre, men fortfarande tenderar att översälja vad det faktiskt handlar om.
Maskininlärning är i praktiken inte mycket mer än en svart låda som du ger två uppsättningar siffror till. Den försöker sedan lista ut det bästa sättet att göra så att siffrorna i den ena uppsättningen i slutändan ser ut som siffrorna i den andra uppsättningen. När den listat ut hur den gör det kan du sen, i teorin, ge den bara den första uppsättningen siffror, och så kan lådan lista ut hur den andra uppsättningen skulle se ut. Man har alltså ”lärt” lådan vad den ska göra med information man ger den.
På jobbet gör jag det här med hjälp av CSV-filer, alltså bara faktiska listor med siffror. Så en lista med siffror åker in och en lista med siffror kommer ut, och så hoppas man att det är rätt siffror. Men det är ju ganska tråkigt. En mycket roligare användning är att stoppa in och plocka ut bilder ur lådan, och eftersom jag ändå fått lägga en massa tid på att sätta mig in i hur man får lådan att göra saker så är det inte mer än rätt att jag använder lite av de kunskaperna för rikets räkning!
Jag drog hem två olika Google Colab-projekt och lyckades efter lite meckande få dem att fungera. Det ena genererar ansikten utifrån en enkel text-prompt och den andra tar bilder på animerade karaktärer och gör dem ”riktiga”, samt kan ändra specifika karaktärsdrag som att göra någon flintis, eller ändra deras kön. Och med det satte jag igång och började generera diverse spelrelaterade underverk.
Eftersom jag är jag var min första tanke att ta Jak från Jak & Daxter och göra honom till en riktig pojke. Tyvärr lyckades den artificiella intelligensen inte lista ut vilken del av Jak som var tänkt att vara ett ansikte och gav helt sonika upp. Jag kände ett styng av uppgivenhet i bröstet, skulle jag trots allt inte få koden att fungera? Men jag gav inte upp, utan testade istället en mer människolik karaktär för att se ifall maskinen lyckades bättre då.
Och till min stora lycka: succé!
Eller ja, succé är väl kanske ett något starkt ord.
Maskinen har listat ut att Marcus Fenix är lite av en gubbe. En äldre herre. Men den har inte riktigt fått med det faktum att han är en krutgubbe med armar som trädstammar. Istället har de gett honom ett par läsglasögon och resultatet blev lite Lars Beckman möter Magnus Härenstam.
Riktigt vad mitt syfte med nästa operation var är jag inte säker på, men när jag ändå höll på så testade jag byta kön på gubb-Marcus.
Ja, nä, men något är det väl. Om inte annat hade jag spelat skiten ur ett Gears of War med den här tantan i huvudrollen. Men jag kände fortfarande inte att jag fick det maximala resultatet från A.I:n, och fortsatta experiment med att försöka göra spelkaraktärer verkliga lämnade mig besviken. Så jag bestämde mig för att istället ta en titt på versionen som genererade ansikten baserat på fritext, för att se vad vi kunde få fram där.
Jag inledde med att fortsätta med Marcus Fenix.
Ovan ser ni två versioner av hur maskinen trodde Marcus Fenix ser ut. Bilden till höger är resultatet efter att den fick lite mer tid på sig att tänka, men jag vet inte om det gjorde saken bättre direkt. Båda versioner ser ut lite som medlemmar ur en nu metal-version av Smash Mouth.
Efter ovan monstrositeter så tänkte jag att om Marcus Fenix är det platoniska idealet av en manlig spelkaraktär, så måste väl Lara Croft vara detsamma för kvinnliga karaktärer. Hur mycket jag står bakom den logiken vet jag inte, men det var i alla fall nästa namn jag matade in i maskinen.
Inte heller här är ”bra” direkt ordet jag skulle vilja använda, men jag skulle ändå säga att det nog går att gissa vem det är på bilden om man inte hade vetat. Det kanske i och för sig säger mer om den begränsade mängden välkända kvinnliga spelkaraktärer som finns än något annat.
I mitt bröst värkte fortfarande besvikelsen över att jag inte fått förvandla Jak till en riktig pojke, så det var nästa experiment.
Till vänster har vi ”Jak from Jak & Daxter”, vilket resulterade i en inte helt bedrövlig rendering av Jak som en riktig människa. Lite Seth Green möter Tim Blake Nelson, vilket kanske inte är castingen jag skulle ha gissat på, men ändå någon form av lyckat resultat. Till höger har vi ett försök med kort och gott ”Jak” i textfältet, vilket eventuellt skapade lite förvirring gällande om det var karaktären eller djuret jag ville skapa ett ansikte av.
Med Jak avklarad tänkte jag att jag fick ge Daxter också ett försök.
Nej. Bara nej.
Marcus Fenix och Lara Croft agerade som sagt som mina platoniska ideal ovan, men vad är faktiskt det platoniska idealet av en spelkaraktär? Kanske kan vi få det besvarat genom att helt enkelt mata ”video game character” in i maskineriet.
Båda de här karaktärerna ger mig starka John Hughes-vibbar av någon anledning, men desto mindre vibben av att vara spelkaraktärer. Att båda två lutar åt det feminina hållet skulle kunna vara intressant, om det inte vore för att bas-ansiktet som används är kvinnligt, vilket jag tror har mer påverkan i det här fallet. Min gissning är att A.I:n helt enkelt inte visste vad den skulle göra här.
Och samma sak får man nog säga om mitt försök att reproducera det faktiska platoniska originalet av en spelkaraktär: Super Mario.
Måste säga att jag har svårt att se den här. Det röda och blå är där i alla fall?
Det var uppenbart att mina verktyg inte räckte till för vad jag ville göra. Dags att ta i med hårdhandskarna. Koden jag använde för att fritt generera ansikten var en förenklad version av en kod med betydligt mer frihet. Nu satte jag istället upp grundversionen, som låter mig skapa precis vad fan som helst utifrån fritext. Jag kan väl avslöja redan nu att fotorealism inte är att förvänta sig, utan resultaten ska kanske snarare ses som… abstrakt konst? Oavsett, titta och njut!
”Jak & Daxter”
”Marcus Fenix”
”Marcus Fenix’ Face”
”Video Game Character”
”Super Mario in Dark Souls”
”Sonic as Mona Lisa”
Så vad har vi då lärt oss om A.I. genom det här projektet? Inte jättemycket som är direkt användbart kanske, men väl att maskinlärning kan missbrukas till att generera diverse dumheter, vilket alltid är något. Jag har redan börjat fundera över vad jag ska hitta på härnäst. Just nu ruvar min hjärna på en idé om någon form av tävling som jag ska utsätta mina kära kollegor för, där de kommer få gissa vad det är A.I:n har försökt skapa. Plita gärna ner en kommentar om det är någon ni skulle vara intresserade av att se!
Om ni är intresserade av att själva försöka leka runt lite med A.I. så är det olika kombinationer av VQGAN, StyleGAN och CLIP som jag har meckat med, och jag har som sagt gjort det i Google Colab. Det finns en uppsjö projekt som går att hitta och testa på själva, men versionerna jag använder har jag sparat ner och gjort lite ändringar i för att fixa buggar och underlätta användningen. Ni kan hitta dem alla nedanför. Notera att du behöver kopiera projekten till din egen Google Drive innan du börjar använda dem. Vill man göra det ännu enklare för sig kan man också testa på neuralblender.com som är en hemsida som streamlineat hela processen.
Gör tecknade ansikten till riktiga ansikten
Generera ansikten baserade på text
Generera bilder baserat på text
Kommentarerna är öppna om ni stöter på problem eller har frågor, men notera att jag på inget sätt är någon expert. Jag har bara testat mig fram, googlat och hamrat på knappar tills kul saker trillat ut.