Det neurala nätverket ritar bilder. Ostagram: en neural nätverksbaserad tjänst som kombinerar foton och ornament till konstnärliga mästerverk

Sedan i augusti 2015 har tyska forskare från universitetet i Tübingen presenterat sitt om möjligheten till stilöverföring kända artister på andra bilder började det dyka upp tjänster som tjänade pengar på denna möjlighet. Den lanserades på den västerländska marknaden och på den ryska marknaden - dess kompletta kopia.

Till bokmärken

Trots att Ostagram lanserades i december började det snabbt bli populärt i sociala nätverk i mitten av april. Samtidigt, från och med den 19 april, fanns det mindre än tusen personer i projektet på VKontakte.

För att använda tjänsten måste du förbereda två bilder: ett foto som måste bearbetas och en bild med ett exempel på en stil som ska läggas över på originalbilden.

Tjänsten har en gratisversion: den skapar en bild i en minsta upplösning på upp till 600 pixlar längs bildens längsta sida. Användaren får resultatet av endast en av upprepningarna av att applicera filtret på fotot.

Det finns två betalversioner: Premium producerar en bild på upp till 700 pixlar längs den längsta sidan och tillämpar 600 iterationer av neurala nätverksbearbetning på bilden (ju fler iterationer, desto mer intressant och intensiv bearbetning). En sådan bild kommer att kosta 50 rubel.

I HD-versionen kan du justera antalet iterationer: 100 kostar 50 rubel och 1000 - 250 rubel. I det här fallet kommer bilden att ha en upplösning på upp till 1200 pixlar på den längsta sidan, och den kan användas för utskrift på duk: Ostagram erbjuder denna tjänst med leverans från 1800 rubel.

I februari kommer representanter för Ostagram inte att acceptera förfrågningar om bildbehandling från användare "från länder med utvecklad kapitalism", utan då tillgång till fotobehandling för VKontakte-användare från hela världen. Att döma av Ostagram-koden publicerad på GitHub, utvecklades den av Sergey Morugin, en 30-årig bosatt i Nizhny Novgorod.

TJ kontaktade kommersiella direktör projekt, introducerat av Andrey. Enligt honom dök Ostagram upp före Instapainting, men inspirerades av ett liknande projekt som heter Vipart.

Ostagram utvecklades av en grupp studenter från NNSTU. Alekseeva: efter inledande tester på en smal grupp vänner i slutet av 2015, bestämde de sig för att göra projektet offentligt. Till en början var bildbehandlingen helt gratis, och man planerade att tjäna pengar på att sälja tryckta målningar. Enligt Andrey visade sig utskrift vara det största problemet: foton av människor som bearbetats av ett neuralt nätverk ser sällan tilltalande ut för det mänskliga ögat, och slutklienten måste justera resultatet under lång tid innan det appliceras på duken, vilket kräver mycket maskinresurser.

För bildbehandling ville skaparna av Ostagram använda Amazons molnservrar, men efter tillströmningen av användare blev det klart att kostnaden för dem skulle överstiga tusen dollar om dagen med en minimal avkastning på investeringen. Andrey, som också är investerare i projektet, hyrde serveranläggningar i Nizhny Novgorod.

Publiken för projektet är cirka tusen personer om dagen, men vissa dagar nådde det 40 tusen människor på grund av övergångar från utländska medier som redan hade lagt märke till projektet före inhemska (Ostagram lyckades till och med samarbeta med europeiska DJs). På natten, när trafiken är låg, kan bildbehandlingen ta 5 minuter och ta upp till en timme under dagen.

Om tidigare utländska användare avsiktligt begränsade tillgången till bildbehandling (man trodde att man skulle börja tjäna pengar från Ryssland), så förlitar sig Ostagram redan mer på en västerländsk publik.

Hittills är utsikterna för återbetalning villkorade. Om varje användare betalade 10 rubel för bearbetning, kanske det skulle löna sig. […]

Det är mycket svårt att tjäna pengar i vårt land: vårt folk är redo att vänta en vecka, men de kommer inte att betala ett öre för det. Européer är mer positiva till detta - när det gäller att betala för att påskynda, förbättra kvaliteten - så inriktningen går till den marknaden.

Andrey, Ostagram-representant

