Neuroninis tinklas piešia paveikslus. Ostagram: neuroniniu tinklu pagrįsta paslauga, sujungianti nuotraukas ir ornamentus į meno šedevrus

Nuo 2015 m. rugpjūčio mėn. vokiečių mokslininkai iš Tiubingeno universiteto pristatė savo nuomonę apie stiliaus perkėlimo galimybę žinomų menininkų kitose nuotraukose pradėjo matytis paslaugos, kurios uždirbo iš šios galimybės. Jis pasirodė Vakarų rinkoje, o Rusijos rinkoje - visa jo kopija.

Į žymes

Nepaisant to, kad „Ostagram“ pasirodė gruodį, balandžio viduryje ji greitai pradėjo populiarėti socialiniuose tinkluose. Tuo pačiu metu, balandžio 19 d., „VKontakte“ projekte 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, kurį norite uždėti ant originalaus paveikslėlio.

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

Yra dvi mokamos versijos: „Premium“ sukuria vaizdą iki 700 pikselių išilgai ilgiausios pusės 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 šią paslaugą su pristatymu nuo 1800 rublių.

Vasario mėnesį „Ostagram“ atstovai nepriims prašymų apdoroti vaizdus 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ė komercijos direktorius projektą, kurį pristatė Andrejus. Anot jo, „Ostagram“ pasirodė prieš „Instapainting“, bet buvo įkvėpta panašaus projekto „Vipart“.

Ostagramą sukūrė NNSTU studentų grupė. Alekseeva: 2015 m. pabaigoje atlikę pirminius bandymus siauroje draugų grupėje, jie nusprendė paviešinti projektą. Iš pradžių vaizdų apdorojimas buvo visiškai nemokamas, užsidirbti planuota parduodant spausdintus paveikslus. Anot Andrejaus, didžiausia problema pasirodė spausdinimas: neuroniniu tinklu apdorotos žmonių nuotraukos retai atrodo malonios žmogaus akiai, o galutiniam klientui reikia ilgai koreguoti rezultatą, prieš jį dedant ant drobės. reikalauja daug mašinų resursų.

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

Projekto auditorija – apie tūkstantį žmonių per dieną, tačiau kai kuriomis dienomis ji siekė 40 tūkstančių žmonių dėl perėjimų iš užsienio žiniasklaidos, kuri projektą jau buvo pastebėjusi anksčiau nei vietinė (Ostagram net spėjo 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ą (manoma pradėti monetizuoti iš Rusijos), tai dabar „Ostagram“ jau labiau pasitiki Vakarų auditorija.

Iki šiol atsipirkimo perspektyvos yra sąlyginės. Jei kiekvienas vartotojas sumokėtų 10 rublių už apdorojimą, galbūt tai atsipirktų. […]

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

Andrejus, Ostagram atstovas

Pasak Andrejaus, „Ostagram“ komanda dirba nauja versija svetainė, kurioje didelis dėmesys skiriamas socialumui: „Tai atrodys kaip viena gerai žinoma paslauga, bet ką daryti“. „Facebook“ atstovai Rusijoje jau domėjosi šiuo projektu, tačiau sandoris dar nepasiektas derybų dėl pardavimo.

Serviso darbų pavyzdžiai

„Ostagram“ svetainės sklaidos kanale taip pat galite pamatyti, koks vaizdų derinys lėmė galutinius kadrus: dažnai tai yra net įdomiau nei pats rezultatas. Tuo pačiu metu filtrai – nuotraukos, naudojamos kaip apdorojimo efektas – gali būti išsaugotos tolesniam naudojimui.

Sveikinimai, Habr! Tikrai pastebėjote, kad nuotraukų stiliaus tema yra įvairi meniniai stiliai aktyviai diskutavo šiuose jūsų internetuose. 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ų komandai teko susidurti su panašia užduotimi: kaip dalis įmonės vidinio hakatono, sukūrėme vaizdo stilių, nes. jau buvo programėlė nuotraukoms. Šiame įraše apžvelgsime, kaip tinklas „perbraižo“ vaizdus, ​​ir pažvelgsime į straipsnius, kurie leido tai padaryti. Rekomenduoju prieš skaitant šią medžiagą susipažinti su paskutiniu įrašu ir apskritai su konvoliucinių neuroninių tinklų pagrindais. Rasite keletą formulių, kodą (pateiksiu pavyzdžius apie Theano ir Lasagne), taip pat daug nuotraukų. Šis įrašas yra įmontuotas chronologinė tvarka straipsnių išvaizda ir atitinkamai pačios idėjos. Kartais ją atskiedu mūsų naujausia patirtimi. Štai berniukas iš pragaro už dėmesį.


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 nėra juodoji dėžė, o gana interpretuojamas dalykas (beje, šiandien tai galima pasakyti ne tik apie konvoliucinius tinklus kompiuteriui vizija). Autoriai nusprendė išmokti interpretuoti paslėptų sluoksnių neuronų aktyvacijas, tam panaudoję prieš kelerius metus pasiūlytą dekonvoliucinį neuronų tinklą (deconvnet) (beje, to paties Zeilerio ir Ferguso, kurie yra ir šios publikacijos autoriai kaip). gerai). Dekonvoliucinis tinklas iš tikrųjų yra tas pats tinklas, kurio konvoliucijos ir telkiniai taikomi atvirkštine tvarka. Originalus darbas su deconvnet naudojo tinklą neprižiūrimo mokymosi režimu vaizdams generuoti. Šį kartą autoriai jį panaudojo tiesiog norėdami pakeisti ypatybes, gautas po perdavimo per tinklą į pirminį vaizdą. Rezultatas yra 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), todėl visi sluoksnio aktyvavimai nėra neigiami. Atitinkamai, grįžtant per netiesiškumą, taip pat būtina gauti neneigiamus rezultatus. Tam autoriai siūlo naudoti tą patį ReLu. Theano architektūros požiūriu būtina nepaisyti operacijos gradiento funkcijos (be galo vertingas sąsiuvinis yra lazanijos receptuose, iš ten sužinosite, 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 viskas yra šiek tiek sudėtingiau, bet viskas logiška: užtenka pritaikyti perkeltą to paties 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 vingių vizualizacijų).


