Kuvan neuroverkko. Kuvien muotoilu hermoverkkojen avulla: ei mystiikkaa, vain kiroilua

Koti / Entinen

Tavallisimmissa valokuvissa näkyy lukuisia ja ei täysin erotettavissa olevia kokonaisuuksia. Useimmiten jostain syystä koirat. Tällaiset kuvat alkoivat täyttää Internetiä kesäkuussa 2015, kun Googlen DeepDream lanseerattiin - yksi ensimmäisistä avoimet palvelut perustuu hermoverkkoihin ja on suunniteltu kuvankäsittelyyn.

Se tapahtuu suunnilleen näin: algoritmi analysoi valokuvia, löytää niistä katkelmia, jotka muistuttavat sitä joistakin tutuista esineistä - ja vääristää kuvaa näiden tietojen mukaisesti.

Ensin projekti muotoiltiin avoimeksi lähdekoodiksi, ja sitten samoilla periaatteilla luodut verkkopalvelut ilmestyivät Internetiin. Yksi kätevimmistä ja suosituimmista on Deep Dream Generator: pienen kuvan käsittely kestää vain noin 15 sekuntia (aiemmin käyttäjien piti odottaa yli tunnin).

Kuinka hermoverkot oppivat luomaan tällaisia ​​kuvia? Ja miksi niitä muuten kutsutaan sellaisiksi?

Neuroverkot jäljittelevät suunnittelussaan elävän organismin todellisia hermoverkkoja, mutta tekevät tämän matemaattisten algoritmien avulla. Kun olet luonut perusrakenteen, voit harjoitella sitä koneoppimismenetelmillä. Jos puhumme hahmontunnistuksesta, tuhansia kuvia on kuljettava hermoverkon läpi. Jos hermoverkon tehtävä on erilainen, niin harjoitusharjoitukset ovat erilaisia.

Analysoi esimerkiksi shakin pelaamisen algoritmeja shakkipelejä. Samaa polkua pitkin Googlen DeepMindin AlphaGo-algoritmi kiinalaiseen Go-peliin, jota kehuttiin läpimurrona, koska Go on paljon monimutkaisempi ja epälineaarisempi kuin shakki.

    Voit leikkiä yksinkertaistetulla hermoverkkomallilla ja ymmärtää paremmin sen periaatteita.

    YouTubessa on myös sarja ymmärrettäviä käsin piirrettyjä kuvia rullat siitä, miten neuroverkot toimivat.

Toinen suosittu palvelu on Dreamscope, joka ei voi vain haaveilla koirista, vaan myös matkia erilaisia ​​​​maalaustyylejä. Kuvankäsittely on myös erittäin yksinkertaista ja nopeaa (noin 30 sekuntia).

Ilmeisesti palvelun algoritminen osa on muunnos Neural-tyyliohjelmasta, josta olemme jo käsitelleet.

Viime aikoina on ilmestynyt ohjelma, joka maalaa realistisesti mustavalkoisia kuvia. Aikaisemmissa versioissa vastaavat ohjelmat tekivät tehtävänsä paljon huonommin, ja suurena saavutuksena pidettiin, jos vähintään 20 % ihmisistä ei pystynyt erottamaan todellista kuvaa tietokoneen väristä.

Lisäksi väritys kestää vain noin minuutin.

Sama kehitysyhtiö lanseerasi myös kuvista tunnistavan palvelun erilaisia ​​tyyppejä esineitä.

Nämä palvelut voivat tuntua vain hauskalta viihteeltä, mutta itse asiassa kaikki on paljon mielenkiintoisempaa. Uudet teknologiat tulevat ihmisten taiteilijoiden käytäntöihin ja muuttavat käsitystämme taiteesta. Ehkä pian ihmisten on kilpailtava koneiden kanssa luovuuden alalla.

Kuviontunnistusalgoritmien opettaminen on tehtävä, jonka kanssa tekoälykehittäjät ovat kamppailleet pitkään. Siksi vanhoja valokuvia värittäviä ja koiria taivaalle piirtäviä ohjelmia voidaan pitää osana suurempaa ja kiehtovampaa prosessia.

Tervehdys, Habr! Varmasti olet huomannut, että teemana on kuvien muotoilu erilaisille taiteellisia tyylejä keskusteltu aktiivisesti näissä Internetissäsi. Kaikkia näitä suosittuja artikkeleita lukiessa saatat ajatella, että näiden sovellusten konepellin alla tapahtuu taikuutta ja hermoverkko todella fantasioi ja piirtää kuvan uudelleen alusta. Sattui vain niin, että tiimimme oli samanlaisen tehtävän edessä: osana yrityksen sisäistä hackathonia teimme videotyylin, koska. siellä oli jo sovellus valokuville. Tässä viestissä tarkastelemme, kuinka verkosto "piirtää" kuvia uudelleen, ja tarkastelemme artikkeleita, jotka mahdollistivat sen. Suosittelen, että tutustut viimeiseen viestiin ennen tämän materiaalin lukemista ja yleensä konvoluutiohermoverkkojen perusteisiin. Löydät joitain kaavoja, koodia (annan esimerkkejä Theanosta ja Lasagnesta), sekä paljon kuvia. Tämä viesti on sisäänrakennettu aikajärjestyksessä artikkeleiden ulkonäkö ja vastaavasti itse ideat. Joskus laimentan sitä viimeaikaisilla kokemuksillamme. Tässä on poika helvetistä huomion saamiseksi.


