Billedets neurale netværk. Styling af billeder ved hjælp af neurale netværk: ingen mystik, bare matan

hjem / Tidligere

På de mest almindelige fotografier optræder talrige og ikke helt skelnelige enheder. Oftest, af en eller anden grund, hunde. Internettet begyndte at fylde op med sådanne billeder i juni 2015, da Googles DeepDream blev lanceret – en af ​​de første åbne tjenester baseret på neurale netværk til billedbehandling.

Det sker omtrent sådan: Algoritmen analyserer fotografier, finder fragmenter i dem, der minder ham om nogle kendte objekter - og forvrænger billedet i overensstemmelse med disse data.

Først blev projektet lagt ud i form af open source, og derefter dukkede onlinetjenester op på internettet, skabt efter de samme principper. En af de mest bekvemme og populære er Deep Dream Generator: behandling af et lille billede her tager kun omkring 15 sekunder (tidligere måtte brugere vente mere end en time).

Hvordan lærer neurale netværk at skabe sådanne billeder? Og hvorfor hedder de i øvrigt det?

Ved deres design efterligner neurale netværk ægte neurale netværk af en levende organisme, men de gør det ved hjælp af matematiske algoritmer. Når du har oprettet en grundlæggende struktur, kan du træne den ved hjælp af maskinlæringsteknikker. Hvis vi taler om mønstergenkendelse, så skal tusindvis af billeder føres gennem det neurale netværk. Hvis opgaven for det neurale netværk er anderledes, så vil træningsøvelserne være anderledes.

Algoritmer til at spille skak analyserer for eksempel skakspil. På samme måde satte Google DeepMinds AlphaGo-algoritme ind i det kinesiske spil go - hvilket blev set som et gennembrud, da go er meget mere komplekst og ikke-lineært end skak.

    Du kan lege med en forenklet neural netværksmodel og bedre forstå dens principper.

    YouTube har også en række letlæselige ruller om hvordan neurale netværk fungerer.

En anden populær tjeneste er Dreamscope, som ikke kun kan drømme om hunde, men også efterligne forskellige malestile. Billedbehandlingen her er også meget enkel og hurtig (ca. 30 sekunder).

Tilsyneladende er den algoritmiske del af tjenesten en ændring af programmet "Neural stil", som vi allerede har diskuteret.

For nylig er der dukket et program op, der realistisk farver sort-hvide billeder. I tidligere versioner klarede lignende programmer sig meget mindre godt i deres opgave, og det blev betragtet som en stor præstation, hvis mindst 20% af mennesker ikke kunne skelne et rigtigt billede fra et computerfarvet billede.

Desuden tager farvning her kun omkring 1 minut.

Det samme udviklerfirma lancerede også en tjeneste, der genkender forskellige typer objekter i billeder.

Disse tjenester kan virke som bare sjov underholdning, men i virkeligheden er alt meget mere interessant. Nye teknologier er på vej ind i menneskelige kunstneres praksis og ændrer vores forståelse af kunst. Folk bliver sandsynligvis snart nødt til at konkurrere med maskiner inden for kreativitet.

At lære algoritmer til mønstergenkendelse er en opgave, som udviklerne af kunstig intelligens har kæmpet med i lang tid. Derfor kan programmer, der farver gamle billeder og maler hunde på himlen, betragtes som en del af en større og mere spændende proces.

Hilsen, Habr! Du har sikkert bemærket, at emnet stilisering af fotos til forskellige kunstneriske stilarter diskuteres aktivt på disse internetsider. Når du læser alle disse populære artikler, tror du måske, at magi sker under hætten af ​​disse applikationer, og det neurale netværk virkelig fantaserer og gentegner billedet fra bunden. Det skete bare sådan, at vores team stod over for en lignende opgave: Som en del af det interne virksomhedshackathon lavede vi videostiliseringen, fordi ansøgning om billeder har allerede været. I dette indlæg vil vi finde ud af, hvordan dette netværk "gentegner" billeder, og vi vil analysere de artikler, der gjorde dette muligt. Jeg anbefaler, at du læser det sidste indlæg, før du læser dette materiale og generelt med det grundlæggende i konvolutionelle neurale netværk. Du finder nogle formler, noget kode (jeg vil give eksempler på Theano og Lasagne), samt en masse billeder. Dette indlæg er organiseret i kronologisk rækkefølge efter artiklernes udseende og følgelig selve ideerne. Nogle gange vil jeg fortynde det med vores seneste erfaring. Her er en dreng fra helvede til din opmærksomhed.


