Stilizimi i imazhit duke përdorur rrjetet nervore: pa misticizëm, vetëm blasfemi. Ostagram: një shërbim i bazuar në rrjetin nervor që kombinon fotot dhe stolitë në kryevepra artistike Një rrjet nervor vizaton fotografi në internet

Përshëndetje, Habr! Me siguri e keni vënë re se tema e stilizimit të fotografive për t'iu përshtatur stileve të ndryshme artistike po diskutohet në mënyrë aktive në këto internete tuajat. Duke lexuar të gjithë këta artikuj të njohur, mund të mendoni se nën kapuçin e këtyre aplikacioneve po ndodh magjia dhe rrjeti nervor me të vërtetë po imagjinon dhe rivizaton imazhin nga e para. Kështu ndodhi që ekipi ynë u përball me një detyrë të ngjashme: si pjesë e një hakatoni të brendshëm të korporatës, ne bëmë një stilizim video, sepse ... Kishte tashmë një aplikacion për fotografi. Në këtë postim, ne do të kuptojmë se si rrjeti "rivizaton" imazhet dhe do të analizojmë artikujt që e bënë të mundur këtë. Unë rekomandoj që të lexoni postimin e mëparshëm përpara se të lexoni këtë material dhe, në përgjithësi, bazat e rrjeteve nervore konvolucionale. Do të gjeni disa formula, disa kode (do të jap shembuj për Theano dhe Lasagne), dhe gjithashtu shumë foto. Ky postim është organizuar sipas rendit kronologjik të paraqitjes së artikujve dhe, në përputhje me rrethanat, vetë ideve. Ndonjëherë unë do ta holloj atë me përvojën tonë të fundit. Ja një djalë nga ferri për të tërhequr vëmendjen tuaj.


Vizualizimi dhe Kuptimi i Rrjeteve Konvolucionale (28 nëntor 2013)

Para së gjithash, vlen të përmendet një artikull në të cilin autorët ishin në gjendje të tregonin se një rrjet nervor nuk është një kuti e zezë, por një gjë plotësisht e interpretueshme (nga rruga, sot kjo mund të thuhet jo vetëm për rrjetet konvolucionale për kompjuterë vizion). Autorët vendosën të mësojnë se si të interpretojnë aktivizimet e neuroneve në shtresat e fshehura për këtë ata përdorën një rrjet nervor dekonvolucionist (deconvnet), të propozuar disa vite më parë (nga rruga, nga i njëjti Seiler dhe Fergus, të cilët janë autorët e kësaj; publikim). Një rrjet dekonvolucioni është në fakt i njëjti rrjet me konvolucione dhe bashkime, por aplikohet në rend të kundërt. Puna origjinale në deconvnet përdori rrjetin në një mënyrë mësimi të pambikëqyrur për të gjeneruar imazhe. Këtë herë, autorët e përdorën atë thjesht për t'u kthyer nga veçoritë e marra pas një kalimi përpara përmes rrjetit në imazhin origjinal. Rezultati është një imazh që mund të interpretohet si sinjali që shkaktoi këtë aktivizim në neurone. Natyrisht, lind pyetja: si të bëjmë një kalim të kundërt përmes konvolucionit dhe jolinearitetit? Dhe aq më tepër përmes max-pooling, ky sigurisht nuk është një operacion i kthyeshëm. Le të shohim të tre komponentët.

Reverse ReLu

Në rrjetet konvolucionale, funksioni i aktivizimit përdoret shpesh ReLu(x) = max (0, x), e cila i bën të gjitha aktivizimet në shtresë jo negative. Rrjedhimisht, kur ktheheni në jolinearitetin, është gjithashtu e nevojshme të merren rezultate jo negative. Për këtë, autorët sugjerojnë përdorimin e të njëjtit ReLu. Nga një këndvështrim arkitektonik, Theano duhet të anashkalojë funksionin e funksionimit të gradientit (fletorja me vlerë pafundësisht është në Recetat e Lasagna, prej andej do të merrni detajet se çfarë është klasa ModifiedBackprop).

Klasa ZeilerBackprop(ModifiedBackprop): def grad(vetë, hyrjet, gradat dalëse): (inp,) = hyrjet (grd,) = out_grads #return (grd * (grd > 0).atype(inp.dtype),) # korrigjoj qartë return (vetë.jolineariteti(grd),) # përdorni jolinearitetin e dhënë

Konvolucioni i kundërt

Kjo është pak më e komplikuar, por gjithçka është logjike: mjafton të aplikoni një version të transpozuar të të njëjtit kernel konvolucioni, por në daljet nga ReLu i kundërt në vend të shtresës së mëparshme të përdorur në kalimin përpara. Por kam frikë se kjo nuk është aq e qartë me fjalë, le të shohim vizualizimin e kësaj procedure (do të gjeni edhe më shumë vizualizime të konvolucioneve).


Konvolucioni me hap=1

Konvolucioni me hap=1 Versioni i kundërt

