Tekoäly elokuvantekijän työvälineenä: Miten kuvangenerointijärjestelmiä hyödynnettiin Kukoistus-lyhytelokuvan tekoprosessissa

Vertti Luostarinen
8 min readFeb 6, 2022

Pohdin jo opinnäytetyössäni ”GPT-2:n hyödyntäminen fiktiosisältöjen käsikirjoittamisessa ajatusta algoritmisesta kauhusta. Siinä pelottavuus kumpuaa outouden laaksosta, siitä vieraannuttavasta tunteesta, jota koemme, kun olemme tekemisissä tekoälyn kanssa. Kun minua pyydettiin tekemään elokuva Budapestiin Finnish Film Daysille, päädyin muutaman mutkan kautta palaamaan saman aiheen äärelle ja lopulta tehneeksi elokuvan, joka voitaisiin luokitella algoritmiseksi kauhuksi. Tässä postauksessa käyn läpi, miten käytin tekoälyä elokuvan tekemiseen ja miten tekstipohjainen kuvangenerointi on päätynyt vaikuttamaan elokuvanteon prosessiin ensin käsikirjoitusvaiheessa ja myöhemmin animaatiojaksoissa.

Näyttelijä Lauri Ahonen ottamassa ensi askeleitaan matkallaan kukoksi.

Miten tekstiä kuviksi muokkaava työkalu muokkaa elokuvaa

Alkuperäinen tarkoitukseni ei ollut hyödyntää tekoälyä elokuvassa lainkaan. Aloitimme käsikirjoittajakollega Oili Syväsen kanssa käsikirjoitusprosessin tutkimalla suomalaisia ja unkarilaisia kukkomyyttejä. Niille oli yhteistä vastuunoton teema; kukko saapuu taloon ja se, miten talon ihmiset päättävät reagoida siihen, määrittää miten kukko heidät palkitsee. Suomalaisissa myyteissä kukko tuli levittämään lähinnä ruttoa, ja tarinan opetus oli useimmiten panna paha kiertämään ja viedä kukko naapuriin. Unkarilaisissa tarinoissa kukko sen sijaan saattoi jäädä taloon asumaan ja ryhtyä vaikkapa leskelle uudeksi puolisoksi. Ihmisen ja eläimen rajat siis hämärtyivät, jos eläimestä suostui ottamaan vastuun ja kohtelemaan sitä hyvin.

Myyttien inspiroimana hahmottelimme tarinaa siitä, miten suomalainen pariskunta reagoi kesämökin pihamaalle ilmestyvään kukkoon. Aihio perustui myös jämsäläiseen tositapaukseen, jossa tien vierestä oli löytynyt jätesäkissä kukko ja kana. Tahdoin kertoa kukon inhimillistymisestä ja ihmisen kukkoistumisesta; ajan mittaan poikaystävä Jari ja kukko alkavat peilata toisiaan. Tällaiset posthumanistiset, perinteisen ihmisyyden rajat ylittävät teemat ovat aina olleet tekijänä lähellä sydäntäni.

Tässä vaiheessa kirjoittamisprosessia tajusin ensimmäistä kertaa yhteyden tekstipohjaisen kuvangeneroinnin ja käsittelemäni materiaalin välillä. Tiesin kokemuksesta, että kuvia generoiva tekoäly on todella hyvä liittämään visuaalisia elementtejä yhteen odottamattomilla tavoilla; se jos mikä kykenee hiipimään perinteisen ihmisvetoisen taidekäsityksen rajaviivojen yli epämukavilla tavoilla. Olin havainnoinut tätä ilmiötä kirjoittaessani Opasta tekstipohjaiseen kuvangenerointiin asiasisällöissä viime vuonna.

Menen yksityiskohtiin paljon tarkemmin oppaassa, mutta karkeasti yksinkertaistaen tekstipohjaisella kuvangeneroinnilla tarkoitetaan prosessia, jossa käytetään tekoälyä muuntamaan ihmisen antama tekstisyöte kuvaksi. Tekstiä menee sisään ja kuvia tulee ulos.

Tuotin tekoälyllä kuvastoa, joka voisi ohjata käsikirjoitusprosessia eteenpäin ja viedä sitä suuntiin, joita en ollut tullut ajatelleeksi. Samalla kuvat toimivat elokuvalle varhaisena konseptitaiteena sponsorien houkuttelua varten.