Visualisering og forståelse af konvolutionelle netværk (28. nov. 2013)

Først og fremmest er det værd at nævne artiklen, hvori forfatterne var i stand til at vise, at et neuralt netværk ikke er en sort boks, men en fuldstændig fortolkelig ting (forresten, i dag kan dette ikke kun siges om foldningsnetværk til computer vision). Forfatterne besluttede at lære at fortolke aktiveringen af ​​neuroner af skjulte lag, til dette brugte de et deconvolution neuralt netværk (deconvnet), foreslået flere år tidligere (i øvrigt af den samme Seiler og Fergus, som er forfatterne til dette offentliggørelse). Et dekonvolutionelt netværk er faktisk det samme netværk med foldninger og puljer, men anvendt i omvendt rækkefølge. I det originale arbejde med deconvnet blev netværket brugt i uovervåget indlæringstilstand til at generere billeder. Denne gang anvendte forfatterne det blot for at gå tilbage fra funktionerne opnået efter en fremadgående gennemgang gennem netværket til det originale billede. Som et resultat opnås et billede, der kan tolkes som et signal, der forårsagede denne aktivering på neuroner. Naturligvis opstår spørgsmålet: hvordan får man en omvendt passage gennem foldning og ikke-linearitet? Og endnu mere gennem max-pooling er dette bestemt ikke en omvendt operation. Lad os tage et kig på alle tre komponenter.

Omvendt ReLu

I foldningsnetværk bruges aktiveringsfunktionen ofte ReLu (x) = max (0, x) hvilket gør alle aktiveringer på laget ikke-negative. Når man går tilbage gennem ikke-lineariteten, er det derfor også nødvendigt at opnå ikke-negative resultater. Til dette foreslår forfatterne at bruge den samme ReLu. Fra et Theano-arkitektursynspunkt skal du tilsidesætte operationsgradientfunktionen (den uendeligt værdifulde notesbog er i lasagneopskrifter, derfra kan du få detaljerne om, hvad ModifiedBackprop-klassen er).

Klasse ZeilerBackprop (ModifiedBackprop): def grad (selv, input, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd> 0) .astype (inp.dtype),) # korriger eksplicit return (self.nlinearity (grd),) # brug den givne ikke-linearitet

Omvendt foldning

Det er lidt mere kompliceret her, men alt er logisk: det er nok at anvende den transponerede version af den samme foldningskerne, men på udgangene fra den omvendte ReLu i stedet for det tidligere lag, der blev brugt i det fremadgående gennemløb. Men jeg er bange for, at det med ord ikke er så indlysende, lad os se på visualiseringen af ​​denne procedure (du vil finde endnu flere visualiseringer af viklinger).


Indvikling med skridt = 1

Indvikling med skridt = 1 Omvendt version

Indvikling med skridt = 2

Indvikling med skridt = 2 Omvendt version

Omvendt pooling

Denne operation (i modsætning til de foregående), er generelt set ikke inverterbar. Men vi vil alligevel gerne igennem det maksimale på en eller anden måde under returpassagen. Til dette foreslår forfatterne at bruge et kort over, hvor maksimum var under den direkte passage (maks. placering skifter). Under den omvendte passage kobles indgangssignalet ud, så det tilnærmelsesvis bevare strukturen af ​​det originale signal, det er virkelig nemmere at se end at beskrive det.



Resultat

Visualiseringsalgoritmen er ekstremt enkel:

  1. Lav en lige aflevering.
  2. Vælg det lag, der interesserer os.
  3. Ret aktiveringen af ​​en eller flere neuroner og nulstil resten.
  4. Træk den modsatte konklusion.

