Vaizdų formavimas naudojant neuroninius tinklus: jokios mistikos, tiesiog matan. Ostagram: neuroniniu tinklu pagrįsta paslauga, sujungianti nuotraukas ir ornamentus į meno šedevrus. Neuroninio tinklo menininkas

Vaizdų formavimas naudojant neuroninius tinklus: jokios mistikos, tiesiog matan.  Ostagram: neuroniniu tinklu pagrįsta paslauga, sujungianti nuotraukas ir ornamentus į meno šedevrus. Neuroninio tinklo menininkas
Vaizdų formavimas naudojant neuroninius tinklus: jokios mistikos, tiesiog matan. Ostagram: neuroniniu tinklu pagrįsta paslauga, sujungianti nuotraukas ir ornamentus į meno šedevrus. Neuroninio tinklo menininkas

Nuo tada, kai 2015 m. rugpjūčio mėn. vokiečių mokslininkai iš Tiubingeno universiteto pristatė savo idėją apie galimybę garsių menininkų stilių perkelti į kitas nuotraukas, pradėjo atsirasti paslaugų, kurios šią galimybę pelnė pinigais. Jis buvo paleistas Vakarų rinkoje, o Rusijos rinkoje - visas jo egzempliorius.

Į žymes

Nepaisant to, kad „Ostagram“ buvo paleista dar gruodį, ji greitai pradėjo populiarėti socialiniuose tinkluose būtent balandžio viduryje. Tuo pačiu metu balandžio 19 d. projekte „VKontakte“ buvo mažiau nei tūkstantis žmonių.

Norėdami naudotis paslauga, turite paruošti du vaizdus: nuotrauką, kurią reikia apdoroti, ir paveikslėlį su stiliaus pavyzdžiu, kuris bus dedamas ant originalios nuotraukos.

Paslauga turi nemokamą versiją: ji sukuria vaizdą, kurio minimali skiriamoji geba yra iki 600 pikselių ilgiausioje vaizdo pusėje. Vartotojas gauna tik vienos filtro pritaikymo nuotraukai iteracijų rezultatą.

Yra dvi mokamos versijos: Premium sukuria vaizdą iki 700 pikselių ilgiausioje pusėje ir vaizdui pritaiko 600 neuroninio tinklo apdorojimo iteracijų (kuo daugiau iteracijų, tuo įdomesnis ir intensyvesnis apdorojimas). Viena tokia nuotrauka kainuos 50 rublių.

HD versijoje galite reguliuoti iteracijų skaičių: 100 kainuos 50 rublių, o 1000 - 250 rublių. Tokiu atveju vaizdo raiška bus iki 1200 pikselių ilgiausioje pusėje ir jį bus galima naudoti spausdinant ant drobės: Ostagram siūlo tokią paslaugą su pristatymu nuo 1800 rublių.

Vasario mėnesį „Ostagram“ atstovai nepriims užklausų dėl vaizdo apdorojimo iš vartotojų „iš išsivysčiusių kapitalizmo šalių“, o tada prieigą prie nuotraukų apdorojimo „VKontakte“ vartotojams iš viso pasaulio. Sprendžiant iš „Ostagram“ kodo, paskelbto „GitHub“, jį sukūrė 30 metų Nižnij Novgorodo gyventojas Sergejus Moruginas.

TJ susisiekė su projekto komercijos direktoriumi, kuris prisistatė Andrejumi. Anot jo, „Ostagram“ pasirodė prieš „Instapainting“, bet buvo įkvėpta panašaus projekto „Vipart“.

Ostagramą sukūrė grupė studentų iš N.N. Aleksejeva: 2015 m. pabaigoje atlikus pirminį bandymą siauroje draugų grupėje, buvo nuspręsta projektą paviešinti. Iš pradžių vaizdo apdorojimas buvo visiškai nemokamas, o užsidirbti buvo planuojama parduodant spausdintus paveikslus. Anot Andrejaus, didžiausia problema pasirodė spausdinimas: neuroniniu tinklu apdorotos žmonių nuotraukos retai atrodo malonios žmogaus akiai, o galutiniam klientui reikia nemažai laiko pakoreguoti rezultatą prieš dedant jį ant drobės, o tai reikalauja. dideli mašinų ištekliai.

Vaizdo apdorojimui „Ostagram“ kūrėjai norėjo pasitelkti „Amazon“ debesų serverius, tačiau po vartotojų antplūdžio paaiškėjo, kad kaštai jiems per dieną viršys tūkstantį dolerių su minimalia investicijų grąža. Andrejus, kuris taip pat yra projekto investuotojas, išsinuomojo serverių patalpas Nižnij Novgorode.

Projekto auditorija – apie tūkstantis žmonių per dieną, tačiau kai kuriomis dienomis ji siekė net 40 tūkstančių žmonių dėl perėjimų iš užsienio žiniasklaidos priemonių, kurios jau pastebėjo projektą anksčiau nei vietinės (Ostagram net pavyko bendradarbiauti su Europos didžėjais). Naktį, kai srautas mažas, vaizdo apdorojimas gali užtrukti 5 minutes, o dieną – iki valandos.

Jei anksčiau užsienio vartotojams buvo sąmoningai ribojama galimybė apdoroti vaizdą (manė pradėti monetizaciją iš Rusijos), tai dabar „Ostagram“ jau labiau skaičiuoja Vakarų auditoriją.

Iki šiol susigrąžinimo perspektyvos yra savavališkos. Jei kiekvienas vartotojas už apdorojimą sumokėtų 10 rublių, galbūt tai atsipirktų. […]

Mūsų šalyje labai sunku užsidirbti pinigų: mūsų žmonės pasiruošę laukti savaitę, bet už tai nemokės nė cento. Europiečiai tam labiau pritaria – kalbant apie mokėjimą už pagreitį, kokybės gerinimą – todėl dėmesys sutelkiamas į tą rinką.

Andrejus, Ostagram atstovas

Pasak Andrejaus, „Ostagram“ komanda kuria naują svetainės versiją, daugiau dėmesio skirdama socialumui: „Tai atrodys kaip viena gerai žinoma paslauga, bet ką daryti“. Šiuo projektu jau domėjosi „Facebook“ atstovai Rusijoje, tačiau derybos dėl pardavimo sandoris dar nepasiekė.

Aptarnavimo darbų pavyzdžiai

„Ostagram“ svetainės sklaidos kanale taip pat galite pamatyti, kokių vaizdų derinys buvo galutinis: dažnai tai yra net įdomiau nei pats rezultatas. Tokiu atveju filtrus – paveikslėlius, kurie buvo naudojami kaip apdorojimo efektas – galima išsaugoti naudojimui ateityje.

Sveikinu, Habr! Tikriausiai pastebėjote, kad šiose interneto svetainėse aktyviai diskutuojama apie nuotraukų stilizavimą įvairiems meniniams stiliams. Skaitydami visus šiuos populiarius straipsnius galite pagalvoti, kad po šių programų gaubtu vyksta magija, o neuroninis tinklas tikrai fantazuoja ir perbraižo vaizdą nuo nulio. Taip atsitiko, kad mūsų komanda susidūrė su panašia užduotimi: vidinio įmonės hakatono metu sukūrėme vaizdo įrašo stilizaciją, nes paraiška nuotraukoms jau pateikta. Šiame įraše išsiaiškinsime, kaip šis tinklas „perbraižo“ vaizdus, ​​ir analizuosime straipsnius, kurie leido tai padaryti. Rekomenduoju perskaityti paskutinį įrašą prieš skaitant šią medžiagą ir apskritai su konvoliucinių neuroninių tinklų pagrindais. Rasite keletą formulių, kažkokį kodą (pateiksiu pavyzdžius apie Theano ir Lasagne), taip pat daug nuotraukų. Šis įrašas yra išdėstytas chronologine straipsnių pasirodymo ir atitinkamai pačių idėjų tvarka. Kartais ją atskiedu mūsų naujausia patirtimi. Štai vaikinas iš pragaro jūsų dėmesiui.


Konvoliucinių tinklų vizualizavimas ir supratimas (2013 m. lapkričio 28 d.)

Visų pirma, verta paminėti straipsnį, kuriame autoriai sugebėjo parodyti, kad neuroninis tinklas yra ne juodoji dėžė, o visiškai interpretuojamas dalykas (beje, šiandien tai galima pasakyti ne tik apie konvoliucinius tinklus kompiuteriui vizija). Autoriai nusprendė išmokti interpretuoti neuronų aktyvavimą paslėptuose sluoksniuose, tam panaudoję dekonvoliucijos neuroninį tinklą (deconvnet), pasiūlytą prieš kelerius metus (beje, to paties Seilerio ir Ferguso, kurie yra ir 2010 m. šį leidinį). Dekonvoliucinis tinklas iš tikrųjų yra tas pats tinklas su konvoliucijomis ir telkiniais, tačiau taikomas atvirkštine tvarka. Pradiniame deconvnet darbe tinklas buvo naudojamas neprižiūrimo mokymosi režimu vaizdams generuoti. Šį kartą autoriai jį pritaikė tiesiog norėdami pereiti nuo funkcijų, gautų po perdavimo į priekį per tinklą, į pradinį vaizdą. Dėl to gaunamas vaizdas, kurį galima interpretuoti kaip signalą, sukėlusį šį neuronų aktyvavimą. Natūralu, kad kyla klausimas: kaip padaryti atvirkštinį judėjimą per konvoliuciją ir netiesiškumą? Ir juo labiau per max-pooling, tai tikrai nėra atvirkštinė operacija. Pažvelkime į visus tris komponentus.

Reverse ReLu

Konvoliuciniuose tinkluose dažnai naudojama aktyvinimo funkcija ReLu (x) = maks (0, x) dėl to visi sluoksnio aktyvavimai nėra neigiami. Atitinkamai, grįžtant per netiesiškumą, taip pat reikia gauti neneigiamus rezultatus. Tam autoriai siūlo naudoti tą patį ReLu. „Theano“ architektūros požiūriu reikia nepaisyti operacijos gradiento funkcijos (be galo vertinga užrašų knygelė yra lazanijos receptuose, iš ten galite gauti išsamią informaciją apie tai, kas yra „ModifiedBackprop“ klasė).

Klasė ZeilerBackprop (ModifiedBackprop): def grad (self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd> 0) .astype (inp.dtype),) # aiškiai ištaisyti return (self.nonlinearity (grd),) # naudokite nurodytą netiesiškumą

Atvirkštinė konvoliucija

Čia yra šiek tiek sudėtingiau, bet viskas logiška: užtenka pritaikyti transponuotą tos pačios konvoliucijos branduolio versiją, bet išvestims iš atvirkštinio ReLu, o ne ankstesniame sluoksnyje, naudojamoje į priekį. Bet bijau, kad žodžiais tai nėra taip akivaizdu, pažiūrėkime į šios procedūros vizualizaciją (rasite dar daugiau konvoliucijos vizualizacijų).


Konvoliucija su žingsniu = 1

Konvoliucija su žingsniu = 1 Atvirkštinė versija

Konvoliucija su žingsniu = 2

Konvoliucija su žingsniu = 2 Atvirkštinė versija

Atvirkštinis telkimas

Ši operacija (skirtingai nuo ankstesnių), paprastai kalbant, nėra apverčiama. Bet vis tiek norėtume per grįžtamąjį pravažiavimą kokiu nors būdu pereiti maksimumą. Tam autoriai siūlo naudoti žemėlapį, kur buvo daugiausiai tiesioginio pravažiavimo metu (maks. vietos jungikliai). Atbulinės eigos metu įvesties signalas atjungiamas taip, kad maždaug išliktų pradinio signalo struktūra, jį pamatyti tikrai lengviau nei aprašyti.



Rezultatas

Vizualizacijos algoritmas yra labai paprastas:

  1. Atlikite tiesioginį perdavimą.
  2. Pasirinkite mus dominantį sluoksnį.
  3. Ištaisykite vieno ar kelių neuronų aktyvavimą ir iš naujo nustatykite likusius.
  4. Padarykite priešingą išvadą.

Kiekvienas pilkas kvadratas toliau pateiktame paveikslėlyje atitinka filtro (kuris naudojamas konvoliucijai) atvaizdavimą arba vieno neurono svorį, o kiekvienas spalvotas vaizdas yra ta pirminio vaizdo dalis, kuri aktyvuoja atitinkamą neuroną. Aiškumo dėlei neuronai viename sluoksnyje yra sugrupuoti į temines grupes. Apskritai staiga paaiškėjo, kad neuroninis tinklas sužino būtent tai, apie ką Hubelis ir Weiselis rašė savo darbuose apie regos sistemos struktūrą, už kurį 1981 m. buvo apdovanoti Nobelio premija. Šio straipsnio dėka mes gavome vaizdinį vaizdą, ką konvoliucinis neuroninis tinklas išmoksta kiekviename sluoksnyje. Būtent šios žinios leis vėliau manipuliuoti generuojamo vaizdo turiniu, tačiau iki to dar toli, ateinantys keleri metai buvo skirti neuroninių tinklų „trepanavimo“ metodams tobulinti. Be to, straipsnio autoriai pasiūlė būdą analizuoti, kaip geriausia sukurti konvoliucinio neuroninio tinklo architektūrą, kad būtų pasiekti geriausi rezultatai (nors ir nelaimėjo ImageNet 2013, bet pateko į viršų; UPD: pasirodo, jie laimėjo, Clarifai jie yra).


Funkcijų vizualizacija


Čia yra aktyvinimo vizualizavimo naudojant deconvnet pavyzdys, šiandien šis rezultatas atrodo toks, bet tada tai buvo proveržis.


Ryškumo žemėlapiai naudojant deconvnet

„Deep Inside Convolutional Networks“: vaizdų klasifikavimo modelių ir aktualumo žemėlapių vizualizavimas (2014 m. balandžio 19 d.)

Šis straipsnis skirtas žinių, esančių konvoliuciniame neuroniniame tinkle, vizualizavimo metodų tyrimui. Autoriai siūlo du atvaizdavimo būdus, pagrįstus gradiento nusileidimu.

Klasės modelio vizualizacija

Taigi įsivaizduokite, kad turime išmokytą neuroninį tinklą, kad išspręstume tam tikro klasių skaičiaus klasifikavimo problemą. Pažymime išėjimo neurono aktyvavimo reikšmę, kuri atitinka klasę c... Tada ši optimizavimo problema suteikia mums tiksliai vaizdą, kuris maksimaliai padidina pasirinktą klasę:



Šią užduotį lengva išspręsti naudojant Theano. Paprastai mes prašome karkaso paimti išvestinę iš modelio parametrų, tačiau šį kartą darome prielaidą, kad parametrai yra fiksuoti, o išvestinė paimama iš įvesties vaizdo. Ši funkcija parenka didžiausią išvesties sluoksnio reikšmę ir grąžina funkciją, kuri apskaičiuoja išvestinę iš įvesties vaizdo.


def compile_saliency_function (net): "" "Sudaro funkciją, skirtą tam tikros įvesties vaizdų minipartijos ryškumo žemėlapiams ir numatomoms klasėms apskaičiuoti." "" inp = net ["input"]. input_var outp = lasagne.layers.get_output (net ["fc8"], deterministinis = tiesa) max_outp = T.max (outp, axis = 1) akivaizdumas = theano.grad (max_outp.sum (), wrt = inp) max_class = T.argmax (outp, axis = 1) grąžinti theano.function (,)

Tikriausiai internete matėte keistus šunų veidus – „DeepDream“. Pradiniame straipsnyje autoriai naudoja šį procesą, kad sukurtų vaizdus, ​​​​kurie maksimaliai padidina pasirinktą klasę:

  1. Pradinį vaizdą inicijuokite nuliais.
  2. Iš šio paveikslėlio apskaičiuokite išvestinės vertę.
  3. Pakeiskite vaizdą, pridėdami gautą vaizdą iš išvestinės prie jo.
  4. Grįžkite į 2 veiksmą arba išeikite iš ciklo.

Gauti vaizdai yra:




Ką daryti, jei pirmą vaizdą inicijuosime tikra nuotrauka ir pradėsime tą patį procesą? Bet kiekvienoje iteracijoje mes pasirinksime atsitiktinę klasę, iš naujo nustatysime likusią dalį ir apskaičiuosime išvestinės vertę, tada gausime tokį gilų sapną.


Atsargiai 60 MB


Kodėl tiek daug šunų veidų ir akių? Tai paprasta: 1000 klasių įvaizdyje yra beveik 200 šunų, jie turi akis. Taip pat yra daug klasių, kuriose yra tiesiog žmonės.

Klasės išskirtinumo ištraukimas

Jei šį procesą inicijuosime tikra nuotrauka, po pirmos iteracijos sustosime ir nubrėžsime išvestinės reikšmę, tada gausime tokį vaizdą, kurį pridėję prie pradinio, padidinsime pasirinktos klasės aktyvavimo reikšmę.


Ryškumo žemėlapiai naudojant išvestinę priemonę


Vėlgi rezultatas yra „taip ir taip“. Svarbu pažymėti, kad tai yra naujas būdas vizualizuoti aktyvacijas (niekas netrukdo mums nustatyti aktyvinimo reikšmių ne paskutiniame sluoksnyje, o apskritai bet kuriame tinklo sluoksnyje ir paimti išvestinę iš įvesties vaizdo) . Kitame straipsnyje bus sujungti abu ankstesni metodai ir pateikiamas įrankis, kaip pritaikyti stiliaus perkėlimą, kuris bus aprašytas vėliau.

Paprastumo siekimas: visas konvoliucinis tinklas (2015 m. balandžio 13 d.)

Paprastai kalbant, šis straipsnis ne apie vizualizaciją, o apie tai, kad pakeitus telkinį konvoliucija su dideliu žingsniu kokybė neprarandama. Tačiau kaip šalutinis tyrimo produktas, autoriai pasiūlė naują būdą vizualizuoti ypatybes, kurias naudojo tiksliau analizuoti tai, ko modelis išmoksta. Jų idėja yra tokia: jei paimsime tik išvestinę, tada dekonvoliucijos metu tos savybės, kurios įvesties vaizde buvo mažesnės už nulį, nebegrįžta (įvesties vaizdui naudojant ReLu). Ir tai lemia tai, kad skleidžiamame galiniame vaizde atsiranda neigiamos reikšmės. Kita vertus, jei naudojate „deconvnet“, tada iš „ReLu“ darinio paimamas kitas „ReLu“ - tai leidžia neperduoti neigiamų verčių atgal, tačiau, kaip matėte, rezultatas yra „so-so“. Bet ką daryti, jei derinsite šiuos du metodus?




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

Tada gauni visiškai švarų ir interpretuojamą vaizdą.


Ryškumo žemėlapiai naudojant vadovaujamą atgalinį propagavimą

Eik gilyn

Dabar pagalvokime, ką tai mums duoda? Leiskite jums priminti, kad kiekvienas konvoliucinis sluoksnis yra funkcija, kuri kaip įvestį gauna trimatį tenzorių ir taip pat išveda trimatį tenzorių, galbūt kitokio matmens. d x w x h; d epth yra neuronų skaičius sluoksnyje, kiekvienas iš jų sukuria ypatybių dydžio žemėlapį w igth x h aštuoni.


Išbandykime šį eksperimentą VGG-19 tinkle:



conv1_2

Beveik nieko nematote, tk. priimamasis plotas labai mažas, tai antrasis posūkis 3x3, atitinkamai bendras plotas 5x5. Bet jei priartinsime, pamatysime, kad ši funkcija yra tik gradiento detektorius.




conv3_3


conv4_3


conv5_3


baseinas5


Dabar įsivaizduokime, kad vietoj maksimumo per plokštę iš įvesties vaizdo paimsime visų plokštės elementų sumos vertės išvestinę. Tada akivaizdžiai jautri neuronų grupės sritis apims visą įvesties vaizdą. Ankstyviesiems sluoksniams matysime ryškius žemėlapius, iš kurių darome išvadą, kad tai yra spalvų detektoriai, tada gradientai, tada kraštinės ir taip toliau sudėtingų raštų kryptimi. Kuo gilesnis sluoksnis, tuo vaizdas bus blankesnis. Tai paaiškinama tuo, kad gilesni sluoksniai turi sudėtingesnį modelį, kurį jie aptinka, o sudėtingas modelis pasirodo rečiau nei paprastas, todėl aktyvinimo žemėlapis išnyksta. Pirmasis metodas tinka suprasti sluoksnius su sudėtingais raštais, o antrasis - tik paprastiems.


conv1_1


conv2_2


conv4_3


Galite atsisiųsti išsamesnę kelių vaizdų ir aktyvinimo duomenų bazę.

Neuroninis meninio stiliaus algoritmas (2015 m. rugsėjo 2 d.)

Taigi, praėjo pora metų nuo pirmojo sėkmingo neuroninio tinklo trepanavimo. Mes (žmoniškumo prasme) savo rankose turime galingą įrankį, leidžiantį suprasti, ko neuroninis tinklas mokosi, o taip pat pašalinti tai, ko tikrai nenorėtume. Šio straipsnio autoriai kuria metodą, leidžiantį vienam vaizdui sukurti panašų aktyvinimo žemėlapį kuriam nors tiksliniam vaizdui, o gal net daugiau nei vienam – tai yra stiliaus pagrindas. Į įvestį tiekiame baltą triukšmą ir panašiu iteraciniu procesu, kaip ir giliame sapne, sukuriame šį vaizdą su funkcijų žemėlapiais, panašiais į tikslinį vaizdą.

Turinio praradimas

Kaip jau minėta, kiekvienas neuroninio tinklo sluoksnis sukuria tam tikros dimensijos trimatį tenzorių.




Pažymime išvestį i-tas sluoksnis iš įvesties as. Tada, jei sumažinsime svertinę likučių sumą tarp įvesties vaizdo ir kažkokį įvaizdį, kurio siekiame c, tada gausite būtent tai, ko jums reikia. Tikriausiai.



Norėdami eksperimentuoti su šiuo straipsniu, galite naudoti šį stebuklingą nešiojamąjį kompiuterį, ten atliekami skaičiavimai (tiek GPU, tiek CPU). GPU naudojamas neuroninio tinklo savybėms ir kaštų funkcijos vertei apskaičiuoti. Theano išleidžia funkciją, kuri gali apskaičiuoti tikslo funkcijos gradientą eval_grad pagal įvesties vaizdą x... Tada tai įtraukiama į lbfgs ir pradedamas kartotinis procesas.


# Inicijuoti naudojant triukšmo vaizdą genered_image.set_value (floatX (np.random.uniform (-128, 128, (1, 3, IMAGE_W, IMAGE_W)))) x0 = genered_image.get_value (). Astype ("float64") xs = xs.append (x0) # Optimizuokite, periodiškai išsaugodami i rezultatą diapazone (8): spausdinkite (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)

Jei vykdysime tokios funkcijos optimizavimą, greitai gausime vaizdą, panašų į tikslinį. Dabar galime atkurti vaizdus iš balto triukšmo, kurie atrodo kaip koks nors turinio vaizdas.


Turinio praradimas: conv4_2



Optimizavimo procesas




Nesunku pamatyti dvi gauto vaizdo ypatybes:

  • spalvos buvo prarastos - tai yra dėl to, kad konkrečiame pavyzdyje buvo naudojamas tik sluoksnis conv4_2 (arba, kitaip tariant, svoris w su juo buvo ne nulis, o likusiems sluoksniams jis buvo lygus nuliui); kaip pamenate, būtent ankstyvuosiuose sluoksniuose yra informacija apie spalvas ir gradiento perėjimus, o vėlesniuose – apie didesnes detales, kurias stebime – spalvos prarandamos, o turinys ne;
  • kai kurie namai „išvažiavo“, tai yra, tiesios linijos yra šiek tiek išlenktos – taip yra todėl, kad kuo gilesnis sluoksnis, tuo mažiau informacijos apie objekto erdvinę padėtį (konvoliucijos ir telkinių naudojimo rezultatas).