Konseptointi- ja käsikirjoitusvaiheessa elokuvaa pitää kaupitella yhteistyökumppaneille ennen kuin kuvaakaan itse elokuvasta on kuvattu. Kukoistuksessa konseptitaidetta oli tarjolla rajattomasti, kiitos tekoälyn.

Yleensä elokuvia rakennetaan tekstistä kuviksi. On yksi koko alan isoimmista paradokseista, että audiovisuaalisten teosten perustukset valetaan mediassa, jossa ei ole mitään auditiivista tai visuaalista: käsikirjoituksessa. Kukoistuksessa tekstipohjainen kuvangenerointi mahdollisti sen, että minulla oli käsikirjoitukseen pohjaavaa kuvamateriaalia jo väliversioita työstäessäni. Ohjasin tekoälyä yksinkertaisilla tekstisyötteillä, kuten ”a painting of a rooster man”, ja ne puolestaan vaikuttivat siihen, miten tarina kulki eteenpäin. Tekoäly keksi paljon uudenlaisia tapoja, joilla Jari ja kukko kykenivät sulautumaan toisiinsa.

Lopulta aloin pohtia myös sitä, miten kuvangeneroinnin voisi integroida näkyväksi osaksi elokuvaa. Yhdessä vaiheessa meidän oli tarkoitus tulostaa kuvia ja tehdä niistä osa lavastusta, mutta tästä luovuttiin tuotannollisista syistä. Kuvat pitäisi herättää eloon, jotta ne eivät jäisi pelkiksi koristeiksi, vaan veisivät tarinaa eteenpäin.

Voiko tekoäly liikuttaa kuvaa?

Olin jo opinnäytetyöni loppupuolella visioinut sellaista elokuvanteon tulevaisuutta, jossa koneet tekevät käsikirjoituksen ja toiset koneet taikovat käsikirjoituksesta liikkuvia kuvia. Vajaassa kahdessa vuodessa tuosta kuvitelmasta on tullut jo pitkälti todellisuutta tekstipohjaisen kuvangeneroinnin ansiosta. Viimeinen linkki kuitenkin vielä puuttuu, eli se, miten liikkumattomista kuvista saataisiin liikkuvia. Harkitsin useita eri lähestymistapoja tähän ongelmaan.

Ensimmäinen ajatukseni oli hyödyntää videota jatkavaa tekoälyä liikkeen aikaansaamiseksi. On olemassa tekoälyjärjestelmiä, jotka on koulutettu täydentämään niille syötettyjä videoita. Niille on toisin sanottuna näytetty riittävä määrä liikkuvaa kuvaa, jotta ne kykenevät yhden kuvan perusteella arvaamaan tulevat kuvat, joista lopullinen video koostuu. Tällaisiin järjestelmiin perehtyessäni ymmärsin kuitenkin nopeasti, että niillä on muutamia melko kriittisiä rajoituksia.

Useimmat ennustavista järjestelmistä ovat melko kontekstisidonnaisia. Esimerkiksi Nvidian ennustusjärjestelmää on onnistuneesti sovellettu vaikkapa liekkien tai ilotulituksen generoimiseen. Kaikkiin kohteisiin sen tapa luoda liikettä ei kuitenkaan toiminut. Se ei useimmiten oikein ymmärtänyt, mikä antamassani still-kuvassa kuuluisi liikkua ja niinpä se liikutti vähän kaikkea. Lopputulos ei näyttänyt liikkuvalta kuvalta, vaan väreilevältä still-kuvalta.

Tämä ei ole still-kuva, vaan hyvin hienovaraisesti väreilevä video.

Toisissa liikettä ennustavissa järjestelmissä oli samankaltaisia ongelmia: niiden tuottamissa videoissa vaikkapa osa kohteesta putosi pois ja osa jäi paikalleen, tai taivas kohteen taustalla lähti livohkaan. Väreilemisen sijaan niissä kohteet tuntuivat pirstaloituvan. On yksi asia opettaa koneoppimisjärjestelmää tuottamaan sanaa ”kukko” vastaava kuva, ja aivan toinen asia yrittää tarjota sille tietoa siitä, miten tuon ”kukon” kuuluisi liikkua. Mikäänhän ei kerro kuvangenerointijärjestelmälle, onko kukko edes elävä olento vai vaikkapa jonkinlainen kaasumaisesti liikehtivä luonnonilmiö.