Konvoluutioverkostojen visualisointi ja ymmärtäminen (28.11.2013)

Ensinnäkin on syytä mainita artikkeli, jossa kirjoittajat pystyivät osoittamaan, että hermoverkko ei ole musta laatikko, vaan melko tulkittavissa oleva asia (muuten, nykyään tätä ei voida sanoa vain tietokoneen konvoluutioverkoista näkemys). Kirjoittajat päättivät oppia tulkitsemaan piilokerroksen hermosolujen aktivaatioita, tähän he käyttivät useita vuosia aiemmin ehdottamaa dekonvoluutiohermoverkkoa (deconvnet) (muuten, saman Zeilerin ja Fergusin toimesta, jotka ovat tämän julkaisun kirjoittajia). hyvin). Dekonvoluutioverkko on itse asiassa sama verkko, jossa konvoluutioita ja poolointeja sovelletaan käänteisessä järjestyksessä. Alkuperäinen deconvnet-työ käytti verkkoa valvomattomassa oppimistilassa kuvien luomiseen. Tällä kertaa kirjoittajat käyttivät sitä yksinkertaisesti päinvastaiseen siirtymiseen ominaisuuksista, jotka saatiin verkon läpi eteenpäin kulkemisen jälkeen alkuperäiseen kuvaan. Tuloksena on kuva, joka voidaan tulkita signaaliksi, joka aiheutti tämän aktivaation hermosoluissa. Luonnollisesti herää kysymys: kuinka saada käänteinen läpikulku konvoluution ja epälineaarisuuden läpi? Ja vielä enemmän max-poolingin avulla, tämä ei todellakaan ole käänteinen operaatio. Katsotaanpa kaikkia kolmea komponenttia.

Käänteinen ReLu

Konvoluutioverkoissa käytetään usein aktivointitoimintoa ReLu(x) = max(0, x), mikä tekee kaikista kerroksen aktivaatioista ei-negatiivisia. Näin ollen, kun kuljetaan takaisin epälineaarisuuden läpi, on myös tarpeen saada ei-negatiivisia tuloksia. Tätä varten kirjoittajat ehdottavat saman ReLu:n käyttöä. Theano-arkkitehtuurin näkökulmasta on välttämätöntä ohittaa toiminnan gradienttitoiminto (äärimmäisen arvokas muistikirja on lasagneresepteissä, sieltä poimii yksityiskohdat, mikä ModifiedBackprop-luokka on).

Luokka ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # nimenomaan korjata return (self.nonlinearity(grd),) # käytä annettua epälineaarisuutta

Käänteinen konvoluutio

Tässä se on hieman monimutkaisempi, mutta kaikki on loogista: riittää, että sovelletaan saman konvoluutioytimen transponoitua versiota, mutta käänteisen ReLu:n lähtöihin edellisen eteenpäin kulkevan kerroksen sijaan. Mutta pelkään, että sanoin se ei ole niin ilmeistä, katsotaanpa tämän menettelyn visualisointia (löydät vielä enemmän konvoluutioiden visualisointeja).


Konvoluutio, kun askel = 1

Konvoluutio, kun askel = 1 käänteinen versio

Konvoluutio, kun askel = 2

Konvoluutio, kun askel = 2 käänteinen versio

Käänteinen poolaaminen

Tämä operaatio (toisin kuin edelliset) ei yleensä ole käännettävä. Mutta haluamme silti kulkea maksimin läpi jollakin tavalla taaksepäin ajon aikana. Tätä varten kirjoittajat ehdottavat karttaa siitä, missä maksimi oli suoran ohituksen aikana (maksimi sijaintikytkimet). Käänteisen ajon aikana tulosignaali muunnetaan unpoolingiksi siten, että alkuperäisen signaalin rakenne säilyy suunnilleen, se on todella helpompi nähdä kuin kuvata tässä.



Tulos

Visualisointialgoritmi on erittäin yksinkertainen:

  1. Tee suora syöttö.
  2. Valitse kerros, josta olemme kiinnostuneita.
  3. Korjaa yhden tai useamman hermosolun aktivaatio ja nollaa loput.
  4. Tee johtopäätös.