Konvoliucija, kai žingsnis = 1

Konvoliucija, kai žingsnis = 1 atvirkštinė versija

Konvoliucija, kai žingsnis = 2

Konvoliucija, kai žingsnis = 2 atvirkštinė versija

Atvirkštinis telkimas

Ši operacija (skirtingai nuo ankstesnių) paprastai nėra apverčiama. Bet vis tiek norėtume kažkaip pravažiuoti maksimumą važiuojant atbuline eiga. Norėdami tai padaryti, autoriai siūlo naudoti žemėlapį, kur daugiausia buvo tiesioginio pravažiavimo metu (maksimalus vietos jungikliai). Atbulinės eigos metu įvesties signalas transformuojamas į išjungimą taip, kad maždaug išliktų pirminio signalo struktūra, tai pamatyti tikrai lengviau nei čia 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 išvadą.

Kiekvienas pilkas kvadratas toliau pateiktame paveikslėlyje atitinka filtro vizualizaciją (kuris taikomas konvoliucijai) arba vieno neurono svorius, ir kiekvienas spalvotas paveikslas yra ta pirminio vaizdo dalis, kuri aktyvuoja atitinkamą neuroną. Siekiant aiškumo, viename sluoksnyje esantys neuronai yra sugrupuoti į teminės grupės. Apskritai staiga paaiškėjo, kad neuroninis tinklas sužino būtent tai, apie ką Hubelis ir Weiselis rašė savo darbuose apie regėjimo sistemos struktūrą, už kurį buvo apdovanoti. Nobelio premija 1981 metais. Šio straipsnio dėka gavome vaizdinį vaizdą, ką konvoliucinis neuroninis tinklas išmoksta kiekviename sluoksnyje. Būtent šios žinios leis vėliau manipuliuoti sugeneruoto vaizdo turiniu, tačiau iki to dar toli, ateinantys keleri metai atiteko neuroninių tinklų „trepanacijos“ metodų tobulinimui. Be to, straipsnio autoriai pasiūlė būdą išanalizuoti, kaip geriausiai sukurti konvoliucinio neuroninio tinklo architektūrą, kad geriausi rezultatai(tačiau jie nelaimėjo „ImageNet 2013“, bet pateko į viršų; UPD: pasirodo, jie laimėjo, Clarifai yra tai, kas jie yra).