Konvolucioni me hap=2

Konvolucioni me hap=2 Versioni i kundërt

Bashkim i kundërt

Ky operacion (ndryshe nga ato të mëparshme) në përgjithësi nuk është i kthyeshëm. Por ne ende do të donim të kalonim disi maksimumin gjatë kalimit të kthimit. Për ta bërë këtë, autorët sugjerojnë përdorimin e një harte se ku ishte maksimumi gjatë një kalimi të drejtpërdrejtë (ndërprerësit maksimal të vendndodhjes). Gjatë kalimit të kundërt, sinjali i hyrjes shndërrohet në unpooling në mënyrë të tillë që të ruajë afërsisht strukturën e sinjalit origjinal këtu është me të vërtetë më e lehtë për t'u parë sesa për t'u përshkruar.



Rezultati

Algoritmi i vizualizimit është jashtëzakonisht i thjeshtë:

  1. Bëni një pasim të drejtë.
  2. Zgjidhni shtresën që na intereson.
  3. Regjistroni aktivizimin e një ose më shumë neuroneve dhe rivendosni pjesën tjetër.
  4. Nxirrni përfundimin e kundërt.

Çdo katror gri në imazhin e mëposhtëm korrespondon me një vizualizim të filtrit (i cili përdoret për konvolucionin) ose peshave të një neuroni, dhe çdo foto me ngjyrë është pjesa e imazhit origjinal që aktivizon neuronin përkatës. Për qartësi, neuronet brenda një shtrese grupohen në grupe tematike. Në përgjithësi, papritmas doli që rrjeti nervor mëson saktësisht se çfarë shkruan Hubel dhe Weisel në punën e tyre mbi strukturën e sistemit vizual, për të cilin ata u nderuan me çmimin Nobel në 1981. Falë këtij artikulli, ne morëm një paraqitje vizuale të asaj që mëson një rrjet nervor konvolucional në secilën shtresë. Është kjo njohuri që më vonë do të bëjë të mundur manipulimin e përmbajtjes së imazhit të krijuar, por kjo është ende shumë larg, vitet e ardhshme u shpenzuan për të përmirësuar metodat e "trepanimit" të rrjeteve nervore. Përveç kësaj, autorët e artikullit propozuan një mënyrë për të analizuar mënyrën më të mirë për të ndërtuar arkitekturën e një rrjeti nervor konvolucionist për të arritur rezultate më të mira (megjithëse ata nuk e fituan ImageNet 2013, por arritën në krye; UPD: rezulton se fituan, Clarifai është ai që janë).


Vizualizimi i veçorive


Këtu është një shembull i vizualizimit të aktivizimeve duke përdorur deconvnet, sot ky rezultat duket kështu-ashtu, por atëherë ishte një përparim.


Hartat e spikatura duke përdorur deconvnet

Deep Inside Convolutional Networks: Vizualizimi i Modeleve të Klasifikimit të Imazheve dhe Hartave të Shquara (19 Prill 2014)

Ky artikull i kushtohet studimit të metodave për vizualizimin e njohurive të përfshira në një rrjet nervor konvolucional. Autorët propozojnë dy metoda vizualizimi të bazuara në zbritjen gradient.

Vizualizimi i modelit të klasës

Pra, imagjinoni që ne kemi një rrjet nervor të trajnuar për të zgjidhur një problem klasifikimi në një numër të caktuar klasash. Le të shënojmë vlerën e aktivizimit të neuronit dalës, i cili korrespondon me klasën c. Pastaj problemi i mëposhtëm i optimizimit na jep saktësisht imazhin që maksimizon klasën e zgjedhur:



Ky problem mund të zgjidhet lehtësisht duke përdorur Theano. Zakonisht ne i kërkojmë kornizës të marrë derivatin në lidhje me parametrat e modelit, por këtë herë supozojmë se parametrat janë fikse dhe derivati ​​merret në lidhje me imazhin hyrës. Funksioni i mëposhtëm zgjedh vlerën maksimale të shtresës së daljes dhe kthen një funksion që llogarit derivatin e figurës hyrëse.