Enligt Andrey jobbar Ostagram-teamet på ny version en sida med stort fokus på socialitet: "Det kommer att se ut som en välkänd tjänst, men vad ska man göra." Representanter för Facebook i Ryssland har redan varit intresserade av projektet, men affären har ännu inte kommit till förhandlingar om försäljningen.

Exempel på servicearbete

I flödet på Ostagrams hemsida kan du också se vilken kombination av bilder som resulterade i slutbilderna: ofta är detta ännu mer intressant än själva resultatet. Samtidigt kan filter - bilder som används som effekt för bearbetning - sparas för vidare användning.

Hälsningar, Habr! Säkert har du märkt att temat för styling foton för olika konstnärliga stilar aktivt diskuteras i dessa dina internets. När du läser alla dessa populära artiklar kanske du tror att det pågår magi under huven på dessa applikationer, och det neurala nätverket fantiserar verkligen och ritar om bilden från grunden. Det råkade bara vara så att vårt team stod inför en liknande uppgift: som en del av ett internt företagshackathon gjorde vi en videostyling, eftersom. det fanns redan en app för bilder. I det här inlägget ska vi ta en titt på hur nätverket "ritar om" bilder, och titta på artiklarna som gjorde det möjligt. Jag rekommenderar att du bekantar dig med det sista inlägget innan du läser detta material och i allmänhet med grunderna i konvolutionella neurala nätverk. Du hittar några formler, lite kod (jag kommer att ge exempel på Theano och Lasagne), samt en massa bilder. Det här inlägget är inbyggt kronologisk ordning artiklars utseende och följaktligen själva idéerna. Ibland kommer jag att späda på det med vår senaste erfarenhet. Här är en pojke från helvetet för uppmärksamhet.


Visualisera och förstå konvolutionella nätverk (28 nov 2013)

Först och främst är det värt att nämna artikeln där författarna kunde visa att ett neuralt nätverk inte är en svart låda, utan en ganska tolkbar sak (förresten, idag kan detta inte bara sägas om faltningsnätverk för datorer syn). Författarna bestämde sig för att lära sig hur man tolkar aktiveringarna av dolda lagerneuroner, för detta använde de det dekonvolutionella neurala nätverket (deconvnet) som föreslagits flera år tidigare (förresten, av samma Zeiler och Fergus, som är författarna till denna publikation som väl). Ett dekonvolutionellt nätverk är faktiskt samma nätverk med faltningar och sammanslagningar som tillämpas i omvänd ordning. Det ursprungliga arbetet med deconvnet använde nätverket i ett oövervakat inlärningsläge för att generera bilder. Den här gången använde författarna det helt enkelt för en omvänd passning från funktionerna som erhölls efter en framåtpassning genom nätverket till den ursprungliga bilden. Resultatet är en bild som kan tolkas som en signal som orsakade denna aktivering på neuroner. Naturligtvis uppstår frågan: hur gör man en omvänd passning genom faltning och olinjäritet? Och i ännu högre grad genom maxpooling är detta verkligen inte en omvänd operation. Låt oss titta på alla tre komponenterna.

Omvänd ReLu

I faltningsnätverk används ofta aktiveringsfunktionen ReLu(x) = max(0, x), vilket gör alla aktiveringar på lagret icke-negativa. Följaktligen, när man passerar tillbaka genom olinjäriteten, är det också nödvändigt att erhålla icke-negativa resultat. För detta föreslår författarna att använda samma ReLu. Ur en Theano-arkitektursynpunkt är det nödvändigt att åsidosätta gradientfunktionen för operationen (den oändligt värdefulla anteckningsboken finns i lasagnerecepten, därifrån kommer du att ta reda på detaljerna om vad ModifiedBackprop-klassen är).

Klass ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # korrigera uttryckligen return (self.nonlinearity(grd),) # använd den givna olinjäriteten

Omvänd faltning

Här är det lite mer komplicerat, men allt är logiskt: det räcker att tillämpa den transponerade versionen av samma faltningskärna, men på utgångarna från den omvända ReLu istället för det tidigare lagret som användes i framåtpassningen. Men jag är rädd att det i ord inte är så uppenbart, låt oss titta på visualiseringen av denna procedur (du kommer att hitta ännu fler visualiseringar av veck).


Konvolution när steg=1

Konvolution när steg=1 omvänd version

Vältning när steg=2

Vältning när steg=2 omvänd version

Omvänd poolning

