Neurónová sieť vytvára maľby v štýle známych umelcov. Štylizácia obrazu pomocou neurónových sietí: žiadna mystika, len vulgárne výrazy

20.06.2019

Na najbežnejších fotografiách sa objavujú početné a nie celkom rozlíšiteľné entity. Najčastejšie z nejakého dôvodu psy. Internet sa začal zapĺňať takýmito obrázkami v júni 2015, keď bol spustený DeepDream od Google – jedna z prvých otvorených služieb založená na neurónových sieťach a určená na spracovanie obrázkov.

Deje sa to asi takto: Algoritmus analyzuje fotografie, nájde v nich fragmenty, ktoré mu pripomínajú nejaké známe predmety – a podľa týchto údajov deformuje obraz.

Najprv bol projekt zverejnený ako open source a potom sa na internete objavili online služby vytvorené podľa rovnakých princípov. Jedným z najpohodlnejších a najobľúbenejších je Deep Dream Generator: spracovanie malej fotografie tu trvá len asi 15 sekúnd (predtým museli používatelia čakať viac ako hodinu).

Ako sa neurónové siete učia vytvárať takéto obrázky? A mimochodom, prečo sa tak volajú?

Neurónové siete svojou štruktúrou napodobňujú skutočné neurónové siete živého organizmu, ale robia to pomocou matematických algoritmov. Po vytvorení základnej štruktúry ju môžete trénovať pomocou metód strojového učenia. Ak hovoríme o rozpoznávaní obrázkov, potom je potrebné, aby cez neurónovú sieť prešli tisíce obrázkov. Ak je úloha neurónovej siete iná, potom budú iné aj tréningové cvičenia.

Algoritmy na hranie šachu napríklad analyzujú šachové hry. Rovnakým spôsobom algoritmus AlphaGo z Google DeepMind do čínskej hry Go - ktorý bol vnímaný ako prelomový, pretože Go je oveľa zložitejší a nelineárny ako šach.

    Môžete sa pohrať so zjednodušeným modelom neurónových sietí a lepšie pochopiť jeho princípy.

    Na YouTube je aj séria zrozumiteľných kresieb valčeky o tom, ako fungujú neurónové siete.

Ďalšou obľúbenou službou je Dreamscope, ktorá dokáže o psíkoch nielen snívať, ale aj napodobňovať rôzne štýly maľby. Spracovanie obrazu je tu tiež veľmi jednoduché a rýchle (cca 30 sekúnd).

Algoritmická časť služby je zrejme modifikáciou programu „Neurálny štýl“, o ktorom sme už hovorili.

Nedávno sa objavil program, ktorý realisticky farbí čiernobiele obrázky. V predchádzajúcich verziách podobné programy vykonávali svoju prácu oveľa horšie a za veľký úspech sa považovalo, ak aspoň 20 % ľudí nedokázalo rozlíšiť skutočný obrázok od obrázka zafarbeného počítačom.

Navyše zafarbenie tu trvá len asi 1 minútu.

Tá istá vývojárska spoločnosť spustila aj službu, ktorá rozpoznáva rôzne typy objektov na obrázkoch.

Tieto služby sa môžu zdať len ako zábavná zábava, no v skutočnosti je všetko oveľa zaujímavejšie. Nové technológie vstupujú do praxe ľudských umelcov a menia naše chápanie umenia. Je pravdepodobné, že ľudia budú musieť v oblasti kreativity čoskoro konkurovať strojom.

Naučiť algoritmy rozpoznávať obrázky je úloha, s ktorou vývojári umelej inteligencie zápasia už dlho. Preto programy, ktoré farbia staré fotografie a kreslia psov na oblohe, možno považovať za súčasť väčšieho a zaujímavejšieho procesu.

Zdravím ťa, Habr! Určite ste si všimli, že na týchto vašich internetoch sa aktívne diskutuje o téme štylizácie fotografií do rôznych umeleckých štýlov. Pri čítaní všetkých týchto populárnych článkov si možno pomyslíte, že pod kapotou týchto aplikácií sa odohráva mágia a neurónová sieť si skutočne predstavuje a prekresľuje obraz od začiatku. Náhodou náš tím stál pred podobnou úlohou: v rámci interného firemného hackathonu sme urobili štylizáciu videa, pretože... Aplikácia na fotografie už existovala. V tomto príspevku zistíme, ako sieť „prekresľuje“ obrázky, a analyzujeme články, ktoré to umožnili. Pred prečítaním tohto materiálu a vo všeobecnosti základov konvolučných neurónových sietí odporúčam prečítať si predchádzajúci príspevok. Nájdete tu niekoľko vzorcov, nejaký kód (uvediem príklady na Theano a Lasagne) a tiež veľa obrázkov. Tento príspevok je usporiadaný v chronologickom poradí podľa vzhľadu článkov a podľa toho aj samotných nápadov. Niekedy to rozriedim našou nedávnou skúsenosťou. Tu je chlapec z pekla, aby upútal vašu pozornosť.