def compile_saliency_function(net): """ Përpilon një funksion për të llogaritur hartat e spikatura dhe klasat e parashikuara për një minibatch të caktuar të imazheve hyrëse. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], deterministic=E vërtetë) max_outp = T.max(outp, bosht=1) saliency = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, axis=1) kthe theano.function(, )

Me siguri keni parë imazhe të çuditshme me fytyra qensh në internet - DeepDream. Në punimin origjinal, autorët përdorin procesin e mëposhtëm për të gjeneruar imazhe që maksimizojnë klasën e zgjedhur:

  1. Inicializoni imazhin fillestar me zero.
  2. Llogaritni vlerën e derivatit nga ky imazh.
  3. Ndryshoni imazhin duke shtuar në të imazhin që rezulton nga derivati.
  4. Kthehuni në pikën 2 ose dilni nga laku.

Imazhet që rezultojnë janë:




Po sikur të inicializojmë imazhin e parë me një fotografi të vërtetë dhe të fillojmë të njëjtin proces? Por në çdo përsëritje do të zgjedhim një klasë të rastësishme, do të rivendosim pjesën tjetër dhe do të llogarisim vlerën e derivatit, atëherë do të marrim diçka si kjo ëndërr e thellë.


Kujdes 60 mb


Pse ka kaq shumë fytyra dhe sy të qenit? Është e thjeshtë: ka pothuajse 200 qen nga 1000 klasa në rrjetin e imazhit, ata kanë sy. Dhe gjithashtu shumë klasa ku ka thjesht njerëz.

Nxjerrja e dallueshmërisë së klasës

Nëse ky proces inicializohet me një fotografi reale, ndalet pas përsëritjes së parë dhe vizatohet vlera e derivatit, atëherë do të marrim një imazh të tillë, duke e shtuar atë origjinalit, do të rrisim vlerën e aktivizimit të klasës së zgjedhur.


Hartat e spikatura duke përdorur derivat


Përsëri rezultati është "kaq-kaq". Është e rëndësishme të theksohet se kjo është një mënyrë e re për të vizualizuar aktivizimet (asgjë nuk na pengon të rregullojmë vlerat e aktivizimit jo në shtresën e fundit, por në çdo shtresë të rrjetit në përgjithësi dhe të marrim derivatin në lidhje me imazhin hyrës ). Artikulli tjetër do të kombinojë të dyja qasjet e mëparshme dhe do të na japë një mjet se si të konfigurojmë transferimin e stilit, i cili do të përshkruhet më vonë.

Përpjekja për thjeshtësi: Rrjeti i Gjithë Convolutional (13 Prill 2015)

Ky artikull në përgjithësi nuk ka të bëjë me vizualizimin, por për faktin se zëvendësimi i bashkimit me konvolucionin me një hap të madh nuk çon në humbje të cilësisë. Por si një nënprodukt i hulumtimit të tyre, autorët propozuan një mënyrë të re për të vizualizuar veçoritë, të cilat ata e përdorën për të analizuar më saktë atë që modeli mëson. Ideja e tyre është si vijon: nëse thjesht marrim derivatin, atëherë gjatë dekonvolucionit ato veçori që ishin më pak se zero në imazhin e hyrjes nuk kalohen prapa (duke përdorur ReLu për imazhin hyrës). Dhe kjo çon në shfaqjen e vlerave negative në imazhin që përhapet përsëri. Nga ana tjetër, nëse përdorni deconvnet, atëherë një ReLu tjetër merret nga derivati ​​i ReLu - kjo ju lejon të mos i kaloni vlerat negative, por siç e patë, rezultati është "ashtu-kështu". Por çfarë nëse kombinoni këto dy metoda?




Klasa GuidedBackprop(ModifiedBackprop): def grad(vetë, hyrjet, gradat dalëse): (inp,) = hyrjet(grd,) = out_grads dtype = kthimi inp.dtype (grd * (inp > 0).atype(dtype) * (grd > 0).atype(dtype),)

Atëherë do të merrni një imazh krejtësisht të pastër dhe të interpretueshëm.


Hartat e spikatura duke përdorur përhapjen e drejtuar prapa

Shkoni më thellë

Tani le të mendojmë se çfarë na jep kjo? Më lejoni t'ju kujtoj se çdo shtresë konvolucionale është një funksion që merr një tensor tredimensional si hyrje dhe gjithashtu prodhon një tensor tredimensional si dalje, ndoshta të një dimensioni të ndryshëm d x w x h; d epth është numri i neuroneve në shtresë, secili prej tyre gjeneron një hartë tipare të madhësisë w igth x h tetë.


Le të provojmë eksperimentin e mëposhtëm në rrjetin VGG-19:



conv1_2

Po, ju nuk shihni pothuajse asgjë, sepse ... zona pritëse është shumë e vogël, kjo është konvolucioni i dytë i 3x3, përkatësisht, sipërfaqja totale është 5x5. Por duke zmadhuar, ne shohim se veçoria është vetëm një detektor gradient.




conv3_3


conv4_3


conv5_3


pishinë5


Tani le të imagjinojmë që në vend të maksimumit mbi bllokun, do të marrim derivatin e vlerës së shumës së të gjithë elementëve të bllokut mbi imazhin hyrës. Pastaj padyshim zona pritëse e një grupi neuronesh do të mbulojë të gjithë imazhin e hyrjes. Për shtresat e hershme do të shohim harta të ndritshme, nga të cilat arrijmë në përfundimin se këto janë detektorë ngjyrash, pastaj gradientë, pastaj skaje, e kështu me radhë drejt modeleve më komplekse. Sa më e thellë të jetë shtresa, aq më e zbehtë është imazhi. Kjo shpjegohet me faktin se shtresat më të thella kanë një model më kompleks që zbulojnë, dhe një model kompleks shfaqet më rrallë se ai i thjeshtë, kështu që harta e aktivizimit zbehet. Metoda e parë është e përshtatshme për të kuptuar shtresat me modele komplekse, dhe e dyta është vetëm për ato të thjeshta.


conv1_1


conv2_2


conv4_3


Ju mund të shkarkoni një bazë të dhënash më të plotë të aktivizimeve për disa imazhe dhe .

Një algoritëm nervor i stilit artistik (2 shtator 2015)

Pra, kanë kaluar nja dy vjet nga trepanimi i parë i suksesshëm i një rrjeti nervor. Ne (në kuptimin e njerëzimit) kemi në dorë një mjet të fuqishëm që na lejon të kuptojmë se çfarë mëson një rrjet nervor, si dhe të heqim atë që nuk duam që ai të mësojë. Autorët e këtij artikulli po zhvillojnë një metodë që lejon një imazh të gjenerojë një hartë të ngjashme aktivizimi me disa imazhe të synuara, dhe ndoshta edhe më shumë se një - kjo është baza e stilizimit. Ne aplikojmë zhurmë të bardhë në hyrje dhe duke përdorur një proces të ngjashëm përsëritës si në ëndrrën e thellë, e zvogëlojmë këtë imazh në një, hartat e veçorive të të cilit janë të ngjashme me imazhin e synuar.

Humbja e përmbajtjes

Siç është përmendur tashmë, çdo shtresë e rrjetit nervor prodhon një tensor tredimensional të disa dimensioneve.




Le të shënojmë daljen i shtresa e th nga hyrja si . Atëherë nëse minimizojmë shumën e ponderuar të mbetjeve ndërmjet imazhit të hyrjes dhe disa imazhe që synojmë c, atëherë do të merrni pikërisht atë që ju nevojitet. Ndoshta.



Për të eksperimentuar me këtë artikull, mund të përdorni këtë laptop magjik, ku bëhen llogaritjet (si në GPU ashtu edhe në CPU). GPU përdoret për të llogaritur veçoritë e rrjetit nervor dhe vlerën e funksionit të kostos. Theano prodhon një funksion që mund të llogarisë gradientin e funksionit objektiv eval_grad nga imazhi hyrës x. Kjo pastaj futet në lbfgs dhe fillon procesi përsëritës.


# Inicializoni me një imazh të zhurmës generated_image.set_value(floatX(np.random.uniform(-128, 128, (1, 3, IMAGE_W, IMAGE_W)))) x0 = generated_image.get_value().atype("float64") xs = xs.append(x0) # Optimize, duke ruajtur rezultatin periodikisht për i në intervalin(8): print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = generated_image.get_value().atype("float64") xs.append(x0)

Nëse kryejmë optimizimin e një funksioni të tillë, do të marrim shpejt një imazh të ngjashëm me atë të synuar. Tani mund të përdorim zhurmën e bardhë për të rikrijuar imazhe që janë të ngjashme me disa imazhe të përmbajtjes.


Humbja e përmbajtjes: conv4_2



Procesi i optimizimit




Është e lehtë të vërehen dy veçori të imazhit që rezulton:

  • ngjyrat humbën - ky është rezultat i faktit se në një shembull specifik u përdor vetëm shtresa conv4_2 (ose, me fjalë të tjera, pesha w për të ishte jo zero, dhe zero për shtresat e tjera); siç e mbani mend, janë shtresat e hershme ato që përmbajnë informacione për ngjyrat dhe tranzicionet e gradientit, dhe ato të mëvonshme përmbajnë informacion për detaje më të mëdha, gjë që ne vëzhgojmë - ngjyrat humbasin, por përmbajtja jo;
  • disa shtëpi kanë “lëvizur”, d.m.th. vijat e drejta janë pak të lakuar - kjo ndodh sepse sa më e thellë të jetë shtresa, aq më pak informacion për pozicionin hapësinor të veçorisë që përmban (rezultati i përdorimit të konvolucioneve dhe bashkimit).

Shtimi i shtresave të hershme korrigjon menjëherë situatën e ngjyrave.


Humbja e përmbajtjes: conv1_1, conv2_1, conv4_2


Shpresojmë që tani të ndiheni sikur keni njëfarë kontrolli mbi atë që rivizatohet në imazhin e zhurmës së bardhë.

Humbja e stilit

Dhe tani kalojmë në pjesën më interesante: si mund ta përcjellim stilin? Çfarë është stili? Natyrisht, stili nuk është diçka që ne e optimizuam në Humbjen e Përmbajtjes, sepse ai përmban shumë informacione rreth pozicioneve hapësinore të veçorive, kështu që gjëja e parë që duhet të bëjmë është ta heqim disi këtë informacion nga pamjet e marra në secilën shtresë.


Autori sugjeron metodën e mëposhtme. Le të marrim tensorin në daljen e një shtrese të caktuar, ta zgjerojmë atë përgjatë koordinatave hapësinore dhe të llogarisim matricën e kovariancës midis blloqeve. Le ta shënojmë këtë transformim si G. Çfarë kemi bërë në të vërtetë? Mund të themi se kemi llogaritur se sa shpesh tiparet brenda një patch ndodhin në çifte, ose, me fjalë të tjera, kemi përafruar shpërndarjen e veçorive në arna me një shpërndarje normale multivariate.




Pastaj Style Loss futet si më poshtë, ku s- ky është një imazh me stil:



A do ta provojmë për Vincent? Ne marrim, në parim, diçka të pritshme - zhurma në stilin e Van Gogh, informacioni rreth rregullimit hapësinor të veçorive humbet plotësisht.


Vincent




Po sikur të vendosni një fotografi në vend të një imazhi stili? Do të merrni tipare të njohura, ngjyra të njohura, por pozicioni hapësinor humbet plotësisht.


Foto me humbje stili


Ju ndoshta keni pyetur veten pse ne llogarisim matricën e kovariancës dhe jo diçka tjetër? Në fund të fundit, ka shumë mënyra për të grumbulluar veçori në mënyrë që koordinatat hapësinore të humbasin. Kjo është vërtet një pyetje e hapur, dhe nëse merrni diçka shumë të thjeshtë, rezultati nuk do të ndryshojë në mënyrë dramatike. Le ta kontrollojmë këtë, nuk do të llogarisim matricën e kovariancës, por thjesht vlerën mesatare të secilës pjatë.




humbje e thjeshtë e stilit

Humbje e kombinuar

Natyrisht, ekziston një dëshirë për të përzier këto dy funksione të kostos. Pastaj ne do të gjenerojmë një imazh nga zhurma e bardhë në mënyrë që të ruajë veçoritë nga imazhi i përmbajtjes (të cilat janë të lidhura me koordinatat hapësinore), dhe gjithashtu do të përmbajë veçori "stili" që nuk janë të lidhura me koordinatat hapësinore, d.m.th. ne do të shpresojmë që detajet e imazhit të përmbajtjes do të mbeten të paprekura nga vendet e tyre, por do të rivizatohen me stilin e dëshiruar.



Në fakt, ekziston edhe një rregullues, por ne do ta heqim atë për thjeshtësi. Mbetet t'i përgjigjemi pyetjes së mëposhtme: cilat shtresa (pesha) duhet të përdoren gjatë optimizimit? Dhe kam frikë se nuk kam një përgjigje për këtë pyetje, dhe as autorët e artikullit. Ata kanë një propozim për të përdorur sa vijon, por kjo nuk do të thotë aspak se një kombinim tjetër do të funksionojë më keq, hapësira e kërkimit është shumë e madhe. Rregulli i vetëm që rrjedh nga të kuptuarit e modelit: nuk ka kuptim të merren shtresa ngjitur, sepse karakteristikat e tyre nuk do të ndryshojnë shumë nga njëra-tjetra, kështu që një shtresë nga secili grup conv*_1 i shtohet stilit.


# Përcaktoni humbjet e funksionit të humbjes = # humbja e përmbajtjes losses.append(0.001 * content_loss(foto_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,"4. ) 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 = shuma(humbjet)

Modeli përfundimtar mund të paraqitet si më poshtë.




Dhe këtu është rezultati i shtëpive me Van Gogh.



Përpjekja për të kontrolluar procesin

Le të kujtojmë pjesët e mëparshme, tashmë dy vjet para artikullit aktual, shkencëtarë të tjerë po hulumtonin se çfarë mëson në të vërtetë një rrjet nervor. Të armatosur me të gjithë këta artikuj, ju mund të gjeneroni vizualizime të veçorive të stileve të ndryshme, imazhe të ndryshme, rezolucione dhe madhësi të ndryshme dhe të përpiqeni të kuptoni se cilat shtresa të përdorni me çfarë peshe. Por edhe ripeshimi i shtresave nuk jep kontroll të plotë mbi atë që po ndodh. Problemi këtu është më konceptual: ne jemi duke optimizuar funksionin e gabuar! Si kështu, ju pyesni? Përgjigja është e thjeshtë: ky funksion minimizon mospërputhjen... mirë, e kuptoni idenë. Por ajo që ne vërtet duam është që ne të pëlqejmë imazhin. Kombinimi konveks i funksioneve të humbjes së përmbajtjes dhe stilit nuk është një masë e asaj që mendja jonë e konsideron të bukur. U vu re se nëse vazhdoni stilizimin për një kohë të gjatë, funksioni i kostos natyrisht bie gjithnjë e më poshtë, por bukuria estetike e rezultatit bie ndjeshëm.




Epo, në rregull, ka edhe një problem. Le të themi se kemi gjetur një shtresë që nxjerr veçoritë që na nevojiten. Le të themi se disa tekstura janë trekëndore. Por kjo shtresë përmban gjithashtu shumë veçori të tjera, të tilla si rrathë, që ne me të vërtetë nuk duam t'i shohim në imazhin që rezulton. Në përgjithësi, nëse mund të punësonim një milion kinezë, ne mund të vizualizonim të gjitha tiparet e një imazhi stili dhe me forcë brutale thjesht shënonim ato që na nevojiten dhe t'i përfshijmë ato vetëm në funksionin e kostos. Por për arsye të dukshme nuk është aq e thjeshtë. Por, çka nëse thjesht heqim të gjithë rrathët që nuk duam të shohim në rezultat nga imazhi i stilit? Atëherë aktivizimi i neuroneve përkatëse që i përgjigjen rrathëve thjesht nuk do të funksionojë. Dhe, natyrisht, atëherë kjo nuk do të shfaqet në foton që rezulton. Është e njëjta gjë me lulet. Imagjinoni një imazh të ndritshëm me shumë ngjyra. Shpërndarja e ngjyrave do të jetë shumë e njollosur në të gjithë hapësirën, dhe shpërndarja e imazhit që rezulton do të jetë e njëjtë, por në procesin e optimizimit ato majat që ishin në origjinal ndoshta do të humbasin. Doli se thjesht reduktimi i thellësisë së bitit të paletës së ngjyrave e zgjidh këtë problem. Dendësia e shpërndarjes së shumicës së ngjyrave do të jetë afër zeros dhe do të ketë maja të mëdha në disa zona. Kështu, duke manipuluar origjinalin në Photoshop, ne manipulojmë veçoritë që nxirren nga imazhi. Është më e lehtë për një person të shprehë dëshirat e tij vizualisht sesa të përpiqet t'i formulojë ato në gjuhën e matematikës. Mirupafshim. Si rezultat, projektuesit dhe menaxherët, të armatosur me Photoshop dhe skripta për vizualizimin e veçorive, arritën rezultate tre herë më shpejt se sa matematikanët dhe programuesit.


Një shembull i manipulimit të ngjyrës dhe madhësisë së veçorive


Ose mund të përdorni një imazh të thjeshtë si stil



rezultatet








Ja një video, por vetëm me teksturën e duhur

Rrjetet e teksturave: Sinteza e teksteve dhe imazheve të stilizuara (10 mars 2016)

Duket se mund të ndalemi këtu, nëse jo për një nuancë. Algoritmi i mësipërm i stilizimit kërkon një kohë shumë të gjatë për t'u përfunduar. Nëse marrim një zbatim ku lbfgs funksionon në CPU, procesi zgjat rreth pesë minuta. Nëse e rishkruani në mënyrë që optimizimi të shkojë në GPU, atëherë procesi do të zgjasë 10-15 sekonda. Kjo nuk është e mirë. Ndoshta autorët e këtij dhe të artikullit tjetër kanë menduar për të njëjtën gjë. Të dy botimet u botuan në mënyrë të pavarur, me 17 ditë diferencë, pothuajse një vit pas artikullit të mëparshëm. Autorët e artikullit aktual, si autorët e atij të mëparshëm, ishin të angazhuar në gjenerimin e teksteve (nëse thjesht rivendosni Humbjen e stilit në zero, kjo është ajo që do të merrni). Ata propozuan të optimizonin jo një imazh të marrë nga zhurma e bardhë, por një rrjet nervor që gjeneron një imazh të stilizuar.




Tani, nëse procesi i stilimit nuk përfshin ndonjë optimizim, ju duhet vetëm të bëni një kalim përpara. Dhe optimizimi kërkohet vetëm një herë për të trajnuar rrjetin e gjeneratorit. Ky artikull përdor një gjenerator hierarkik, ku secili vijon z më i madh në përmasa se ai i mëparshmi dhe i marrë nga zhurma në rastin e gjenerimit të teksturës, dhe nga disa bazë të dhënash imazhesh për trajnimin e stilistit. Është e rëndësishme të përdorni diçka tjetër përveç pjesës së trajnimit të imazhit, sepse... veçoritë brenda rrjetit të Humbjeve llogariten nga rrjeti i trajnuar gjatë pjesës së trajnimit.



Humbjet perceptuese për transferimin e stilit në kohë reale dhe super-rezolucion (27 mars 2016)

Siç sugjeron titulli, autorët, të cilët ishin vetëm 17 ditë vonesë me idenë e një rrjeti gjenerues, po punonin për të rritur rezolucionin e imazheve. Ata me sa duket u frymëzuan nga sukseset e të mësuarit të mbetur në imazhet më të fundit.




Prandaj, blloku i mbetur dhe blloku i konvertimit.



Kështu, tani, përveç kontrollit mbi stilimin, kemi një gjenerator të shpejtë (në sajë të këtyre dy artikujve, koha e gjenerimit për një imazh matet në dhjetëra ms).

Përfundimi

Ne përdorëm informacionin nga artikujt e rishikuar dhe kodin e autorëve si pikënisje për të krijuar një aplikacion tjetër për stilimin e aplikacionit të parë të stilimit të videos:



Gjeneron diçka të tillë.


Në fotografitë më të zakonshme shfaqen entitete të shumta dhe jo tërësisht të dallueshme. Më shpesh, për ndonjë arsye, qentë. Interneti filloi të mbushej me imazhe të tilla në qershor 2015, kur u lançua DeepDream i Google - një nga shërbimet e para të hapura të bazuara në rrjetet nervore dhe i krijuar për përpunimin e imazhit.

Ndodh diçka si kjo: algoritmi analizon fotografi, gjen fragmente në to që i kujtojnë disa objekte të njohura - dhe shtrembëron imazhin në përputhje me këto të dhëna.

Fillimisht, projekti u publikua si burim i hapur, dhe më pas shërbimet online të krijuara sipas të njëjtave parime u shfaqën në internet. Një nga më të përshtatshmet dhe më të njohurit është Deep Dream Generator: përpunimi i një fotografie të vogël këtu zgjat vetëm rreth 15 sekonda (më parë, përdoruesit duhej të prisnin më shumë se një orë).

Si mësojnë rrjetet nervore të krijojnë imazhe të tilla? Dhe pse, meqë ra fjala, quhen kështu?

Rrjetet nervore në strukturën e tyre imitojnë rrjetet nervore reale të një organizmi të gjallë, por këtë e bëjnë duke përdorur algoritme matematikore. Pasi të keni krijuar një strukturë bazë, mund ta stërvitni duke përdorur metoda të mësimit të makinerive. Nëse po flasim për njohjen e imazheve, atëherë mijëra imazhe duhet të kalojnë përmes një rrjeti nervor. Nëse detyra e rrjetit nervor është e ndryshme, atëherë ushtrimet e trajnimit do të jenë të ndryshme.

Algoritmet për të luajtur shah, për shembull, analizojnë lojërat e shahut. Në të njëjtën mënyrë, algoritmi AlphaGo nga Google DeepMind në lojën kineze të Go - e cila u perceptua si një zbulim i madh, pasi Go është shumë më kompleks dhe jolinear se shahu.

    Ju mund të luani me një model të thjeshtuar të rrjeteve nervore dhe të kuptoni më mirë parimet e tij.

    Ekziston edhe një seri vizatimesh të kuptueshme në YouTube rollers për mënyrën se si funksionojnë rrjetet nervore.

Një tjetër shërbim popullor është Dreamscope, i cili jo vetëm që mund të ëndërrojë për qentë, por edhe të imitojë stile të ndryshme pikture. Përpunimi i imazhit këtu është gjithashtu shumë i thjeshtë dhe i shpejtë (rreth 30 sekonda).

Me sa duket, pjesa algoritmike e shërbimit është një modifikim i programit "Stil Neural", të cilin e kemi diskutuar tashmë.

Kohët e fundit, është shfaqur një program që ngjyros realisht imazhet bardh e zi. Në versionet e mëparshme, programe të ngjashme e bënin punën e tyre shumë më pak mirë dhe konsiderohej një arritje e madhe nëse të paktën 20% e njerëzve nuk mund të dallonin një foto reale nga një imazh i ngjyrosur nga një kompjuter.

Për më tepër, ngjyrosja këtu zgjat vetëm rreth 1 minutë.

E njëjta kompani zhvillimi lançoi gjithashtu një shërbim që njeh lloje të ndryshme objektesh në foto.

Këto shërbime mund të duken si thjesht argëtim argëtues, por në realitet gjithçka është shumë më interesante. Teknologjitë e reja po hyjnë në praktikën e artistëve njerëzorë dhe po ndryshojnë kuptimin tonë për artin. Ka të ngjarë që njerëzit së shpejti do të duhet të konkurrojnë me makinat në fushën e krijimtarisë.

Mësimi i algoritmeve për të njohur imazhet është një detyrë me të cilën zhvilluesit e inteligjencës artificiale kanë luftuar për një kohë të gjatë. Prandaj, programet që ngjyrosin fotografitë e vjetra dhe vizatojnë qen në qiell mund të konsiderohen pjesë e një procesi më të madh dhe më intrigues.

Që kur studiuesit gjermanë nga Universiteti i Tübingen paraqitën idenë e tyre për transferimin e stilit të artistëve të famshëm në fotografi të tjera në gusht 2015, kanë filluar të shfaqen shërbime që fitojnë para nga kjo mundësi. U lançua në tregun perëndimor, dhe kopja e tij e plotë u lançua në tregun rus.

Tek faqeshënuesit

Përkundër faktit se Ostagram u lançua në dhjetor, ai filloi të fitonte shpejt popullaritet në rrjetet sociale në mes të prillit. Në të njëjtën kohë, që nga 19 Prilli, kishte më pak se një mijë njerëz në projekt në VKontakte.

Për të përdorur shërbimin, duhet të përgatisni dy imazhe: një foto që duhet të përpunohet dhe një fotografi me një shembull të stilit për t'u mbivendosur në foton origjinale.

Shërbimi ka një version falas: krijon një imazh në një rezolucion minimal deri në 600 piksele përgjatë anës më të gjatë të imazhit. Përdoruesi merr rezultatin e vetëm një prej përsëritjeve të aplikimit të filtrit në foto.

Ekzistojnë dy versione me pagesë: Premium prodhon një imazh deri në 700 piksel përgjatë anës më të gjatë dhe aplikon 600 përsëritje të përpunimit të rrjetit nervor në imazh (sa më shumë përsëritje, aq më interesant dhe intensiv është përpunimi). Një foto e tillë do të kushtojë 50 rubla.

Në versionin HD, mund të personalizoni numrin e përsëritjeve: 100 do të kushtojnë 50 rubla dhe 1000 do të kushtojnë 250 rubla. Në këtë rast, imazhi do të ketë një rezolucion deri në 1200 piksele në anën më të gjatë dhe mund të përdoret për printim në kanavacë: Ostagram ofron një shërbim të tillë me shpërndarje duke filluar nga 1800 rubla.

Në shkurt, përfaqësuesit e Ostagram njoftuan se nuk do të pranonin kërkesa për përpunim imazhi nga përdoruesit "nga vendet me kapitalizëm të zhvilluar", por më pas akses në përpunimin e fotografive për përdoruesit e VKontakte nga e gjithë bota. Duke gjykuar nga kodi Ostagram i publikuar në GitHub, ai u zhvillua nga Sergey Morugin, një 30-vjeçar banor i Nizhny Novgorod.

TJ kontaktoi drejtorin komercial të projektit, i cili u prezantua si Andrey. Sipas tij, Ostagram u shfaq para Instapainting, por u frymëzua nga një projekt i ngjashëm i quajtur Vipart.

Ostagram u zhvillua nga një grup studentësh nga NSTU. Alekseeva: pas testimit fillestar në një grup të ngushtë miqsh, në fund të vitit 2015 ata vendosën ta bëjnë projektin publik. Fillimisht, përpunimi i imazhit ishte plotësisht falas, dhe plani ishte të fitonim para duke shitur piktura të printuara. Sipas Andrey, printimi doli të ishte problemi më i madh: fotot e njerëzve të përpunuara nga një rrjet nervor rrallë duken të këndshme për syrin e njeriut dhe klientit përfundimtar i duhet një kohë e gjatë për të rregulluar rezultatin përpara se ta aplikojë atë në kanavacë, gjë që kërkon burime të mëdha makinerish.

Krijuesit e Ostagram donin të përdornin serverët cloud të Amazon për të përpunuar imazhet, por pas një fluksi përdoruesish, u bë e qartë se kostot do të kalonin një mijë dollarë në ditë me kthim minimal të investimit. Andrey, i cili është gjithashtu një investitor në projekt, mori me qira kapacitetin e serverit në Nizhny Novgorod.

Audienca e projektit është rreth një mijë njerëz në ditë, por në disa ditë ai arriti në 40 mijë njerëz për shkak të referimeve nga mediat e huaja, të cilat tashmë e kishin vënë re projektin para atyre vendase (madje Ostagram arriti të bashkëpunonte me DJ evropianë). Natën, kur trafiku është i ulët, përpunimi i imazhit mund të zgjasë 5 minuta, dhe gjatë ditës mund të zgjasë deri në një orë.

Nëse qasja e mëparshme në përpunimin e imazhit ishte e kufizuar qëllimisht për përdoruesit e huaj (ata menduan të fillonin fitimin e parave në Rusi), tani Ostagram po mbështet më shumë në një audiencë perëndimore.

Sot, perspektivat për rikuperim janë të kushtëzuara. Nëse secili përdorues paguante 10 rubla për përpunim, atëherë ndoshta do të paguante. […]

Është shumë e vështirë të fitosh para në vendin tonë: njerëzit tanë janë gati të presin një javë, por nuk do të paguajnë asnjë qindarkë për të. Evropianët janë më të favorshëm për këtë - në drejtim të pagesës për përshpejtimin, përmirësimin e cilësisë - kështu që ata po synojnë atë treg.

Andrey, përfaqësues i Ostagram

Sipas Andrey, ekipi i Ostagram po punon në një version të ri të faqes me një theks më të madh në shoqërinë: "Do të jetë i ngjashëm me një shërbim të mirënjohur, por çfarë të bëjmë." Përfaqësuesit e Facebook në Rusi ishin tashmë të interesuar për projektin, por negociatat për shitjen nuk kanë arritur ende në pikën e shitjes.

Shembuj të punës së shërbimit

Në burimin në faqen e internetit të Ostagram, mund të shihni gjithashtu kombinimin e imazheve që rezultuan në fotot përfundimtare: shpesh kjo është edhe më interesante se vetë rezultati. Në këtë rast, filtrat - fotografitë e përdorura si efekt për përpunim - mund të ruhen për përdorim në të ardhmen.