Denna operation (till skillnad från de tidigare) är i allmänhet inte inverterbar. Men vi skulle ändå vilja passera maximalt på något sätt under det omvända passet. För att göra detta föreslår författarna att man använder en karta över var maxvärdet var under direktpasset (maxlägesväxlar). Under backpasset omvandlas insignalen till unpooling på ett sådant sätt att strukturen hos den ursprungliga signalen ungefär bevaras, det är verkligen lättare att se än att beskriva här.



Resultat

Visualiseringsalgoritmen är extremt enkel:

  1. Gör en rak passning.
  2. Välj det lager vi är intresserade av.
  3. Åtgärda aktiveringen av en eller flera neuroner och återställ resten.
  4. Gör en slutsats.

Varje grå ruta i bilden nedan motsvarar en visualisering av ett filter (som används för faltning) eller vikter av en enskild neuron, och varje färgbildär den del av originalbilden som aktiverar motsvarande neuron. För tydlighetens skull grupperas neuroner inom ett lager i tematiska grupper. I allmänhet visade det sig plötsligt att det neurala nätverket lär sig exakt vad Hubel och Weisel skrev om i sitt arbete om strukturen av det visuella systemet, för vilket de belönades Nobelprisetår 1981. Tack vare den här artikeln fick vi en visuell representation av vad ett konvolutionellt neuralt nätverk lär sig vid varje lager. Det är denna kunskap som gör det möjligt att senare manipulera innehållet i den genererade bilden, men detta är fortfarande långt borta, de närmaste åren har gått till att förbättra metoderna för "trepanation" av neurala nätverk. Dessutom föreslog artikelförfattarna ett sätt att analysera hur man bäst bygger arkitekturen för ett konvolutionellt neuralt nätverk för att uppnå bästa resultat(de vann dock inte ImageNet 2013, utan hamnade i toppen; UPD: det visar sig att de vann, Clarifai är vad de är).


Funktionsvisualisering


Här är ett exempel på visualisering av aktiveringar med hjälp av deconvnet, idag ser det här resultatet redan ut som så, men då var det ett genombrott.


Saliency-kartor med deconvnet

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

Den här artikeln ägnas åt studiet av kunskapsvisualiseringsmetoder som finns i ett konvolutionellt neuralt nätverk. Författarna föreslår två visualiseringsmetoder baserade på gradientnedstigning.

Klassmodellvisualisering

Så tänk dig att vi har ett utbildat neuralt nätverk för att lösa ett klassificeringsproblem i ett visst antal klasser. Beteckna som aktiveringsvärdet för utgångsneuronen som motsvarar klassen c. Sedan ger följande optimeringsproblem oss exakt den bild som maximerar den valda klassen:



Denna uppgift är lätt att lösa med hjälp av Theano. Vanligtvis ber vi ramverket att ta derivatan av modellparametrarna, men den här gången antar vi att parametrarna är fixerade och derivatan är hämtad från ingångsbilden. Följande funktion väljer det maximala värdet för utdatalagret och returnerar en funktion som beräknar derivatan med avseende på ingångsbilden.


def compile_saliency_function(net): """ Kompilerar en funktion för att beräkna framträdande kartor och predikterade klasser för en given minibatch av indatabilder. """ 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) returnera theano.function(, )

Du har säkert sett konstiga bilder av hundar på Internet - DeepDream. I originalartikeln använder författarna nästa process för att generera bilder som maximerar den valda klassen:

  1. Initiera den första bilden med nollor.
  2. Beräkna värdet på derivatan från denna bild.
  3. Ändra bilden genom att lägga till den resulterande bilden från derivatan.
  4. Gå tillbaka till steg 2 eller lämna slingan.

De resulterande bilderna är:




Men vad händer om du initierar den första bilden med ett riktigt foto och startar samma process? Men vid varje iteration kommer vi att välja en slumpmässig klass, sätta resten till noll och beräkna värdet på derivatan, då får vi en så djup dröm.


Varning 60 mb


Varför finns det så många hundansikten och ögon? Det är enkelt: det finns nästan 200 hundar i bildnätet av 1000 klasser, de har ögon. Och även en massa klasser där det bara är folk.

Klassens Saliency Extraktion

Om denna process initieras med ett riktigt foto, stoppas efter den första iterationen och ritar värdet på derivatan, kommer vi att få en sådan bild, och lägga till den till den ursprungliga, vi kommer att öka aktiveringsvärdet för den valda klassen.


