Tyylinsiirto neuroverkolla -missä nyt mennään?

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.

voikukka2

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.

kcy-svanstein

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.
sg0121-o6b-5000

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.

webcam-8

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.

13319832_10154350678878729_9121630049567734789_n 13631426_10154447075118729_4305692201693102001_n 13590365_10154441100598729_1529703482112326313_n 13407122_10154362334043729_9195650560963400310_n 13406702_10154358832833729_6778726443557436080_n 13335945_10154363850698729_7387738817002639327_n 13335635_10154353353698729_8706872279582061958_n 13332961_10154356924908729_2820591695876020740_n 13332785_10154353187183729_3501822723956145775_n 13319895_10154351699898729_4175794135248685437_n 13315332_10154355498193729_3888213330757277491_n

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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *