Obrázky kreslené neuronovou sítí. Stylizace obrazu pomocí neuronových sítí: žádná mystika, jen vulgárnost

Na nejobyčejnějších fotografiích se objevují četné a ne zcela rozlišitelné entity. Nejčastěji z nějakého důvodu psi. Internet se takovými obrázky začal plnit v červnu 2015, kdy byl spuštěn DeepDream od Googlu – jeden z prvních otevřené služby, založené na neuronových sítích a určené pro zpracování obrazu.

Děje se to asi takto: Algoritmus analyzuje fotografie, najde v nich fragmenty, které mu připomínají nějaké známé předměty – a podle těchto dat deformuje obraz.

Nejprve byl projekt publikován jako open source a poté se na internetu objevily online služby vytvořené podle stejných principů. Jedním z nejpohodlnějších a nejoblíbenějších je Deep Dream Generator: zpracování malé fotografie zde trvá jen asi 15 sekund (dříve museli uživatelé čekat déle než hodinu).

Jak se neuronové sítě naučí vytvářet takové obrázky? A mimochodem, proč se jim tak říká?

Neuronové sítě svou strukturou napodobují skutečné neuronové sítě živého organismu, ale využívají toho matematické algoritmy. Po vytvoření základní struktury ji můžete trénovat pomocí metod strojového učení. Pokud se bavíme o rozpoznávání obrazu, pak je potřeba procházet neuronovou sítí tisíce obrázků. Pokud je úloha neuronové sítě jiná, budou se lišit i tréninková cvičení.

Algoritmy pro hraní šachů například analyzují šachové hry. Stejně tak algoritmus AlphaGo z Google DeepMind do čínské hry Go – což bylo vnímáno jako průlom, protože Go je mnohem složitější a nelineárnější než šachy.

    Můžete si pohrát se zjednodušeným modelem neuronových sítí a lépe porozumět jeho principům.

    Na YouTube je také řada srozumitelných kreseb válečky o tom, jak fungují neuronové sítě.

Další oblíbenou službou je Dreamscope, která umí o psech nejen snít, ale také napodobovat různé malířské styly. Zpracování obrazu je zde také velmi jednoduché a rychlé (cca 30 sekund).

Algoritmická část služby je zřejmě modifikací programu „Neural style“, o kterém jsme již hovořili.

V poslední době se objevil program, který realisticky vybarvuje černobílé obrázky. V předchozích verzích dělaly podobné programy svou práci mnohem hůře a za velký úspěch bylo považováno, když alespoň 20 % lidí nerozeznalo skutečný obrázek od obrázku zbarveného počítačem.

Navíc barvení zde trvá jen asi 1 minutu.

Stejná vývojářská společnost také spustila službu, která rozpoznává na obrázcích odlišné typy objektů.

Tyto služby se mohou zdát jen jako zábavná zábava, ale ve skutečnosti je vše mnohem zajímavější. Nové technologie vstupují do praxe lidských umělců a mění naše chápání umění. Je pravděpodobné, že lidé budou muset brzy konkurovat strojům v oblasti kreativity.

Naučit algoritmy rozpoznávat obrázky je úkol, se kterým se vývojáři umělé inteligence potýkají již dlouhou dobu. Proto programy, které barví staré fotografie a kreslí psy na obloze, lze považovat za součást většího a zajímavějšího procesu.

Protože němečtí vědci z univerzity v Tübingenu představili svou studii o možnosti přenosu stylu v srpnu 2015 slavných umělců k dalším fotkám se začaly objevovat služby, které tuto příležitost monetizovaly. Byl uveden na západní trh a jeho kompletní kopie byla uvedena na ruský trh.

Do záložek

Navzdory tomu, že Ostagram byl spuštěn již v prosinci, začal si v polovině dubna rychle získávat popularitu na sociálních sítích. Přitom k 19. dubnu byla v projektu na VKontakte necelá tisícovka lidí.

