Det nevrale nettverket tegner bilder. Ostagram: en nevrale nettverksbasert tjeneste som kombinerer bilder og ornamenter til kunstneriske mesterverk

Siden i august 2015 presenterte tyske forskere fra universitetet i Tübingen sitt om muligheten for stiloverføring kjente artister på andre bilder begynte det å dukke opp tjenester som tjente penger på denne muligheten. Den ble lansert på det vestlige markedet, og på det russiske markedet - dens komplette kopi.

Til bokmerker

Til tross for at Ostagram ble lansert i desember, begynte det raskt å få popularitet i sosiale nettverk i midten av april. På samme tid, per 19. april, var det mindre enn tusen personer i prosjektet på VKontakte.

For å bruke tjenesten må du forberede to bilder: et bilde som må behandles, og et bilde med et eksempel på en stil som skal legges på originalbildet.

Tjenesten har en gratisversjon: den lager et bilde i en minimumsoppløsning på opptil 600 piksler langs den lengste siden av bildet. Brukeren mottar resultatet av bare én av gjentakelsene av å bruke filteret på bildet.

Det er to betalte versjoner: Premium produserer et bilde på opptil 700 piksler langs den lengste siden og bruker 600 iterasjoner med nevrale nettverksbehandling på bildet (jo flere iterasjoner, jo mer interessant og intensiv er behandlingen). Et slikt bilde vil koste 50 rubler.

I HD-versjonen kan du justere antall iterasjoner: 100 vil koste 50 rubler, og 1000 - 250 rubler. I dette tilfellet vil bildet ha en oppløsning på opptil 1200 piksler på den lengste siden, og det kan brukes til utskrift på lerret: Ostagram tilbyr denne tjenesten med levering fra 1800 rubler.

I februar vil representanter for Ostagram ikke godta forespørsler om bildebehandling fra brukere «fra land med utviklet kapitalisme», men da tilgang til bildebehandling for VKontakte-brukere fra hele verden. Etter Ostagram-koden publisert på GitHub, ble den utviklet av Sergey Morugin, en 30 år gammel bosatt i Nizhny Novgorod.

TJ tok kontakt kommersiell direktør prosjekt, introdusert av Andrey. Ifølge ham dukket Ostagram opp før Instapainting, men ble inspirert av et lignende prosjekt kalt Vipart.

Ostagram er utviklet av en gruppe studenter fra NNSTU. Alekseeva: etter innledende testing på en smal gruppe venner på slutten av 2015, bestemte de seg for å gjøre prosjektet offentlig. I utgangspunktet var bildebehandlingen helt gratis, og det var planlagt å tjene penger på å selge trykte malerier. I følge Andrey viste utskrift seg å være det største problemet: bilder av mennesker behandlet av et nevralt nettverk ser sjelden behagelig ut for det menneskelige øyet, og sluttklienten må justere resultatet i lang tid før det påføres det på lerretet, som krever mye maskinressurser.

For bildebehandling ønsket skaperne av Ostagram å bruke Amazons skyservere, men etter tilstrømningen av brukere ble det klart at kostnadene for dem ville overstige tusen dollar om dagen med en minimal avkastning på investeringen. Andrey, som også er investor i prosjektet, leide serverfasiliteter i Nizhny Novgorod.

Publikum til prosjektet er omtrent tusen mennesker om dagen, men noen dager nådde det 40 tusen mennesker på grunn av overganger fra utenlandske medier som allerede hadde lagt merke til prosjektet før innenlandske (Ostagram klarte til og med å samarbeide med europeiske DJ-er). Om natten, når trafikken er lav, kan bildebehandlingen ta 5 minutter, og ta opptil en time i løpet av dagen.

Hvis tidligere utenlandske brukere bevisst ble begrenset tilgang til bildebehandling (det ble antatt å starte inntektsgenerering fra Russland), stoler Ostagram allerede mer på et vestlig publikum.

Til dags dato er utsiktene for tilbakebetaling betinget. Hvis hver bruker betalte 10 rubler for behandling, ville det kanskje lønne seg. […]

Det er veldig vanskelig å tjene penger i landet vårt: folket vårt er klare til å vente en uke, men de vil ikke betale en krone for det. Europeere er mer gunstige for dette - når det gjelder å betale for å øke hastigheten, forbedre kvaliteten - så orienteringen går til det markedet.

Andrey, Ostagram-representant

Ifølge Andrey jobber Ostagram-teamet med ny verson et nettsted med sterkt fokus på sosialitet: "Det vil se ut som én kjent tjeneste, men hva skal jeg gjøre." Representanter for Facebook i Russland har allerede vært interessert i prosjektet, men avtalen har ennå ikke kommet til forhandlinger om salget.

Eksempler på servicearbeid

I feeden på Ostagram-nettsiden kan du også se hvilken kombinasjon av bilder som resulterte i de endelige bildene: ofte er dette enda mer interessant enn selve resultatet. Samtidig kan filtre - bilder brukt som effekt for behandling - lagres for videre bruk.

Hilsen, Habr! Du har sikkert lagt merke til at temaet for styling bilder for ulike kunstneriske stiler aktivt diskutert i disse internett. Når du leser alle disse populære artiklene, tror du kanskje at magi foregår under panseret til disse applikasjonene, og det nevrale nettverket fantaserer virkelig og tegner bildet på nytt fra bunnen av. Det skjedde at teamet vårt ble møtt med en lignende oppgave: som en del av en intern bedriftshackathon laget vi en videostyling, fordi. det fantes allerede en app for bilder. I dette innlegget skal vi ta en titt på hvordan nettverket «tegner på nytt» bilder, og se på artiklene som gjorde det mulig. Jeg anbefaler at du gjør deg kjent med det siste innlegget før du leser dette materialet og generelt med det grunnleggende om konvolusjonelle nevrale nettverk. Du finner noen formler, litt kode (jeg vil gi eksempler på Theano og Lasagne), samt en masse bilder. Dette innlegget er innebygd kronologisk rekkefølge utseendet til artiklene og følgelig selve ideene. Noen ganger vil jeg fortynne det med vår nylige erfaring. Her er en gutt fra helvete for oppmerksomhet.


Visualisere og forstå konvolusjonelle nettverk (28. nov. 2013)

Først av alt er det verdt å nevne artikkelen der forfatterne var i stand til å vise at et nevralt nettverk ikke er en svart boks, men en ganske tolkbar ting (forresten, i dag kan dette ikke bare sies om konvolusjonelle nettverk for datamaskiner syn). Forfatterne bestemte seg for å lære å tolke aktiveringene av skjulte lagneuroner, for dette brukte de det dekonvolusjonelle nevrale nettverket (deconvnet) foreslått flere år tidligere (forresten, av de samme Zeiler og Fergus, som er forfatterne av denne publikasjonen som vi vil). Et dekonvolusjonelt nettverk er faktisk det samme nettverket med konvolusjoner og sammenslåinger brukt i omvendt rekkefølge. Det originale arbeidet med deconvnet brukte nettverket i en uovervåket læringsmodus for å generere bilder. Denne gangen brukte forfatterne det ganske enkelt for en omvendt overgang fra funksjonene som ble oppnådd etter en foroverpassering gjennom nettverket til det originale bildet. Resultatet er et bilde som kan tolkes som et signal som forårsaket denne aktiveringen på nevroner. Naturligvis oppstår spørsmålet: hvordan få en omvendt passering gjennom konvolusjon og ikke-linearitet? Og enda mer gjennom maks-pooling, er dette absolutt ikke en omvendt operasjon. La oss se på alle tre komponentene.

Omvendt ReLu

I konvolusjonelle nettverk brukes ofte aktiveringsfunksjonen ReLu(x) = maks(0, x), som gjør alle aktiveringer på laget ikke-negative. Følgelig, når man går tilbake gjennom ikke-lineariteten, er det også nødvendig å oppnå ikke-negative resultater. For dette foreslår forfatterne å bruke samme ReLu. Fra et Theano-arkitektursynspunkt er det nødvendig å overstyre gradientfunksjonen til operasjonen (den uendelig verdifulle notatboken er i lasagneoppskriftene, derfra vil du finne detaljene om hva ModifiedBackprop-klassen er).

Klasse ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # korriger eksplisitt return (self.nonlinearity(grd),) # bruk den gitte ikke-lineariteten

Omvendt konvolusjon

Her er det litt mer komplisert, men alt er logisk: det er nok å bruke den transponerte versjonen av den samme konvolusjonskjernen, men på utgangene fra den omvendte ReLu i stedet for det forrige laget som ble brukt i foroverpasset. Men jeg er redd for at det i ord ikke er så åpenbart, la oss se på visualiseringen av denne prosedyren (du vil finne enda flere visualiseringer av viklinger).


Konvolusjon når skritt=1

Konvolusjon når skritt=1 omvendt versjon

Konvolusjon når skritt=2

Konvolusjon når skritt=2 omvendt versjon

Omvendt pooling

Denne operasjonen (i motsetning til de forrige) er vanligvis ikke inverterbar. Men vi vil likevel gjerne passere maksimalt på en eller annen måte under den omvendte passeringen. For å gjøre dette foreslår forfatterne å bruke et kart over hvor maksimum var under direktepasseringen (maks. plasseringsbytter). Under den reverserte passeringen transformeres inngangssignalet til unpooling på en slik måte at strukturen til det opprinnelige signalet tilnærmet bevares, det er egentlig lettere å se enn å beskrive her.



Resultat

Visualiseringsalgoritmen er ekstremt enkel:

  1. Gjør en rett pasning.
  2. Velg laget vi er interessert i.
  3. Fiks aktiveringen av ett eller flere nevroner og tilbakestill resten.
  4. Gjør en slutning.

Hver grå firkant i bildet nedenfor tilsvarer en visualisering av et filter (som brukes for konvolusjon) eller vekter av en enkelt nevron, og hver fargebilde er den delen av originalbildet som aktiverer det tilsvarende nevronet. For klarhetens skyld er nevroner i ett lag gruppert i tematiske grupper. Generelt viste det seg plutselig at det nevrale nettverket lærer nøyaktig hva Hubel og Weisel skrev om i arbeidet med strukturen til det visuelle systemet, som de ble tildelt for Nobel pris i 1981. Takket være denne artikkelen fikk vi en visuell representasjon av hva et konvolusjonelt nevralt nettverk lærer på hvert lag. Det er denne kunnskapen som vil tillate senere å manipulere innholdet i det genererte bildet, men dette er fortsatt langt unna, de neste årene har gått til å forbedre metodene for "trepanering" av nevrale nettverk. I tillegg foreslo forfatterne av artikkelen en måte å analysere hvordan man best kan bygge arkitekturen til et konvolusjonelt nevralt nettverk for å oppnå beste resultater(de vant imidlertid ikke ImageNet 2013, men kom til topps; UPD: det viser seg at de vant, Clarifai er hva de er).


Funksjonsvisualisering


Her er et eksempel på visualisering av aktiveringer ved hjelp av deconvnet, i dag ser dette resultatet allerede så som så ut, men da var det et gjennombrudd.


Saliency-kart ved hjelp av deconvnet

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

Denne artikkelen er viet til studiet av kunnskapsvisualiseringsmetoder inneholdt i et konvolusjonelt nevralt nettverk. Forfatterne foreslår to visualiseringsmetoder basert på gradientnedstigning.

Klassemodellvisualisering

Så forestill deg at vi har et trent nevralt nettverk for å løse et klassifiseringsproblem i et visst antall klasser. Angi som aktiveringsverdien til utgangsneuronen som tilsvarer klassen c. Da gir følgende optimaliseringsproblem oss nøyaktig bildet som maksimerer den valgte klassen:



Denne oppgaven er enkel å løse ved hjelp av Theano. Vanligvis ber vi rammeverket om å ta den deriverte av modellparametrene, men denne gangen antar vi at parameterne er faste og den deriverte er hentet fra inngangsbildet. Følgende funksjon velger maksimalverdien til utdatalaget og returnerer en funksjon som beregner den deriverte med hensyn til inngangsbildet.


def compile_saliency_function(net): """ Kompilerer en funksjon for å beregne saliency-kartene og predikerte klasser for en gitt minibatch av input-bilder. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], deterministic=True) max_outp = T.max(outp, axis=1) saliency = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, axis=1) returner theano.function(, )

Du har sikkert sett merkelige bilder av hunder på Internett - DeepDream. I den originale artikkelen bruker forfatterne neste prosess for å generere bilder som maksimerer den valgte klassen:

  1. Initialiser det første bildet med nuller.
  2. Beregn verdien av den deriverte fra dette bildet.
  3. Endre bildet ved å legge til det resulterende bildet fra den deriverte.
  4. Gå tilbake til trinn 2 eller gå ut av loopen.

De resulterende bildene er:




Men hva om du initialiserer det første bildet med et ekte bilde og starter den samme prosessen? Men ved hver iterasjon vil vi velge en tilfeldig klasse, sette resten til null og beregne verdien av den deriverte, så får vi en så dyp drøm.


Forsiktig 60 mb


Hvorfor er det så mange hundeansikter og øyne? Det er enkelt: det er nesten 200 hunder i bildenettet av 1000 klasser, de har øyne. Og også mange klasser der det bare er folk.

Klasse Saliency Extraction

Hvis denne prosessen initialiseres med et ekte bilde, stoppet etter den første iterasjonen og tegning av verdien av derivatet, vil vi få et slikt bilde, og legge til det originale, vi vil øke aktiveringsverdien til den valgte klassen.


Saliency-kart ved hjelp av derivater


Igjen er resultatet «så som så». Det er viktig å merke seg at dette ny måte visualisering av aktiveringer (ingenting hindrer oss i å fikse verdiene for aktiveringer ikke på det siste laget, men generelt på et hvilket som helst lag i nettverket og ta den deriverte med hensyn til inngangsbildet). Den neste artikkelen vil kombinere begge tidligere tilnærminger og gi oss et verktøy for hvordan du setter opp stiloverføring, som vil bli beskrevet senere.

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

Denne artikkelen handler generelt ikke om visualisering, men om at det å erstatte pooling med en konvolusjon med et stort skritt ikke fører til tap av kvalitet. Men som et biprodukt av forskningen deres, foreslo forfatterne en ny måte å visualisere funksjoner på, som de brukte for å analysere mer nøyaktig hva modellen lærer. Ideen deres er som følger: hvis vi ganske enkelt tar den deriverte, så går ikke de funksjonene som var mindre enn null på inngangsbildet tilbake under dekonvolusjon (ved å bruke ReLu for inngangsbildet). Og dette fører til det faktum at negative verdier vises på det forplantede bakbildet. På den annen side, hvis du bruker deconvnet, blir en annen ReLu hentet fra den deriverte av ReLu - dette lar deg ikke hoppe tilbake negative verdier, men som du så, er resultatet "så som så". Men hva om vi kombinerer disse to metodene?




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

Da får du et helt rent og tolkbart bilde.


Saliency-kart ved hjelp av guidet tilbakepropagasjon

Gå dypere

La oss nå tenke, hva gir dette oss? La meg minne deg på at hvert konvolusjonslag er en funksjon som mottar en tredimensjonal tensor som input og også produserer en tredimensjonal tensor som en utgang, kanskje av en annen dimensjon d x w x h; d epth er antall nevroner i laget, hver av dem genererer et funksjonskart med størrelsen w igth x håtte.


La oss prøve følgende eksperiment på VGG-19-nettverket:



konv1_2

Ja, du ser nesten ingenting, fordi. det mottakelige området er veldig lite, dette er den andre konvolusjonen 3x3, henholdsvis, det totale arealet er 5x5. Men ved å zoome inn ser vi at funksjonen bare er en gradientdetektor.




konv3_3


conv4_3


conv5_3


basseng5


Og se for deg at i stedet for maksimum over platen, vil vi ta den deriverte av verdien av summen av alle elementene på platen over inngangsbildet. Da vil åpenbart det mottakelige området til gruppen av nevroner dekke hele inngangsbildet. For de tidlige lagene vil vi se lyse kart, hvorfra vi trekker ut at disse er fargedetektorer, deretter gradienter, deretter grenser, og så videre mot mer komplekse mønstre. Jo dypere laget er, desto svakere oppnås bildet. Dette forklares med det faktum at dypere lag har et mer komplekst mønster som de oppdager, og et komplekst mønster vises sjeldnere enn et enkelt, og derfor dempes aktiveringskartet. Den første måten er egnet for å forstå lag med komplekse mønstre, og den andre er helt riktig for enkle.


konv1_1


konv2_2


conv4_3


Du kan laste ned en mer komplett database med aktiveringer for flere bilder og .

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

Så det har gått et par år siden den første vellykkede trepaneringen av det nevrale nettverket. Vi (i betydningen menneskelighet) har et kraftig verktøy i våre hender som lar oss forstå hva det nevrale nettverket lærer, samt fjerne det vi egentlig ikke vil at det skal lære. Forfatterne av denne artikkelen utvikler en metode som lar deg få ett bilde til å generere et lignende aktiveringskart til et målbilde, og muligens til og med mer enn ett - dette er grunnlaget for styling. Vi mater hvit støy til inngangen, og i en lignende iterativ prosess som i dyp drøm, bringer vi dette bildet til et der funksjonskartene ligner målbildet.

tap av innhold

Som allerede nevnt, produserer hvert lag i det nevrale nettverket en tredimensjonal tensor av en eller annen dimensjon.




La oss betegne utgangen Jeg lag fra inngangen som . Så hvis vi minimerer den vektede summen av residualene mellom inngangsbildet og et bilde vi streber etter c, så får du akkurat det du trenger. Kan være.



For å eksperimentere med denne artikkelen kan du bruke denne magiske bærbare datamaskinen, hvor beregningene finner sted (både på GPU og på CPU). GPUen brukes til å beregne funksjonene til det nevrale nettverket og verdien av kostnadsfunksjonen. Theano produserer en funksjon som kan beregne gradienten til målfunksjonen eval_grad ved inndatabilde x. Dette mates deretter inn i lbfgs og den iterative prosessen starter.


# Initialiser med et støybilde 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) # Optimaliser, lagre 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 = genered_image.get_value().astype("float64") xs.append(x0)

Hvis vi kjører optimalisering av en slik funksjon, vil vi raskt få et bilde som ligner på målet. Nå kan vi gjenskape bilder fra hvit støy som ser ut som et innholdsbilde.


Innholdstap: conv4_2



Optimaliseringsprosess




Det er lett å legge merke til to funksjoner i det resulterende bildet:

  • tapte farger - dette er resultatet av det faktum at i spesifikt eksempel bare conv4_2-laget ble brukt (eller, med andre ord, vekten w var ikke null for det, og null for de andre lagene); som du husker, er det de tidlige lagene som inneholder informasjon om farger og gradientoverganger, og de senere inneholder informasjon om større detaljer, som er det vi observerer - fargene går tapt, men innholdet er det ikke;
  • noen hus "la oss gå", dvs. rette linjer er svakt buede - dette er fordi jo dypere laget er, jo mindre informasjon om den romlige posisjonen til funksjonen den inneholder (resultatet av å bruke konvolusjoner og sammenslåinger).

Å legge til tidlige lag korrigerer umiddelbart situasjonen med farger.


Innholdstap: conv1_1, conv2_1, conv4_2


Forhåpentligvis har du nå fått følelsen av at du har kontroll over hva som blir tegnet på nytt på det hvite støybildet.

stiltap

Og nå kom vi til det mest interessante: hvordan kan vi formidle stilen? Hva er stil? Det er klart at stilen ikke er det vi optimaliserte i Content Loss, fordi den inneholder mye informasjon om funksjonenes romlige posisjoner. Så det første du må gjøre er å fjerne denne informasjonen fra visningene mottatt på hvert lag.


Forfatteren foreslår følgende metode. La oss ta tensoren ved utgangen av et lag, utvide den i romlige koordinater og beregne kovariansmatrisen mellom platene. La oss betegne denne transformasjonen som G. Hva har vi egentlig gjort? Det kan sies at vi telte hvor ofte funksjonene inne i platen forekommer i par, eller med andre ord, vi tilnærmet fordelingen av funksjoner i platene med en multivariat normalfordeling.




Deretter legges Style Loss inn som følger, hvor s er et bilde med stil:



Skal vi prøve for Vincent? I prinsippet får vi noe forventet - støy i stil med Van Gogh, informasjon om det romlige arrangementet av funksjoner går helt tapt.


Vincent




Hva om vi legger et bilde i stedet for et stilbilde? Du får allerede kjente funksjoner, kjente farger, men den romlige posisjonen er helt tapt.


Bilde med tap av stil


Du lurte sikkert på hvorfor vi beregner kovariansmatrisen, og ikke noe annet? Tross alt er det mange måter å aggregere funksjoner slik at romlige koordinater går tapt. Dette er egentlig et åpent spørsmål, og hvis du tar noe veldig enkelt, vil ikke resultatet endre seg dramatisk. La oss sjekke dette, vi vil ikke beregne kovariansmatrisen, men bare gjennomsnittsverdien til hver plate.




enkelt stiltap

Kombinert tap

Det er naturlig nok et ønske om å blande disse to kostnadsfunksjonene. Da vil vi generere et slikt bilde fra hvit støy at det vil beholde funksjoner fra innholdsbildet (som har binding til romlige koordinater), og det vil også være "stil" funksjoner som ikke er bundet til romlige koordinater, dvs. Vi vil forhåpentligvis beholde innholdsbildedetaljene på plass, men tegnet på nytt med riktig stil.



Faktisk er det også en regularizer, men vi vil utelate den for enkelhets skyld. Det gjenstår å svare på følgende spørsmål: hvilke lag (vekter) skal brukes i optimalisering? Og jeg er redd for at jeg ikke har et svar på dette spørsmålet, og det har heller ikke forfatterne av artikkelen. De har et forslag om å bruke følgende, men dette betyr slett ikke at en annen kombinasjon vil fungere dårligere, søkerommet er for stort. Den eneste regelen som følger av forståelsen av modellen er at det ikke gir mening å ta nabolag, fordi deres tegn vil ikke avvike mye fra hverandre, derfor legges et lag fra hver konv*_1-gruppe til stilen.


# Definer tapsfunksjonstap = # tap av innhold losses.append(0.001 * content_loss(photo_features, gen_features, "conv4_2")) # style loss losses.append(0.2e6 * style_loss(art_features, gen_features, "conv1_1")) losses.append (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv4_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(losses)

Den endelige modellen kan presenteres i følgende skjema.




Og her er resultatet av husene med Van Gogh.



Forsøk å kontrollere prosessen

La oss huske de foregående delene, så tidlig som to år før den nåværende artikkelen har andre forskere undersøkt hva det nevrale nettverket egentlig lærer. Bevæpnet med alle disse artiklene kan du generere funksjonsvisualiseringer av ulike stiler, ulike bilder, forskjellige oppløsninger og størrelser, og prøv å forstå hvilke lag med hvilken vekt du skal ta. Men selv omvekting av lagene gir ikke full kontroll over hva som skjer. Problemet her er mer konseptuelt: vi optimaliserer feil funksjon! Hvordan det, spør du? Svaret er enkelt: denne funksjonen minimerer gjenværende ... vel, du skjønner ideen. Men det vi egentlig ønsker er at vi liker bildet. Den konvekse kombinasjonen av innhold og stiltapsfunksjoner er ikke et mål på hva sinnet vårt anser som vakkert. Det har blitt observert at hvis stylingen fortsetter for lenge, faller kostnadsfunksjonen naturligvis lavere og lavere, men den estetiske skjønnheten til resultatet synker kraftig.




Ok, det er ett problem til. La oss si at vi har funnet et lag som trekker ut funksjonene vi trenger. La oss si at noen teksturer er trekantede. Men dette laget inneholder fortsatt mange andre funksjoner, for eksempel sirkler, som vi egentlig ikke ønsker å se i det resulterende bildet. Generelt sett, hvis vi kunne ansette en million kinesere, kunne vi visualisert alle funksjonene til et stilbilde, og ved uttømmende søk bare markere de vi trenger, og bare inkludere dem i kostnadsfunksjonen. Men av åpenbare grunner er det ikke så lett. Men hva om vi bare fjerner alle sirklene vi ikke vil skal vises i resultatet fra stilarket? Da vil aktiveringen av de tilsvarende nevronene som reagerer på sirklene rett og slett ikke fungere. Og selvfølgelig vil dette ikke vises i det resulterende bildet. Det er det samme med blomster. Presenter et lyst bilde med mange farger. Fordelingen av farger vil være veldig smurt over hele rommet, fordelingen av det resulterende bildet vil være den samme, men under optimaliseringsprosessen vil toppene som var på originalen sannsynligvis gå tapt. Det viste seg at en enkel nedgang i bittdybden farge palett løser dette problemet. Fordelingstettheten til de fleste farger vil være nær null, og det vil være store topper i flere områder. Ved å manipulere originalen i Photoshop manipulerer vi altså funksjonene som trekkes ut fra bildet. Det er lettere for en person å uttrykke sine ønsker visuelt enn å prøve å formulere dem på matematikkspråket. Ha det. Som et resultat oppnådde designere og ledere, bevæpnet med Photoshop og skript for å visualisere funksjoner, et resultat tre ganger raskere enn det matematikere og programmerere gjorde.


Et eksempel på å manipulere fargen og størrelsen på funksjoner


Og du kan umiddelbart ta et enkelt bilde som en stil



resultater








Og her er en vidosik, men bare med riktig tekstur

Teksturnettverk: Fremmatingssyntese av teksturer og stiliserte bilder (10. mars 2016)

Det ser ut til at dette kan stoppes, om ikke én nyanse. Stylingalgoritmen ovenfor fungerer veldig lenge. Hvis vi tar en implementering der lbfgs kjøres på CPU, så tar prosessen omtrent fem minutter. Hvis du skriver det om slik at optimaliseringen går til GPU, så vil prosessen ta 10-15 sekunder. Det er ikke bra. Kanskje har forfatterne av denne og den neste artikkelen tenkt på det samme. Begge publikasjonene kom ut uavhengig av hverandre med 17 dagers mellomrom, nesten ett år etter forrige artikkel. Forfatterne av den nåværende artikkelen, som forfatterne av den forrige, var engasjert i teksturgenerering (hvis du bare tilbakestiller stiltapet, er dette omtrent det du får). De foreslo å optimalisere ikke et bilde hentet fra hvit støy, men et nevralt nettverk som genererer et stilisert bilde.




Nå, hvis stylingprosessen ikke inkluderer noen optimalisering, er det bare en foroverpassering som må gjøres. Og optimalisering kreves bare én gang for å trene generatornettverket. Denne artikkelen bruker en hierarkisk generator hvor hver følger z større enn den forrige og er samplet fra støy i tilfelle teksturgenerering, og fra en bildedatabase for stylizertrening. Det er kritisk å bruke noe annet enn treningsdelen av imagenet, fordi funksjoner inne i Loss-nettverket beregnes av nettverket som er trent bare på treningsdelen.



Perseptuelle tap for sanntidsstiloverføring og superoppløsning (27. mars 2016)

Som navnet tilsier, var forfatterne, som bare var 17 dager forsinket med ideen om et genererende nettverk, opptatt med å øke oppløsningen på bilder. De ser ut til å ha blitt inspirert av suksessen med gjenværende læring på det nyeste imagenettet.




Følgelig restblokk og konv.blokk.



Dermed har vi nå i tillegg til stylingkontroll også en rask generator i hendene (takket være disse to artiklene er generasjonstiden for ett bilde målt i titalls ms).

Slutt

Vi brukte informasjonen fra de gjennomgåtte artiklene og koden til forfatterne som utgangspunkt for å lage en annen stylingapplikasjon for den første videostylingapplikasjonen:



Generer noe slikt.


På de mest vanlige fotografiene dukker det opp mange og ikke helt skillelige enheter. Oftest av en eller annen grunn hunder. Slike bilder begynte å fylle Internett i juni 2015, da DeepDream fra Google ble lansert – en av de første åpne tjenestene basert på nevrale nettverk og designet for bildebehandling.

Det skjer omtrent slik: Algoritmen analyserer fotografier, finner fragmenter i dem som minner den om noen kjente objekter - og forvrenger bildet i samsvar med disse dataene.

Først ble prosjektet lagt ut som en åpen kildekode, og deretter dukket netttjenester laget på de samme prinsippene opp på Internett. En av de mest praktiske og populære er Deep Dream Generator: det tar bare omtrent 15 sekunder å behandle et lite bilde her (tidligere måtte brukere vente mer enn en time).

Hvordan lærer nevrale nettverk å lage slike bilder? Og hvorfor heter de det forresten?

Nevrale nettverk i deres design imiterer de virkelige nevrale nettverkene til en levende organisme, men de gjør dette ved hjelp av matematiske algoritmer. Etter å ha laget en grunnleggende struktur, kan du trene den ved hjelp av maskinlæringsmetoder. Hvis vi snakker om mønstergjenkjenning, må tusenvis av bilder sendes gjennom det nevrale nettverket. Hvis oppgaven til det nevrale nettverket er annerledes, vil treningsøvelsene være annerledes.

Algoritmer for å spille sjakk analyserer for eksempel sjakkspill. Langs samme vei, Googles DeepMinds AlphaGo-algoritme inn i det kinesiske spillet Go - som ble hyllet som et gjennombrudd fordi Go er mye mer komplekst og ikke-lineært enn sjakk.

    Du kan leke med en forenklet nevrale nettverksmodell og forstå prinsippene bedre.

    YouTube har også en serie med forståelige håndtegnede ruller om hvordan nevrale nettverk fungerer.

En annen populær tjeneste er Dreamscope, som ikke bare kan drømme om hunder, men også imitere ulike malestiler. Bildebehandlingen her er også veldig enkel og rask (ca. 30 sekunder).

Tilsynelatende er den algoritmiske delen av tjenesten en modifikasjon av programmet Neural stil, som vi allerede har diskutert.

Nylig har det dukket opp et program som realistisk maler svart-hvitt-bilder. I tidligere versjoner gjorde lignende programmer jobben sin mye mindre bra, og det ble ansett som en stor prestasjon hvis minst 20 % av folk ikke kunne se forskjellen mellom et ekte bilde og et datafarget bilde.

Dessuten tar fargelegging her bare omtrent 1 minutt.

Det samme utviklingsselskapet lanserte også en tjeneste som gjenkjenner i bilder forskjellige typer gjenstander.

Disse tjenestene kan virke som bare morsom underholdning, men faktisk er alt mye mer interessant. Ny teknologi kommer inn i praksisen til menneskelige kunstnere og endrer vår forståelse av kunst. Kanskje snart må folk konkurrere med maskiner innen kreativitet.

Å lære mønstergjenkjenningsalgoritmer er en oppgave AI-utviklere har slitt med i lang tid. Derfor kan programmer som fargelegger gamle fotografier og tegner hunder på himmelen betraktes som en del av en større og mer spennende prosess.


Topp