Saliency-kartor med derivat


Återigen är resultatet "så som så". Det är viktigt att notera att detta nytt sätt visualisering av aktivering (ingenting hindrar oss från att fixa värdena för aktivering inte på det sista lagret, utan i allmänhet på vilket lager av nätverket som helst och ta derivatan med avseende på ingångsbilden). Nästa artikel kommer att kombinera båda tidigare tillvägagångssätt och ge oss ett verktyg för hur man ställer in stilöverföring, vilket kommer att beskrivas senare.

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

Den här artikeln handlar generellt sett inte om visualisering, utan om det faktum att att ersätta pooling med en faltning med ett stort steg inte leder till kvalitetsförlust. Men som en biprodukt av sin forskning föreslog författarna ett nytt sätt att visualisera funktioner, som de använde för att mer exakt analysera vad modellen lär sig. Deras idé är följande: om vi helt enkelt tar derivatan, så går de funktioner som var mindre än noll på ingångsbilden inte tillbaka under dekonvolutionen (med hjälp av ReLu för ingångsbilden). Och detta leder till det faktum att negativa värden visas på den förökade bakre bilden. Å andra sidan, om du använder deconvnet, så tas en annan ReLu från derivatan av ReLu - detta gör att du inte kan hoppa tillbaka negativa värden, men som du såg är resultatet "so-so". Men vad händer om vi kombinerar dessa två metoder?




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

Då får du en helt ren och tolkningsbar bild.


Saliency-kartor med hjälp av guidad backpropagation

Gå djupare

Låt oss nu tänka, vad ger detta oss? Låt mig påminna dig om att varje faltningslager är en funktion som tar emot en tredimensionell tensor som indata och som också producerar en tredimensionell tensor som en utdata, kanske av en annan dimension d x w x h; d epth är antalet neuroner i lagret, var och en av dem genererar en funktionskarta med storleken w igt x håtta.


Låt oss prova följande experiment på VGG-19-nätverket:



conv1_2

Ja, man ser nästan ingenting, för. det receptiva området är mycket litet, detta är den andra faltningen 3x3, respektive, den totala ytan är 5x5. Men när vi zoomar in ser vi att funktionen bara är en gradientdetektor.




conv3_3


conv4_3


conv5_3


pool5


Och föreställ dig nu att istället för maximum över plattan kommer vi att ta derivatan av värdet av summan av alla element i plattan över ingångsbilden. Då kommer uppenbarligen det mottagliga området för gruppen av neuroner att täcka hela inmatningsbilden. För de tidiga lagren kommer vi att se ljusa kartor, från vilka vi drar slutsatsen att dessa är färgdetektorer, sedan gradienter, sedan gränser och så vidare mot mer komplexa mönster. Ju djupare lagret är, desto svagare bild erhålls. Detta förklaras av det faktum att djupare lager har ett mer komplext mönster som de upptäcker, och ett komplext mönster visas mer sällan än ett enkelt, och därför dämpas aktiveringskartan. Det första sättet är lämpligt för att förstå lager med komplexa mönster, och det andra är precis rätt för enkla.


konv1_1


conv2_2


conv4_3


Du kan ladda ner en mer komplett databas med aktiveringar för flera bilder och .

A Neural Algorithm of Artistic Style (2 sep 2015)

Så det har gått ett par år sedan den första framgångsrika trepaneringen av det neurala nätverket. Vi (i bemärkelsen mänsklighet) har ett kraftfullt verktyg i våra händer som gör att vi kan förstå vad det neurala nätverket lär sig, samt ta bort det vi egentligen inte skulle vilja att det lärde sig. Författarna till den här artikeln utvecklar en metod som låter dig få en bild att generera en liknande aktiveringskarta som en målbild, och möjligen till och med mer än en - detta är grunden för styling. Vi matar vitt brus till ingången, och i en liknande iterativ process som i djupa drömmar tar vi denna bild till en där funktionskartorna liknar målbilden.

innehållsförlust

Som redan nämnts producerar varje lager i det neurala nätverket en tredimensionell tensor av någon dimension.




Låt oss beteckna utgången i:e lagret från ingången som . Sedan om vi minimerar den viktade summan av resterna mellan ingångsbilden och någon bild vi strävar efter c, då får du precis vad du behöver. Kanske.



För att experimentera med den här artikeln kan du använda denna magiska bärbara dator, där beräkningarna sker (både på GPU och på CPU). GPU:n används för att beräkna funktionerna i det neurala nätverket och värdet av kostnadsfunktionen. Theano producerar en funktion som kan beräkna gradienten för målfunktionen eval_grad genom inmatningsbild x. Detta matas sedan in i lbfgs och den iterativa processen startar.


# Initiera med en brusbild genered_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) # Optimera, spara resultatet regelbundet för i i intervallet(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)

Om vi ​​kör optimeringen av en sådan funktion får vi snabbt en bild som liknar målbilden. Nu kan vi återskapa bilder från vitt brus som ser ut som en innehållsbild.


Innehållsförlust: conv4_2



Optimeringsprocess




Det är lätt att lägga märke till två funktioner i den resulterande bilden:

  • förlorade färger - detta är resultatet av det faktum att i specifikt exempel endast lagret conv4_2 användes (eller, med andra ord, vikten w var inte noll för det och noll för de andra lagren); som ni minns är det de tidiga lagren som innehåller information om färger och gradientövergångar, och de senare innehåller information om större detaljer, vilket är vad vi observerar - färgerna går förlorade, men innehållet är det inte;
  • vissa hus "låt oss gå", d.v.s. raka linjer är lätt krökta - detta beror på att ju djupare lagret är, desto mindre information om den rumsliga positionen för särdraget det innehåller (resultatet av applicering av veck och pooling).

Att lägga till tidiga lager korrigerar omedelbart situationen med färger.


Innehållsförlust: conv1_1, conv2_1, conv4_2


Förhoppningsvis har du vid det här laget fått en känsla av att du har kontroll över vad som ritas om på bilden med vitt brus.

stilförlust

Och nu kom vi till det mest intressanta: hur kan vi förmedla stilen? Vad är stil? Uppenbarligen är inte stilen vad vi optimerade i Content Loss, eftersom den innehåller mycket information om funktionernas rumsliga positioner. Så det första du ska göra är att på något sätt ta bort denna information från vyerna som tas emot på varje lager.


Författaren föreslår följande metod. Låt oss ta tensorn vid utgången av något lager, expandera den i rumsliga koordinater och beräkna kovariansmatrisen mellan plattorna. Låt oss beteckna denna omvandling som G. Vad har vi egentligen gjort? Man kan säga att vi räknade hur ofta särdragen inuti plattan förekommer i par, eller med andra ord approximerade vi fördelningen av egenskaper i plattorna med en multivariat normalfördelning.




Sedan skrivs Style Loss in enligt följande, där sär en bild med stil:



Ska vi försöka för Vincent? I princip får vi något förväntat - brus i stil med Van Gogh, information om det rumsliga arrangemanget av funktioner är helt förlorat.


Vincent




Vad händer om vi lägger ett foto istället för en stilbild? Du får redan bekanta egenskaper, bekanta färger, men den rumsliga positionen är helt förlorad.


Foto med stilförlust


Du undrade säkert varför vi beräknar kovariansmatrisen, och inte något annat? Det finns trots allt många sätt att aggregera funktioner så att rumsliga koordinater går förlorade. Detta är verkligen en öppen fråga, och om du tar något väldigt enkelt kommer resultatet inte att förändras dramatiskt. Låt oss kontrollera detta, vi kommer inte att beräkna kovariansmatrisen, utan helt enkelt medelvärdet för varje platta.




enkel stilförlust

Kombinerad förlust

Naturligtvis finns det en önskan att blanda dessa två kostnadsfunktioner. Sedan kommer vi att generera en sådan bild från vitt brus att den kommer att behålla funktioner från innehållsbilden (som har bindning till rumsliga koordinater), och det kommer också att finnas "stil" funktioner som inte är bundna till rumsliga koordinater, d.v.s. vi kommer förhoppningsvis att behålla innehållsbildens detaljer intakta, men ritade om med rätt stil.



Faktum är att det också finns en regularizer, men vi kommer att utelämna den för enkelhets skull. Det återstår att svara på följande fråga: vilka lager (vikter) ska användas vid optimering? Och jag är rädd att jag inte har ett svar på den här frågan, och det har inte artikelförfattarna heller. De har ett förslag att använda följande, men det betyder inte alls att en annan kombination kommer att fungera sämre, sökutrymmet är för stort. Den enda regel som följer av förståelsen av modellen är att det inte är meningsfullt att ta angränsande lager, eftersom deras tecken kommer inte att skilja sig mycket från varandra, därför läggs ett lager från varje konv*_1-grupp till stilen.