Ankstyvųjų sluoksnių pridėjimas iš karto pataiso spalvų situaciją.


Turinio praradimas: conv1_1, conv2_1, conv4_2


Tikimės, kad šiuo metu jausite, kad galite valdyti tai, kas bus perpiešta baltojo triukšmo vaizde.

Stiliaus praradimas

O dabar priėjome prie įdomiausio dalyko: kaip galime perteikti stilių? Kas yra stilius? Akivaizdu, kad stilių optimizavome ne turinio praradime, nes jame yra daug informacijos apie objektų erdvines padėtis, todėl pirmiausia reikia kažkaip pašalinti šią informaciją iš rodinių, gaunamų kiekviename sluoksnyje.


Autorius siūlo tokį metodą. Paimkite tenzorių prie išėjimo iš tam tikro sluoksnio, išskleiskite jį išilgai erdvinių koordinačių ir apskaičiuokite kovariacijos matricą tarp štampų. Pažymėkime šią transformaciją kaip G... Ką mes iš tikrųjų padarėme? Galima sakyti, kad apskaičiavome, kaip dažnai ypatybės plokštės viduje randamos poromis, arba, kitaip tariant, aproksimavome požymių pasiskirstymą daugiamačio normaliojo skirstinio plokštelėse.




Tada Style Loss pristatomas taip, kur s- tai šiek tiek stiliaus vaizdas:



Pabandykime dėl Vincento? Iš esmės gausime tai, ko tikėjomės – Van Gogho stiliaus triukšmas, informacija apie erdvinį funkcijų išdėstymą visiškai prarasta.


Vincentas




Bet ką daryti, jei vietoj stilizuoto vaizdo įdėsite nuotrauką? Gausite jau pažįstamas savybes, pažįstamas spalvas, tačiau erdvinė padėtis visiškai prarasta.


Nuotrauka praradus stilių


Tikrai susimąstėte, kodėl mes skaičiuojame kovariacijos matricą, o ne ką nors kita? Galų gale, yra daug būdų, kaip agreguoti ypatybes, kad būtų prarastos erdvinės koordinatės. Tai tikrai atviras klausimas, ir jei imsitės kažko labai paprasto, rezultatas kardinaliai nepasikeis. Patikrinkim tai ne kovariacijos matricą skaičiuosime, o tiesiog kiekvienos plokštelės vidutinę reikšmę.




paprasto stiliaus praradimas

Kombinuotas praradimas

Natūralu, kad yra noras sumaišyti šias dvi sąnaudų funkcijas. Tada iš balto triukšmo sugeneruosime tokį vaizdą, kad jame būtų išsaugoti turinio vaizdo objektai (turintys susiejimą su erdvinėmis koordinatėmis), taip pat bus "stiliaus" ypatybės, nesusietos su erdvinėmis koordinatėmis, t.y. tikimės, kad turinio vaizdo detalės išliks nepakitusios, bet perpieštos norimu stiliumi.



Tiesą sakant, yra ir reguliatorius, bet paprastumo dėlei jį praleisime. Belieka atsakyti į tokį klausimą: kokius sluoksnius (svorius) naudoti optimizavimui? Ir aš bijau, kad atsakymo į šį klausimą neturiu aš, kaip ir straipsnio autoriai. Jie turi pasiūlymą naudoti šiuos dalykus, tačiau tai nereiškia, kad kitas derinys veiks prasčiau, per didelė paieškos erdvė. Vienintelė taisyklė, išplaukianti suprantant modelį: nėra prasmės imti gretimų sluoksnių, nes jų ženklai nedaug skirsis vienas nuo kito, todėl į stilių pridedamas sluoksnis iš kiekvienos konv * _1 grupės.


# Apibrėžkite praradimo funkcijos nuostolius = # turinio praradimo nuostoliai.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 (meno_savybės, gen_features, "conv2_1")) losses.append (0.2e6 * style_loss (meno_savybės, gen_features, "conv3_1")) losses.append (0.2e6 * style_loss (meno_savybės, "konv4_1") ) losses.append (0.2e6 * style_loss (art_features, gen_features, "conv5_1")) # total variation sankcija.append (0.1e-7 * total_variation_loss (generated_image)) total_loss = suma (nuostoliai)

Galutinį modelį galima pavaizduoti taip.




O štai namų su Van Goghu rezultatas.



Bandymas kontroliuoti procesą