Hver grå firkant på billedet nedenfor svarer til gengivelsen af ​​et filter (som bruges til foldning) eller vægten af ​​en neuron, og hvert farvebillede er den del af det originale billede, der aktiverer den tilsvarende neuron. For klarhedens skyld er neuroner inden for et lag grupperet i tematiske grupper. Generelt viste det sig pludselig, at det neurale netværk lærer præcis, hvad Hubel og Weisel skrev om i deres arbejde med strukturen af ​​det visuelle system, som de blev tildelt Nobelprisen for i 1981. Takket være denne artikel fik vi en visuel repræsentation af, hvad det konvolutionelle neurale netværk lærer på hvert lag. Det er denne viden, der senere vil gøre det muligt at manipulere indholdet af det genererede billede, men dette er stadig langt væk; de næste par år blev brugt på at forbedre metoderne til at "trepanere" neurale netværk. Derudover foreslog artiklens forfattere en måde at analysere, hvordan man bedst bygger arkitekturen af ​​et foldet neuralt netværk for at opnå de bedste resultater (selvom de ikke vandt ImageNet 2013, men de kom til tops; UPD: det viser sig, at de vandt, Clarifai er de).


Funktionsvisualisering


Her er et eksempel på at visualisere aktiveringer ved hjælp af deconvnet, i dag ser dette resultat ud som så, men så var det et gennembrud.


Saliency Maps ved hjælp af deconvnet

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

Denne artikel er afsat til studiet af metoder til visualisering af viden indeholdt i et foldet neuralt netværk. Forfatterne foreslår to gengivelsesmetoder baseret på gradientnedstigning.

Klassemodelvisualisering

Så forestil dig, at vi har et trænet neuralt netværk til at løse et klassifikationsproblem for et bestemt antal klasser. Lad os betegne aktiveringsværdien af ​​outputneuronen, som svarer til klassen c... Så giver følgende optimeringsproblem os præcis det billede, der maksimerer den valgte klasse:



Denne opgave er nem at løse ved hjælp af Theano. Normalt beder vi rammen om at tage den afledede fra modelparametrene, men denne gang antager vi, at parametrene er faste, og den afledede er taget fra inputbilledet. Den følgende funktion vælger den maksimale værdi af outputlaget og returnerer en funktion, der beregner den afledede fra inputbilledet.


def compile_saliency_function (net): "" "Kompilerer en funktion til at beregne saliency-kortene og forudsagte klasser for en given minibatch af inputbilleder." "" inp = net ["input"]. input_var outp = lasagne.layers.get_output (net ["fc8"], deterministisk = Sand) max_outp = T.max (outp, akse = 1) saliency = theano.grad (max_outp.sum (), wrt = inp) max_class = T.argmax (outp, akse = 1) returnere theano.function (,)

Du har sikkert set mærkelige hundeansigter på internettet - DeepDream. I den originale artikel bruger forfatterne følgende proces til at generere billeder, der maksimerer den valgte klasse:

  1. Initialiser det oprindelige billede med nuller.
  2. Beregn værdien af ​​den afledte fra dette billede.
  3. Skift billedet ved at tilføje det resulterende billede fra derivatet til det.
  4. Vend tilbage til trin 2 eller forlad løkken.

De resulterende billeder er:




Hvad hvis vi initialiserer det første billede med et rigtigt foto og starter den samme proces? Men ved hver iteration vil vi vælge en tilfældig klasse, nulstille resten og beregne værdien af ​​den afledte, så får vi sådan en dyb drøm.


Forsigtig 60 MB


Hvorfor er der så mange hundeansigter og øjne? Det er enkelt: I billedet af 1000 klasser er der næsten 200 hunde, de har øjne. Der er også mange klasser, hvor der simpelthen er mennesker.

Klasse Saliency Extraction

Hvis vi initialiserer denne proces med et rigtigt foto, stopper efter den første iteration og tegner værdien af ​​derivatet, så får vi et sådant billede, og tilføjer det til det originale, vi øger aktiveringsværdien af ​​den valgte klasse.