# Definiera förlustfunktionsförluster = # innehållsförlust 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 = summa(förluster)

Den slutliga modellen kan presenteras i följande form.




Och här är resultatet av husen med Van Gogh.



Försök att kontrollera processen

Låt oss komma ihåg de tidigare delarna, så tidigt som två år före den aktuella artikeln har andra forskare undersökt vad det neurala nätverket verkligen lär sig. Beväpnad med alla dessa artiklar kan du skapa funktionsvisualiseringar av olika stilar, olika bilder, olika upplösningar och storlekar, och försök förstå vilka lager med vilken vikt du ska ta. Men även omviktning av lagren ger inte full kontroll över vad som händer. Problemet här är mer konceptuellt: vi optimerar fel funktion! Hur då, frågar du? Svaret är enkelt: den här funktionen minimerar resterande ... ja, ni förstår. Men det vi verkligen vill är att vi gillar bilden. Den konvexa kombinationen av innehåll och stilförlustfunktioner är inte ett mått på vad vårt sinne anser vara vackert. Det har observerats att om stylingen fortsätter för länge sjunker kostnadsfunktionen naturligtvis lägre och lägre, men den estetiska skönheten i resultatet sjunker kraftigt.




Okej, det finns ett problem till. Låt oss säga att vi hittade ett lager som extraherar de funktioner vi behöver. Låt oss säga att vissa texturer är triangulära. Men det här lagret innehåller fortfarande många andra funktioner, som cirklar, som vi verkligen inte vill se i den resulterande bilden. Generellt sett, om vi kunde anställa en miljon kineser, skulle vi kunna visualisera alla funktioner i en stilbild, och genom en uttömmande sökning bara markera de som vi behöver, och bara inkludera dem i kostnadsfunktionen. Men av förklarliga skäl är det inte så lätt. Men vad händer om vi bara tar bort alla cirklar som vi inte vill ska visas i resultatet från stilmallen? Då kommer aktiveringen av motsvarande neuroner som svarar på cirklarna helt enkelt inte att fungera. Och, naturligtvis, då kommer detta inte att visas i den resulterande bilden. Det är samma sak med blommor. Presentera en ljus bild med många färger. Fördelningen av färger kommer att vara mycket utsmetad över hela utrymmet, fördelningen av den resulterande bilden kommer att vara densamma, men under optimeringsprocessen kommer de toppar som fanns på originalet förmodligen att gå förlorade. Det visade sig att en enkel minskning av bitdjupet färgpalett löser detta problem. Fördelningstätheten för de flesta färger kommer att vara nära noll, och det kommer att finnas stora toppar i flera områden. Genom att manipulera originalet i Photoshop manipulerar vi alltså de funktioner som extraheras från bilden. Det är lättare för en person att uttrycka sina önskningar visuellt än att försöka formulera dem på matematikens språk. Hejdå. Som ett resultat uppnådde designers och chefer, beväpnade med Photoshop och skript för att visualisera funktioner, ett resultat tre gånger snabbare än vad matematiker och programmerare gjorde.


Ett exempel på att manipulera färgen och storleken på funktioner


Och du kan omedelbart ta en enkel bild som en stil



resultat








Och här är en vidosik, men bara med rätt konsistens

Texture Networks: feed-forward syntes av texturer och stiliserade bilder (10 mars 2016)

Det verkar som att detta skulle kunna stoppas, om inte en nyans. Ovanstående stylingalgoritm fungerar under mycket lång tid. Om vi ​​tar en implementering där lbfgs körs på CPU:n så tar processen cirka fem minuter. Om du skriver om det så att optimeringen går till GPU:n kommer processen att ta 10-15 sekunder. Det duger inte. Kanske tänkte författarna till denna och nästa artikel ungefär detsamma. Båda publikationerna kom ut oberoende med 17 dagars mellanrum, nästan ett år efter föregående artikel. Författarna till den aktuella artikeln, liksom författarna till den föregående, var engagerade i texturgenerering (om du bara återställer Style Loss är det ungefär vad du får). De föreslog att man inte optimerar en bild som erhålls från vitt brus, utan något neuralt nätverk som genererar en stiliserad bild.