Vizualizácia a pochopenie konvolučných sietí (28. novembra 2013)

V prvom rade stojí za zmienku článok, v ktorom autori dokázali ukázať, že neurónová sieť nie je čierna skrinka, ale úplne interpretovateľná vec (mimochodom, dnes sa to dá povedať nielen o konvolučných sieťach pre počítač vízia). Autori sa rozhodli naučiť sa interpretovať aktiváciu neurónov v skrytých vrstvách; na tento účel použili dekonvolučnú neurónovú sieť (deconvnet), navrhnutú pred niekoľkými rokmi (mimochodom tým istým Seilerom a Fergusom, ktorí sú autormi tohto zverejnenie). Dekonvolučná sieť je vlastne tá istá sieť s konvolúciami a združovaniami, ale aplikovaná v opačnom poradí. Pôvodná práca na deconvnet používala sieť v režime učenia bez dozoru na generovanie obrázkov. Tentoraz to autori použili jednoducho na spätné sledovanie od vlastností získaných po prechode dopredu cez sieť k pôvodnému obrázku. Výsledkom je obraz, ktorý možno interpretovať ako signál, ktorý spôsobil túto aktiváciu v neurónoch. Prirodzene vyvstáva otázka: ako urobiť spätný prechod cez konvolúciu a nelinearitu? A ešte viac vďaka max-poolingu to určite nie je invertibilná operácia. Pozrime sa na všetky tri zložky.

Reverzná ReLu

V konvolučných sieťach sa často používa aktivačná funkcia ReLu(x) = max(0, x), čím sú všetky aktivácie na vrstve nezáporné. V súlade s tým, keď ideme späť cez nelinearitu, je tiež potrebné získať nezáporné výsledky. Na tento účel autori navrhujú použiť rovnaký ReLu. Z architektonického hľadiska musí Theano prepísať funkciu prechodu (nekonečne cenný zápisník je v Lasagna Recipes, odtiaľ získate podrobnosti o tom, čo je trieda ModifiedBackprop).

Trieda ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # explicitne opravit return (self.nonlinearity(grd),) # použite danú nelinearitu

Obrátená konvolúcia

Toto je trochu komplikovanejšie, ale všetko je logické: stačí použiť transponovanú verziu toho istého konvolučného jadra, ale na výstupy z reverzného ReLu namiesto predchádzajúcej vrstvy použitej v doprednom priechode. Obávam sa však, že to slovami nie je také zrejmé, pozrime sa na vizualizáciu tohto postupu (nájdete ešte viac vizualizácií konvolúcií).


Konvolúcia s krokom=1

Konvolúcia s krokom=1 Obrátená verzia

Konvolúcia s krokom=2

Konvolúcia s krokom=2 Obrátená verzia

Reverzné združovanie

Táto operácia (na rozdiel od predchádzajúcich) vo všeobecnosti nie je invertovateľná. Ale aj tak by sme sa chceli nejako dostať cez maximum pri spiatočnej pasáži. Na tento účel autori navrhujú použiť mapu, kde bolo maximum pri priamom prejazde (max. prepínače polohy). Pri spätnom prechode je vstupný signál prevedený na unpooling tak, aby sa približne zachovala štruktúra pôvodného signálu, tu je to naozaj jednoduchšie vidieť ako opísať.



Výsledok

Algoritmus vizualizácie je veľmi jednoduchý:

  1. Urobte priamy prechod.
  2. Vyberte vrstvu, ktorá nás zaujíma.
  3. Zaznamenajte aktiváciu jedného alebo viacerých neurónov a zvyšok resetujte.
  4. Vyvodzujte opačný záver.