Pro použití služby je potřeba připravit dva obrázky: fotografii, kterou je potřeba zpracovat, a obrázek s příkladem stylu, který má překrýt původní fotografii.

Služba má bezplatnou verzi: vytváří obrázek v minimálním rozlišení až 600 pixelů podél nejdelší strany obrázku. Uživatel obdrží výsledek pouze jedné z iterací použití filtru na fotografii.

Existují dvě placené verze: Premium vytváří obraz až 700 pixelů podél nejdelší strany a aplikuje na obrázek 600 iterací zpracování neuronové sítě (čím více iterací, tím zajímavější a intenzivnější zpracování). Jedna taková fotografie bude stát 50 rublů.

Ve verzi HD si můžete přizpůsobit počet iterací: 100 bude stát 50 rublů a 1000 bude stát 250 rublů. V tomto případě bude mít obrázek rozlišení až 1200 pixelů na nejdelší straně a lze jej použít pro tisk na plátno: Ostagram nabízí takovou službu s dodáním od 1800 rublů.

V únoru zástupci Ostagramu oznámili, že nebudou přijímat žádosti o zpracování obrazu od uživatelů „ze zemí s rozvinutým kapitalismem“, ale poté přístup ke zpracování fotografií pro uživatele VKontakte z celého světa. Soudě podle kódu Ostagramu zveřejněného na GitHubu jej vyvinul Sergey Morugin, 30letý obyvatel Nižního Novgorodu.

TJ kontaktoval obchodní ředitel projekt, který se představil jako Andrey. Ostagram se podle něj objevil před Instapaintingem, ale inspiroval se podobným projektem s názvem Vipart.

Ostagram byl vyvinut skupinou studentů z NSTU. Alekseeva: po počátečním testování na úzké skupině přátel se na konci roku 2015 rozhodli projekt zveřejnit. Zpočátku bylo zpracování obrazu zcela zdarma a plánem bylo vydělávat peníze prodejem tištěných obrazů. Podle Andrey se nejvíce ukázalo těsnění velký problém: Fotky lidí zpracované neuronovou sítí vypadají pro lidské oko málokdy příjemně a koncový klient potřebuje dlouhou dobu na úpravu výsledku, než jej aplikuje na plátno, což vyžaduje velké strojové prostředky.

Tvůrci Ostagramu chtěli ke zpracování obrázků využít cloudové servery Amazonu, ale po návalu uživatelů se ukázalo, že náklady překročí tisíc dolarů za den s minimální návratností investice. Andrey, který je také investorem projektu, si pronajal kapacitu serveru v Nižním Novgorodu.

Sledovanost projektu je asi tisíc lidí denně, ale v některých dnech dosáhla až 40 tisíc lidí kvůli přechodům z zahraniční média, kteří si projektu všimli už před těmi tuzemskými (Ostagram dokonce stihl spolupracovat s evropskými DJs). V noci při nízkém provozu může zpracování obrazu trvat 5 minut a ve dne až hodinu.

Jestliže byl dřívější přístup ke zpracování obrazu záměrně omezen na zahraniční uživatele (přemýšleli o zahájení monetizace v Rusku), nyní Ostagram počítá spíše se západním publikem.

Dnes jsou vyhlídky na kompenzaci podmíněné. Pokud by každý uživatel zaplatil 10 rublů za zpracování, možná by se to vyplatilo. […]

Zpeněžit se u nás velmi těžko: naši jsou připraveni týden čekat, ale nezaplatí za to ani korunu. Evropané jsou k tomu příznivější – pokud jde o placení za urychlení, zlepšení kvality – a tak se zaměřují na tento trh.

Andrey, zástupce Ostagramu

Podle Andrey tým Ostagram pracuje na nová verze web se silným zaměřením na společenskost: „Bude to podobné jedné známé službě, ale co dělat.“ O projekt se již zajímali zástupci Facebooku v Rusku, ale jednání o prodeji ještě nedospěla do místa prodeje.

Příklady servisních prací