Jokainen harmaa neliö alla olevassa kuvassa vastaa suodattimen visualisointia (jota käytetään konvoluutiota varten) tai yksittäisen hermosolun painoja, ja jokainen värillinen kuva on se osa alkuperäisestä kuvasta, joka aktivoi vastaavan neuronin. Selvyyden vuoksi yhden kerroksen neuronit on ryhmitelty teemaryhmiä. Yleisesti ottaen yhtäkkiä kävi ilmi, että hermoverkko oppii tarkalleen, mistä Hubel ja Weisel kirjoittivat visuaalisen järjestelmän rakennetta koskevassa työssään, josta heidät palkittiin Nobel palkinto vuonna 1981. Tämän artikkelin ansiosta saimme visuaalisen esityksen siitä, mitä konvoluutiohermoverkko oppii kullakin tasolla. Juuri tämä tieto mahdollistaa myöhemmin luodun kuvan sisällön manipuloinnin, mutta se on vielä kaukana, lähivuosina on menty hermoverkkojen "trepanoinnin" menetelmien parantamiseen. Lisäksi artikkelin kirjoittajat ehdottivat tapaa analysoida, kuinka parhaiten rakentaa konvoluutiohermoverkon arkkitehtuuri saavuttaakseen parhaat tulokset(he eivät kuitenkaan voittaneet ImageNet 2013 -kilpailua, mutta pääsivät kärkeen; UPD: kävi ilmi, että he voittivat, Clarifai on mitä he ovat).


Ominaisuuden visualisointi


Tässä on esimerkki aktivointien visualisoinnista deconvnetillä, tänään tämä tulos näyttää jo niin ja niin, mutta silloin se oli läpimurto.


Näkyvyyskartat käyttämällä deconvnetiä

Deep Inside Convolutional Networks: kuvien luokitusmallien ja näkyvyyskarttojen visualisointi (19. huhtikuuta 2014)

Tämä artikkeli on omistettu konvoluutiohermoverkon sisältämien tiedon visualisointimenetelmien tutkimukselle. Kirjoittajat ehdottavat kahta visualisointimenetelmää, jotka perustuvat gradienttilaskeutumiseen.

Luokkamallin visualisointi

Kuvittele siis, että meillä on koulutettu hermoverkko ratkaisemaan luokitteluongelman tiettyyn määrään luokkia. Merkitään luokkaa vastaavan lähtöhermosolun aktivointiarvona c. Sitten seuraava optimointitehtävä antaa meille tarkalleen kuvan, joka maksimoi valitun luokan:



Tämä tehtävä on helppo ratkaista Theanolla. Yleensä pyydämme viitekehystä ottamaan mallin parametrien derivaatan, mutta tällä kertaa oletetaan, että parametrit ovat kiinteitä ja derivaatta otetaan syötekuvasta. Seuraava funktio valitsee tuloskerroksen maksimiarvon ja palauttaa funktion, joka laskee derivaatan tulokuvan suhteen.