Každý šedý štvorec na obrázku nižšie zodpovedá vizualizácii filtra (ktorý sa používa na konvolúciu) alebo hmotnosti jedného neurónu a každý farebný obrázok je časťou pôvodného obrázka, ktorá aktivuje zodpovedajúci neurón. Pre prehľadnosť sú neuróny v rámci jednej vrstvy zoskupené do tematických skupín. Vo všeobecnosti sa zrazu ukázalo, že neurónová sieť sa učí presne to, o čom písali Hubel a Weisel vo svojej práci o štruktúre vizuálneho systému, za čo im bola v roku 1981 udelená Nobelova cena. Vďaka tomuto článku sme získali vizuálnu reprezentáciu toho, čo sa konvolučná neurónová sieť učí v každej vrstve. Práve tieto poznatky neskôr umožnia manipulovať s obsahom vygenerovaného obrazu, ale to je ešte ďaleko, niekoľko nasledujúcich rokov sa venovalo zdokonaľovaniu metód „trepanovania“ neurónových sietí. Okrem toho autori článku navrhli spôsob, ako analyzovať, ako najlepšie vybudovať architektúru konvolučnej neurónovej siete na dosiahnutie lepších výsledkov (hoci nevyhrali ImageNet 2013, ale dostali sa na vrchol; UPD: ukázalo sa, že vyhrali, Clarifai je taký, aký je).


Vizualizácia funkcií


Tu je príklad vizualizácie aktivácií pomocou deconvnet, dnes tento výsledok vyzerá tak-tak, ale vtedy to bol prelom.


Saliency Maps pomocou deconvnet

Deep Inside Convolutional Networks: Vizualizácia modelov klasifikácie obrázkov a máp význačnosti (19. apríla 2014)

Tento článok je venovaný štúdiu metód na vizualizáciu vedomostí obsiahnutých v konvolučnej neurónovej sieti. Autori navrhujú dve metódy vizualizácie založené na gradientovom zostupe.

Vizualizácia modelu triedy

Predstavme si teda, že máme natrénovanú neurónovú sieť na riešenie klasifikačného problému do určitého počtu tried. Označme aktivačnú hodnotu výstupného neurónu, ktorá zodpovedá triede c. Potom nám nasledujúci optimalizačný problém dáva presne ten obrázok, ktorý maximalizuje vybranú triedu:



Tento problém možno ľahko vyriešiť pomocou Theano. Zvyčajne požadujeme, aby framework zobral deriváciu vzhľadom na parametre modelu, ale tentoraz predpokladáme, že parametre sú pevné a derivácia sa berie s ohľadom na vstupný obrázok. Nasledujúca funkcia vyberie maximálnu hodnotu výstupnej vrstvy a vráti funkciu, ktorá vypočíta deriváciu vstupného obrazu.