Ve feedu na webu Ostagram můžete vidět i kombinaci obrázků, ze kterých vznikly finální fotografie: často je to ještě zajímavější než samotný výsledek. V tomto případě lze filtry - obrázky použité jako efekt pro zpracování - uložit pro budoucí použití.

Zdravím tě, Habr! Pravděpodobně jste si všimli, že téma stylizace fotografií, aby vyhovovaly různé uměleckých stylů se na těchto vašich internetech aktivně diskutuje. Při čtení všech těchto populárních článků si možná pomyslíte, že pod pokličkou těchto aplikací se dějí kouzla a neuronová síť si skutečně představuje a překresluje obraz od začátku. Náhodou byl náš tým postaven před podobný úkol: v rámci interního firemního hackathonu jsme udělali stylizaci videa, protože... Aplikace pro fotografie již existovala. V tomto příspěvku zjistíme, jak síť „překresluje“ obrázky, a analyzujeme články, které to umožnily. Před přečtením tohoto materiálu a obecně základů konvolučních neuronových sítí doporučuji přečíst předchozí příspěvek. Najdete zde nějaké vzorce, nějaký kód (uvedu příklady na Theano a Lasagne) a také spoustu obrázků. Tento příspěvek je založen na časová posloupnost vzhled článků a podle toho i myšlenky samotné. Někdy to rozředím naší nedávnou zkušeností. Tady je kluk z pekla, aby upoutal vaši pozornost.


Vizualizace a porozumění konvolučním sítím (28. listopadu 2013)

V první řadě stojí za zmínku článek, ve kterém autoři dokázali ukázat, že neuronová síť není černá skříňka, ale zcela interpretovatelná věc (mimochodem, dnes to lze říci nejen o konvolučních sítích pro počítač vidění). Autoři se rozhodli naučit se interpretovat aktivace neuronů ve skrytých vrstvách, k tomu použili dekonvoluční neuronovou síť (deconvnet), navrženou o několik let dříve (mimochodem stejnými Seilerem a Fergusem, kteří jsou autory této vydání). Dekonvoluční síť je ve skutečnosti stejná síť s konvolucemi a sdružováním, ale aplikovaná v obráceném pořadí. Původní práce na deconvnet používala síť v režimu učení bez dozoru ke generování obrázků. Tentokrát jej autoři použili jednoduše pro zpětný průchod z vlastností získaných po přímém průchodu sítí do původní obrázek. Výsledkem je obraz, který lze interpretovat jako signál, který tuto aktivaci v neuronech způsobil. Přirozeně vyvstává otázka: jak provést zpětný průchod konvolucí a nelinearitou? A ještě více díky max-poolingu se rozhodně nejedná o nevratnou operaci. Podívejme se na všechny tři komponenty.

Reverzní ReLu

V konvolučních sítích se často používá aktivační funkce ReLu(x) = max(0, x), díky čemuž jsou všechny aktivace na vrstvě nezáporné. V souladu s tím, když se vracíme přes nelinearitu, je také nutné získat nezáporné výsledky. K tomu autoři navrhují použít stejný ReLu. Z architektonického hlediska musí Theano přepsat funkci přechodu (nekonečně cenný zápisník je v Lasagna Recipes, odtud získáte podrobnosti o tom, co je třída ModifiedBackprop).

Třída ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # explicitně opravit return (self.nonlinearity(grd),) # použijte danou nelinearitu

Reverzní konvoluce

To je trochu složitější, ale vše je logické: stačí použít transponovanou verzi stejného konvolučního jádra, ale na výstupy z reverzního ReLu místo předchozí vrstvy použité v dopředném průchodu. Obávám se ale, že to není slovy tak zřejmé, podívejme se na vizualizaci tohoto postupu (vizualizace konvolucí najdete ještě více).


Konvoluce s krokem=1

Konvoluce s krokem=1 Obrácená verze

Konvoluce s krokem=2

Konvoluce s krokem=2 Obrácená verze