Vapaan liikkeen ohella kokeilin myös laittaa tekoälyn luomaan zoom-efektiä, mutta totesin pian, ettei sekään tuottanut tunnetta liikkeestä, vaan jäi pelkästään irralliseksi efektiksi. Lisäksi se ei toiminut kovin hyvin valitsemani “piirrostyylin” kanssa, sillä se tarvitsi selkeitä ääriviivoja toimiakseen kunnolla.

Luovuin tässä kohtaa todellisen liikkeen ideasta ja aloin pohtia tapoja, joilla voisi luoda liikkeen illuusiota. Muistin tässä kohtaa Ebsynth-ohjelman, jota käytin Uneton48-kilpailuun tekemässäni elokuvassa ”Viinahiiriä ja ihmisiä”. Ohjelma on melko monikäyttöinen, mutta sen yleisin sovellutus on tehdä kuvatusta videosta animoidun näköistä, ja siihen mekin sitä olimme taannoin lyhytelokuvassa käyttäneet. Tällä kertaa suunnitelmani oli hieman monimutkaisempi; ajattelin, että voisin yhdistää elävää kuvaa ja tekoälyn tekemiä still-kuvia Ebsynthin avulla siten, että lopputulos vaikuttaisi animoidulta. Ajattelin, että Ebsynthiä voisi käyttää häivyttämään rajaa niiden välillä riittävästi, jotta tekoälyelementit sulautuisivat paremmin kokonaisuuteen. Huomasin kuitenkin äkkiä, että still-kuvat näyttivät Ebsynthin läpi menneinä yhä pelkiltä stilleiltä ja yritykseni vedellä niitä pitkin kuva-alaa editointikonstein näyttivät nekin todella tönköiltä. Liikkuvien osien sisällyttäminen samoihin otoksiin oikeastaan vain korosti niiden staattisuutta. Kokonaisuudesta oli myös hyvin hankala karistaa sellaista oloa, että kyseessä on animaatiofiltterin läpi vedettyä videota, eikä oikeaa animaatiota.

Ebsynthin ohella käytimme StyleTransfer-GANeja muuttamaan videoruudut maalausmaisen näköisiksi. Ebsynth tarvitsee aina esimerkin siitä tyylistä, millaiseksi muutkin videon ruudut pitää muuttaa.

Suunnitelma C oli hyödyntää ns. iterointianimaatioita. Kun koneoppimisjärjestelmä lähtee luomaan kuvaa, se tekee siitä vähitellen uusia versioita, iteraatioita. Useimmat kuvangenerointijärjestelmät ovat tehneet melko helpoksi tämän iterointiprosessin tarkkailun, jotta kuvan muovaaminen omanlaiseksi olisi sujuvampaa ja virheiden löytäminen nopeampaa. Monet generointityökirjat sisältävät jopa valmiin videonkoostamistyökalun, jotta iterointiprosessia voi lopuksi arvioida ja nähdä, missä kohtaa generointijärjestelmä on tehnyt lisäyksiä.

Tällaiset videot eivät ehkä näytä niinkään liikkuvan kuin syntyvän, vähän kuin seuraisi timelapse-elokuvaa siitä, miten joku maalaa kuvaa. En saisi niillä aikaiseksi liikkuvia kohteita perinteisessä mielessä, mutta minulla oli muutamia ajatuksia siitä, miten iteraatioanimaatioita voisi elävöittää, jotta lopputulos olisi enemmän animaatiomainen. Päädyin lopulta siis käyttämään animaatioihin samoja tekstipohjaisia järjestelmiä, joilla olin tehnyt myös konseptikuvat. Aina ei kannata mennä merta edemmäs kalaan.

Animaatiotyönkulun rakentaminen

Yksi ensimmäisiä Kukoistuksen iteraatioanimaatioita.

