Stilizarea imaginilor folosind rețele neuronale: fără misticism, doar înjurături. Ostagram: un serviciu bazat pe rețea neuronală care combină fotografiile și ornamentele în capodopere artistice Și iată un videoclip, dar numai cu textura potrivită

În fotografiile cele mai obișnuite apar entități numeroase și nu în totalitate distinse. Cel mai adesea din anumite motive câini. Astfel de imagini au început să umple internetul în iunie 2015, când a fost lansat DeepDream de la Google - una dintre primele servicii deschise bazate pe rețele neuronale și concepute pentru procesarea imaginilor.

Se întâmplă aproximativ așa: algoritmul analizează fotografiile, găsește în ele fragmente care îi amintesc de unele obiecte familiare - și distorsionează imaginea în conformitate cu aceste date.

În primul rând, proiectul a fost prezentat ca o sursă deschisă, iar apoi au apărut pe internet servicii online create pe aceleași principii. Unul dintre cele mai convenabile și populare este Deep Dream Generator: este nevoie de doar aproximativ 15 secunde pentru a procesa o fotografie mică aici (anterior, utilizatorii trebuiau să aștepte mai mult de o oră).

Cum învață rețelele neuronale să creeze astfel de imagini? Și de ce, apropo, se numesc așa?

Rețelele neuronale în designul lor imită rețelele neuronale reale ale unui organism viu, dar o fac cu ajutorul algoritmi matematici. După ce ați creat o structură de bază, o puteți antrena folosind metode de învățare automată. Dacă vorbim despre recunoașterea modelelor, atunci mii de imagini trebuie să fie trecute prin rețeaua neuronală. Dacă sarcina rețelei neuronale este diferită, atunci exercițiile de antrenament vor fi diferite.

Algoritmii pentru jocul de șah, de exemplu, analizează jocurile de șah. Pe aceeași cale, algoritmul AlphaGo de la Google DeepMind în jocul chinezesc Go - care a fost salutat ca o descoperire deoarece Go este mult mai complex și neliniar decât șahul.

    Vă puteți juca cu un model de rețea neuronală simplificată și puteți înțelege mai bine principiile acestuia.

    YouTube are, de asemenea, o serie de desene de mână inteligibile role despre cum funcționează rețelele neuronale.

Un alt serviciu popular este Dreamscope, care nu poate doar să viseze la câini, ci și să imite diverse stiluri de pictură. Procesarea imaginii aici este, de asemenea, foarte simplă și rapidă (aproximativ 30 de secunde).

Aparent, partea algoritmică a serviciului este o modificare a programului Neural style, despre care am discutat deja.

Mai recent, a apărut un program care pictează realist imagini alb-negru. În versiunile anterioare, programele similare și-au făcut treaba mult mai puțin bine și era considerat o mare realizare dacă cel puțin 20% dintre oameni nu puteau face diferența dintre o imagine reală și una colorată pe computer.

Mai mult, colorarea aici durează doar aproximativ 1 minut.

Aceeași companie de dezvoltare a lansat și un serviciu care recunoaște în imagini tipuri diferite obiecte.

Aceste servicii pot părea doar un divertisment distractiv, dar, de fapt, totul este mult mai interesant. Noile tehnologii intră în practica artiștilor umani și ne schimbă înțelegerea artei. Poate că în curând oamenii vor trebui să concureze cu mașinile din domeniul creativității.

Predarea algoritmilor de recunoaștere a modelelor este o sarcină cu care dezvoltatorii AI se luptă de mult timp. Prin urmare, programele care colorează fotografii vechi și desenează câini pe cer pot fi considerate parte a unui proces mai amplu și mai intrigant.

Din august 2015, cercetătorii germani de la Universitatea din Tübingen și-au prezentat pe a lor posibilitatea de transfer de stil artiști celebri pe alte fotografii au început să apară servicii care au monetizat această oportunitate. S-a lansat pe piața occidentală, iar pe piața rusă - copia sa completă.

La marcaje

În ciuda faptului că Ostagram s-a lansat în decembrie, a început să câștige rapid popularitate în rețelele sociale la mijlocul lunii aprilie. În același timp, din 19 aprilie, în proiectul de pe VKontakte erau mai puțin de o mie de oameni.