def compile_saliency_function(net): """ Kääntää funktion, joka laskee näkyvyyskartat ja ennustetut luokat tietylle syöttökuvien minierälle. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], deterministinen = tosi) max_outp = T.max(outp, axis=1) näkyvyys = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, axis=1) return theano.function(, )

Olet luultavasti nähnyt outoja kuvia koirista Internetissä - DeepDream. Alkuperäisessä artikkelissa kirjoittajat käyttävät seuraavaa prosessia luodakseen kuvia, jotka maksimoivat valitun luokan:

  1. Alusta alkuperäinen kuva nollalla.
  2. Laske derivaatan arvo tästä kuvasta.
  3. Muuta kuvaa lisäämällä siihen johdannaisesta saatu kuva.
  4. Palaa vaiheeseen 2 tai poistu silmukasta.

Tuloksena olevat kuvat ovat:




Ja jos alustat ensimmäisen kuvan oikea valokuva ja suorittaa sama prosessi? Mutta jokaisessa iteraatiossa valitsemme satunnaisen luokan, asetamme loput nollaan ja laskemme derivaatan arvon, niin saamme niin syvän unen.


Varoitus 60 mb


Miksi koirien kasvoja ja silmiä on niin paljon? Se on yksinkertaista: kuvaverkossa on lähes 200 koiraa 1000 luokasta, heillä on silmät. Ja myös paljon luokkia, joissa on vain ihmisiä.

Luokka Saliency Extraction

Jos tämä prosessi alustetaan oikealla valokuvalla, pysäytetään ensimmäisen iteraation ja derivaatan arvon piirtämisen jälkeen, niin saamme sellaisen kuvan, jonka lisäämällä alkuperäiseen, nostamme valitun luokan aktivointiarvoa.


Näkyvyyskartat johdannaista käyttäen


Jälleen tulos on "niin-niin". On tärkeää huomata, että tämä on uusi tapa visualisoida aktivaatioita (mikään ei estä meitä kiinnittämästä aktivointiarvoja ei viimeiseen kerrokseen, vaan mihin tahansa verkkokerrokseen yleensä ja ottamaan johdannaista tulokuvan suhteen). Seuraava artikkeli yhdistää molemmat aiemmat lähestymistavat ja antaa meille työkalun tyylinsiirron määrittämiseen, joka kuvataan myöhemmin.

Pyrkimys yksinkertaisuuteen: The All Convolutional Net (13.4.2015)

Tässä artikkelissa ei yleensä ole kyse visualisoinnista, vaan siitä, että yhdistämisen korvaaminen konvoluutiolla suurella askeleella ei johda laadun heikkenemiseen. Mutta tutkimuksensa sivutuotteena kirjoittajat ehdottivat uutta tapaa visualisoida ominaisuuksia, joita he sovelsivat enemmän tarkka analyysi mitä malli oppii. Heidän ideansa on seuraava: jos otamme yksinkertaisesti derivaatan, niin dekonvoluution aikana ne ominaisuudet, jotka olivat syötekuvassa, eivät palaa takaisin alle nolla(ReLu:n käyttäminen syöttökuvaan). Ja tämä johtaa siihen, että negatiiviset arvot näkyvät levitetyssä takakuvassa. Toisaalta, jos käytät deconvnetiä, toinen ReLu otetaan ReLu:n johdannaisesta - tämä sallii, että et ohita negatiivisia arvoja taaksepäin, mutta kuten näit, tulos on "niin-niin". Mutta entä jos yhdistämme nämä kaksi menetelmää?




luokka GuidedBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads dtype = inp.dtype return (grd * (inp > 0).astype(dtype) * (grd) > 0).astype(dtype),)

Sitten saat täysin puhtaan ja tulkittavissa olevan kuvan.


Näkyvyyskartat, joissa käytetään ohjattua takaisinpropagaatiota

Mennä syvemmälle

Mietitään nyt, mitä tämä antaa meille? Muistutan teitä siitä, että jokainen konvoluutiokerros on funktio, joka vastaanottaa kolmiulotteisen tensorin syötteenä ja tuottaa myös kolmiulotteisen tensorin ulostulona, ​​ehkä eri mittaisen. d x w x h; d epth on kerroksen hermosolujen lukumäärä, joista jokainen luo piirrekartan koon kanssa w igth x h kahdeksan.


Kokeillaan seuraavaa koetta VGG-19-verkossa:



konv1_2

Kyllä, et näe melkein mitään, koska. vastaanottoalue on hyvin pieni, tämä on vastaavasti toinen konvoluutio 3x3, kokonaispinta-ala on 5x5. Mutta lähentämällä näemme, että ominaisuus on vain gradientin ilmaisin.




konv3_3


konv4_3


conv5_3


allas 5


Ja nyt kuvittele, että levyn maksimin sijaan otamme levyn kaikkien elementtien summan arvon derivaatan syötekuvan yli. Sitten ilmeisesti hermosolujen ryhmän vastaanottava alue kattaa koko sisääntulokuvan. Varhaisille kerroksille näemme kirkkaita karttoja, joista päättelemme, että nämä ovat värinilmaisimia, sitten gradientteja, sitten reunoja ja niin edelleen kohti monimutkaisempia kuvioita. Mitä syvempi kerros, sitä himmeämpi kuva saadaan. Tämä selittyy sillä, että syvemmillä kerroksilla on monimutkaisempi kuvio, jonka ne havaitsevat, ja monimutkainen kuvio ilmestyy harvemmin kuin yksinkertainen, ja siksi aktivointikartta himmenee. Ensimmäinen tapa soveltuu monimutkaisten kuvioiden kerrosten ymmärtämiseen ja toinen yksinkertaisille kerroksille.


konv1_1


konv2_2


konv4_3


Voit ladata kattavamman tietokannan useiden kuvien ja .

Taiteellisen tyylin hermoalgoritmi (2. syyskuuta 2015)

Joten on kulunut pari vuotta ensimmäisestä onnistuneesta neuroverkon trepanaatiosta. Meillä (inhimillisessä mielessä) on käsissämme voimakas työkalu, jonka avulla voit ymmärtää, mitä hermoverkko oppii, sekä poistaa sen, mitä emme todellakaan haluaisi sen oppivan. Tämän artikkelin kirjoittajat kehittävät menetelmää, jonka avulla voit luoda yhden kuvan samanlainen kartta aktivoinnit jossain kohdekuvassa, ja ehkä jopa useammassa kuin yhdessä - tämä on muotoilun perusta. Syötämme syötteeseen valkoista kohinaa ja samassa iteratiivisessa prosessissa kuin syvässä unessa tuomme tämän kuvan sellaiseen, jossa piirrekartat ovat samanlaisia ​​kuin kohdekuva.

sisällön menetys

Kuten jo mainittiin, jokainen hermoverkon kerros tuottaa jonkin ulottuvuuden kolmiulotteisen tensorin.




Merkitään tulos i. kerros syötteestä nimellä . Sitten jos minimoidaan syötekuvan välisten jäännösten painotettu summa ja jokin mielikuva, johon pyrimme c, niin saat juuri sen mitä tarvitset. Voi olla.



Tämän artikkelin kokeilemiseen voit käyttää tätä maagista kannettavaa tietokonetta, jossa laskelmat suoritetaan (sekä GPU:lla että CPU:lla). GPU:ta käytetään neuroverkon ominaisuuksien ja kustannusfunktion arvon laskemiseen. Theano tuottaa funktion, joka voi laskea tavoitefunktion gradientin eval_grad syötekuvan mukaan x. Tämä syötetään sitten lbfgs:iin ja iteratiivinen prosessi alkaa.


# Alusta kohinakuvalla generated_image.set_value(floatX(np.random.uniform(-128, 128, (1, 3, IMAGE_W, IMAGE_W)))) x0 = generated_image.get_value().astype("float64") xs = xs.append(x0) # Optimoi, tallenna tulos määräajoin i:lle alueella(8): print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = genered_image.get_value().astype("float64") xs.append(x0)

Jos suoritamme tällaisen toiminnon optimoinnin, saamme nopeasti kohdekuvan kaltaisen kuvan. Nyt voimme luoda valkoisesta kohinasta kuvia, jotka näyttävät sisältökuvalta.


Sisällön menetys: conv4_2



Optimointiprosessi




Tuloksena olevasta kuvasta on helppo huomata kaksi ominaisuutta:

  • kadonneet värit - tämä on seurausta siitä, että sisään konkreettinen esimerkki käytettiin vain kerrosta conv4_2 (tai toisin sanoen paino w oli nollasta poikkeava sille ja nolla muille kerroksille); kuten muistatte, varhaiset kerrokset sisältävät tietoa väreistä ja gradienttisiirtymistä, ja myöhemmät sisältävät tietoa suuremmista yksityiskohdista, mitä me havaitsemme - värit katoavat, mutta sisältö ei;
  • jotkut talot "mennään", ts. suorat viivat ovat hieman kaarevia - tämä johtuu siitä, että mitä syvempi kerros, sitä vähemmän tietoa sen sisältämän piirteen spatiaalisesta sijainnista (konvoluutioiden ja yhdistämisen tulos).

Varhaisten kerrosten lisääminen korjaa välittömästi tilanteen väreillä.


Sisällön menetys: konv1_1, konv2_1, konv4_2


Toivottavasti sinulla on nyt tunne, että voit hallita sitä, mikä piirretään uudelleen valkoisen kohinakuvan päälle.

tyylin menetys

Ja nyt päästiin mielenkiintoisimpaan: miten voimme välittää tyylin? Mikä on tyyli? Ilmeisesti tyyli ei ole se, mitä optimoimme Content Lossissa, koska se sisältää paljon tietoa ominaisuuksien tilapaikoista, joten ensimmäinen asia on jotenkin poistaa tämä tieto jokaiselle tasolle vastaanotetuista näkymistä.


Kirjoittaja ehdottaa seuraavaa menetelmää. Otetaan tensori jonkin kerroksen lähdöstä, laajennetaan se spatiaalisissa koordinaateissa ja lasketaan kovarianssimatriisi levyjen välillä. Merkitään tämä muunnos nimellä G. Mitä me todella olemme tehneet? Voidaan sanoa, että laskimme kuinka usein levyn sisällä olevat piirteet esiintyvät pareittain, eli toisin sanoen approkimoimme piirteiden jakautumista levyissä monimuuttujaisen normaalijakauman avulla.




Sitten Style Loss syötetään seuraavasti, missä s on joku kuva tyylillä:



Yritetäänkö Vincent? Periaatteessa saamme jotain odotettua - Van Goghin tyylistä melua, tiedot ominaisuuksien tilajärjestelystä katoavat kokonaan.


Vincent




Mitä jos laitamme valokuvan tyylikuvan sijaan? Saat jo tuttuja piirteitä, tuttuja värejä, mutta tila-asema katoaa kokonaan.


Valokuva tyylin menetyksellä


Mietit varmasti, miksi laskemme kovarianssimatriisin emmekä jotain muuta? Loppujen lopuksi on monia tapoja koota ominaisuuksia niin, että paikkakoordinaatit menetetään. Tämä on todella avoin kysymys, ja jos otat jotain hyvin yksinkertaista, tulos ei muutu dramaattisesti. Tarkastetaan tämä, emme laske kovarianssimatriisia, vaan yksinkertaisesti kunkin levyn keskiarvon.




yksinkertainen tyylin menetys

Yhdistetty tappio

Luonnollisesti halutaan yhdistää nämä kaksi kustannusfunktiota. Sitten generoidaan valkoisesta kohinasta sellainen kuva, että se säilyttää sisältökuvan piirteet (joilla on tilakoordinaatteihin sitoutuminen) ja tulee myös "tyyli"-ominaisuuksia, jotka eivät ole sidottu tilakoordinaatteihin, ts. toivottavasti pidämme sisältökuvan yksityiskohdat ennallaan, mutta piirrettynä uudelleen oikealla tyylillä.



Itse asiassa siellä on myös regularisaattori, mutta jätämme sen pois yksinkertaisuuden vuoksi. Jäljelle jää vastata seuraava kysymys: mitä kerroksia (painoja) tulisi käyttää optimointiin? Ja pelkään, että minulla ei ole vastausta tähän kysymykseen, eikä myöskään artikkelin kirjoittajilla. Heillä on ehdotus käyttää seuraavaa, mutta tämä ei tarkoita ollenkaan, että myös toinen yhdistelmä toimisi huonommin suuri tila Hae. Ainoa mallin ymmärtämisestä seuraava sääntö on, että vierekkäisiä kerroksia ei ole järkevää ottaa, koska niiden merkit eivät eroa paljon toisistaan, joten tyyliin lisätään taso jokaisesta konv*_1-ryhmästä.


# Määrittele häviöfunktion häviöt = # content loss losses.append(0.001 * content_loss(photo_features, gen_features, "conv4_2")) # style loss losses.append(0.2e6 * style_loss(art_features, gen_features, "conv1_1")) losses.append (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) losses.append(0.2e6 * style_loss(taide_ominaisuudet_1,)_confeatures_1 ) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # total variation sakkohäviöt.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = summa(häviöt)

Lopullinen malli voidaan esittää seuraavassa muodossa.




Ja tässä on tulos taloista Van Goghin kanssa.



Yritä hallita prosessia

Muistakaamme edelliset osat, jo kaksi vuotta ennen tämänhetkistä artikkelia muut tiedemiehet ovat tutkineet, mitä hermoverkko todella oppii. Kaikkien näiden artikkelien avulla voit luoda ominaisuuksien visualisointeja. erilaisia ​​tyylejä, erilaisia ​​kuvia, eri resoluutioita ja kokoja, ja yritä ymmärtää, mitkä kerrokset millä painolla ottaa. Mutta edes tasojen painottaminen uudelleen ei anna täyttä hallintaa tapahtuvaan. Ongelma tässä on enemmän käsitteellistä: optimoimme väärän toiminnon! Kuinka niin, kysyt? Vastaus on yksinkertainen: tämä toiminto minimoi jäännösmäärän... no, ymmärrät idean. Mutta haluamme todella, että pidämme kuvasta. Sisällön ja tyylin menetysfunktioiden kupera yhdistelmä ei ole mitta siitä, mitä mielemme pitää kauniina. On havaittu, että jos muotoilua jatketaan liian pitkään, kustannusfunktio putoaa luonnollisesti yhä alemmas, mutta tuloksen esteettinen kauneus putoaa jyrkästi.




Okei, on vielä yksi ongelma. Oletetaan, että löysimme kerroksen, joka poimii tarvitsemamme ominaisuudet. Oletetaan, että jotkut tekstuurit ovat kolmion muotoisia. Mutta tämä kerros sisältää silti monia muita ominaisuuksia, kuten ympyröitä, joita emme todellakaan halua nähdä tuloksena olevassa kuvassa. Yleisesti ottaen, jos voisimme palkata miljoona kiinalaista, voisimme visualisoida kaikki tyylikuvan ominaisuudet ja kattavalla haulla merkitä vain tarvitsemamme ja sisällyttää ne vain kustannusfunktioon. Mutta ilmeisistä syistä se ei ole niin helppoa. Mutta entä jos poistamme tyylitaulukosta kaikki piirit, joita emme halua näkyvän tuloksessa? Sitten ympyröihin reagoivien vastaavien neuronien aktivointi ei yksinkertaisesti toimi. Ja tietysti tämä ei näy tuloksena olevassa kuvassa. Sama juttu kukkien kanssa. Esitä kirkas kuva, jossa on paljon värejä. Värien jakautuminen on erittäin tahriintunut koko tilassa, tuloksena olevan kuvan jakautuminen on sama, mutta optimointiprosessin aikana alkuperäisessä olleet huiput todennäköisesti häviävät. Kävi ilmi, että bittisyvyyden pelkistys väripaletti ratkaisee tämän ongelman. Useimpien värien leviämistiheys on lähellä nollaa ja suuria huippuja on useilla alueilla. Siten käsittelemällä alkuperäistä Photoshopissa muokkaamme kuvasta poimittuja ominaisuuksia. Ihmisen on helpompi ilmaista toiveensa visuaalisesti kuin yrittää muotoilla niitä matematiikan kielellä. Hei hei. Tämän seurauksena suunnittelijat ja johtajat, jotka ovat aseistautuneet Photoshopilla ja ominaisuuksien visualisointiin tarkoitetuilla skripteillä, saavuttivat tuloksen kolme kertaa nopeammin kuin matemaatikot ja ohjelmoijat.


Esimerkki piirteiden värin ja koon manipuloinnista


Ja voit heti ottaa yksinkertaisen kuvan tyyliksi



tuloksia








Ja tässä on vidosik, mutta vain oikealla koostumuksella

Tekstuuriverkot: Pintakuvioiden ja tyyliteltyjen kuvien synteesi eteenpäin (10. maaliskuuta 2016)

Näyttää siltä, ​​​​että tämä voitaisiin lopettaa, ellei yksi vivahde. Yllä oleva tyylialgoritmi toimii hyvin pitkään. Jos otamme toteutuksen, jossa lbfgs ajetaan suorittimella, prosessi kestää noin viisi minuuttia. Jos kirjoitat sen uudelleen niin, että optimointi menee GPU:lle, prosessi kestää 10-15 sekuntia. Se ei ole hyvä. Ehkä tämän ja seuraavan artikkelin kirjoittajat ajattelivat samaa. Molemmat julkaisut ilmestyivät itsenäisesti 17 päivän välein, lähes vuosi edellisen artikkelin jälkeen. Nykyisen artikkelin kirjoittajat, kuten edellisen kirjoittajat, harjoittivat tekstuurin luomista (jos vain nollaat Style Lossin, saat suunnilleen tämän). He ehdottivat, että ei optimoida valkoisesta kohinasta saatua kuvaa, vaan jotain hermoverkkoa, joka tuottaa tyylitellyn kuvan.




Nyt, jos muotoiluprosessi ei sisällä optimointia, on suoritettava vain eteenpäinsyöttö. Ja optimointia tarvitaan vain kerran generaattoriverkon kouluttamiseksi. Tämä artikkeli käyttää hierarkkista generaattoria, jossa jokainen seuraa z suurempi kuin edellinen ja se otetaan kohinasta pintakuvioiden luomisen yhteydessä ja jostain kuvatietokannasta stylizaattorin harjoittelua varten. On kriittistä käyttää jotain muuta kuin imagenetin koulutusosaa, koska Loss-verkon sisällä olevat ominaisuudet lasketaan juuri koulutusosaan koulutetun verkon toimesta.



Havaintohäviöt reaaliaikaisessa tyylinsiirrossa ja superresoluutiossa (27.3.2016)

Kuten nimestä voi päätellä, kirjoittajat, jotka olivat vain 17 päivää myöhässä ideasta generoivasta verkostosta, olivat kiireisiä kuvien resoluution lisäämisessä. He näyttävät saaneen inspiraationsa jäännösoppimisen menestyksestä uusimmassa imagenetissä.




Vastaavasti jäännöslohko ja konv.



Meillä on siis nyt tyylihallinnan lisäksi käsissämme myös nopea generaattori (näiden kahden artikkelin ansiosta yhden kuvan generointiaika mitataan kymmenissä ms).

Loppu

Käytimme tarkistettujen artikkelien tietoja ja tekijöiden koodia lähtökohtana toisen tyylisovelluksen luomisessa ensimmäiseen videon muotoilusovellukseen:



Luo jotain tällaista.


Elokuusta 2015 lähtien saksalaiset tutkijat Tübingenin yliopistosta esittelivät näkemyksensä tyylinsiirron mahdollisuudesta kuuluisia taiteilijoita muissa valokuvissa alkoi näkyä palveluita, jotka rahastivat tämän mahdollisuuden. Se lanseerattiin länsimarkkinoille ja Venäjän markkinoille - sen täydellinen kopio.

Kirjanmerkkeihin

Huolimatta siitä, että Ostagram julkaistiin joulukuussa, se alkoi nopeasti saada suosiota sosiaalisissa verkostoissa huhtikuun puolivälissä. Samaan aikaan, huhtikuun 19. päivänä, VKontakte-projektissa oli alle tuhat ihmistä.

Palvelun käyttämiseksi sinun on valmisteltava kaksi kuvaa: valokuva, joka on käsiteltävä, ja kuva, jossa on tyyliesimerkki, joka peitetään alkuperäisen kuvan päälle.

Palvelusta on ilmainen versio: se luo kuvan vähintään 600 pikselin resoluutiolla kuvan pisimmälle sivulle. Käyttäjä saa tuloksen vain yhdestä iteraatiosta, jossa suodatin käytetään valokuvaan.

Maksullisia versioita on kaksi: Premium tuottaa jopa 700 pikselin pituisen kuvan pisimmälle sivulle ja käyttää kuvaan 600 hermoverkkokäsittelyn iteraatiota (mitä enemmän iteraatioita, sitä mielenkiintoisempaa ja intensiivisempi käsittely). Yksi tällainen kuva maksaa 50 ruplaa.

HD-versiossa voit säätää iteraatioiden määrää: 100 maksaa 50 ruplaa ja 1000 - 250 ruplaa. Tässä tapauksessa kuvan resoluutio on jopa 1200 pikseliä pisimmällä sivulla, ja sitä voidaan käyttää kankaalle tulostamiseen: Ostagram tarjoaa tämän palvelun toimituksella alkaen 1800 ruplaa.

Helmikuussa Ostagramin edustajat eivät hyväksy kuvankäsittelypyyntöjä käyttäjiltä "kehittyneen kapitalismin maista", mutta sitten pääsyä valokuvien käsittelyyn VKontakten käyttäjille kaikkialta maailmasta. GitHubissa julkaistun Ostagram-koodin perusteella sen on kehittänyt Sergei Morugin, 30-vuotias Nižni Novgorodin asukas.

TJ otti yhteyttä kaupallinen johtaja projekti, jonka esitteli Andrey. Hänen mukaansa Ostagram ilmestyi ennen Instapaintingia, mutta sai inspiraationsa samanlaisesta Vipart-projektista.

Ostagramin on kehittänyt ryhmä NNSTU:n opiskelijoita. Alekseeva: testattuaan ensimmäisen kerran kapealla ystäväryhmällä vuoden 2015 lopussa he päättivät julkistaa projektin. Aluksi kuvankäsittely oli täysin ilmaista, ja rahaa oli tarkoitus ansaita myymällä painettuja maalauksia. Andreyn mukaan suurimmaksi ongelmaksi osoittautui tulostaminen: neuroverkon käsittelemät valokuvat ihmisistä näyttävät harvoin miellyttäviltä. ihmisen silmä, ja loppuasiakkaan on säädettävä tulosta pitkään ennen sen levittämistä kankaalle, mikä vaatii paljon koneresursseja.

Kuvankäsittelyyn Ostagramin luojat halusivat käyttää Amazon-pilvipalvelimia, mutta käyttäjien tulvan jälkeen kävi selväksi, että niiden hinta ylittäisi tuhannen dollarin päivässä minimaalisella sijoitetun pääoman tuotolla. Andrey, joka on myös hankkeen sijoittaja, vuokrasi palvelintilat Nižni Novgorodista.

Projektin yleisö on noin tuhat ihmistä päivässä, mutta joinakin päivinä se saavutti 40 tuhatta ihmistä siirtymien takia. ulkomaista mediaa, jotka ovat huomanneet projektin jo ennen kotimaisia ​​(Ostagram onnistui jopa tekemään yhteistyötä eurooppalaisten DJ:n kanssa). Yöllä, kun liikennettä on vähän, kuvankäsittely voi kestää 5 minuuttia ja päivällä jopa tunnin.

Jos aiemmin ulkomaisten käyttäjien pääsyä kuvankäsittelyyn rajoitettiin tarkoituksella (kaupallistamisen arveltiin alkavan Venäjältä), niin nyt Ostagram luottaa jo enemmän länsimaiseen yleisöön.

Toistaiseksi takaisinmaksunäkymät ovat ehdollisia. Jos jokainen käyttäjä maksaisi 10 ruplaa käsittelystä, se ehkä kannattaisi. […]

Maassamme on erittäin vaikea ansaita rahaa: kansamme ovat valmiita odottamaan viikon, mutta he eivät maksa siitä penniäkään. Eurooppalaiset ovat suotuisampia tälle - maksamalla nopeuttamisesta, laadun parantamisesta - joten suuntaus menee näille markkinoille.

Andrey, Ostagramin edustaja

Andreyn mukaan Ostagram-tiimi työskentelee parhaillaan uusi versio sivusto, joka keskittyy voimakkaasti sosiaalisuuteen: "Se näyttää yhdeltä tunnetulta palvelulta, mutta mitä tehdä." Facebookin edustajat Venäjällä ovat jo olleet kiinnostuneita projektista, mutta kauppa ei ole vielä päässyt kauppaneuvotteluihin.

Esimerkkejä palvelutyöstä

Ostagram-sivuston syötteestä näet myös, mikä kuvayhdistelmä johti loppuotoksiin: usein tämä on jopa mielenkiintoisempaa kuin itse tulos. Samalla suodattimet - prosessoinnin tehosteeksi käytetyt kuvat - voidaan tallentaa myöhempää käyttöä varten.

© 2022 skudelnica.ru -- Rakkaus, pettäminen, psykologia, avioero, tunteet, riidat