Olen useassa postauksessa kertonut kuvien luomisesta neural-stylen avulla. Yritän nyt vähän valottaa kuinka se toimii.
Neural-stylen ytimenä on neuroverkko, joka on valmiiksi opetettu tunnistamaan kuvista piirteitä ja hahmoja. Tällaiset neuroverkot on laajoja kokonaisuuksia, joissa yleensä on kahdenlaisia kerroksia:
- Konvoluutiokerrokset, jotka tarkastelevat kuvaa ikäänkuin pienen liikkuvan ikkunan kautta, ja näin havainnoivat kuvasta paikallisia piirteitä. Kun konvoluutiokerroksia kytketään peräkkäin, alemmat kerrokset havaitsevat kuvasta alkeellisia peruspiirteitä, kuten viivan pätkiä. Ylemmät kerrokset, sopivasti koulutettuna, oppivat havaitsemaan suurempi kokonaisuuksia kuten esineitä ja muita hahmoja.
- Täysin kytketyt kerrokset, joilla konvoluutiokerrosten havaitsemista hahmoista jalostetaan lopullinen tieto mitä verkko kuvassa näkee. Toisin kuin konvoluutiokerroksissa, joissa ”neurosolut” kytkeytyvät vain lähimpiin naapureihinsa, täysin kytketyissä kerroksissa jokainen input-kerroksen solu vaikuttaa jokaiseen output-kerroksen soluun.
Vaikka täysin kytketyt kerrokset ovat välttämättömiä kuvien sisällön tunnistamisessa ja luokittelussa, neural-style ei tarvitse niitä vaan toimii lähinnä konvoluutiokerrosten pohjalta. Mutta kuinka? Neuroverkon lisäksi tarvitaan kuva S sisältömalliksi ja kuva T tyylimalliksi. Sitten neural-style lähtee satunnaisesta kuvasta (”lumisadetta”) joka syötetään neuroverkkoon ja verrataan lopputulosta haluttuun sisältöön S ja tyyliin T. Neuroverkkoa ohjataan sopivalla optimointialgoritmilla minimoimaan sekä sisällön että tyylin poikkeamien summa. Tätä toistetaan tarpeeksi kauan, satoja tai tuhansia kertoja jotta saadaan lopullinen kuva.
Sisältöä ja tyyliä voidaan painottaa eri tavoin painokertoimilla, joilla suoraan vaikutetaan poikkeaman laskentaan. Lumisadekuvan sijaan voidaan myös lähteä sisältökuvasta. Lumisadekuvan kanssa neural-style pyrkii koko ajan minimoimaan sekä sisällön että tyylin poikkeamaa, sisältökuvasta lähdettäessä sisällön poikkeama on tietysti aluksi nolla, ja sen pitää antaa kasvaa jotta tyylin poikkeama saadaan pienemmäksi, optimointi lähestyy lopputulosta siis eri puolelta, tyylin poikkeama pienenee samalla kuin sisällön poikkeama kasvaa. Toimintaan voidaan myös vaikuttaa sillä miltä kerroksilta poikkeamaa mitataan.
Mutta miten tyyliä mitataan? Tässä on käytössä menetelmä jonka esittivät Leon A. Gatys, Alexander S. Ecker ja Matthias Bethge artikkelissaan A Neural Algorithm of Artistic Style . Kytkemällä konvoluutiokerroksen perään Gramianin matriisi saadaan kuvasta eristettyä siinä toistuvasti esiintyviä tyylillisiä piirteitä. Tyyli pitää tässä ymmärtää aika suppeassa merkityksessä, lähinnä värien ja tekstuurin käyttönä. Neural-style ei ymmärrä yhtään mitään taiteilijan tyylistä syvemmässä merkityksessä. Neural-stylen kyky hahmottaa kuvia ja tyylipiirteitä on myös vahvasti sidoksissa siihen millä aineistoilla ja kuinka hyvin neuroverkko on opetettu.
Erinomainen juttu. Täytyypä joskus kokeilla.
Noita neural-style -nimisiä toteutuksia näyttää olevan aika monta tuolla githubissa. Tuo mitä olen itse käyttänyt syyskuusta asti on tämä https://github.com/jcjohnson/neural-style . Voisin vaikka tehdä siitä suomenkielisen asennusohjeenkin.
Pingback: Tyylinsiirto neuroverkolla -missä nyt mennään? – Löytöretkiä siellä täällä