Prisiminkime ankstesnes dalis, dar prieš dvejus metus iki dabartinio straipsnio kiti mokslininkai tyrinėjo, ko iš tikrųjų išmoksta neuroninis tinklas. Apsiginklavę visais šiais straipsniais galite generuoti skirtingų stilių, skirtingų vaizdų, skirtingos skiriamosios gebos ir dydžių ypatybių vizualizacijas ir pabandyti išsiaiškinti, kokius sluoksnius su kokiu svoriu paimti. Tačiau net ir persvėrus sluoksnius negalima visiškai kontroliuoti to, kas vyksta. Problema čia labiau konceptuali: optimizuojame netinkamą funkciją! Kaip taip, klausiate? Atsakymas paprastas: ši funkcija sumažina likutį... suprasite. Tačiau mes tikrai norime, kad vaizdas mums patiktų. Išgaubtas turinio ir stiliaus praradimo funkcijų derinys nėra matas, ką mūsų protas laiko gražiu. Pastebėta, kad jei stilizuoti tęsiate per ilgai, savikainos funkcija natūraliai krenta vis žemiau, tačiau rezultato estetinis grožis smarkiai krenta.




Na, gerai, yra kita problema. Tarkime, kad radome sluoksnį, kuris išskiria mums reikalingas funkcijas. Tarkime, kai kurios tekstūros yra trikampės. Tačiau šiame sluoksnyje vis dar yra daug kitų funkcijų, pavyzdžiui, apskritimai, kurių mes tikrai nenorime matyti gautame paveikslėlyje. Paprastai tariant, jei būtų galima pasamdyti milijoną kinų, tai būtų galima vizualizuoti visas stiliaus įvaizdžio ypatybes, o žiauria jėga tiesiog pažymėti tuos, kurių mums reikia, ir įtraukti juos tik į kaštų funkciją. Tačiau dėl akivaizdžių priežasčių tai nėra taip paprasta. Bet ką daryti, jei iš stiliaus vaizdo tiesiog pašalinsime apskritimus, kurių nenorime matyti rezultate? Tada atitinkamų neuronų, kurie reaguoja į apskritimus, aktyvavimas tiesiog neveiks. Ir, žinoma, tada tai nebus rodoma gautame paveikslėlyje. Tas pats ir su gėlėmis. Įsivaizduokite ryškų vaizdą su daugybe spalvų. Spalvų pasiskirstymas bus labai išteptas visoje erdvėje, toks pat bus ir gauto vaizdo pasiskirstymas, tačiau optimizavimo procese greičiausiai bus prarastos smailės, kurios buvo originale. Paaiškėjo, kad tiesiog sumažinus spalvų paletės bitų gylį ši problema išsprendžiama. Daugumos spalvų tankis bus artimas nuliui, o keliose srityse bus didelės smailės. Taigi, manipuliuodami originalu „Photoshop“, manipuliuojame funkcijomis, išskirtomis iš vaizdo. Žmogui lengviau vaizdžiai išreikšti savo norus, nei bandyti juos suformuluoti matematikos kalba. Ate. Dėl to dizaineriai ir vadybininkai, apsiginklavę „Photoshop“ ir funkcijoms vizualizuoti skirtais scenarijais, rezultatų pasiekė tris kartus greičiau nei matematikai ir programuotojai.


Pavyzdys, kaip manipuliuoti elementų spalva ir dydžiu


Arba galite paimti paprastą vaizdą kaip stilių.



rezultatus








O štai vidosik, bet tik reikiamos tekstūros

Tekstūrų tinklai: tekstūrų ir stilizuotų vaizdų sintezė į priekį (2016 m. kovo 10 d.)

Atrodo, kad prie šio, jei ne vieno niuanso, buvo galima sustoti. Aukščiau pateiktas stiliaus algoritmas trunka labai ilgai. Jei pasirinksite diegimą, kai lbfgs paleidžiamas CPU, procesas trunka apie penkias minutes. Jei perrašysime taip, kad optimizavimas eitų į GPU, tai procesas užtruks 10-15 sekundžių. Tai nieko gero. Galbūt apie tai galvojo ir šio, ir kito straipsnio autoriai. Abu leidiniai buvo išleisti atskirai 17 dienų skirtumu, praėjus beveik metams po ankstesnio straipsnio. Dabartinio straipsnio autoriai, kaip ir ankstesnio, užsiėmė tekstūrų generavimu (jei tik iš naujo nustatysite Style Loss į kažką panašaus, jums pasiseks). Jie pasiūlė optimizuoti ne vaizdą, gautą iš baltojo triukšmo, o tam tikrą neuroninį tinklą, kuris generuoja stilizuotą vaizdą.




Dabar, jei stiliaus kūrimo procesas neapima optimizavimo, reikia atlikti tik perdavimą į priekį. O optimizuoti reikia tik vieną kartą norint apmokyti generatorių tinklą. Šiame straipsnyje naudojamas hierarchinis generatorius, kur kiekvienas kitas z dydis didesnis nei ankstesnis ir yra paimtas iš triukšmo tekstūros generavimo atveju ir iš tam tikro vaizdų pagrindo, skirto stilisto mokymui. Labai svarbu naudoti ką nors kita nei imajneto mokymo dalis, nes nuostolių tinklo ypatybes apskaičiuoja tinklas, apmokytas tik mokymo dalyje.