Pentru a utiliza serviciul, trebuie să pregătiți două imagini: o fotografie care trebuie procesată și o imagine cu un exemplu de stil de suprapus pe imaginea originală.

Serviciul are o versiune gratuită: creează o imagine cu o rezoluție minimă de până la 600 de pixeli de-a lungul celei mai lungi părți a imaginii. Utilizatorul primește doar rezultatul uneia dintre iterațiile de aplicare a filtrului la fotografie.

Există două versiuni plătite: Premium produce o imagine de până la 700 de pixeli de-a lungul celei mai lungi părți și aplică imaginii 600 de iterații de procesare a rețelei neuronale (cu cât mai multe iterații, cu atât procesarea este mai interesantă și mai intensă). O astfel de imagine va costa 50 de ruble.

În versiunea HD, puteți ajusta numărul de iterații: 100 va costa 50 de ruble și 1000 - 250 de ruble. În acest caz, imaginea va avea o rezoluție de până la 1200 de pixeli pe partea cea mai lungă și poate fi folosită pentru imprimarea pe pânză: Ostagram oferă acest serviciu cu livrare de la 1800 de ruble.

În februarie, reprezentanții Ostagram nu vor accepta solicitări de procesare a imaginilor de la utilizatorii „din țări cu capitalism dezvoltat”, dar apoi acces la procesarea foto pentru utilizatorii VKontakte din întreaga lume. Judecând după codul Ostagram publicat pe GitHub, acesta a fost dezvoltat de Sergey Morugin, un locuitor de 30 de ani din Nijni Novgorod.

A contactat TJ director comercial proiect, introdus de Andrey. Potrivit acestuia, Ostagram a apărut înainte de Instapainting, dar a fost inspirat de un proiect similar numit Vipart.

Ostagram a fost dezvoltat de un grup de studenți de la NNSTU. Alekseeva: după testarea inițială pe un grup restrâns de prieteni la sfârșitul anului 2015, au decis să facă public proiectul. Inițial, procesarea imaginilor a fost complet gratuită și s-a planificat să câștige bani prin vânzarea de tablouri tipărite. Potrivit lui Andrey, imprimarea sa dovedit a fi cea mai mare problemă: fotografiile persoanelor procesate de o rețea neuronală rareori arată plăcute pentru ochiul uman, iar clientul final trebuie să ajusteze rezultatul pentru o lungă perioadă de timp înainte de a-l aplica pe pânză, ceea ce necesită o mulțime de resurse ale mașinii.

Pentru procesarea imaginilor, creatorii Ostagram au vrut să folosească servere cloud Amazon, dar după afluxul de utilizatori, a devenit clar că costul acestora va depăși o mie de dolari pe zi cu o rentabilitate minimă a investiției. Andrey, care este și investitor în proiect, a închiriat facilități de server în Nijni Novgorod.

Audiența proiectului este de aproximativ o mie de oameni pe zi, dar în unele zile a ajuns la 40 de mii de persoane din cauza tranzițiilor din mass-media străină care deja observase proiectul înaintea celor interne (Ostagram a reușit chiar să colaboreze cu DJ europeni). Noaptea, când traficul este redus, procesarea imaginilor poate dura 5 minute și poate dura până la o oră în timpul zilei.

Dacă utilizatorii străini anteriori aveau acces limitat în mod deliberat la procesarea imaginilor (se credea că va începe monetizarea din Rusia), acum Ostagram se bazează deja mai mult pe un public occidental.

Până în prezent, perspectivele de rambursare sunt condiționate. Dacă fiecare utilizator ar plăti 10 ruble pentru procesare, atunci poate că ar plăti. […]

Este foarte greu de monetizat la noi: oamenii noștri sunt gata să aștepte o săptămână, dar nu vor plăti nici un ban pentru asta. Europenii sunt mai favorabili în acest sens - în ceea ce privește plata pentru accelerare, îmbunătățirea calității - așa că orientarea se îndreaptă către acea piață.

Andrey, reprezentant Ostagram