Saliency Maps ved hjælp af afledte


Igen er resultatet "så som så". Det er vigtigt at bemærke, at dette er en ny måde at visualisere aktiveringer på (intet forhindrer os i at fiksere værdierne for aktiveringer ikke på det sidste lag, men generelt på et hvilket som helst lag af netværket og tage derivatet fra inputbilledet) . Den næste artikel vil kombinere begge de tidligere tilgange og give os et værktøj til, hvordan man tilpasser stiloverførslen, som vil blive beskrevet senere.

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

Generelt handler denne artikel ikke om visualisering, men om det faktum, at udskiftning af poolingen med en foldning med et stort skridt ikke fører til kvalitetstab. Men som et biprodukt af deres forskning foreslog forfatterne en ny måde at visualisere funktioner på, som de brugte til mere præcist at analysere, hvad modellen lærer. Deres idé er som følger: Hvis vi bare tager den afledede, så går de funktioner, der var mindre end nul på inputbilledet, ikke tilbage under dekonvolution (ved at bruge ReLu til inputbilledet). Og dette fører til det faktum, at negative værdier vises på det forplantede bagbillede. På den anden side, hvis du bruger deconvnet, tages en anden ReLu fra ReLu-derivatet - dette giver dig mulighed for ikke at sende negative værdier tilbage, men som du så, er resultatet "så som så". Men hvad hvis du kombinerer disse to metoder?




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

Så får du et helt rent og fortolkeligt billede.


Saliency-kort ved hjælp af guidet backpropagation

Gå dybere

Lad os nu tænke, hvad giver det os? Lad mig minde dig om, at hvert foldningslag er en funktion, der modtager en tredimensionel tensor som input og udsender også en tredimensionel tensor, måske af en anden dimension d x w x h; d epth er antallet af neuroner i laget, hver af dem genererer et funktionskort over størrelse w igt x h otte.


Lad os prøve følgende eksperiment på et VGG-19-netværk:



konv1_2

Man ser næsten ingenting, tk. det modtagelige område er meget lille, dette er den anden foldning, henholdsvis 3x3, det samlede areal er 5x5. Men hvis vi zoomer ind, kan vi se, at funktionen blot er en gradientdetektor.




konv3_3


conv4_3


conv5_3


pool 5


Lad os nu forestille os, at i stedet for maksimum over pladen, vil vi tage den afledte værdi af summen af ​​alle pladeelementer fra inputbilledet. Så vil den åbenlyst modtagelige region af gruppen af ​​neuroner dække hele inputbilledet. For de tidlige lag vil vi se lyse kort, hvorfra vi konkluderer, at disse er detektorer af farver, derefter gradienter, derefter grænser, og så videre i retning af komplicerede mønstre. Jo dybere laget er, jo mørkere bliver billedet. Dette forklares ved, at dybere lag har et mere komplekst mønster, som de registrerer, og et komplekst mønster optræder sjældnere end et simpelt, og derfor falmer aktiveringskortet. Den første metode er velegnet til at forstå lag med komplekse mønstre, og den anden er kun til simple.


konv1_1


conv2_2


conv4_3


Du kan downloade en mere komplet database med aktiveringer for flere billeder og.

A Neural Algorithm of Artistic Style (2. sep. 2015)

Så der er gået et par år siden den første vellykkede trepanning af det neurale netværk. Vi (i betydningen medmenneskelighed) har et kraftfuldt værktøj i vores hænder, der giver os mulighed for at forstå, hvad det neurale netværk lærer, og også at fjerne det, vi ikke rigtig gerne ville have det til at lære. Forfatterne til denne artikel er ved at udvikle en metode, der gør det muligt for et billede at generere et lignende aktiveringskort for et eller andet målbillede, og måske endda mere end ét - dette er grundlaget for styling. Vi leverer hvid støj til inputtet, og ved en lignende iterativ proces som i deep dream bringer vi dette billede til et med feature maps svarende til målbilledet.

Indholdstab