Käyttämissäni tekstipohjaisissa kuvangenerointijärjestelmissä on kaksi elementtiä, sanojen ja kuvien välisiä yhteyksiä laskeva CLIP, ja kuvia generoiva GAN. Kyse on nimenomaan tekstipohjaisesta kuvangeneroinnista, sillä CLIP on vain tilastollinen malli, joka kykenee ohjaamaan GANin suorittamaa kuvangenerointia tiettyyn suuntaan.

Kuten minkä tahansa koneoppimismallin kanssa, myös kuvangenerointijärjestelmien kanssa suurimmat valinnat tehdään jo ennen generointia, kun valikoidaan se data, jolla järjestelmä koulutetaan. Käytin animaatioruutujen generointiin pääasiassa WikiArt-datasettiä, koska totesin, että sillä sain aikaan maalausmaista jälkeä, joka toi animaatioille luontevuutta ja ”animaatiomaisuutta”. Myös tekstisyötteet olivat totuttuun tapaan ”a painting of”-etuliitteillä varustettuja.

Kun nämä parametrit olivat selvillä, siirryin ratkomaan iterointiin liittyviä ongelmia. Useimmat GAN-pohjaiset kuvangenerointijärjestelmät toimivat siten, että suurimmat harppaukset iteraatioiden välissä tapahtuvat heti alussa, ja mitä pidempään kuvangenerointialgoritmi raksuttaa saman kuvan parissa, sitä pienempiä muutoksia siihen tulee. Tämä johtaa videoihin, joiden ensimmäiset sekunnit voivat olla hyvin dramaattisia, mutta muuttuvat jälleen vain väreileviksi still-kuviksi nopeasti sen jälkeen. Tähän kehitin parikin erilaista ratkaisua, joista ensimmäinen oli tylysti leikata seuraavaan klippiin muutaman sekunnin jälkeen. Tämä johti kuitenkin todella hektiseen ja hakkaavaan leikkaustyyliin, joka pommitti katsojaa visuaalisella informaatiolla.

Seuraavaksi kokeilin manipuloida GANin parametrejä siihen suuntaan, että se tekisi pienempiä muutoksia iteraatioiden välillä. Tämä auttoi siinä, että aika, jolloin animaatioissa tuntui tapahtuvan ja kuva oli vielä muotoutumassa, kasvoi. Viimein päätimme vielä ediitissä leikkaaja Elvira Schirmerin kanssa, että animaatiot etenisivät 12 ruutua sekunnissa perinteisen 25 ruudun sijasta. Tällöin videot hidastuivat entisestään.

Kukkoistumisprosessi etenee. Tässä GANin alkukuvana on käytetty ruutua elokuvan kuvamateriaaleista.

Tämän jälkeen aloin kokeilla, miten iterointiprosessiin saisi enemmän variaatiota. GANit aloittavat generointiprosessin aina jostakin alkukuvasta. Sillä, minkälainen alkukuva on, on melkoinen vaikutus siihen, millainen myös varsinainen, tekstin ohjaama lopputulos on. Vaihtelemalla alkukuvaa saa aikaan hyvinkin erilaisia tuloksia. Keksin käyttää alkukuvina kuvakaappauksia elokuvan kuvamateriaaleista. Tämä tuotti mielenkiintoisia tuloksia, koska pystyin tekemään miespääosan esittäjästä Lauri Ahosesta kukkomaisemman käyttämällä alkukuvana hänen kasvojaan. Kokeilin myös metodia, jossa käytin uuden generoinnin alkuna aina edellisen animaation seuraavaa kuvaa, mutta se tuotti makuuni oudon nytkähtelevää jälkeä, koska yrityksistäni huolimatta eniten liikettä tapahtui kuitenkin aina animaatioiden alussa.

Seuraava ratkaistava ongelma liittyi resoluutioon ja menee melko tekniseksi. GAN-pohjaiset järjestelmät nojaavat Nvidian valmistamien näytönohjainten ominaisuuteen nimeltä CUDA-prosessointi. CUDA-prosessointia tehdään näytönohjaimissa erityisillä CUDA-ytimillä. Käytössä olevien CUDA-ydinten määrä on suoraan sidoksissa siihen, millä resoluutiolla kuvia voi tuottaa. Yksinkertaistettuna siis: mitä parempi näytönohjain, sitä isompia kuvia. Googlen Colaboratory-palvelu, jonka kautta minulla on ollut tapana käyttää tekoälyjärjestelmiä, tarjosi päivästä toiseen ainoastaan näytönohjainta, jossa oli niin vähän CUDA-ytimiä, että maksimikoko animaatioruuduille oli 800x450 pikseliä. Tämä johti melkoiseen pikselimössöön, varsinkin verrattuna elokuvan muuhun UHD-laadulla eli 3840x2160-resoluutiolla kuvattuun materiaaliin.