Potrivit lui Andrey, echipa Ostagram lucrează versiune noua un site cu un accent puternic pe socialitate: „Va arăta ca un serviciu binecunoscut, dar ce să faci.” Reprezentanții Facebook din Rusia au fost deja interesați de proiect, dar înțelegerea nu a ajuns încă la negocieri privind vânzarea.

Exemple de lucrări de service

În feedul de pe site-ul Ostagram, puteți vedea, de asemenea, ce combinație de imagini a rezultat în fotografiile finale: de multe ori acest lucru este chiar mai interesant decât rezultatul în sine. În același timp, filtrele - imaginile folosite ca efect pentru procesare - pot fi salvate pentru utilizare ulterioară.

Salutări, Habr! Cu siguranță ați observat că tema fotografiilor de stil pentru diverse stiluri artistice discutat în mod activ în aceste internet-uri. Citind toate aceste articole populare, ați putea crede că magia se petrece sub capota acestor aplicații, iar rețeaua neuronală fantezează cu adevărat și redesenează imaginea de la zero. S-a întâmplat că echipa noastră s-a confruntat cu o sarcină similară: ca parte a unui hackathon corporativ intern, am realizat un stil video, pentru că. exista deja o aplicație pentru fotografii. În această postare, vom arunca o privire asupra modului în care rețeaua „redesenează” imagini și ne vom uita la articolele care au făcut acest lucru posibil. Vă recomand să vă familiarizați cu ultimul post înainte de a citi acest material și, în general, cu elementele de bază ale rețelelor neuronale convoluționale. Veți găsi câteva formule, ceva cod (voi da exemple despre Theano și Lasagne), precum și o mulțime de poze. Această postare este încorporată ordine cronologica apariția articolelor și, în consecință, a ideilor în sine. Uneori o voi dilua cu experiența noastră recentă. Iată un băiat din iad pentru atenție.


Vizualizarea și înțelegerea rețelelor convoluționale (28 noiembrie 2013)

În primul rând, merită menționat articolul în care autorii au reușit să arate că o rețea neuronală nu este o cutie neagră, ci un lucru destul de interpretabil (apropo, astăzi acest lucru se poate spune nu numai despre rețelele convoluționale pentru computere). viziune). Autorii au decis să învețe cum să interpreteze activările neuronilor din stratul ascuns, pentru aceasta au folosit rețeaua neuronală deconvoluțională (deconvnet) propusă cu câțiva ani mai devreme (apropo, de aceiași Zeiler și Fergus, care sunt autorii acestei publicații ca bine). O rețea deconvoluțională este de fapt aceeași rețea cu convoluții și regrupări aplicate în ordine inversă. Lucrarea originală de pe deconvnet a folosit rețeaua într-un mod de învățare nesupravegheat pentru a genera imagini. De data aceasta, autorii l-au folosit pur și simplu pentru o trecere inversă de la caracteristicile obținute după o trecere înainte prin rețea la imaginea originală. Rezultatul este o imagine care poate fi interpretată ca un semnal care a provocat această activare asupra neuronilor. În mod firesc, apare întrebarea: cum se face o trecere inversă prin convoluție și neliniaritate? Și cu atât mai mult prin max-pooling, aceasta nu este cu siguranță o operație inversată. Să ne uităm la toate cele trei componente.

ReLu invers

În rețelele convoluționale, funcția de activare este adesea folosită ReLu(x) = max(0, x), ceea ce face ca toate activările de pe strat să nu fie negative. În consecință, la trecerea înapoi prin neliniaritate, este, de asemenea, necesar să se obțină rezultate nenegative. Pentru aceasta, autorii propun să folosească același ReLu. Din punct de vedere al arhitecturii Theano, este necesar să trecem peste funcția de gradient a operației (caietul infinit de valoros se află în rețetele de lasagna, de acolo veți culege detalii despre ce este clasa ModifiedBackprop).

Clasa ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # explicit rectifica return (self.nonlinearity(grd),) # folosește neliniaritatea dată

Convoluție inversă