Funkcijų vizualizacija


Čia yra aktyvinimo vizualizavimo naudojant deconvnet pavyzdys, šiandien šis rezultatas jau 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ų vizualizavimo metodų, esančių konvoliuciniame neuroniniame tinkle, tyrimui. Autoriai siūlo du vizualizacijos metodus, pagrįstus gradiento nusileidimu.

Klasės modelio vizualizacija

Taigi įsivaizduokite, kad turime išmokytą neuroninį tinklą, kad išspręstume klasifikavimo į tam tikrą skaičių klasių problemą. Pažymėkite kaip klasę atitinkančio išvesties neurono aktyvavimo vertę 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 modelio parametrų išvestinę, tačiau šį kartą darome prielaidą, kad parametrai yra fiksuoti ir 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ę įvesties vaizdo atžvilgiu.


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 = True) max_outp = T.max(outp, axis=1) ryškumas = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, axis=1) return theano.function(, )

Turbūt esate matę keistus šunų vaizdus internete – DeepDream. Originaliame straipsnyje autoriai naudojasi sekantis procesas Norėdami sukurti 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 prie jo gautą vaizdą iš išvestinės.
  4. Grįžkite į 2 veiksmą arba išeikite iš ciklo.

Gauti vaizdai yra:




Bet ką daryti, jei pirmą vaizdą inicijuosite tikra nuotrauka ir pradėsite tą patį procesą? Bet kiekvienoje iteracijoje pasirinksime atsitiktinę klasę, likusią nustatysime į nulį ir apskaičiuosime išvestinės vertę, tada gausime tokią gilią svajonę.


Atsargiai 60 mb


Kodėl tiek daug šunų veidų ir akių? Tai paprasta: įvaizdžio tinkle yra beveik 200 šunų iš 1000 klasių, jie turi akis. Ir taip pat daug užsiėmimų, kur yra tik žmonės.

Klasės išskirtinumo ištraukimas

Jei šis procesas inicijuojamas tikra nuotrauka, sustabdomas po pirmos iteracijos ir nubrėžus išvestinės reikšmę, tai gausime tokį vaizdą, kurį pridėję prie originalaus, padidinsime pasirinktos klasės aktyvavimo reikšmę.


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


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

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

Šiame straipsnyje paprastai kalbama ne apie vizualizaciją, o apie tai, kad pakeitus telkimą į konvoliuciją su dideliu žingsniu kokybė neprarandama. Tačiau kaip šalutinis jų tyrimo produktas, autoriai pasiūlė naują ypatybių vizualizavimo būdą, kurį jie taikė, norėdami tiksliau išanalizuoti tai, ko modelis išmoksta. Jų idėja yra tokia: jei paimtume tiesiog išvestinę, tada tos savybės, kurios įvesties vaizde buvo mažesnės už nulį, negrįžta atgal dekonvoliucijos metu (naudojant ReLu įvesties vaizdui). Ir tai lemia tai, kad skleidžiamame galiniame vaizde atsiranda neigiamos reikšmės. Kita vertus, jei naudojate deconvnet, tada kitas ReLu yra paimtas iš ReLu darinio - tai leidžia nepraleisti neigiamų reikšmių, tačiau, kaip matėte, rezultatas yra „so-so“. Bet ką daryti, jei derinsime š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 gaunamas visiškai švarus ir interpretuojamas vaizdas.


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 sukuria trimatį tenzorių kaip išvestį, galbūt kitokio matmens. d x w x h; d epth yra neuronų skaičius sluoksnyje, kiekvienas iš jų sukuria savybių žemėlapį su dydžiu w igth x h aštuoni.


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



conv1_2

Taip, beveik nieko nematote, nes. priimamasis plotas yra labai mažas, tai yra antrasis posūkis 3x3, atitinkamai, bendras plotas yra 5x5. Tačiau priartinus matome, kad ši funkcija yra tik gradiento detektorius.




conv3_3


conv4_3


conv5_3


baseinas5