Som allerede nævnt producerer hvert lag af det neurale netværk en tredimensionel tensor af en eller anden dimension.




Lad os betegne outputtet jeg-th lag fra input som. Så hvis vi minimerer den vægtede sum af residualerne mellem inputbilledet og et billede, vi sigter efter c, så får du lige det, du har brug for. Sandsynligvis.



For at eksperimentere med denne artikel kan du bruge denne magiske bærbare computer, beregninger finder sted der (både på GPU'en og på CPU'en). GPU'en bruges til at beregne funktionerne i det neurale netværk og værdien af ​​omkostningsfunktionen. Theano udsteder en funktion, der kan beregne gradienten af ​​den objektive funktion eval_grad ved inputbillede x... Dette føres derefter ind i lbfgs, og en iterativ proces startes.


# Initialiser med et støjbillede 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) # Optimer, gemmer resultatet periodisk for i i området (8): print (i) scipy.optimize.fmin_l_bfgs_b (eval_loss, x0.flatten (), fprime = eval_grad, maxfun = 40) x0 = genereret_billede.get_værdi (). astype ("float64") xs.append (x0)

Hvis vi kører optimeringen af ​​en sådan funktion, så får vi hurtigt et billede, der ligner målet. Nu er vi i stand til at genskabe billeder fra hvid støj, der ligner et indholdsbillede.


Indholdstab: conv4_2



Optimeringsproces




Det er let at se to funktioner i det resulterende billede:

  • farverne gik tabt - dette er resultatet af, at i et specifikt eksempel kun blev brugt conv4_2-laget (eller med andre ord, vægten w med det var ikke-nul, og for resten af ​​lagene var det nul); som du husker, er det de tidlige lag, der indeholder information om farver og gradientovergange, og de senere indeholder information om større detaljer, som vi observerer - farverne går tabt, men indholdet er ikke;
  • nogle huse "kørte af sted", dvs. de lige linjer er let buede - dette skyldes, at jo dybere laget er, jo mindre information indeholder det om trækets rumlige position (resultatet af brug af foldninger og puljer).

Tilføjelse af tidlige lag korrigerer straks farvesituationen.


Indholdstab: conv1_1, conv2_1, conv4_2


Forhåbentlig på dette tidspunkt føler du, at du kan kontrollere, hvad der bliver tegnet om på billedet med hvid støj.

Stiltab

Og nu kom vi til det mest interessante: hvordan kan vi formidle stilen? Hvad er stil? Det er klart, at stilen ikke er noget, vi har optimeret i Content Loss, fordi den indeholder en masse information om funktionernes rumlige positioner. Så den første ting at gøre er at fjerne denne information fra de visninger, der modtages på hvert lag.


Forfatteren foreslår følgende metode. Tag tensoren ved udgangen fra et bestemt lag, fold den ud langs de rumlige koordinater og beregn kovariansmatrixen mellem matricerne. Lad os betegne denne transformation som G... Hvad har vi egentlig gjort? Vi kan sige, at vi har beregnet, hvor ofte træk inde i pladen findes i par, eller med andre ord, vi tilnærmede fordelingen af ​​træk i pladerne med en multivariat normalfordeling.




Derefter introduceres Style Loss som følger, hvor s- dette er et billede med stil:



Lad os prøve for Vincent? I princippet vil vi få noget forventet - støj i stil med Van Gogh, information om det rumlige arrangement af funktioner går helt tabt.


Vincent




Men hvad hvis du i stedet for et stiliseret billede lægger et billede? Du får allerede velkendte funktioner, velkendte farver, men den rumlige position er fuldstændig tabt.


Foto ved tab af stil


Du undrede dig sikkert over, hvorfor vi beregner kovariansmatricen, og ikke noget andet? Der er trods alt mange måder, hvordan man kan aggregere funktioner, så de rumlige koordinater går tabt. Dette er virkelig et åbent spørgsmål, og hvis du tager noget meget simpelt, vil resultatet ikke ændre sig dramatisk. Lad os tjekke dette, vi vil ikke beregne kovariansmatrixen, men blot gennemsnitsværdien af ​​hver plade.