Aici este puțin mai complicat, dar totul este logic: este suficient să aplicați versiunea transpusă a aceluiași nucleu de convoluție, dar la ieșirile din ReLu inversă în locul stratului anterior folosit în trecerea înainte. Dar mă tem că în cuvinte nu este atât de evident, să ne uităm la vizualizarea acestei proceduri (veți găsi și mai multe vizualizări ale circumvoluțiilor).


Convoluție când pas=1

Convoluție când pas=1 versiune inversă

Convoluție când pas=2

Convoluție când pas=2 versiune inversă

Reverse Pooling

Această operație (spre deosebire de cele anterioare) nu este în general inversabilă. Dar am dori totuși să trecem prin maxim într-un fel în timpul trecerii inverse. Pentru a face acest lucru, autorii sugerează utilizarea unei hărți a unde a fost maximul în timpul trecerii directe (comutații de locație max). În timpul trecerii inverse, semnalul de intrare este transformat în unpooling în așa fel încât să păstreze aproximativ structura semnalului original, este cu adevărat mai ușor de văzut decât de descris aici.



Rezultat

Algoritmul de vizualizare este extrem de simplu:

  1. Faceți o pasă dreaptă.
  2. Selectați stratul care ne interesează.
  3. Remediați activarea unuia sau mai multor neuroni și resetați restul.
  4. Faceți o inferență.

Fiecare pătrat gri din imaginea de mai jos corespunde vizualizării filtrului (care este folosit pentru convoluție) sau greutăților unui neuron, iar fiecare imagine colorată este partea din imaginea originală care activează neuronul corespunzător. Pentru claritate, neuronii dintr-un singur strat sunt grupați în grupuri tematice. În general, s-a dovedit brusc că rețeaua neuronală învață exact despre ce au scris Hubel și Weisel în munca lor privind structura sistemului vizual, pentru care au fost premiați. Premiul Nobelîn 1981. Datorită acestui articol, am obținut o reprezentare vizuală a ceea ce învață o rețea neuronală convoluțională la fiecare strat. Tocmai aceste cunoștințe vor permite ulterior manipularea conținutului imaginii generate, dar acest lucru este încă departe, următorii câțiva ani s-au dus la îmbunătățirea metodelor de „trepanare” a rețelelor neuronale. În plus, autorii articolului au propus o modalitate de a analiza modul cel mai bine de a construi arhitectura unei rețele neuronale convoluționale pentru a obține rezultate mai bune (cu toate acestea, nu au câștigat ImageNet 2013, ci au ajuns în top; UPD: se dovedește că au câștigat, Clarifai este ceea ce sunt).


Vizualizare caracteristică


Iată un exemplu de vizualizare a activărilor folosind deconvnet, astăzi acest rezultat arată deja așa, dar atunci a fost o descoperire.


Hărți de proeminentă folosind deconvnet

Deep Inside Convolutional Networks: Vizualizarea modelelor de clasificare a imaginilor și a hărților de importanță (19 aprilie 2014)

Acest articol este dedicat studiului metodelor de vizualizare a cunoștințelor conținute într-o rețea neuronală convoluțională. Autorii propun două metode de vizualizare bazate pe coborârea gradientului.

Vizualizarea modelului de clasă

Deci, imaginați-vă că avem o rețea neuronală antrenată pentru a rezolva o problemă de clasificare într-un anumit număr de clase. Indicați valoarea de activare a neuronului de ieșire care corespunde clasei c. Apoi următoarea problemă de optimizare ne oferă exact imaginea care maximizează clasa selectată:



Această sarcină este ușor de rezolvat folosind Theano. De obicei, cerem cadrului să ia derivata parametrilor modelului, dar de data aceasta presupunem că parametrii sunt fix și derivata este luată din imaginea de intrare. Următoarea funcție selectează valoarea maximă a stratului de ieșire și returnează o funcție care calculează derivata față de imaginea de intrare.