O dabar įsivaizduokite, kad vietoj maksimumo per plokštę imsime visų plokštės elementų sumos vertės išvestinę per įvesties vaizdą. Tada akivaizdu, kad neuronų grupės jautri 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 tt sudėtingesnių modelių link. Kuo gilesnis sluoksnis, tuo blankesnis vaizdas. Tai paaiškinama tuo, kad gilesni sluoksniai turi sudėtingesnį raštą, kurį jie aptinka, o sudėtingas modelis pasirodo rečiau nei paprastas, todėl aktyvinimo žemėlapis pritemsta. Pirmasis būdas tinka suprasti sluoksnius su sudėtingais raštais, o antrasis – kaip tik paprastiems.


conv1_1


conv2_2


conv4_3


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

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

Taigi, praėjo pora metų nuo pirmosios sėkmingos neuroninio tinklo trepanacijos. Mes (žmoniškumo prasme) savo rankose turime galingą įrankį, leidžiantį suprasti, ką neuroninis tinklas išmoksta, taip pat pašalinti tai, ko iš tikrųjų nenorėtume. Šio straipsnio autoriai kuria metodą, leidžiantį padaryti, kad vienas vaizdas sugeneruotų panašų aktyvinimo žemėlapį tam tikram vaizdui, o galbūt net daugiau nei vienam - tai yra stiliaus pagrindas. Į įvestį tiekiame baltąjį triukšmą ir panašiu iteraciniu procesu, kaip ir giliame sapne, pateikiame šį vaizdą į tokį, kuriame funkcijų žemėlapiai yra panašūs į tikslinį vaizdą.

turinio praradimas

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




Pažymime išvestį i sluoksnis iš įvesties kaip . 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. Gal būt.



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


# Inicijuoti naudojant triukšmo vaizdą 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) # Optimizuokite, periodiškai išsaugodami i rezultatą diapazone (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)

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 pastebėti dvi gauto vaizdo ypatybes:

  • prarastos spalvos - tai yra to, kad in konkretus pavyzdys buvo naudojamas tik sluoksnis conv4_2 (arba, kitaip tariant, jo svoris w nebuvo nulis, o kitų sluoksnių – nulis); kaip pamenate, tai ankstyvuosiuose sluoksniuose yra informacija apie spalvas ir gradiento perėjimus, o vėlesniuose – apie didesnes detales, ką mes ir stebime – spalvos prarandamos, o turinys ne;
  • kai kurie namai „einam“, t.y. tiesios linijos yra šiek tiek išlenktos – taip yra todėl, kad kuo gilesnis sluoksnis, tuo mažiau informacijos apie jame esančios ypatybės erdvinę padėtį (konvoliucijos ir sujungimų taikymo rezultatas).

Ankstyvųjų sluoksnių pridėjimas iš karto ištaiso situaciją su spalvomis.


Turinio praradimas: conv1_1, conv2_1, conv4_2


Tikimės, kad iki šiol jaučiate, kad galite valdyti tai, kas perbraižoma ant balto triukšmo vaizdo.

stiliaus praradimas

O dabar priėjome prie įdomiausio: kaip galime perteikti stilių? Kas yra stilius? Akivaizdu, kad stilius nėra toks, kokį optimizavome „Content Loss“, nes jame yra daug informacijos apie funkcijų erdvines padėtis, todėl pirmiausia reikia kažkaip pašalinti šią informaciją iš rodinių, gaunamų kiekviename sluoksnyje.


Autorius siūlo tokį metodą. Paimkime tenzorių kurio nors sluoksnio išvestyje, išplėskime jį erdvinėmis koordinatėmis ir apskaičiuokime kovariacijos matricą tarp plokščių. Pažymėkime šią transformaciją kaip G. Ką mes iš tikrųjų padarėme? Galima sakyti, kad skaičiavome, kaip dažnai ypatybės plokštės viduje atsiranda poromis, arba, kitaip tariant, aproksiminome požymių pasiskirstymą daugiamačiu normaliuoju pasiskirstymu.




Tada Style Loss įvedamas taip, kur s yra šiek tiek stiliaus vaizdas:



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


Vincentas




Ką daryti, jei vietoj stiliaus įvaizdžio įdėtume nuotrauką? Gaunate jau pažįstamus bruožus, pažįstamas spalvas, tačiau visiškai prarandama erdvinė padėtis.


Nuotrauka su stiliaus praradimu