Reverzní sdružování

Tato operace (na rozdíl od předchozích) obecně není invertovatelná. Ale stejně bychom chtěli nějak projet maximum při zpáteční pasáži. K tomu autoři navrhují použít mapu, kde bylo maximum při přímém průjezdu (přepínače max. polohy). Při zpětném průchodu je vstupní signál převeden na unpooling tak, aby byla přibližně zachována struktura původního signálu, zde je opravdu lépe vidět, než popisovat.



Výsledek

Algoritmus vizualizace je velmi jednoduchý:

  1. Proveďte přímý průchod.
  2. Vyberte vrstvu, která nás zajímá.
  3. Zaznamenejte aktivaci jednoho nebo více neuronů a zbytek resetujte.
  4. Vyvodit opačný závěr.

Každý šedý čtverec na obrázku níže odpovídá vizualizaci filtru (který se používá pro konvoluci) nebo vahám jednoho neuronu a každý barevný obrázek je částí původního obrázku, která aktivuje odpovídající neuron. Pro přehlednost jsou neurony v rámci jedné vrstvy seskupeny do tematické skupiny. Obecně se najednou ukázalo, že neuronová síť se učí přesně to, o čem psali Hubel a Weisel ve své práci o struktuře vizuálního systému, za což byli oceněni Nobelova cena v roce 1981. Díky tomuto článku jsme získali vizuální znázornění toho, co se konvoluční neuronová síť učí v každé vrstvě. Právě tyto znalosti později umožní manipulovat s obsahem generovaného obrazu, ale to je ještě daleko, několik dalších let bylo věnováno zdokonalování metod „trepanování“ neuronových sítí. Kromě toho autoři článku navrhli metodu pro analýzu toho, jak nejlépe postavit architekturu konvoluční neuronové sítě, aby bylo dosaženo nejlepší výsledky(ačkoli nevyhráli ImageNet 2013, ale dostali se na vrchol; UPD: ukázalo se, že vyhráli, Clarifai je tím, čím jsou).


Vizualizace funkcí


Zde je příklad vizualizace aktivací pomocí deconvnetu, dnes tento výsledek tak vypadá, ale tehdy to byl průlom.


Saliency Maps pomocí deconvnet

Deep Inside Convolutional Networks: Visualizing Image Classification Models and Saliency Maps (19. dubna 2014)

Tento článek je věnován studiu metod pro vizualizaci znalostí obsažených v konvoluční neuronové síti. Autoři navrhují dvě vizualizační metody založené na gradientním sestupu.

Vizualizace modelu třídy

Představte si tedy, že máme natrénovanou neuronovou síť k vyřešení klasifikačního problému do určitého počtu tříd. Označme aktivační hodnotu výstupního neuronu, která odpovídá třídě C. Pak nám následující optimalizační problém dává přesně ten obrázek, který maximalizuje vybranou třídu:



Tento problém lze snadno vyřešit pomocí Theano. Obvykle žádáme framework, aby vzal derivaci s ohledem na parametry modelu, ale tentokrát předpokládáme, že parametry jsou pevné a derivace se bere s ohledem na vstupní obrázek. Následující funkce vybere maximální hodnotu výstupní vrstvy a vrátí funkci, která vypočítá derivaci vstupního obrazu.