def compile_saliency_function(net): """ Compilează o funcție pentru a calcula hărțile de proeminență și clasele prezise pentru un mini-lot dat de imagini de intrare. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], determinist=True) max_outp = T.max(outp, axis=1) saiency = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, axis=1) returnează theano.function(, )

Probabil ați văzut imagini ciudate cu câini pe Internet - DeepDream. În articolul original, autorii folosesc următorul proces pentru a genera imagini care maximizează clasa selectată:

  1. Inițializați imaginea inițială cu zerouri.
  2. Calculați valoarea derivatei din această imagine.
  3. Schimbați imaginea adăugând la ea imaginea rezultată din derivat.
  4. Reveniți la pasul 2 sau părăsiți bucla.

Imaginile rezultate sunt:




Dar ce se întâmplă dacă inițializați prima imagine cu o fotografie reală și începeți același proces? Dar la fiecare iterație vom alege o clasă aleatorie, vom pune restul la zero și vom calcula valoarea derivatei, apoi vom obține un vis atât de profund.


Atenție 60 mb


De ce există atât de multe fețe și ochi de câine? E simplu: sunt aproape 200 de câini în rețeaua de imagine din 1000 de clase, au ochi. Și, de asemenea, o mulțime de clase în care sunt doar oameni.

Extragerea proeminenței de clasă

Dacă acest proces este inițializat cu o fotografie reală, oprit după prima iterație și trasarea valorii derivatului, atunci vom obține o astfel de imagine, adăugând care la cea originală, vom crește valoarea de activare a clasei selectate.


Hărți de proeminentă folosind derivate


Din nou, rezultatul este „așa-așa”. Este important de reținut că acest lucru Metoda noua vizualizarea activărilor (nimic nu ne împiedică să fixăm valorile activărilor nu pe ultimul strat, ci în general pe orice strat al rețelei și să luăm derivatul față de imaginea de intrare). Următorul articol va combina ambele abordări anterioare și ne va oferi un instrument despre cum să configurați transferul de stil, care va fi descris mai târziu.

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

Acest articol nu este, în general, despre vizualizare, ci despre faptul că înlocuirea grupării cu o convoluție cu un pas mare nu duce la pierderea calității. Dar, ca produs secundar al cercetării lor, autorii au propus un nou mod de vizualizare a caracteristicilor, pe care l-au aplicat pentru a analiza mai precis ceea ce învață modelul. Ideea lor este următoarea: dacă luăm pur și simplu derivata, atunci în timpul deconvoluției, acele caracteristici care erau în imaginea de intrare nu revin înapoi. mai putin de zero(aplicarea ReLu la imaginea de intrare). Și acest lucru duce la faptul că valorile negative apar pe imaginea din spate propagată. Pe de altă parte, dacă utilizați deconvnet, atunci un alt ReLu este luat din derivatul lui ReLu - acest lucru vă permite să nu săriți înapoi valorile negative, dar după cum ați văzut, rezultatul este „așa așa”. Dar dacă combinăm aceste două metode?




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

Apoi obțineți o imagine complet curată și interpretabilă.


Hărți de proeminentă folosind propagarea inversă ghidată

Mergi mai adânc

Acum să ne gândim, ce ne oferă asta? Permiteți-mi să vă reamintesc că fiecare strat convoluțional este o funcție care primește un tensor tridimensional ca intrare și, de asemenea, produce un tensor tridimensional ca rezultat, poate de o dimensiune diferită. d X w X h; d epth este numărul de neuroni din strat, fiecare dintre ei generează o hartă caracteristică cu dimensiunea w igth x h opt.


Să încercăm următorul experiment pe rețeaua VGG-19:



conv1_2

Da, nu vezi aproape nimic, pentru că. aria receptivă este foarte mică, aceasta este a doua circumvoluție 3x3, respectiv, aria totală este de 5x5. Dar mărind, vedem că caracteristica este doar un detector de gradient.




conv3_3


conv4_3


conv5_3


piscina5


Și acum imaginați-vă că în loc de maximul peste placă, vom lua derivata valorii sumei tuturor elementelor plăcii peste imaginea de intrare. Apoi, evident, zona receptivă a grupului de neuroni va acoperi întreaga imagine de intrare. Pentru straturile timpurii, vom vedea hărți luminoase, din care deducem că acestea sunt detectoare de culoare, apoi gradienți, apoi margini și așa mai departe spre modele mai complexe. Cu cât stratul este mai adânc, se obține imaginea mai slabă. Acest lucru se explică prin faptul că straturile mai profunde au un model mai complex pe care îl detectează, iar un model complex apare mai rar decât unul simplu și, prin urmare, harta de activare se estompează. Prima modalitate este potrivită pentru înțelegerea straturilor cu modele complexe, iar a doua este potrivită pentru cele simple.


conv1_1


conv2_2


conv4_3


Puteți descărca o bază de date mai completă de activări pentru mai multe imagini și .

Un algoritm neural al stilului artistic (2 septembrie 2015)

Deci, au trecut câțiva ani de la prima trepanare reușită a rețelei neuronale. Noi (în sensul umanității) avem în mâinile noastre Unealtă puternică, care vă permite să înțelegeți ce învață rețeaua neuronală, precum și să eliminați ceea ce nu ne-am dori cu adevărat să învețe. Autorii acestui articol dezvoltă o metodă care vă permite să generați o singură imagine hartă asemănătoare activări pe o imagine țintă și poate chiar mai mult de una - aceasta este baza stilului. Introducem zgomot alb la intrare și, într-un proces iterativ similar ca în visul profund, aducem această imagine la una în care hărțile caracteristicilor sunt similare cu imaginea țintă.

pierdere de conținut

După cum sa menționat deja, fiecare strat al rețelei neuronale produce un tensor tridimensional de o anumită dimensiune.




Să notăm rezultatul i al-lea strat de la intrare ca . Atunci dacă minimizăm suma ponderată a reziduurilor dintre imaginea de intrare și o imagine la care aspirăm c, atunci primești exact ceea ce ai nevoie. Pot fi.



Pentru a experimenta acest articol, puteți folosi acest laptop magic, unde au loc calculele (atât pe GPU, cât și pe CPU). GPU-ul este utilizat pentru a calcula caracteristicile rețelei neuronale și valoarea funcției de cost. Theano produce o funcție care poate calcula gradientul funcției obiectiv eval_grad prin imaginea de intrare X. Acesta este apoi introdus în lbfgs și începe procesul iterativ.


# Inițializați cu o imagine de zgomot 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) # Optimize, salvând periodic rezultatul pentru i în intervalul(8): print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = generated_image.get_value().astype("float64") xs.append(x0)

Dacă rulăm optimizarea unei astfel de funcție, atunci vom obține rapid o imagine similară cu cea țintă. Acum putem recrea imagini din zgomot alb care arată ca o imagine de conținut.


Pierdere de conținut: conv4_2



Proces de optimizare




Este ușor de observat două caracteristici ale imaginii rezultate:

  • culori pierdute - acesta este rezultatul faptului că într-un anumit exemplu a fost folosit doar stratul conv4_2 (sau, cu alte cuvinte, greutatea w a fost diferită de zero pentru acesta și zero pentru celelalte straturi); după cum vă amintiți, straturile timpurii sunt cele care conțin informații despre culori și tranziții de gradient, iar cele ulterioare conțin informații despre detalii mai mari, ceea ce observăm - culorile se pierd, dar conținutul nu;
  • unele case „să mergem”, adică. liniile drepte sunt ușor curbate - acest lucru se datorează faptului că cu cât stratul este mai adânc, cu atât mai puține informații despre poziția spațială a caracteristicii pe care o conține (rezultatul aplicării convoluțiilor și grupărilor).

Adăugarea de straturi timpurii corectează imediat situația cu culori.


Pierdere de conținut: conv1_1, conv2_1, conv4_2


Sperăm că până acum aveți sentimentul că aveți control asupra a ceea ce este redesenat pe imaginea cu zgomot alb.

pierderea stilului

Și acum am ajuns la cel mai interesant: cum putem transmite stilul? Ce este stilul? Evident, stilul nu este ceea ce am optimizat în Content Loss, deoarece conține multe informații despre pozițiile spațiale ale caracteristicilor.Deci primul lucru de făcut este să eliminați cumva aceste informații din vizualizările primite pe fiecare strat.


Autorul propune următoarea metodă. Să luăm tensorul la ieșirea unui strat, să-l extindem în coordonate spațiale și să calculăm matricea de covarianță dintre plăci. Să notăm această transformare ca G. Ce am făcut cu adevărat? Se poate spune că am numărat cât de des apar în perechi caracteristicile din interiorul plăcii sau, cu alte cuvinte, am aproximat distribuția caracteristicilor în plăci cu o distribuție normală multivariată.




Apoi Style Loss este introdus după cum urmează, unde s este o imagine cu stil:



Să încercăm pentru Vincent? În principiu, obținem ceva așteptat - zgomot în stilul lui Van Gogh, informații despre aranjarea spațială a caracteristicilor se pierd complet.


Vincent




Ce se întâmplă dacă punem o fotografie în loc de o imagine de stil? Obțineți caracteristici deja familiare, culori familiare, dar poziția spațială este complet pierdută.


Fotografie cu pierdere de stil


Sigur te-ai întrebat de ce calculăm matricea de covarianță și nu altceva? La urma urmei, există multe modalități de a agrega caracteristici, astfel încât coordonatele spațiale să se piardă. Aceasta este într-adevăr o întrebare deschisă, iar dacă iei ceva foarte simplu, rezultatul nu se va schimba dramatic. Să verificăm acest lucru, nu vom calcula matricea de covarianță, ci pur și simplu valoarea medie a fiecărei plăci.




pierdere simplă de stil

Pierdere combinată

Desigur, există dorința de a combina aceste două funcții de cost. Apoi vom genera o astfel de imagine din zgomotul alb încât va reține caracteristici din imaginea de conținut (care au legătură cu coordonatele spațiale) și vor exista și caracteristici de „stil” care nu sunt legate de coordonatele spațiale, de exemplu. sperăm că vom păstra intacte detaliile imaginii de conținut, dar redesenate cu stilul potrivit.



De fapt, există și un regulator, dar îl vom omite pentru simplitate. Rămâne să răspundem la următoarea întrebare: ce straturi (greutăți) să folosiți în optimizare? Și mă tem că nu am un răspuns la această întrebare, și nici autorii articolului. Au o sugestie de a folosi următoarele, dar asta nu înseamnă deloc că o altă combinație va funcționa mai rău, spațiul de căutare este prea mare. Singura regulă care decurge din înțelegerea modelului este că nu are sens să luăm straturi învecinate, deoarece semnele lor nu vor diferi prea mult unele de altele, prin urmare se adaugă stilului un strat din fiecare grup conv*_1.


# Define loss function losses = # pierderi de conținut 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 (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(art_features, "genconv4_1") ) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # total variation penalty losses.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = sum(pierderi)

Modelul final poate fi prezentat în forma următoare.




Și iată rezultatul caselor cu Van Gogh.



Încercați să controlați procesul

Să ne amintim părțile anterioare, încă cu doi ani înainte de articolul actual, alți oameni de știință au explorat ceea ce învață cu adevărat rețeaua neuronală. Înarmat cu toate aceste articole, puteți genera vizualizări de caracteristici. diverse stiluri, imagini diferite, rezoluții și dimensiuni diferite și încercați să înțelegeți ce straturi cu ce greutate să luați. Dar chiar și re-ponderarea straturilor nu oferă control deplin asupra a ceea ce se întâmplă. Problema aici este mai conceptuală: optimizăm funcția greșită! Cum, întrebi? Răspunsul este simplu: această funcție minimizează reziduul... ei bine, ați înțeles ideea. Dar ceea ce ne dorim cu adevărat este să ne placă imaginea. Combinația convexă a funcțiilor de pierdere a conținutului și stilului nu este o măsură a ceea ce mintea noastră consideră frumos. S-a observat că dacă coafarea este continuată prea mult timp, funcția de cost scade în mod natural din ce în ce mai mult, dar frumusețea estetică a rezultatului scade brusc.




Bine, mai este o problemă. Să presupunem că am găsit un strat care extrage caracteristicile de care avem nevoie. Să presupunem că unele texturi sunt triunghiulare. Dar acest strat conține încă multe alte caracteristici, cum ar fi cercurile, pe care chiar nu vrem să le vedem în imaginea rezultată. În general, dacă am putea angaja un milion de chinezi, am putea vizualiza toate caracteristicile unei imagini de stil și, printr-o căutare exhaustivă, le-am marca pe cele de care avem nevoie și le-am include doar în funcția de cost. Dar din motive evidente, nu este atât de ușor. Dar ce se întâmplă dacă pur și simplu eliminăm toate cercurile pe care nu dorim să apară în rezultat din foaia de stil? Apoi, activarea neuronilor corespunzători care răspund la cerc pur și simplu nu va funcționa. Și, desigur, atunci acest lucru nu va apărea în imaginea rezultată. La fel este și cu florile. Prezentați o imagine luminoasă cu o cantitate mare culorile. Distribuția culorilor va fi foarte pătată în tot spațiul, distribuția imaginii rezultate va fi aceeași, dar în timpul procesului de optimizare, vârfurile care erau pe original se vor pierde probabil. S-a dovedit că o simplă scădere a adâncimii de biți a paletei de culori rezolvă această problemă. Densitatea de distribuție a majorității culorilor va fi aproape de zero și vor exista vârfuri mari în mai multe zone. Astfel, manipulând originalul în Photoshop, manipulăm caracteristicile care sunt extrase din imagine. Este mai ușor pentru o persoană să-și exprime vizual dorințele decât să încerce să le formuleze în limbajul matematicii. Pa. Drept urmare, designerii și managerii, înarmați cu Photoshop și scripturi pentru vizualizarea caracteristicilor, au obținut un rezultat de trei ori mai rapid decât ceea ce au făcut matematicienii și programatorii.


Un exemplu de manipulare a culorii și dimensiunii caracteristicilor


Și puteți lua imediat o imagine simplă ca stil



rezultate








Și iată un vidosik, dar numai cu textura potrivită

Texture Networks: Feed-forward Sinteză a texturilor și a imaginilor stilizate (10 martie 2016)

Se pare că acest lucru ar putea fi oprit, dacă nu o singură nuanță. Algoritmul de stil de mai sus funcționează foarte mult timp. Dacă luăm o implementare în care lbfgs este rulat pe CPU, atunci procesul durează aproximativ cinci minute. Dacă îl rescrieți astfel încât optimizarea să ajungă la GPU, atunci procesul va dura 10-15 secunde. Nu e bine. Poate că și autorii acestui articol și al următorului articol s-au gândit la același lucru. Ambele publicații au apărut independent la 17 zile una dintre ele, la aproape un an de la articolul precedent. Autorii articolului actual, ca și autorii celui precedent, au fost implicați în generarea texturii (dacă doar resetați pierderea stilului, aceasta este aproximativ ceea ce obțineți). Ei au sugerat optimizarea nu a unei imagini obținute din zgomot alb, ci a unei rețele neuronale care generează o imagine stilizată.




Acum, dacă procesul de styling nu include nicio optimizare, trebuie făcută doar o trecere înainte. Și optimizarea este necesară o singură dată pentru a antrena rețeaua generatoarelor. Acest articol folosește un generator ierarhic în care fiecare urmează z mai mare decât precedentul și este prelevat din zgomot în cazul generării texturii și dintr-o bază de date de imagini pentru antrenamentul stilizatorului. Este esențial să folosiți altceva decât partea de instruire a imagenet-ului, deoarece caracteristicile din interiorul rețelei de pierdere sunt calculate de către rețeaua instruită doar în partea de antrenament.



Pierderi perceptuale pentru transferul stilului în timp real și super-rezoluție (27 martie 2016)

După cum sugerează și numele, autorii, care au întârziat doar 17 zile cu ideea unei rețele generatoare, au fost ocupați să mărească rezoluția imaginilor. Ei par să fi fost inspirați de succesul învățării reziduale pe cel mai recent imagenet.




În consecință, bloc rezidual și bloc conv.



Astfel, acum pe lângă controlul stilului, avem în mână și un generator rapid (mulțumită acestor două articole, timpul de generare pentru o imagine se măsoară în zeci de ms).

Final

Am folosit informațiile din articolele revizuite și codul autorilor ca punct de plecare pentru crearea unei alte aplicații de styling pentru prima aplicație de styling video:



Generați așa ceva.