Nu, om stylingprocessen inte inkluderar någon optimering, behöver bara en framåtpassning göras. Och optimering krävs bara en gång för att träna generatornätverket. Den här artikeln använder en hierarkisk generator där varje följer z större än den föregående och samplas från brus i händelse av texturgenerering, och från någon bilddatabas för stylizerträning. Det är avgörande att använda något annat än utbildningsdelen av imagenet, eftersom funktioner i Loss-nätverket beräknas av nätverket som tränas just på träningsdelen.



Perceptuella förluster för överföring av stil i realtid och superupplösning (27 mars 2016)

Som namnet antyder var författarna, som bara var 17 dagar sena med idén om ett genererande nätverk, upptagna med att öka upplösningen på bilder. De verkar ha inspirerats av framgången med restinlärning på det senaste imagenätet.




Följaktligen restblock och konv. block.



Så nu har vi, förutom stylingkontroll, även en snabb generator i våra händer (tack vare dessa två artiklar mäts genereringstiden för en bild i tiotals ms).

Slut

Vi använde informationen från de granskade artiklarna och författarnas kod som utgångspunkt för att skapa ytterligare en stylingapplikation för den första videostylingapplikationen:



Skapa något sånt här.


På de vanligaste fotografierna förekommer många och inte helt urskiljbara enheter. Oftast av någon anledning hundar. Sådana bilder började fylla internet i juni 2015, när DeepDream från Google lanserades – en av de första öppna tjänsterna baserad på neurala nätverk och designad för bildbehandling.

Det händer ungefär så här: algoritmen analyserar fotografier, hittar fragment i dem som påminner den om några bekanta objekt - och förvränger bilden i enlighet med dessa data.

Först lades projektet upp som en öppen källkod, och sedan dök onlinetjänster skapade på samma principer upp på Internet. En av de mest bekväma och populära är Deep Dream Generator: det tar bara cirka 15 sekunder att bearbeta ett litet foto här (tidigare fick användarna vänta mer än en timme).

Hur lär sig neurala nätverk att skapa sådana bilder? Och varför heter de förresten så?

Neurala nätverk i sin design imiterar de verkliga neurala nätverken hos en levande organism, men de gör detta med hjälp av matematiska algoritmer. Efter att ha skapat en grundläggande struktur kan du träna den med hjälp av maskininlärningsmetoder. Om vi ​​talar om mönsterigenkänning, måste tusentals bilder passeras genom det neurala nätverket. Om det neurala nätverkets uppgift är annorlunda, kommer träningsövningarna att vara annorlunda.

Algoritmer för att spela schack analyserar till exempel schackspel. På samma väg, Googles DeepMinds AlphaGo-algoritm in i det kinesiska spelet Go - vilket hyllades som ett genombrott eftersom Go är mycket mer komplext och icke-linjärt än schack.

    Du kan leka med en förenklad neurala nätverksmodell och bättre förstå dess principer.

    YouTube har också en serie begripliga handritade rullar om hur neurala nätverk fungerar.

En annan populär tjänst är Dreamscope, som inte bara kan drömma om hundar, utan också imitera olika målarstilar. Bildbehandlingen här är också väldigt enkel och snabb (cirka 30 sekunder).

Tydligen är den algoritmiska delen av tjänsten en modifiering av programmet för neural stil, som vi redan har diskuterat.

På senare tid har ett program dykt upp som realistiskt målar svartvita bilder. I tidigare versioner gjorde liknande program sitt jobb mycket mindre bra, och det ansågs vara en stor prestation om minst 20 % av människorna inte kunde se skillnaden mellan en riktig bild och en datorfärgad.

Dessutom tar färgläggning här bara cirka 1 minut.

Samma utvecklingsbolag lanserade också en tjänst som känner igen i bilder olika typer föremål.

Dessa tjänster kan verka som bara rolig underhållning, men i själva verket är allt mycket mer intressant. Ny teknik kommer in i mänskliga konstnärers praktik och förändrar vår förståelse av konst. Kanske snart måste människor konkurrera med maskiner inom kreativitetsområdet.

Att lära ut algoritmer för mönsterigenkänning är en uppgift som AI-utvecklare har kämpat med under lång tid. Därför kan program som färglägger gamla fotografier och ritar hundar på himlen betraktas som en del av en större och mer spännande process.


Topp