Suvokimo praradimas dėl stiliaus perkėlimo realiuoju laiku ir itin didele raiška (2016 m. kovo 27 d.)

Kaip rodo pavadinimas, autoriai, kurie vos 17 dienų vėlavo su generuojančio tinklo idėja, buvo užsiėmę vaizdo raiškos didinimu. Atrodo, kad juos įkvėpė likusio mokymosi sėkmė naudojant naujausią imagnetą.




Atitinkamai likutinis blokas ir konv blokas.



Taigi, dabar mūsų rankose, be stiliaus valdymo, turime greitą generatorių (dėl šių dviejų straipsnių, vieno vaizdo generavimo laikas matuojamas dešimtimis ms).

Pabaiga

Mes panaudojome informaciją iš peržiūrėtų straipsnių ir autorių kodą kaip atspirties tašką kurdami kitą stiliaus programą pirmajai vaizdo įrašų stiliaus programai:



Sukuria kažką panašaus.


Pačiose įprastose nuotraukose atsiranda daugybė ir nelabai išsiskiriančių subjektų. Dažniausiai dėl tam tikrų priežasčių šunys. Internetas tokiais vaizdais pradėjo pildytis 2015 m. birželį, kai buvo paleista Google DeepDream – viena pirmųjų atvirų paslaugų, pagrįstų vaizdų apdorojimo neuroniniais tinklais.

Tai vyksta maždaug taip: algoritmas analizuoja nuotraukas, randa jose fragmentus, primenančius jam pažįstamus objektus – ir pagal šiuos duomenis iškraipo vaizdą.

Iš pradžių projektas buvo paskelbtas atvirojo kodo forma, o vėliau internete pasirodė internetinės paslaugos, sukurtos pagal tuos pačius principus. Vienas patogiausių ir populiariausių yra „Deep Dream Generator“: nedidelės nuotraukos apdorojimas čia užtrunka tik apie 15 sekundžių (anksčiau naudotojams tekdavo laukti daugiau nei valandą).

Kaip neuroniniai tinklai išmoksta kurti tokius vaizdus? Ir kodėl, beje, jie taip vadinami?

Pagal savo dizainą neuroniniai tinklai imituoja tikrus gyvo organizmo neuroninius tinklus, tačiau tai daro naudodami matematinius algoritmus. Sukūrę pagrindinę struktūrą, galite ją išmokyti naudodami mašininio mokymosi metodus. Jei kalbame apie modelio atpažinimą, per neuroninį tinklą reikia perduoti tūkstančius vaizdų. Jei neuroninio tinklo užduotis kitokia, tai ir treniruočių pratimai skirsis.

Pavyzdžiui, žaidimo šachmatais algoritmai analizuoja šachmatų žaidimus. Taip pat „Google DeepMind“ AlphaGo algoritmas įtrauktas į kinų žaidimą „go“, kuris buvo vertinamas kaip proveržis, nes „go“ yra daug sudėtingesnis ir netiesinis nei šachmatai.

    Galite žaisti su supaprastintu neuroninio tinklo modeliu ir geriau suprasti jo principus.

    „Youtube“ taip pat yra daugybė lengvai skaitomų ritinėliai apie tai, kaip veikia neuroniniai tinklai.

Dar viena populiari paslauga – Dreamscope, kuri gali ne tik svajoti apie šunis, bet ir imituoti įvairius tapybos stilius. Vaizdo apdorojimas čia taip pat labai paprastas ir greitas (apie 30 sekundžių).

Regis, algoritminė paslaugos dalis yra „Neural style“ programos modifikacija, kurią jau aptarėme.

Visai neseniai pasirodė programa, kuri tikroviškai nuspalvina juodai baltus vaizdus. Ankstesnėse versijose panašios programos kur kas prasčiau atliko savo užduotį ir buvo laikomas didžiuliu pasiekimu, jei bent 20% žmonių nesugebėjo atskirti tikro vaizdo nuo kompiuterio spalvoto vaizdo.

Be to, spalvinimas čia užtrunka tik apie 1 minutę.

Ta pati kūrėjų įmonė taip pat pristatė paslaugą, kuri nuotraukose atpažįsta įvairių tipų objektus.

Šios paslaugos gali atrodyti kaip tik smagi pramoga, tačiau iš tikrųjų viskas yra daug įdomiau. Naujos technologijos patenka į žmogaus menininkų praktiką ir keičia mūsų supratimą apie meną. Greičiausiai žmonės netrukus turės konkuruoti su mašinomis kūrybiškumo srityje.

Vaizdo atpažinimo algoritmų mokymas yra užduotis, su kuria dirbtinio intelekto kūrėjai kovojo ilgą laiką. Todėl programas, kurios spalvina senus paveikslus ir piešia šunis danguje, galima laikyti didesnio ir labiau intriguojančio proceso dalimi.