simpelt stiltab

Combo tab

Der er naturligvis et ønske om at blande disse to omkostningsfunktioner. Derefter vil vi generere et billede fra hvid støj sådan, at funktioner fra indholdsbilledet (som har en binding til rumlige koordinater) vil blive gemt i det, og der vil også være "stil" funktioner, der ikke er bundet til rumlige koordinater, dvs. forhåbentlig forbliver detaljerne i indholdsbilledet intakte, men omtegnet med den stil, vi ønsker.



Faktisk er der også en regularizer, men den vil vi udelade for nemheds skyld. Det er tilbage at besvare følgende spørgsmål: hvilke lag (vægte) skal bruges til optimering? Og jeg er bange for, at jeg ikke har noget svar på dette spørgsmål, og det har artiklens forfattere heller ikke. De har et forslag om at bruge følgende, men det betyder ikke, at en anden kombination vil virke dårligere, for stort et søgerum. Den eneste regel, der følger af forståelsen af ​​modellen: det nytter ikke noget at tage tilstødende lag, da deres tegn vil ikke adskille sig meget fra hinanden, derfor tilføjes et lag fra hver konv * _1 gruppe til stilen.


# Definer tabsfunktionstab = # tab af indhold losses.append (0,001 * content_loss (photo_features, gen_features, "conv4_2")) # style tab 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 (art_features, gen_features), "conv4_1") ) losses.append (0.2e6 * style_loss (art_features, gen_features, "conv5_1")) # total variation penalty.append (0.1e-7 * total_variation_loss (generated_image)) total_loss = sum (tab)

Den endelige model kan repræsenteres som følger.




Og her er resultatet af husene med Van Gogh.



Forsøger at kontrollere processen

Lad os huske de foregående dele, så tidligt som to år før den aktuelle artikel har andre forskere undersøgt, hvad det neurale netværk virkelig lærer. Bevæbnet med alle disse artikler kan du generere visualiseringer af funktioner i forskellige stilarter, forskellige billeder, forskellige opløsninger og størrelser og prøve at finde ud af, hvilke lag du skal tage med hvilken vægt. Men selv omvejning af lagene giver ikke fuldstændig kontrol over, hvad der sker. Problemet her er mere konceptuelt: vi optimerer den forkerte funktion! Hvordan så, spørger du? Svaret er enkelt: denne funktion minimerer resterne ... du forstår. Men det, vi virkelig ønsker, er, at vi kan lide billedet. Den konvekse kombination af indhold og stiltabsfunktioner er ikke et mål for, hvad vores sind synes er smukt. Det blev bemærket, at hvis du fortsætter med stylingen for længe, ​​så falder omkostningsfunktionen naturligvis lavere og lavere, men den æstetiske skønhed af resultatet falder kraftigt.




Okay, der er et andet problem. Lad os sige, at vi har fundet et lag, der uddrager de funktioner, vi har brug for. Lad os sige, at nogle teksturer er trekantede. Men dette lag indeholder også mange andre funktioner, for eksempel cirkler, som vi virkelig ikke ønsker at se i det resulterende billede. Generelt set, hvis det var muligt at ansætte en million kinesere, så ville det være muligt at visualisere alle funktionerne i stilbilledet, og med brute force bare markere dem, vi har brug for, og kun inkludere dem i omkostningsfunktionen. Men af ​​indlysende grunde er det ikke så nemt. Men hvad hvis vi bare fjerner cirkler, som vi ikke ønsker at se i resultatet fra stilbilledet? Så vil aktiveringen af ​​de tilsvarende neuroner, som reagerer på cirklerne, simpelthen ikke fungere. Og selvfølgelig vises dette ikke på det resulterende billede. Det er det samme med blomster. Forestil dig et levende billede med mange farver. Fordelingen af ​​farver vil være meget udtværet i hele rummet, det samme vil være fordelingen af ​​det resulterende billede, men i optimeringsprocessen vil de toppe, der var på originalen, højst sandsynligt gå tabt. Det viste sig, at blot at reducere bitdybden af ​​farvepaletten løser dette problem. Tætheden af ​​de fleste farver vil være tæt på nul, og der vil være store toppe i flere områder. Ved at manipulere originalen i Photoshop manipulerer vi således de funktioner, der udvindes fra billedet. Det er lettere for en person at udtrykke deres ønsker visuelt end at forsøge at formulere dem på matematikkens sprog. Farvel. Som et resultat opnåede designere og ledere, bevæbnet med photoshop og scripts til visualisering af funktioner, resultater tre gange hurtigere end hvad matematikere og programmører gjorde.