Tikrai susimąstėte, kodėl mes apskaičiuojame kovariacijos matricą, o ne ką nors kita? Juk 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. Patikrinkime tai, skaičiuosime ne kovariacijos matricą, o tiesiog kiekvienos plokštelės vidutinę reikšmę.




paprasto stiliaus praradimas

Kombinuotas nuostolis

Natūralu, kad norima sumaišyti šias dvi sąnaudų funkcijas. Tada iš balto triukšmo sugeneruosime tokį vaizdą, kad jis išliktų turinio-vaizdo bruožus (kurie turi susiejimo su erdvinėmis koordinatėmis), taip pat bus „stiliaus“ bruožų, nesusietų su erdvinėmis koordinatėmis, t.y. Tikimės, kad turinio vaizdo detalės išliks nepažeistos, bet perpieštos tinkamu stiliumi.



Tiesą sakant, yra ir reguliatorius, bet paprastumo dėlei jį praleisime. Belieka atsakyti į tokį klausimą: kokius sluoksnius (svorius) naudoti optimizuojant? Ir aš bijau, kad neturiu atsakymo į šį klausimą, kaip ir straipsnio autoriai. Jie turi pasiūlymą naudoti šiuos dalykus, tačiau tai visiškai nereiškia, kad kitas derinys veiks prasčiau, paieškos erdvė yra per didelė. Vienintelė taisyklė, išplaukianti iš modelio supratimo, yra ta, kad nėra prasmės imtis gretimų sluoksnių, nes jų ženklai nedaug skirsis vienas nuo kito, todėl prie stiliaus pridedamas sluoksnis iš kiekvienos conv*_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(art_features, gen_features, "conv2_1")) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) losses.append(0.2e6 * style_loss(meno_ypatybės_1,)confeature_1"_v4 ) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # total variation bauda losses.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = suma(nuostoliai)

Galutinį modelį galima pateikti tokia forma.




O štai namų su Van Goghu rezultatas.



Stenkitės kontroliuoti procesą

Prisiminkime ankstesnes dalis, dar dvejus metus iki dabartinio straipsnio kiti mokslininkai tyrinėjo, ko iš tikrųjų išmoksta neuroninis tinklas. Turėdami visus šiuos straipsnius, galite generuoti įvairių stilių funkcijų vizualizacijas, įvairių vaizdų, skirtingos raiškos ir dydžių, ir pabandykite suprasti, kokius sluoksnius su kokiu svoriu imti. Tačiau net pervertus 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į... na, supranti. Bet mes tikrai norime, kad vaizdas mums patiktų. Išgaubtas turinio ir stiliaus praradimo funkcijų derinys nėra matas to, ką mūsų protas laiko gražiu. Pastebėta, kad jei stilizavimas tęsiamas per ilgai, kaštų funkcija natūraliai krenta vis žemiau, tačiau rezultato estetinis grožis smarkiai krenta.




Gerai, yra dar viena 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ų, tokių kaip apskritimai, kurių mes tikrai nenorime matyti gautame paveikslėlyje. Paprastai tariant, jei galėtume pasamdyti milijoną kinų, galėtume vizualizuoti visas stiliaus įvaizdžio ypatybes, o išsamia paieška tiesiog pažymėti tuos, kurių mums reikia, ir įtraukti juos tik į išlaidų funkciją. Tačiau dėl akivaizdžių priežasčių tai nėra taip paprasta. Bet ką daryti, jei iš stiliaus lapo tiesiog pašalinsime visus apskritimus, kurių nenorime matyti rezultate? Tada atitinkamų neuronų, reaguojančių į apskritimus, aktyvavimas tiesiog neveiks. Ir, žinoma, tada tai nebus rodoma gautame paveikslėlyje. Tas pats ir su gėlėmis. Pateikite ryškų vaizdą su daugybe spalvų. Spalvų pasiskirstymas bus labai išteptas visoje erdvėje, gauto vaizdo pasiskirstymas bus toks pat, tačiau optimizavimo proceso metu greičiausiai bus prarastos smailės, kurios buvo ant originalo. Paaiškėjo, kad paprastas bitų gylio sumažėjimas spalvų paletė išsprendžia šią problemą. Daugumos spalvų pasiskirstymo tankis bus artimas nuliui, o keliose srityse bus didelių smailių. Taigi, manipuliuodami originalu „Photoshop“, manipuliuojame funkcijomis, kurios išgaunamos 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


Ir jūs galite iš karto priimti paprastą vaizdą kaip stilių



rezultatus








O štai vidosik, bet tik tinkamos tekstūros

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

Atrodo, kad tai būtų galima sustabdyti, jei ne vienas niuansas. Aukščiau pateiktas stiliaus algoritmas veikia labai ilgai. Jei imsime diegimą, kai lbfgs paleidžiamas CPU, procesas trunka apie penkias minutes. Jei jį perrašysite taip, kad optimizavimas vyktų į GPU, procesas užtruks 10–15 sekundžių. Tai nėra gerai. Galbūt apie tą patį mąstė šio ir kito straipsnio autoriai. Abu leidiniai išėjo atskirai 17 dienų skirtumu, praėjus beveik metams po ankstesnio straipsnio. Dabartinio straipsnio autoriai, kaip ir ankstesnio, užsiėmė tekstūros generavimu (jei tik iš naujo nustatysite Style Loss, tai maždaug tiek ir gausite). Jie pasiūlė optimizuoti ne vaizdą, gautą iš baltojo triukšmo, o tam tikrą neuroninį tinklą, kuris sukuria 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, kuriame kiekvienas yra toliau z didesnis nei ankstesnis ir yra paimtas iš triukšmo tekstūros generavimo atveju ir iš kai kurių vaizdų duomenų bazės stilizatoriaus mokymui. Labai svarbu naudoti ką nors kita nei mokymosi „imagenet“ 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 tik 17 dienų vėlavo su idėja sukurti tinklą, buvo užsiėmę vaizdų raiškos didinimu. Atrodo, kad juos įkvėpė likusio mokymosi sėkmė naujausiame „imagenet“.




Atitinkamai likutinis blokas ir konv blokas.



Taigi dabar be stiliaus valdymo savo rankose turime ir 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ų kodus kaip atspirties tašką kurdami kitą stiliaus programą pirmajai vaizdo įrašų stiliaus programai:



Sugeneruokite kažką panašaus.


Pačiose įprastose nuotraukose atsiranda daugybė ir ne visiškai išsiskiriančių subjektų. Dažniausiai dėl kokių nors priežasčių šunys. Tokie vaizdai pradėjo pildyti internetą 2015 m. birželį, kai buvo paleista „Google“ sukurta „DeepDream“ – viena pirmųjų atvirų paslaugų, pagrįstų neuroniniais tinklais ir skirta vaizdų apdorojimui.

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

Pirmiausia projektas buvo išdėstytas kaip atvirojo kodo, o vėliau internete pasirodė internetinės paslaugos, sukurtos tais pačiais principais. Vienas patogiausių ir populiariausių yra „Deep Dream Generator“: čia apdirbti nedidelę nuotrauką užtrunka vos 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?

Neuroniniai tinklai savo konstrukcijoje imituoja tikrus gyvo organizmo neuroninius tinklus, tačiau tai daro matematinių algoritmų pagalba. Sukūrę pagrindinę struktūrą, galite ją mokyti naudodami mašininio mokymosi metodus. Jei kalbame apie modelio atpažinimą, tada 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. Tuo pačiu keliu buvo naudojamas „Google“ „DeepMind“ AlphaGo algoritmas į Kinijos žaidimą „Go“, kuris buvo įvertintas kaip proveržis, nes „Go“ yra daug sudėtingesnis ir netiesiškesnis nei šachmatai.

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

    „YouTube“ taip pat yra keletas suprantamų pieštų rankomis ritinėliai apie tai, kaip veikia neuroniniai tinklai.

Dar viena populiari paslauga – Dreamscope, kuri gali ne tik pasvajoti 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 nudažo juodai baltus vaizdus. Ankstesnėse versijose panašios programos savo darbą atliko kur kas prasčiau ir buvo laikomas didžiuliu pasiekimu, jei bent 20% žmonių nesugebėjo atskirti tikrojo paveikslėlio nuo kompiuterio spalvos.

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

Ta pati kūrimo įmonė taip pat pristatė paslaugą, kuri atpažįsta nuotraukose skirtingi tipai objektų.

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

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


Į viršų