Taottuani muutaman päivän ajan päätäni seinään tämän ongelman parissa muistin, että on olemassa tekoälyjä, jotka kykenevät keksimään kuviin lisää pikseleitä, siis skaalaamaan niiden resoluutiota ylöspäin. Olin itsekin taannoin tehnyt samanlaisella tekniikalla 4k-version turkkilaisesta Tähtien sodasta omaan käyttööni. Kun syötin kuvat ESRGAN-ylösskaalaajaan, joka nelinkertaisti pikselien määrän, sain ulos kuvia, joiden resoluutio oli 3200x1800. Ei aivan siis UHD:ta, mutta tarpeeksi lähellä. Tekoälykuviin ylösskaalaus jopa toimii paremmin kuin ihmisen ottamiin. Kun tekoäly keksii lisää informaatiota kuvaan, sen ottamat vapaudet eivät pistä niin pahasti silmään, sillä kuvassa näkyvät kohteet eivät ole katsojalle samalla tavalla tuttuja. Jotain teknologia tosin teki kuvien väreille; animaatioista tuli hyvin sinisiä ja niitä pitää vielä muokata uudelleen värimäärittelyvaiheessa.

Olin siis onnistunut luomaan Colaboratoryyn työnkulun, joka lähti liikkeelle GAN-mallin, datasetin ja tekstisyötteen valinnasta, eteni generoinnin kautta ESRGAN-ylösskaalaajaan ja tuotti päivässä noin seitsemän sekuntia valmista animaatiota.

Lopuksi

Prosessin lopputuloksena syntyi animaatioita, jotka ovat yllättävällä tavalla orgaanisen oloisia. Ne tuntuvat elävän ja kasvavan tavalla, joka istuu mielestäni hyvin elämänmuotojen sulautumista käsittelevään elokuvaan. Ne tuntuvat vierailta, mutta samaan aikaan luonnollisilta. On tavallaan hauskaa, miten niinkin tekninen asia kuin tekoäly on tuonut mukanaan tekoprosessiin lopulta eläimellisiä ja kasvimaisia elementtejä. Tekoäly ylittää kategorioita samalla tavalla kuin tarinan kukkokin.

Jo antropologi Mary Douglas väitti, että kategoriset anomaliat, siis siistit määritelmärajat ylittävät asiat, ovat niitä, joita kulttuurillisesti pidämme uhkaavina. Hirviöt kautta historian ovat olleet jonkinlaisia rajanrikkojia; zombit rikkovat käsityksiämme elämästä ja kuolemasta, ihmissudet taas häivyttävät Kukko-Jarin tavoin rajoja ihmisen ja eläimen välillä. Hirviökuvaukset, varsinkin elokuvan historiassa, tosin harvoin ovat ulottaneet hirviömäisyyttä tarinatason ulkopuolelle. Kun työskentelin tekoälyn kanssa, päädyin antamaan ruorin oman käsityskykyni ylittäville voimille ja luomaan jotain, joka on paikoitellen hirviömäistä myös rakenteensa ja presentaationsa puolesta. Kun kokonaisuuteen vielä yhdistetään säveltäjä Heikki Ketolan infernaaliset säkkipillit, on lopputuloksena katsomiskokemus, joka tuskin ainakaan jättää katsojaansa kylmäksi. Ja toivon mukaan herättää hetkittäin algoritmista kauhua.

Elokuva saa ensi-iltansa Budapestissa Toldi-elokuvateatterissa 19.2.2022 osana Finnish Film Days-tapahtumaa. Kiitos Björkqvist-rahastolle rahoituksesta, sekä Laitilan Wirvoitusjuomatehtaalle, Helsinki Distillerylle ja Ravintola Gopalille elokuvan sponsoroinnista.

--

--