Et eksempel på at manipulere farven og størrelsen af ​​funktioner


Eller du kan tage et simpelt billede som stil.



resultater








Og her er en vidosik, men kun med den nødvendige tekstur

Texture Networks: Feed-forward syntese af teksturer og stiliserede billeder (10. marts 2016)

Det ser ud til, at det var muligt at stoppe ved denne, hvis ikke en nuance. Ovenstående stylingalgoritme tager meget lang tid. Hvis du tager en implementering, hvor lbfgs køres på CPU'en, tager processen omkring fem minutter. Hvis vi omskriver, så optimeringen går til GPU'en, så vil processen tage 10-15 sekunder. Det er ikke godt. Måske har forfatterne til denne og den næste artikel tænkt på det samme. Begge publikationer blev udgivet uafhængigt af hinanden med 17 dages mellemrum, næsten et år efter den forrige artikel. Forfatterne af den nuværende artikel var ligesom forfatterne til den forrige engageret i genereringen af ​​teksturer (hvis du bare nulstiller stiltabet til noget som dette, vil du lykkes). De foreslog at optimere ikke et billede opnået fra hvid støj, men et eller andet neuralt netværk, der genererer et stiliseret billede.




Nu, hvis stylingprocessen ikke involverer nogen optimering, skal der kun foretages et fremadgående pass. Og optimering er kun påkrævet én gang for at træne generatornetværket. Denne artikel bruger en hierarkisk generator, hvor hver næste z størrelse større end den foregående og er samplet fra støj i tilfælde af teksturgenerering og fra en base af billeder til træning af stylisten. Det er afgørende at bruge noget andet end træningsdelen af ​​imajnet, da funktioner inde i Loss-netværket beregnes af netværket, der er trænet netop på træningsdelen.



Perceptuelle tab for realtidsstiloverførsel og superopløsning (27. marts 2016)

Som navnet antyder, havde forfatterne, der kun var 17 dage forsinket med ideen om det genererende netværk, travlt med at øge billedopløsningen. De ser ud til at være blevet inspireret af succesen med resterende læring på den seneste imagnet.




Henholdsvis restblok og konv.blok.



Således har vi nu i vores hænder, udover kontrol over styling, en hurtig generator (takket være disse to artikler, er generationstiden for et billede målt i titusinder af ms).

Slutningen

Vi brugte oplysningerne fra de gennemgåede artikler og forfatternes kode som udgangspunkt for at skabe endnu en styling-app til den første videostyling-app:



Generer sådan noget.


Lige siden tyske forskere fra universitetet i Tübingen præsenterede deres idé om muligheden for at overføre berømte kunstneres stil til andre fotografier i august 2015, er der begyndt at dukke tjenester op, der har tjent penge på denne mulighed. Den blev lanceret på det vestlige marked og på det russiske marked - dens fulde kopi.

Til bogmærker

På trods af at Ostagram blev lanceret tilbage i december, begyndte det hurtigt at vinde popularitet på sociale netværk netop i midten af ​​april. På samme tid var der mindre end tusind mennesker i projektet på VKontakte pr. 19. april.

For at bruge tjenesten skal du forberede to billeder: et billede, der skal behandles, og et billede med et eksempel på den stil, der skal overlejres på det originale billede.

Tjenesten har en gratis version: Den opretter et billede med en minimumsopløsning på op til 600 pixels langs den længste side af billedet. Brugeren modtager kun resultatet af én af gentagelserne af at anvende filteret på billedet.