def Compile_saliency_function(net): """ Zkompiluje funkci pro výpočet map význačnosti a předpokládaných tříd pro danou minidávku vstupních obrázků. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], deterministický=True) max_outp = T.max(outp, osa=1) význačnost = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, osa=1) return theano.function(, )

Určitě jste na internetu viděli podivné obrázky se psími tvářemi – DeepDream. V původním článku autoři používají další proces pro generování obrázků, které maximalizují vybranou třídu:

  1. Inicializujte počáteční obrázek nulami.
  2. Vypočítejte hodnotu derivace z tohoto obrázku.
  3. Změňte obrázek přidáním výsledného obrázku z derivátu.
  4. Vraťte se k bodu 2 nebo opusťte smyčku.

Výsledné obrázky jsou:




A pokud inicializujeme první obrázek skutečná fotka a začít stejný proces? Ale při každé iteraci vybereme náhodnou třídu, zbytek vynulujeme a vypočítáme hodnotu derivace, pak dostaneme něco jako tento hluboký sen.


Pozor 60 mb


Proč je tolik psích tváří a očí? Je to jednoduché: v imagenetu je téměř 200 psů z 1000 tříd, mají oči. A také mnoho tříd, kde jsou prostě lidé.

Extrakce význačnosti třídy

Pokud je tento proces inicializován skutečnou fotografií, po první iteraci zastaven a je vykreslena hodnota derivace, pak dostaneme takový obrázek, který přidáme k původnímu, zvýšíme aktivační hodnotu vybrané třídy.


Saliency Maps pomocí odvozených


Výsledek je opět „tak-tak“. Je důležité poznamenat, že toto nová cesta vizualizace aktivací (nic nám nebrání fixovat hodnoty aktivací ne na poslední vrstvě, ale obecně na libovolné vrstvě sítě a brát derivaci vzhledem ke vstupnímu obrazu). Příští článek spojí oba předchozí přístupy a dá nám nástroj, jak nastavit přenos stylů, který bude popsán později.

Striving for Simplicity: The All Convolutional Net (13. dubna 2015)

Tento článek obecně není o vizualizaci, ale o tom, že nahrazení poolingu konvolucí velkým krokem nevede ke ztrátě kvality. Ale jako vedlejší produkt svého výzkumu autoři navrhli nový způsob vizualizace funkcí, na který byli zvyklí více přesná analýza co se modelka naučí. Jejich představa je následující: pokud jednoduše vezmeme derivaci, pak se během dekonvoluce vlastnosti, které byly ve vstupním obrázku, nevrátí zpět méně než nula(aplikace ReLu na vstupní obrázek). A to vede ke vzniku záporné hodnoty. Na druhou stranu, pokud použijete deconvnet, pak se další ReLu převezme z derivátu ReLu - to vám umožní nepředávat zpět záporné hodnoty, ale jak jste viděli, výsledek je „tak-tak“. Ale co když tyto dvě metody zkombinujete?




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

Pak získáte zcela čistý a interpretovatelný obraz.


Saliency Maps využívající řízenou zpětnou propagaci

Jít hlouběji

Nyní se zamysleme nad tím, co nám to dává? Dovolte mi připomenout, že každá konvoluční vrstva je funkcí, která přijímá trojrozměrný tenzor jako vstup a také vytváří trojrozměrný tenzor jako výstup, možná jiné dimenze. d X w X h; d epth je počet neuronů ve vrstvě, každý z nich generuje mapu velikosti w igth x h osm.


Zkusme následující experiment na síti VGG-19:



conv1_2

Ano, nevidíte skoro nic, protože... přijímací plocha je velmi malá, jedná se o druhou konvoluci 3x3, respektive celková plocha je 5x5. Ale při přiblížení vidíme, že tato funkce je pouze detektorem gradientu.




conv3_3


conv4_3


conv5_3


bazén 5


Nyní si představme, že místo maxima přes blok vezmeme derivaci hodnoty součtu všech prvků bloku přes vstupní obrázek. Pak je zřejmé, že vnímavá oblast skupiny neuronů pokryje celý vstupní obraz. U prvních vrstev uvidíme jasné mapy, ze kterých usuzujeme, že se jedná o detektory barev, pak gradienty, pak hrany a tak dále směrem ke složitějším vzorům. Čím je vrstva hlubší, tím je obraz slabší. To se vysvětluje tím, že hlubší vrstvy mají složitější vzor, ​​který detekují, a složitý vzor se objevuje méně často než jednoduchý, takže aktivační mapa mizí. První metoda je vhodná pro pochopení vrstev se složitými vzory a druhá je pouze pro jednoduché.


conv1_1


conv2_2


conv4_3


Můžete si stáhnout úplnější databázi aktivací pro několik obrázků a .

Neural Algorithm of Artistic Style (2. září 2015)

Od první úspěšné trepanace neuronové sítě tedy uplynulo pár let. My (ve smyslu lidskosti) máme ve svých rukou Výkonný nástroj, což nám umožňuje pochopit, co se neuronová síť učí, a také odstranit to, co ve skutečnosti nechceme, aby se učila. Autoři tohoto článku vyvíjejí metodu, která umožňuje z jednoho obrázku vygenerovat podobnou aktivační mapu jako nějaký cílový obrázek a možná i více než jeden – to je základ stylizace. Na vstup aplikujeme bílý šum a pomocí podobného iteračního procesu jako v hlubokém snu tento obrázek zredukujeme na takový, jehož mapy rysů jsou podobné cílovému obrázku.

Ztráta obsahu

Jak již bylo zmíněno, každá vrstva neuronové sítě produkuje trojrozměrný tenzor nějaké dimenze.




Označme východ i vrstva ze vstupu jako . Pokud tedy minimalizujeme vážený součet reziduí mezi vstupním obrazem a nějaký obrázek, na který se zaměřujeme C, pak dostanete přesně to, co potřebujete. Možná.



K experimentování s tímto článkem můžete použít tento kouzelný notebook, kde probíhají výpočty (jak na GPU, tak na CPU). GPU se používá k výpočtu vlastností neuronové sítě a hodnoty nákladové funkce. Theano vytváří funkci, která dokáže vypočítat gradient účelové funkce eval_grad podle vstupního obrázku X. To je pak vloženo do lbfgs a začíná iterační proces.


# Inicializujte pomocí šumového obrázku created_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) # Optimalizace, periodické ukládání výsledku pro 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)

Pokud spustíme optimalizaci takové funkce, získáme rychle obrázek podobný cílovému. Nyní můžeme použít bílý šum k obnovení obrázků, které jsou podobné nějakému obsahu.


Ztráta obsahu: conv4_2



Proces optimalizace




Je snadné si všimnout dvou vlastností výsledného obrázku:

  • barvy se ztrácejí – je to důsledek toho, že v konkrétní příklad byla použita pouze vrstva conv4_2 (nebo jinými slovy, váha w pro ni byla nenulová a pro ostatní vrstvy byla nulová); jak si pamatujete, jsou to rané vrstvy, které obsahují informace o barvách a přechodech přechodů, a ty pozdější obsahují informace o větších detailech, což je to, co pozorujeme - barvy se ztrácejí, ale obsah nikoliv;
  • některé domy se „přestěhovaly“, tzn. rovné čáry jsou mírně zakřivené – to proto, že čím je vrstva hlubší, tím méně informací o prostorové poloze prvku obsahuje (výsledek použití konvolucí a sdružování).

Přidání raných vrstev okamžitě opraví barevnou situaci.


Ztráta obsahu: conv1_1, conv2_1, conv4_2


Doufejme, že nyní máte pocit, že máte určitou kontrolu nad tím, co se překreslí do obrazu s bílým šumem.

Ztráta stylu

A nyní se dostáváme k nejzajímavější části: jak můžeme předat styl? co je styl? Je zřejmé, že styl není něco, co jsme optimalizovali v Content Loss, protože obsahuje mnoho informací o prostorových pozicích prvků. Takže první věc, kterou musíme udělat, je nějakým způsobem odstranit tyto informace z pohledů přijatých na každé vrstvě.


Autor navrhuje následující metodu. Vezmeme tenzor na výstupu určité vrstvy, roztáhneme ho podél prostorových souřadnic a vypočítáme kovarianční matici mezi matricemi. Označme tuto transformaci jako G. Co jsme vlastně udělali? Můžeme říci, že jsme vypočítali, jak často se prvky v patchi vyskytují ve dvojicích, nebo jinými slovy, aproximovali jsme rozložení prvků v patchích s vícerozměrným normálním rozdělením.




Poté se zadá Style Loss následovně, kde s- to je nějaký obrázek ve stylu:



Zkusíme to pro Vincenta? Dostáváme v zásadě něco očekávaného – šum ve stylu Van Gogha, informace o prostorovém uspořádání rysů se zcela ztrácí.


Vincent




Co když místo stylového obrázku vložíte fotografii? Získáte známé rysy, známé barvy, ale prostorová poloha se zcela ztrácí.


Fotografie se ztrátou stylu


Pravděpodobně jste se divili, proč počítáme kovarianční matici a ne něco jiného? Koneckonců existuje mnoho způsobů, jak agregovat prvky tak, aby se ztratily prostorové souřadnice. To je skutečně otevřená otázka, a pokud vezmete něco velmi jednoduchého, výsledek se dramaticky nezmění. Pojďme to zkontrolovat, nebudeme počítat kovarianční matici, ale jednoduše průměrnou hodnotu každé desky.




jednoduchá ztráta stylu

Kombinovaná ztráta

Přirozeně existuje potřeba kombinovat tyto dvě nákladové funkce. Poté vygenerujeme obrázek z bílého šumu tak, že si zachová rysy z obrázku obsahu (které jsou spojeny s prostorovými souřadnicemi) a bude obsahovat také „stylové“ prvky, které nejsou spojeny s prostorovými souřadnicemi, tzn. budeme doufat, že detaily obrázků obsahu zůstanou na svém místě nedotčené, ale budou překresleny požadovaným stylem.



Ve skutečnosti existuje i regularizer, ale ten pro jednoduchost vynecháme. Zbývá zodpovědět následující otázku: jaké vrstvy (váhy) použít při optimalizaci? A obávám se, že na tuto otázku nemám odpověď, stejně jako autoři článku. Mají návrh použít následující, ale to vůbec neznamená, že jiná kombinace bude fungovat hůře velký prostor Vyhledávání. Jediné pravidlo, které vyplývá z pochopení modelu: nemá smysl brát sousední vrstvy, protože jejich charakteristiky se od sebe nebudou příliš lišit, proto je ke stylu přidána vrstva z každé skupiny conv*_1.


# Definujte ztráty funkce ztráty = # ztráty ztráty obsahu.append(0,001 * content_loss(photo_features, gen_features, "conv4_2")) # style loss loss loss.append(0.2e6 * style_loss(art_features, gen_features, "conv1_1")) ztráty.append (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) loss.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(losses)

Konečný model lze prezentovat následovně.




A tady je výsledek domů s Van Goghem.



Pokus o kontrolu procesu

Vzpomeňme na předchozí díly, již dva roky před aktuálním článkem zkoumali jiní vědci, co se neuronová síť skutečně učí. Vyzbrojeni všemi těmito články můžete generovat vizualizace funkcí různé styly, různé obrázky, různá rozlišení a velikosti a pokuste se pochopit, které vrstvy vzít s jakou hmotností. Ale ani převážení vrstev nedává úplnou kontrolu nad tím, co se děje. Problém je zde spíše koncepční: optimalizujeme špatnou funkci! Jak to, ptáte se? Odpověď je jednoduchá: tato funkce minimalizuje nesrovnalosti... no, máte představu. Ale co opravdu chceme, je, aby se nám obrázek líbil. Konvexní kombinace funkcí ztráty obsahu a stylu není měřítkem toho, co naše mysl považuje za krásné. Bylo zjištěno, že pokud budete pokračovat ve stylizaci příliš dlouho, nákladová funkce přirozeně klesá níže a níže, ale estetická krása výsledku prudce klesá.




Dobře, je tu ještě jeden problém. Řekněme, že jsme našli vrstvu, která extrahuje funkce, které potřebujeme. Řekněme, že některé textury jsou trojúhelníkové. Ale tato vrstva obsahuje také mnoho dalších prvků, jako jsou kruhy, které ve výsledném obrázku opravdu nechceme vidět. Obecně řečeno, kdybychom mohli najmout milion Číňanů, mohli bychom si vizualizovat všechny vlastnosti obrázku stylu a hrubou silou označit ty, které potřebujeme, a zahrnout je pouze do funkce nákladů. Ale z pochopitelných důvodů to není tak jednoduché. Co když ale z obrázku stylu jednoduše odstraníme všechny kruhy, které ve výsledku nechceme vidět? Pak aktivace odpovídajících neuronů, které reagují na kruhy, prostě nebude fungovat. A to se pak přirozeně na výsledném obrázku neobjeví. Stejné je to s květinami. Představte si jasný obraz s velké množství barvy. Rozložení barev bude velmi rozmazané po celém prostoru a rozložení výsledného obrázku bude stejné, ale v procesu optimalizace se pravděpodobně ztratí ty vrcholy, které byly na originálu. Ukázalo se, že tento problém řeší pouhé snížení bitové hloubky barevné palety. Hustota distribuce většiny barev se bude blížit nule a v několika oblastech budou velké vrcholy. Manipulací s originálem ve Photoshopu tedy manipulujeme s prvky, které jsou extrahovány z obrázku. Pro člověka je snazší vyjádřit své touhy vizuálně, než se je snažit formulovat jazykem matematiky. Sbohem. Výsledkem bylo, že návrháři a manažeři, vyzbrojení Photoshopem a skripty pro vizualizaci funkcí, dosahovali výsledků třikrát rychleji než matematici a programátoři.


Příklad manipulace s barvou a velikostí prvků


Nebo můžete jako styl použít jednoduchý obrázek



Výsledek








Zde je video, ale pouze se správnou texturou

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

Zdá se, že bychom se tam mohli zastavit, nebýt jedné nuance. Dokončení výše uvedeného stylizačního algoritmu trvá velmi dlouho. Pokud vezmeme implementaci, kde lbfgs běží na CPU, proces trvá asi pět minut. Pokud to přepíšete tak, aby optimalizace šla na GPU, tak proces bude trvat 10-15 sekund. To není dobré. Možná autoři tohoto a dalšího článku mysleli na totéž. Obě publikace vyšly nezávisle na sobě, s odstupem 17 dní, téměř rok po předchozím článku. Autoři aktuálního článku se stejně jako autoři předchozího zabývali generováním textur (pokud jen vynulujete Style Loss na nulu, dostanete to). Navrhli optimalizovat nikoli obraz získaný z bílého šumu, ale nějakou neuronovou síť, která generuje stylizovaný obraz.




Nyní, pokud proces stylingu nezahrnuje žádnou optimalizaci, stačí provést pouze dopředný průchod. A optimalizace je vyžadována pouze jednou pro trénování sítě generátorů. Tento článek používá hierarchický generátor, kde každý další z větší velikosti než předchozí a vzorkované ze šumu v případě generování textur a z nějaké obrazové databáze pro školení stylisty. Je důležité použít něco jiného než trénovací část imagenetu, protože... vlastnosti uvnitř sítě Loss jsou vypočítávány sítí vyškolenou během tréninkové části.



Ztráty vnímání pro přenos stylu v reálném čase a super-rozlišení (27. března 2016)

Jak název napovídá, autoři, kteří se s myšlenkou generativní sítě opozdili jen o 17 dní, pracovali na zvýšení rozlišení obrázků. Zjevně je inspiroval úspěch zbytkového učení na nejnovější imagenetu.




V souladu s tím zbytkový blok a konv.



Nyní tu tedy máme kromě kontroly nad stylováním i rychlý generátor (díky těmto dvěma článkům se doba generování jednoho obrázku měří v desítkách ms).

Konec

Informace z recenzovaných článků a kód autorů jsme použili jako výchozí bod pro vytvoření další aplikace pro styling první aplikace pro styling videa:



Vygeneruje něco takového.