Tyylinsiirto neuroverkolla, jossa luodaan uusi kuva niin että yhden kuvan sisältö yhdistetään toisen kuvan tyyliin, syntyi noin vuosi sitten. Kaikki alkoi Leon Gatysin jne. tieteellisestä artikkelista. Siinä kuvattiin menetelmä, joka käytti konvoluutioneuroverkkoa yhdistettynä Gramianin matriiseihin (katso Kuinka neural style toimii). Ei mennyt kauaakaan kun githubista jo löytyi toimivia toteutuksia. Näistä menestyksekkäin oli varmaankin neural-style; se keräsi nopeasti laajan ja aktiivisen käyttäjäkunnan ja se on myös monen jatkokehitellyn toteutuksen pohjana.
Justin Johnsonin kehittämä neural-style on monipuolinen, varmatoiminen ja suhteellisen helppo asentaa, kunhan on jonkinverran perehtynyt linuxin komentorivikäyttöön ja github-sovellusten asentamiseen. Se toimii yllättävänkin hyvin monenlaisella kuva- ja tyyliaineistolla, ja vaikka sovelluksen asetuksien kirjo onkin aloittelijalle hämmentävä, asetukset toimivat hyvin kunhan niihin ensin tottuu. Käyttäjille isoimpia ongelmia ovat olleet nopeus ja skaalautuvuus. Neural-style tekee kuvan iteroimalla ja siihen menee aikaa, joskin GPU:n kanssa toiminta on silti melko nopeaa. Itselleni nopeus ei ole ollut ongelma, siitäkään huolimatta että viime aikoihin asti olen ollut ilman GPU:ta. Kun laittaa ohjelman tallentamaan välituloksia tarpeeksi usein, on ihan mukava seurata kuvan syntyä ja kehittymistä, siinä oppii tuntemaan ohjelman ja sen asetusten toimintaa ja kuvanteon voi myös keskeyttää kun se tuntuu kehittyvän väärään suuntaan.
Skaalautuvuus on hankalampi ongelma. Käytettävissä oleva muisti rajoittaa kuvien kokoa, useimmilla käyttäjillä on enintään 8GB GPU-käytössä. Voisi ajatella, että käyttää GPU:ta hakemaan sopivat asetukset ja sen jälkeen luo lopullisen kokoisen kuvan CPU:lla, jonka käyttöön on yleensä mahdollista asentaa ainakin 32GB. Ikävä kyllä tyylinsiirto ei skaalaudu hyvin: kuvan ulkoasu muuttuu oleellisesti kun kuvakoko kasvaa, eikä tähän ole löydetty ratkaisua asetuksien kautta. Voikin olla, että muutos johtuu siitä että kun neuroverkko on koulutettu tietyllä kuvakoolla, se oppii reagoimaan kuvan piirteisiin sen mukaisella pikselitarkkuudella. Kun kuvakoko kasvaa, sama pikselimäärä sisältää yksityiskohtaisemman osan kuvasta, ja verkko reagoi eri tavoin kuvan piirteisiin. Monet hakevatkin ratkaisua kuvan jälkikäsittelystä ns. superresoluutiotekniikalla, sopivasti opetetun neuroverkon käytöllä kuvan koon kaksinkertaistamiseen laatua heikentämättä. Tällaisia ratkaisuja on olemassa, mutta ainakaan toistaiseksi ei ole tullut vastaan riittävän hyvää, kätevää ja yleiskäyttöistä.
Vuoden aikana on ilmaantunut myös yleisölle suunnattuja palveluita ja sovelluksia, kuten deepart.io, ostagram, pikazo ja prisma. Nämä ovatkin käytännössä ohjanneet uusien käyttäjien odotuksia; niinpä on aika tavallista että neural-stylen käyttäjä kyselee ”kuinka saan tällä samannäköistä jälkeä kuin X:llä?”. Voi toki myös ihmetellä, miksi nimenomaan haluaa samanlaista jälkeä kuin kaikki muutkin, mutta voihan tämmöinen pyrkimys olla myös kimmoke opiskella tyylinsiirtoa syvemmin.
Nopeus ja skaalautuvuus ovat erityisen tärkeitä tällaisia palveluita kehittäville ja ylläpitäville. Viime aikoina onkin ilmaantunut uusia ratkaisuja, joissa esimerkiksi käytetään neuroverkkoa tuottamaan kuva suoraan. Neural-stylehän ei suoraan tee kuvaa, vaan mittaa sisäänsyötetyn kuvan sisältöä ja tyyliä, ja pyrkii iteroiden tekemään halutunlaisen kuvan. Mutta on mahdollista rakentaa myös sellainen neuroverkko, joka tekee itse kuvan, ja opettaa tämmöinen verkko muuntamaan kuvaa: kuva sisään ja muunnettu kuva ulos.
Dmitry Ulyanovin Texture_nets toimii juuri näin. Ensin opetetaan verkko reagoimaan tyylimalliin: otetaan yksi kuva tyylimalliksi ja opetetaan kuvaa tuottava verkko ajamalla sen läpi sopivaa kuvamateriaalia kunnes tulos alkaa olla haluttu. Oppimista voi seurata kätevän selainpohjaisen monitorointikäyttöliittymän kautta.
Koulutus vie yleensä puolesta tunnista muutamaan tuntiin, GPU:ta käyttäen, ja kun verkko on valmiiksi koulutettu, kuvien muuntaminen on todella nopeata. Kun kokeilin sitä ensimmäisen kerran, tuntui ettei mitään tapahtunut, ohjelma alusti neuroverkon ja lopetti samantien. Mutta olihan sinne hakemistoon ilmaantunut se kuva.
Verkon kouluttaminen ei kuitenkaan ole ihan ongelmatonta, eikä kokemus neural-stylestä välttämättä auta ollenkaan. Toistaiseksi tuntuu että mahdollisten tyylien kirjo on jollain tavalla rajallinen, tyylikuvasta huolimatta muunnetuissa kuvissa on jotakin ratkaisulle tyypillistä, jota on vaikea sanoin ilmaista. Tyylit voivat myös toimia upeasti, mutta näyttää oleellisesti erilaisilta kuin tyylin mallina ollut kuva. Tässä voi osittain olla mittakaava ongelmana. Toisin kuin neural-style, texture-nets ei skaalaa kuvia, se vain rajaa kuvista halutunkokoisen alueen koulutuksen aikana. Niinpä korkean resoluution kuvista rajautuukin pieniä yksityiskohtia jotka eivät välttämättä olekaan tyylin oppimisen kannalta järkeviä. Kuvamateriaali kannattaa siis valmiiksi skaalata sellaiseen kokoon, että koulutuksen aikana kuvat rajautuvat mielekkäällä tavalla.
Texture_nets on ilman muuta hieno työkalu ja tarjoaa mielenkiintoisia haasteita. Sillä saa toisinaan upeaa jälkeä, mutta sen ei voi olettaa saman tien toimivan kuten neural-style tai tuottavan automaattisesti halutun tyylin kopioita.
Texture-nets ei ole ainoa, eikä edes ensimmäinen tällaista kuvan valmiiksi tekevää ratkaisua käyttävä sovellus. Neural-stylen kehittäjä, Justin Johnson, esitti ratkaisun periaatteen artikkelissa maaliskuussa 2016. Hän ei ole julkaissut omaa toteutustaan, mutta ainakin yksi hänen artikkeliinsa perustuva toteutus on julkaistu githubissa: chainer-fast-neuralstyle.
Texture-nets käyttää verkon koulutuksessa Gramianin matriiseja tyylin mittaamiseen ja mallintamiseen, seuraten Leon Gatysin menetelmää ja neural-stylen toteutusta. Alex J. Champandardin neural-doodle perustuu erilaiseen ratkaisuun. Gramianin matriisien sijaan siinä käytetään MRF:ää (Markov random fields) ja pilkotaan tyylikuva pieniksi paloiksi (patches), joiden pohjalta lopullinen kuva sitten kootaan niin että palat sopivat mahdollisimman hyvin yhteen. Menetelmä on hyvin erilainen kuin neural-stylessä, ja myös asetusten kannalta melkoisen mutkikas, hämmentäväkin. Toisaalta, siinä missä Gramianin matriisi tilastollisena ratkaisuna kadottaa kokonaan tyylikuvan tilallisen rakenteen, MRF ja palat säilyttävät jonkin verran tyylikuvan tilakokonaisuutta, sitä miten tyylilliset osat liittyvät toisiinsa ja myös sitä mihin ne sijoittuvat suhteessa sisältään. Picasson maalaamat silmät voivat aivan oikein ilmaantua juuri sinne missä sisältökuvassa silmien pitääkin olla. Toisaalta lopputulos menee helposti sekavaksi tyylikuvan osista muodostuvaksi koosteeksi.
Neural-doodlen perustoteutus ei tee kuvaa kerralla, mutta projektista on myös ns. forward-versio. Sen asentaminen voi olla hieman hankalaa, mutta kun sen saa toimimaan, se on yllättävän nopea myös ilman GPU:ta (15 – 45 sekuntia per kuva tehokkaalla CPU:lla). Toteutus käyttää kuvan kerralla tekevää neuroverkkoa, mutta siitä huolimatta myös iteroi. En ole tarkkaan perehtynyt koodin toimintaan, mutta oletan että iteroinnilla haetaan sitä että tyylin palat saadaan riittävän hyvin sovitettua yhteen.
Joistakin eriskummallisuuksistaan huolimatta neural-doodle/forward on mahtava työkalu. Olen pitänyt sitä joitakin päiviä muuntamassa webbikamerakuvaa vaihtelevan tyylikuvan ja satunnaisten asetusten mukaan. Nopeuden lisäksi neural-doodle/forwardissa on slice-parametri jonka pitäisi mahdollistaa suuren kuvan käsittely pienemmällä muistikoolla. En ole tätä tarkkaan testannut, mutta joskus muistin loputtua olen sen avulla saanut kuvan tehtyä. Skaalautuvuuteen voi siis olla tässä ratkaisu. En ole kuitenkaan kokeillut pysyykö tyylin ulkoasu samana kuvakoon kasvaessa.
Mikä näistä sovelluksista sitten on paras? Itselleni tämä ei oikeastaan ole mielekäs kysymys ollenkaan. Kaikki kolme ovat hyviä työkalua, ja kaikki ovat myös erilaisia. Millään niistä ei ole helppo tehdä samaa jälkeä kuin toisella, liekö edes mahdollistakaan. Sitäpaitsi, ratkaisuja ja sovelluksia on muitakin, uutta tutkimusta ilmestyy päivittäin ja sovellukset kehittyvät samaa, hurjaa vauhtia. Nyt jo teemme näillä juttuja joita emme vuosi sitten pitäneet järkevästi mahdollisina.