def Compile_saliency_function(net): """ Kompiluje funkciu na výpočet máp význačnosti a predpovedaných tried pre danú minidávku vstupných obrázkov. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], deterministicky=True) max_outp = T.max(outp, os=1) saliency = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, os=1) return theano.function(, )

Určite ste už na internete videli zvláštne obrázky so psími tvárami – DeepDream. V pôvodnom článku autori používajú nasledujúci proces na generovanie obrázkov, ktoré maximalizujú vybranú triedu:

  1. Inicializujte počiatočný obrázok nulami.
  2. Vypočítajte derivačnú hodnotu z tohto obrázku.
  3. Zmeňte obrázok tak, že k nemu pridáte výsledný obrázok z derivátu.
  4. Vráťte sa k bodu 2 alebo opustite slučku.

Výsledné obrázky sú:




Čo ak inicializujeme prvý obrázok skutočnou fotografiou a spustíme rovnaký proces? Ale pri každej iterácii vyberieme náhodnú triedu, zvyšok vynulujeme a vypočítame hodnotu derivácie, potom dostaneme niečo ako tento hlboký sen.


Pozor 60 mb


Prečo je toľko psích tvárí a očí? Je to jednoduché: v imagenet je takmer 200 psov z 1000 tried, majú oči. A tiež veľa tried, kde sú jednoducho ľudia.

Extrakcia význačnosti triedy

Ak sa tento proces inicializuje skutočnou fotografiou, zastaví sa po prvej iterácii a nakreslí sa hodnota derivácie, tak dostaneme takýto obrázok, pridaním ktorého k pôvodnému zvýšime aktivačnú hodnotu vybranej triedy.


Saliency Maps pomocou odvodených


Výsledok je opäť „tak-tak“. Je dôležité poznamenať, že ide o nový spôsob vizualizácie aktivácií (nič nám nebráni fixovať aktivačné hodnoty nie na poslednej vrstve, ale vo všeobecnosti na ktorejkoľvek vrstve siete a vziať deriváciu vzhľadom na vstupný obrázok ). Nasledujúci článok spojí oba predchádzajúce prístupy a poskytne nám nástroj, ako nastaviť prenos štýlov, ktorý bude popísaný neskôr.

Striving for Simplicity: The All Convolutional Net (13. apríla 2015)

Tento článok vo všeobecnosti nie je o vizualizácii, ale o tom, že nahradenie poolingu konvolúciou veľkým krokom nevedie k strate kvality. Ako vedľajší produkt svojho výskumu však autori navrhli nový spôsob vizualizácie funkcií, ktorý použili na presnejšiu analýzu toho, čo sa model učí. Ich predstava je nasledovná: ak jednoducho vezmeme deriváciu, potom počas dekonvolúcie tie vlastnosti, ktoré boli na vstupnom obrázku menšie ako nula, sa neprenesú späť (pomocou ReLu pre vstupný obrázok). A to vedie k tomu, že sa na obrázku, ktorý sa šíri späť, objavia záporné hodnoty. Na druhej strane, ak použijete deconvnet, potom sa z derivátu ReLu vezme ďalšie ReLu - to vám umožní nepreniesť späť záporné hodnoty, ale ako ste videli, výsledok je „tak-tak“. Ale čo keď skombinujete tieto dve metódy?




class 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),)

Potom získate úplne čistý a interpretovateľný obraz.


Saliency Maps pomocou riadenej spätnej propagácie

Choďte hlbšie

Teraz sa zamyslime nad tým, čo nám to dáva? Dovoľte mi pripomenúť, že každá konvolučná vrstva je funkcia, ktorá prijíma trojrozmerný tenzor ako vstup a tiež vytvára trojrozmerný tenzor ako výstup, možno inej dimenzie. d X w X h; d epth je počet neurónov vo vrstve, každý z nich generuje mapu veľkosti w igth x h osem.


Skúsme nasledujúci experiment na sieti VGG-19:



conv1_2

Áno, nevidíte takmer nič, pretože... prijímacia plocha je veľmi malá, toto je druhá konvolúcia 3x3, respektíve celková plocha je 5x5. Ale pri priblížení vidíme, že táto funkcia je len detektor gradientu.




conv3_3


conv4_3


conv5_3


bazén5


Teraz si predstavme, že namiesto maxima nad blokom vezmeme deriváciu hodnoty súčtu všetkých prvkov bloku cez vstupný obrázok. Potom je zrejmé, že vnímavá oblasť skupiny neurónov pokryje celý vstupný obraz. Pre prvé vrstvy uvidíme jasné mapy, z ktorých usúdime, že ide o detektory farieb, potom gradienty, potom okraje atď. smerom k zložitejším vzorom. Čím je vrstva hlbšia, tým je obraz tmavší. Vysvetľuje to skutočnosť, že hlbšie vrstvy majú zložitejší vzor, ​​ktorý detegujú, a zložitý vzor sa objavuje menej často ako jednoduchý, takže aktivačná mapa mizne. Prvá metóda je vhodná na pochopenie vrstiev so zložitými vzormi a druhá je len pre jednoduché.


conv1_1


conv2_2


conv4_3


Môžete si stiahnuť kompletnejšiu databázu aktivácií pre niekoľko obrázkov a .

Neurónový algoritmus umeleckého štýlu (2. september 2015)

Od prvej úspešnej trepanácie neurónovej siete teda uplynulo pár rokov. My (v zmysle ľudskosti) máme v rukách mocný nástroj, ktorý nám umožňuje pochopiť, čo sa neurónová sieť učí, ako aj odstrániť to, čo v skutočnosti nechceme, aby sa učila. Autori tohto článku vyvíjajú metódu, ktorá umožňuje z jedného obrázku vygenerovať podobnú aktivačnú mapu ako nejaký cieľový obrázok a možno aj viac ako jeden – to je základ štylizácie. Na vstup aplikujeme biely šum a pomocou podobného iteračného procesu ako v hlbokom sne tento obrázok zredukujeme na taký, ktorého mapy prvkov sú podobné cieľovému obrázku.

Strata obsahu

Ako už bolo spomenuté, každá vrstva neurónovej siete produkuje trojrozmerný tenzor nejakého rozmeru.




Označme východ i vrstva zo vstupu ako . Potom ak minimalizujeme vážený súčet zvyškov medzi vstupným obrázkom a nejaký obrázok, na ktorý sa zameriavame c, potom dostanete presne to, čo potrebujete. Možno.



Na experimentovanie s týmto článkom môžete použiť tento čarovný notebook, kde prebiehajú výpočty (na GPU aj na CPU). GPU sa používa na výpočet vlastností neurónovej siete a hodnoty nákladovej funkcie. Theano vytvára funkciu, ktorá dokáže vypočítať gradient účelovej funkcie eval_grad vstupným obrázkom X. Toto sa potom privedie do lbfgs a začne sa iteračný proces.


# Inicializujte šumovým obrázkom vygenerovaný_image.set_value(floatX(np.random.uniform(-128, 128, (1, 3, IMAGE_W, IMAGE_W)))) x0 = vygenerovaný_image.get_value().astype("float64") xs = xs.append(x0) # Optimalizovať, pravidelne ukladať výsledok pre i v rozsahu (8): print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = created_image.get_value().astype("float64") xs.append(x0)

Ak spustíme optimalizáciu takejto funkcie, rýchlo získame obrázok podobný cieľovému. Teraz môžeme použiť biely šum na vytvorenie obrázkov, ktoré sú podobné nejakému obsahu.


Strata obsahu: conv4_2



Proces optimalizácie




Je ľahké si všimnúť dve vlastnosti výsledného obrázka:

  • farby sa stratili - je to dôsledok skutočnosti, že v konkrétnom príklade bola použitá iba vrstva conv4_2 (alebo inými slovami váha w pre ňu bola nenulová a pre ostatné vrstvy nulová); ako si pamätáte, sú to prvé vrstvy, ktoré obsahujú informácie o farbách a prechodoch gradientov, a neskoršie obsahujú informácie o väčších detailoch, čo pozorujeme – farby sa strácajú, ale obsah nie;
  • niektoré domy sa „presťahovali“, t.j. rovné čiary sú mierne zakrivené – je to preto, že čím je vrstva hlbšia, tým menej informácií o priestorovej polohe prvku obsahuje (výsledok použitia konvolúcií a združovania).

Pridanie skorých vrstiev okamžite upraví farebnú situáciu.


Strata obsahu: conv1_1, conv2_1, conv4_2


Dúfajme, že teraz máte pocit, že máte určitú kontrolu nad tým, čo sa prekreslí do obrazu s bielym šumom.

Strata štýlu

A teraz sa dostávame k najzaujímavejšej časti: ako môžeme sprostredkovať štýl? čo je štýl? Je zrejmé, že štýl nie je niečo, čo sme optimalizovali v Content Loss, pretože obsahuje veľa informácií o priestorových pozíciách prvkov. Takže prvá vec, ktorú musíme urobiť, je nejakým spôsobom odstrániť tieto informácie zo zobrazení prijatých na každej vrstve.


Autor navrhuje nasledujúcu metódu. Vezmime tenzor na výstupe určitej vrstvy, rozvinieme ho pozdĺž priestorových súradníc a vypočítame kovariančnú maticu medzi matricami. Označme túto transformáciu ako G. Čo sme naozaj urobili? Dá sa povedať, že sme vypočítali, ako často sa vlastnosti v rámci patchu vyskytujú v pároch, alebo inými slovami, aproximovali sme distribúciu prvkov v patchoch s viacrozmerným normálnym rozdelením.




Potom sa zadá Strata štýlu nasledovne, kde s- toto je nejaký obrázok v štýle:



Skúsime to pre Vincenta? Dostávame v princípe niečo očakávané – hluk v štýle Van Gogha, informácie o priestorovom usporiadaní prvkov sa úplne strácajú.


Vincent




Čo keby ste namiesto obrázkového štýlu dali fotografiu? Získate známe črty, známe farby, no priestorová poloha sa úplne stráca.


Fotografia so stratou štýlu


Pravdepodobne ste sa zamysleli nad tým, prečo počítame kovariančnú maticu a nie niečo iné? Koniec koncov, existuje veľa spôsobov, ako agregovať prvky tak, aby sa stratili priestorové súradnice. Toto je skutočne otvorená otázka a ak si vezmete niečo veľmi jednoduché, výsledok sa dramaticky nezmení. Pozrime sa na to, nebudeme počítať kovariančnú maticu, ale jednoducho priemernú hodnotu každej dosky.




jednoduchá strata štýlu

Kombinovaná strata

Prirodzene existuje túžba kombinovať tieto dve nákladové funkcie. Potom vygenerujeme obrázok z bieleho šumu tak, že si zachová vlastnosti z obrázka obsahu (ktoré sú spojené s priestorovými súradnicami) a bude obsahovať aj „štýlové“ prvky, ktoré nie sú spojené s priestorovými súradnicami, t. budeme dúfať, že detaily obrázkov obsahu zostanú nedotknuté zo svojich miest, ale budú prekreslené požadovaným štýlom.



V skutočnosti existuje aj regularizér, ale ten pre jednoduchosť vynecháme. Zostáva zodpovedať nasledujúcu otázku: aké vrstvy (váhy) by sa mali použiť pri optimalizácii? A obávam sa, že na túto otázku nemám odpoveď a ani autori článku. Majú návrh použiť nasledovné, ale to vôbec neznamená, že iná kombinácia bude fungovať horšie, priestor na vyhľadávanie je príliš veľký. Jediné pravidlo, ktoré vyplýva z pochopenia modelu: nemá zmysel brať susedné vrstvy, pretože ich charakteristiky sa od seba nebudú veľmi líšiť, preto sa k štýlu pridá vrstva z každej skupiny conv*_1.


# Definujte straty funkcie straty = # straty straty obsahu.append(0,001 * strata obsahu(funkcie fotografie, funkcie genu, "conv4_2")) # straty straty štýlu.append(0,2e6 * strata štýlu(art_features, gen_features, "conv1_1")) straty.append (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) straty.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) straty.append(0.2e6 * style_loss(art_features, gen_features, "conv4") ) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # total variation penalty loss.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = sum(straty)

Konečný model môže byť prezentovaný nasledovne.




A tu je výsledok domov s Van Goghom.



Snaha kontrolovať proces

Spomeňme si na predchádzajúce diely, už dva roky pred aktuálnym článkom iní vedci skúmali, čo sa neurónová sieť skutočne učí. Vyzbrojení všetkými týmito článkami môžete vytvárať vizualizácie funkcií rôznych štýlov, rôznych obrázkov, rôznych rozlíšení a veľkostí a pokúsiť sa pochopiť, ktoré vrstvy použiť s akou hmotnosťou. Ale ani opätovné váženie vrstiev neposkytuje úplnú kontrolu nad tým, čo sa deje. Problém je tu skôr koncepčný: optimalizujeme nesprávnu funkciu! Ako to, pýtate sa? Odpoveď je jednoduchá: táto funkcia minimalizuje nezrovnalosti... no, chápete. Čo však naozaj chceme, je, aby sa nám obrázok páčil. Konvexná kombinácia funkcií straty obsahu a štýlu nie je meradlom toho, čo naša myseľ považuje za krásne. Bolo zistené, že ak budete pokračovať v štylizácii príliš dlho, nákladová funkcia prirodzene klesá nižšie a nižšie, ale estetická krása výsledku prudko klesá.




No dobre, je tu ešte jeden problém. Povedzme, že sme našli vrstvu, ktorá extrahuje funkcie, ktoré potrebujeme. Povedzme, že niektoré textúry sú trojuholníkové. Táto vrstva však obsahuje aj mnoho ďalších prvkov, ako napríklad kruhy, ktoré na výslednom obrázku naozaj nechceme vidieť. Všeobecne povedané, ak by sme mohli najať milión Číňanov, mohli by sme si vizualizovať všetky vlastnosti obrázka štýlu a hrubou silou len označiť tie, ktoré potrebujeme, a zahrnúť ich len do funkcie nákladov. Ale z pochopiteľných dôvodov to nie je také jednoduché. Čo ak však z obrázka štýlu jednoducho odstránime všetky kruhy, ktoré vo výsledku nechceme vidieť? Potom aktivácia zodpovedajúcich neurónov, ktoré reagujú na kruhy, jednoducho nebude fungovať. A to sa, prirodzene, na výslednom obrázku neobjaví. Rovnako je to aj s kvetmi. Predstavte si jasný obraz s množstvom farieb. Rozloženie farieb bude veľmi rozmazané v celom priestore a rozloženie výsledného obrazu bude rovnaké, ale v procese optimalizácie sa pravdepodobne stratia tie vrcholy, ktoré boli na origináli. Ukázalo sa, že tento problém rieši jednoduché zníženie bitovej hĺbky farebnej palety. Hustota distribúcie väčšiny farieb bude blízko nule a v niekoľkých oblastiach budú veľké vrcholy. Manipuláciou s originálom vo Photoshope teda manipulujeme s funkciami, ktoré sú extrahované z obrázka. Pre človeka je jednoduchšie vyjadriť svoje túžby vizuálne, ako sa ich snažiť formulovať v jazyku matematiky. Zbohom. Výsledkom bolo, že dizajnéri a manažéri, vyzbrojení Photoshopom a skriptami na vizualizáciu funkcií, dosiahli výsledky trikrát rýchlejšie ako matematici a programátori.


Príklad manipulácie s farbou a veľkosťou prvkov


Alebo môžete použiť jednoduchý obrázok ako štýl



výsledky








Tu je video, ale len so správnou textúrou

Texture Networks: Feed-forward Synthesis of Textures and Stylized Images (10. marec 2016)

Zdá sa, že by sme sa tam mohli zastaviť, nebyť jednej nuansy. Dokončenie vyššie uvedeného štylizačného algoritmu trvá veľmi dlho. Ak vezmeme implementáciu, kde lbfgs beží na CPU, proces trvá asi päť minút. Ak to prepíšete tak, aby optimalizácia prešla na GPU, tak proces bude trvať 10-15 sekúnd. To nie je dobré. Možno sa autori tohto a nasledujúceho článku zamýšľali nad tým istým. Obe publikácie vyšli samostatne, s odstupom 17 dní, takmer rok po predchádzajúcom článku. Autori aktuálneho článku, podobne ako autori predchádzajúceho, sa zaoberali generovaním textúr (ak len vynulujete Style Loss na nulu, dostanete to). Navrhli optimalizovať nie obraz získaný z bieleho šumu, ale nejakú neurónovú sieť, ktorá generuje štylizovaný obraz.




Teraz, ak proces stylingu nezahŕňa žiadnu optimalizáciu, stačí urobiť len prechod dopredu. A optimalizácia je potrebná iba raz na trénovanie siete generátorov. Tento článok používa hierarchický generátor, kde každý ďalší z väčšia veľkosť ako predchádzajúca a vzorkovaná zo šumu v prípade generovania textúr a z nejakej databázy obrázkov na školenie stylistu. Je dôležité použiť niečo iné ako trénovaciu časť imagenetu, pretože... vlastnosti vnútri siete straty sú vypočítané sieťou vyškolenou počas tréningovej časti.



Straty vnímania pre prenos štýlu v reálnom čase a super-rozlíšenie (27. marec 2016)

Ako už názov napovedá, autori, ktorí sa s myšlienkou generatívnej siete omeškali len o 17 dní, pracovali na zvýšení rozlíšenia obrázkov. Zjavne ich inšpiroval úspech zvyškového učenia na najnovšom imagenet.




V súlade s tým zvyškový blok a konv.



Teraz tu teda máme okrem kontroly nad stylingom aj rýchly generátor (vďaka týmto dvom článkom sa čas generovania jedného obrázku meria v desiatkach ms).

Koniec

Informácie z recenzovaných článkov a kód autorov sme použili ako východiskový bod na vytvorenie ďalšej aplikácie na úpravu prvej aplikácie na úpravu videa:



Vygeneruje niečo takéto.


Odkedy nemeckí vedci z Univerzity v Tübingene v auguste 2015 predstavili svoj nápad preniesť štýl slávnych umelcov na iné fotografie, začali sa objavovať služby, ktoré túto príležitosť speňažia. Bol uvedený na západný trh a jeho úplná kópia bola uvedená na ruský trh.

Do záložiek

Napriek tomu, že Ostagram bol spustený už v decembri, v polovici apríla si začal rýchlo získavať popularitu na sociálnych sieťach. V projekte na VKontakte bolo zároveň k 19. aprílu menej ako tisíc ľudí.

Na používanie služby je potrebné pripraviť dva obrázky: fotografiu, ktorú je potrebné spracovať, a obrázok s ukážkou štýlu, ktorý sa má prekryť pôvodnou fotkou.

Služba má bezplatnú verziu: vytvára obraz v minimálnom rozlíšení do 600 pixelov pozdĺž najdlhšej strany obrazu. Používateľ dostane výsledok iba jednej z iterácií aplikovania filtra na fotografiu.

Existujú dve platené verzie: Premium vytvára obraz s veľkosťou až 700 pixelov pozdĺž najdlhšej strany a na obraz aplikuje 600 iterácií spracovania neurónovou sieťou (čím viac iterácií, tým je spracovanie zaujímavejšie a intenzívnejšie). Jedna takáto fotografia bude stáť 50 rubľov.

Vo verzii HD si môžete prispôsobiť počet iterácií: 100 bude stáť 50 rubľov a 1 000 bude stáť 250 rubľov. V tomto prípade bude mať obrázok rozlíšenie až 1200 pixelov na najdlhšej strane a dá sa použiť na tlač na plátno: Ostagram ponúka takúto službu s doručením od 1800 rubľov.

Vo februári zástupcovia Ostagramu oznámili, že nebudú akceptovať žiadosti o spracovanie obrázkov od používateľov „z krajín s rozvinutým kapitalizmom“, ale potom prístup k spracovaniu fotografií pre používateľov VKontakte z celého sveta. Súdiac podľa kódu Ostagram zverejneného na GitHub, bol vyvinutý Sergejom Moruginom, 30-ročným obyvateľom Nižného Novgorodu.

TJ oslovil obchodného riaditeľa projektu, ktorý sa predstavil ako Andrey. Ostagram sa podľa neho objavil pred Instapaintingom, no inšpiroval sa podobným projektom s názvom Vipart.

Ostagram vyvinula skupina študentov z NSTU. Alekseeva: po počiatočnom testovaní na úzkej skupine priateľov sa koncom roka 2015 rozhodli projekt zverejniť. Spočiatku bolo spracovanie obrazu úplne zadarmo a plánom bolo zarobiť si predajom tlačených obrazov. Podľa Andreyho sa najväčším problémom ukázala tlač: fotografie ľudí spracované neurónovou sieťou vyzerajú pre ľudské oko len málokedy príjemne a koncový klient potrebuje dlhý čas na úpravu výsledku pred aplikáciou na plátno, čo si vyžaduje veľké strojové zdroje.

Tvorcovia Ostagramu chceli na spracovanie obrázkov využiť cloudové servery Amazonu, no po návale používateľov sa ukázalo, že náklady presiahnu tisíc dolárov za deň s minimálnou návratnosťou investícií. Andrey, ktorý je tiež investorom projektu, si prenajal kapacitu servera v Nižnom Novgorode.

Publikum projektu je okolo tisíc ľudí denne, no v niektorých dňoch sa dostalo na 40 tisíc ľudí vďaka odporúčaniam zo zahraničných médií, ktoré si projekt všimli už skôr ako domáce (Ostagram stihol dokonca spolupracovať s európskymi DJmi). V noci, keď je nízka premávka, môže spracovanie obrazu trvať 5 minút a cez deň môže trvať až hodinu.

Ak bol skorší prístup k spracovaniu obrazu zámerne obmedzený na zahraničných používateľov (premýšľali o spustení monetizácie v Rusku), teraz Ostagram počíta skôr so západným publikom.

Dnes sú vyhliadky na kompenzáciu podmienené. Ak by každý používateľ zaplatil 10 rubľov za spracovanie, možno by sa to oplatilo. […]

U nás je to veľmi ťažké speňažiť: naši ľudia sú pripravení čakať týždeň, ale nezaplatia za to ani cent. Európania sú k tomu priaznivejší – čo sa týka platenia za zrýchlenie, zlepšenie kvality – a tak sa zameriavajú na tento trh.

Andrey, zástupca Ostagramu

Podľa Andrey tím Ostagram pracuje na novej verzii stránky s väčším dôrazom na spoločenskosť: „Bude to podobné jednej známej službe, ale čo robiť.“ O projekt sa už zaujímali aj zástupcovia Facebooku v Rusku, no rokovania o predaji sa ešte nedostali do bodu predaja.

Príklady servisných prác

Vo feede na stránke Ostagram si môžete pozrieť aj kombináciu obrázkov, z ktorých vznikli finálne fotografie: často je to ešte zaujímavejšie ako samotný výsledok. V tomto prípade je možné filtre - obrázky používané ako efekt na spracovanie - uložiť pre budúce použitie.



Podobné články