Der er to betalingsversioner: Premium producerer et billede på op til 700 pixels på den længste side og anvender 600 iterationer af neural netværksbehandling på billedet (jo flere iterationer, jo mere interessant og intensiv er behandlingen). Et sådant billede vil koste 50 rubler.

I HD-versionen kan du justere antallet af iterationer: 100 koster 50 rubler og 1000 - 250 rubler. I dette tilfælde vil billedet have en opløsning på op til 1200 pixels på den længste side, og det kan bruges til udskrivning på lærred: Ostagram tilbyder en sådan service med levering fra 1800 rubler.

I februar, repræsentanter for Ostagram, som ikke vil acceptere anmodninger om billedbehandling fra brugere "fra lande med udviklet kapitalisme," men derefter adgang til fotobehandling for VKontakte-brugere fra hele verden. At dømme efter Ostagram-koden offentliggjort på GitHub blev den udviklet af Sergey Morugin, en 30-årig bosiddende i Nizhny Novgorod.

TJ kontaktede den kommercielle direktør for projektet, som præsenterede sig selv som Andrey. Ifølge ham optrådte Ostagram før Instapainting, men var inspireret af et lignende projekt kaldet Vipart.

Ostagram er udviklet af en gruppe studerende fra N.N. Alekseeva: efter indledende test på en smal gruppe venner i slutningen af ​​2015, blev det besluttet at offentliggøre projektet. I starten var billedbehandlingen helt gratis, og det var planen at tjene penge på at sælge trykte malerier. Ifølge Andrey viste udskrivning sig at være det største problem: fotos af mennesker behandlet af et neuralt netværk ser sjældent behageligt ud for det menneskelige øje, og slutklienten har brug for lang tid til at justere resultatet, før det påføres på lærredet, hvilket kræver store maskinressourcer.

Til billedbehandling ønskede skaberne af Ostagram at bruge Amazons cloud-servere, men efter tilstrømningen af ​​brugere blev det klart, at omkostningerne for dem ville overstige tusind dollars om dagen med et minimalt investeringsafkast. Andrey, som også er investor i projektet, lejede serverfaciliteter i Nizhny Novgorod.

Projektets publikum er omkring tusind mennesker om dagen, men på nogle dage nåede det 40 tusinde mennesker på grund af overgange fra udenlandske medier, der allerede har bemærket projektet før indenlandske (Ostagram formåede endda at samarbejde med europæiske DJs). Om natten, når trafikken er lav, kan billedbehandlingen tage 5 minutter, og om dagen kan det tage op til en time.

Hvis tidligere udenlandske brugere bevidst havde begrænset adgangen til billedbehandling (de troede at starte indtægtsgenerering fra Rusland), regner Ostagram allerede mere med det vestlige publikum.

Indtil videre er udsigterne til inddrivelse vilkårlige. Hvis hver bruger betalte 10 rubler for behandling, ville det måske betale sig. […]

Det er meget svært at tjene penge i vores land: vores folk er klar til at vente en uge, men de vil ikke betale en skilling for det. Europæerne støtter dette mere - i form af at betale for at fremskynde, forbedre kvaliteten - så fokus går på det marked.

Andrey, repræsentant for Ostagram

Ifølge Andrey arbejder Ostagram-teamet på en ny version af siden med større fokus på socialitet: "Det vil ligne én velkendt tjeneste, men hvad skal man gøre." Repræsentanter for Facebook i Rusland har allerede været interesseret i projektet, men aftalen er endnu ikke nået til forhandlinger om salget.

Eksempler på servicearbejde

I feedet på Ostagrams hjemmeside kan du også se kombinationen af, hvilke billeder der resulterede i de endelige billeder: ofte er dette endnu mere interessant end selve resultatet. I dette tilfælde kan filtre - billeder, der blev brugt som effekt til behandling - gemmes til fremtidig brug.

© 2021 skudelnica.ru - Kærlighed, forræderi, psykologi, skilsmisse, følelser, skænderier