Ostagram: Услуга, базирана на невронна мрежа, която комбинира снимки и орнаменти в художествени шедьоври. Оформяне на изображения с помощта на невронни мрежи: без мистицизъм, само matan Невронна мрежа рисува снимки

Тъй като през август 2015 г. немски изследователи от университета в Тюбинген представиха своите относно възможността за прехвърляне на стил известни художницина други снимки започнаха да се появяват услуги, които осигуряваха приходи от тази възможност. Той стартира на западния пазар, а на руския пазар - негово пълно копие.

Към отметки

Въпреки факта, че Ostagram стартира през декември, той започна бързо да набира популярност в социалните мрежи в средата на април. В същото време към 19 април в проекта във VKontakte имаше по-малко от хиляда души.

За да използвате услугата, трябва да подготвите две изображения: снимка, която трябва да бъде обработена, и картина с пример за стил, който да наслагвате върху оригиналната снимка.

Услугата има безплатна версия: създава изображение с минимална разделителна способност до 600 пиксела по най-дългата страна на изображението. Потребителят получава резултата само от една от итерациите на прилагане на филтъра към снимката.

Има две платени версии: Premium произвежда изображение до 700 пиксела по най-дългата страна и прилага 600 повторения на обработка на невронна мрежа към изображението (колкото повече итерации, толкова по-интересна и интензивна е обработката). Една такава снимка ще струва 50 рубли.

В HD версията можете да регулирате броя на повторенията: 100 ще струват 50 рубли, а 1000 - 250 рубли. В този случай изображението ще има разделителна способност до 1200 пиксела по най-дългата страна и може да се използва за печат върху платно: Ostagram предлага тази услуга с доставка от 1800 рубли.

През февруари представителите на Ostagram няма да приемат заявки за обработка на изображения от потребители „от страни с развит капитализъм“, но след това достъп до обработка на снимки за потребители на VKontakte от цял ​​свят. Съдейки по кода на Ostagram, публикуван в GitHub, той е разработен от Сергей Моругин, 30-годишен жител на Нижни Новгород.

TJ се свърза търговски директорпроект, представен от Андрей. Според него Ostagram се е появил преди Instapainting, но е вдъхновен от подобен проект, наречен Vipart.

Ostagram е разработен от група студенти от NNSTU. Алексеева: след първоначално тестване върху тясна група приятели в края на 2015 г., те решиха да направят проекта публичен. Първоначално обработката на изображения беше напълно безплатна и се планираше да се печелят пари чрез продажба на печатни картини. Според Андрей най-много се оказа тюленът голям проблем: снимки на хора, обработени от невронна мрежа, рядко изглеждат приятни за човешкото око и крайният клиент трябва да коригира резултата дълго време, преди да го приложи към платното, което изисква големи машинни ресурси.

За обработка на изображения създателите на Ostagram искаха да използват облачни сървъри на Amazon, но след наплива от потребители стана ясно, че цената им ще надхвърли хиляда долара на ден с минимална възвръщаемост на инвестицията. Андрей, който също е инвеститор в проекта, нае сървърни съоръжения в Нижни Новгород.

Аудиторията на проекта е около хиляда души на ден, но в някои дни тя достига 40 хиляди души поради преходи от чужди медии, които вече са забелязали проекта преди домашните (Ostagram дори успя да си сътрудничи с европейски диджеи). През нощта, когато трафикът е нисък, обработката на изображения може да отнеме 5 минути и до един час през деня.

Ако по-рано чуждестранните потребители бяха умишлено ограничени в достъпа до обработка на изображения (мислеше се, че ще започне монетизация от Русия), сега Ostagram вече разчита повече на западната аудитория.

Към днешна дата перспективите за изплащане са условни. Ако всеки потребител плати 10 рубли за обработка, тогава може би ще се изплати. […]

У нас е много трудно да се монетизира: нашите хора са готови да чакат седмица, но няма да платят и стотинка за това. Европейците са по-благосклонни към това – по отношение на плащането за ускоряване, подобряване на качеството – така че ориентацията отива към този пазар.

Андрей, представител на Ostagram

Според Андрей екипът на Ostagram работи нова версиясайт със силен акцент върху социалността: „Ще изглежда като една добре позната услуга, но какво да се прави.“ Представители на Facebook в Русия вече проявиха интерес към проекта, но сделката все още не е стигнала до преговори за продажбата.

Примери за сервизна работа

В емисията на уебсайта Ostagram можете също да видите каква комбинация от изображения е довела до крайните снимки: често това е дори по-интересно от самия резултат. В същото време филтрите - снимки, използвани като ефект за обработка - могат да бъдат запазени за по-нататъшна употреба.

Поздрави, Хабр! Със сигурност сте забелязали, че темата за стилизиране на снимки за различни художествени стиловеактивно обсъждани в тези ваши интернети. Четейки всички тези популярни статии, може да си помислите, че магията се случва под капака на тези приложения, а невронната мрежа наистина фантазира и преначертава изображението от нулата. Така се случи, че нашият екип беше изправен пред подобна задача: като част от вътрешен корпоративен хакатон направихме видео стайлинг, т.к. вече имаше приложение за снимки. В тази публикация ще разгледаме как мрежата „преначертава“ изображения и ще разгледаме статиите, които направиха това възможно. Препоръчвам ви да се запознаете с последната публикация, преди да прочетете този материал и като цяло с основите на конволюционните невронни мрежи. Ще намерите някои формули, малко код (ще дам примери за Theano и Lasagne), както и много снимки. Тази публикация е вградена хронологичен редвъншен вид на статии и съответно на самите идеи. Понякога ще го разводня с нашия скорошен опит. Ето едно момче от ада за внимание.


Визуализация и разбиране на конволюционни мрежи (28 ноември 2013 г.)

На първо място, заслужава да се спомене статията, в която авторите успяха да покажат, че невронната мрежа не е черна кутия, а доста интерпретируемо нещо (между другото, днес това може да се каже не само за конволюционните мрежи за компютър визия). Авторите решават да се научат как да интерпретират активациите на невроните на скрития слой, за това са използвали деконволюционната невронна мрежа (deconvnet), предложена няколко години по-рано (между другото, от същите Seiler и Fergus, които са автори на тази публикация като добре). Деконволюционната мрежа всъщност е същата мрежа с конволюции и пулове, приложени в обратен ред. Оригиналната работа върху deconvnet използва мрежата в режим на обучение без надзор, за да генерира изображения. Този път авторите го използваха просто за обратно преминаване от характеристиките, получени след преминаване напред през мрежата към оригиналното изображение. Резултатът е изображение, което може да се интерпретира като сигнал, предизвикал това активиране на невроните. Естествено възниква въпросът: как да направим обратния ход през навиване и нелинейност? И още повече чрез max-pooling, това със сигурност не е обърната операция. Нека разгледаме и трите компонента.

Обратно ReLu

В конволюционните мрежи често се използва функцията за активиране ReLu(x) = max(0, x), което прави всички активации на слоя неотрицателни. Съответно при връщане през нелинейността е необходимо също да се получат неотрицателни резултати. За това авторите предлагат да се използва същият ReLu. От гледна точка на архитектурата на Theano е необходимо да се замени градиентната функция на операцията (безкрайно ценната тетрадка е в рецептите за лазаня, оттам ще разберете подробностите за това какво представлява класът ModifiedBackprop).

Клас ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # изрично коригиране return (self.nonlinearity(grd),) # използвайте дадената нелинейност

Обратна конволюция

Тук е малко по-сложно, но всичко е логично: достатъчно е да приложите транспонираната версия на същото конволюционно ядро, но към изходите от обратния ReLu вместо предишния слой, използван в предния пас. Но се опасявам, че на думи не е толкова очевидно, нека да разгледаме визуализацията на тази процедура (ще намерите още повече визуализации на извивки).


Конволюция, когато крачка = 1

Конволюция, когато крачка = 1 обратна версия

Конволюция, когато крачка = 2

Конволюция, когато крачка = 2 обратна версия

Обратно обединяване

Тази операция (за разлика от предишните) обикновено не е обратима. Но все пак бихме искали да преминем през максимума по някакъв начин по време на обратния пас. За да направите това, авторите предлагат да се използва карта на това къде е бил максимумът по време на директния пас (превключватели на максималните места). По време на обратното преминаване, входният сигнал се трансформира в unpooling по такъв начин, че приблизително да се запази структурата на оригиналния сигнал, наистина е по-лесно да се види, отколкото да се опише тук.



Резултат

Алгоритъмът за визуализация е изключително прост:

  1. Направете прав пас.
  2. Изберете слоя, който ни интересува.
  3. Коригирайте активирането на един или повече неврони и нулирайте останалите.
  4. Направете извод.

Всеки сив квадрат на изображението по-долу съответства на визуализация на филтър (който се прилага за конволюция) или тегла на един неврон, и всеки цветна картинае тази част от оригиналното изображение, която активира съответния неврон. За по-голяма яснота невроните в един слой са групирани тематични групи. Като цяло, изведнъж се оказа, че невронната мрежа научава точно това, за което Хюбел и Вайзел са писали в работата си върху структурата на зрителната система, за която са наградени Нобелова наградапрез 1981г. Благодарение на тази статия получихме визуално представяне на това, което конволюционната невронна мрежа научава на всеки слой. Именно това знание ще позволи по-късно да се манипулира съдържанието на генерираното изображение, но това все още е далеч, следващите няколко години отидоха за подобряване на методите за "трепанация" на невронните мрежи. В допълнение, авторите на статията предложиха начин да се анализира как най-добре да се изгради архитектурата на конволюционна невронна мрежа, за да се постигне най-добри резултати(Въпреки това, те не спечелиха ImageNet 2013, но стигнаха до върха; UPD: оказва се, че са спечелили, Кларифай е това, което са).


Визуализация на функциите


Ето пример за визуализация на активации с помощта на deconvnet, днес този резултат изглежда вече така себе си, но тогава беше пробив.


Карти на Saliency, използващи deconvnet

Дълбоко вътре конволюционни мрежи: Визуализация на модели за класификация на изображения и карти на яркост (19 април 2014 г.)

Тази статия е посветена на изучаването на методите за визуализация на знания, съдържащи се в конволюционна невронна мрежа. Авторите предлагат два метода за визуализация, базирани на градиентно спускане.

Визуализация на модела на класа

И така, представете си, че имаме обучена невронна мрежа за решаване на проблем с класификацията в определен брой класове. Означете като активационна стойност на изходния неврон, който съответства на класа ° С. Тогава следният оптимизационен проблем ни дава точно изображението, което максимизира избрания клас:



Тази задача е лесна за решаване с помощта на Theano. Обикновено искаме от рамката да вземе производната на параметрите на модела, но този път приемаме, че параметрите са фиксирани и производната е взета от входното изображение. Следващата функция избира максималната стойност на изходния слой и връща функция, която изчислява производната по отношение на входното изображение.


def compile_saliency_function(net): """ Компилира функция за изчисляване на картите на яркостта и прогнозираните класове за дадена минипартида от входни изображения. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], deterministic=True) max_outp = T.max(outp, axis=1) saliency = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, axis=1) върне theano.function(, )

Сигурно сте виждали странни изображения на кучета в интернет - DeepDream. В оригиналната статия авторите използват следния процес, за да генерират изображения, които увеличават максимално избрания клас:

  1. Инициализирайте първоначалното изображение с нули.
  2. Изчислете стойността на производната от това изображение.
  3. Променете изображението, като добавите към него полученото изображение от производната.
  4. Върнете се към стъпка 2 или излезте от цикъла.

Получените изображения са:




Но какво ще стане, ако инициализирате първото изображение с истинска снимка и започнете същия процес? Но при всяка итерация ще изберем случаен клас, ще зададем останалата част на нула и ще изчислим стойността на производната, след което ще получим толкова дълбок сън.


Внимание 60 mb


Защо има толкова много кучешки лица и очи? Просто е: в мрежата за изображения има почти 200 кучета от 1000 класа, те имат очи. А също и много класове, където има само хора.

Екстракция на класа

Ако този процес се инициализира с реална снимка, спряна след първата итерация и се изчертае стойността на производната, тогава ще получим такова изображение, добавяйки което към оригиналното, ще увеличим стойността на активиране на избрания клас.


Карти на яркост, използващи производна


Отново резултатът е "така-така". Важно е да се отбележи, че това нов начинвизуализация на активациите (нищо не ни пречи да фиксираме стойностите на активациите не на последния слой, а като цяло на всеки слой от мрежата и да вземем производната по отношение на входното изображение). Следващата статия ще комбинира двата предишни подхода и ще ни даде инструмент как да настроим трансфер на стил, който ще бъде описан по-късно.

Стремеж към простота: цялата конволюционна мрежа (13 април 2015 г.)

Тази статия по принцип не е за визуализация, а за факта, че замяната на обединяване с навиване с голяма крачка не води до загуба на качество. Но като страничен продукт от своето изследване, авторите предложиха нов начин за визуализиране на характеристиките, който приложиха за по-точен анализ на това, което моделът научава. Идеята им е следната: ако просто вземем производната, тогава онези характеристики, които са били по-малки от нула на входното изображение, не се връщат назад по време на деконволюция (използвайки ReLu за входното изображение). И това води до факта, че върху разпространеното обратно изображение се появяват отрицателни стойности. От друга страна, ако използвате deconvnet, тогава друг ReLu се взема от производната на ReLu - това ви позволява да не прескачате обратно отрицателни стойности, но както видяхте, резултатът е "така-така". Но какво ще стане, ако комбинираме тези два метода?




клас GuidedBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = входове (grd,) = out_grads dtype = inp.dtype return (grd * (inp > 0).astype(dtype) * (grd) > 0).astype(dtype),)

Тогава получавате напълно чисто и разбираемо изображение.


Карти на яркост, използващи насочено обратно разпространение

Отидете по-дълбоко

Сега нека помислим какво ни дава това? Нека ви напомня, че всеки конволюционен слой е функция, която получава триизмерен тензор като вход и също така произвежда триизмерен тензор като изход, може би с различно измерение дх wх з; д epth е броят на невроните в слоя, всеки от тях генерира карта на характеристики с размера w igth x зосем.


Нека опитаме следния експеримент в мрежата VGG-19:



conv1_2

Да, не виждате почти нищо, т.к. рецептивната площ е много малка, това е втората навивка 3x3, съответно общата площ е 5x5. Но като увеличим, виждаме, че функцията е само градиентен детектор.




conv3_3


conv4_3


conv5_3


басейн 5


И сега си представете, че вместо максимума над плочата, ще вземем производната на стойността на сумата от всички елементи на плочата върху входното изображение. Тогава очевидно рецептивната област на групата неврони ще покрие цялото входно изображение. За ранните слоеве ще видим ярки карти, от които заключваме, че това са цветни детектори, след това градиенти, след това граници и така нататък към по-сложни модели. Колкото по-дълбок е слоят, толкова по-тъмно се получава изображението. Това се обяснява с факта, че по-дълбоките слоеве имат по-сложен модел, който откриват, и сложен модел се появява по-рядко от обикновен и следователно картата за активиране затъмнява. Първият начин е подходящ за разбиране на слоеве със сложни модели, а вторият е точно за прости.


conv1_1


conv2_2


conv4_3


Можете да изтеглите по-пълна база данни с активации за няколко изображения и .

Невронен алгоритъм на художествен стил (2 септември 2015 г.)

И така, изминаха няколко години от първата успешна трепанация на невронната мрежа. Ние (в смисъл на човечност) имаме в ръцете си мощен инструмент, което ви позволява да разберете какво научава невронната мрежа, както и да премахнете това, което всъщност не бихме искали да научи. Авторите на тази статия разработват метод, който ви позволява да накарате едно изображение да генерира подобна карта за активиране на някакво целево изображение и вероятно дори повече от едно - това е основата на стилизирането. Захранваме бял шум към входа и в подобен итерационен процес, както в дълбок сън, привеждаме това изображение до такова, в което картите на характеристиките са подобни на целевото изображение.

загуба на съдържание

Както вече споменахме, всеки слой от невронната мрежа произвежда триизмерен тензор с някакво измерение.




Да обозначим изхода и th слой от входа като . Тогава, ако минимизираме претеглената сума от остатъците между входното изображение и някакъв образ, към който се стремим ° С, тогава получавате точно това, от което се нуждаете. Може би.



За да експериментирате с тази статия, можете да използвате този магически лаптоп, където се извършват изчисленията (както на GPU, така и на CPU). Графичният процесор се използва за изчисляване на характеристиките на невронната мрежа и стойността на функцията на разходите. Theano създава функция, която може да изчисли градиента на целевата функция eval_gradчрез входно изображение х. Това след това се подава в lbfgs и започва итеративният процес.


# Инициализирайте с изображение на шума generated_image.set_value(floatX(np.random.uniform(-128, 128, (1, 3, IMAGE_W, IMAGE_W)))) x0 = generated_image.get_value().astype("float64") xs = xs.append(x0) # Оптимизирайте, като периодично запазвате резултата за i в диапазон(8): print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = generated_image.get_value().astype("float64") xs.append(x0)

Ако стартираме оптимизацията на такава функция, тогава бързо ще получим изображение, подобно на целевото. Сега можем да пресъздадем изображения от бял шум, които изглеждат като някакво изображение със съдържание.


Загуба на съдържание: conv4_2



Процес на оптимизация




Лесно е да забележите две характеристики на полученото изображение:

  • загубени цветове - това е резултат от факта, че в конкретен примербеше използван само слоят conv4_2 (или, с други думи, теглото w беше различно от нула за него и нула за другите слоеве); както си спомняте, ранните слоеве съдържат информация за цветовете и градиентните преходи, а по-късните съдържат информация за по-големи детайли, което наблюдаваме – цветовете се губят, но съдържанието не е;
  • някои къщи "хайде", т.е. правите линии са леко извити - това е така, защото колкото по-дълбок е слоят, толкова по-малко информация за пространствената позиция на елемента съдържа (резултат от прилагането на навивки и обединяване).

Добавянето на ранни слоеве незабавно коригира ситуацията с цветовете.


Загуба на съдържание: conv1_1, conv2_1, conv4_2


Надяваме се, че вече имате чувството, че имате контрол върху това, което се преначертава върху изображението с бял шум.

загуба на стил

И сега стигнахме до най-интересното: как можем да предадем стила? Какво е стил? Очевидно стилът не е това, което оптимизирахме в Content Loss, тъй като съдържа много информация за пространствените позиции на функциите.Така че първото нещо, което трябва да направите, е някак да премахнете тази информация от изгледите, получени на всеки слой.


Авторът предлага следния метод. Да вземем тензора на изхода на някакъв слой, да го разширим в пространствени координати и да изчислим ковариационната матрица между плочите. Нека означим тази трансформация като г. Какво наистина направихме? Можем да кажем, че изчислихме колко често елементите в плочата се срещат по двойки или, с други думи, приближихме разпределението на характеристиките в плочите с многовариантно нормално разпределение.




Тогава Style Loss се въвежда, както следва, къде се някакво изображение със стил:



Да опитаме ли за Винсент? По принцип получаваме нещо очаквано - шум в стила на Ван Гог, информацията за пространственото подреждане на функциите е напълно загубена.


Винсент




Ами ако поставим снимка вместо изображение в стил? Ще се окаже, че вече познати функции, познати цветове, но поведениенапълно изгубен.


Снимка със загуба на стил


Сигурно сте се чудили защо изчисляваме ковариационната матрица, а не нещо друго? В крайна сметка има много начини за агрегиране на характеристики, така че пространствените координати да бъдат загубени. Това наистина е отворен въпрос и ако вземете нещо много просто, резултатът няма да се промени драстично. Нека проверим това, няма да изчисляваме ковариационната матрица, а просто средната стойност на всяка плоча.




проста загуба на стил

Комбинирана загуба

Естествено, има желание да се смесят тези две функции на разходите. След това ще генерираме такова изображение от бял шум, че то ще запази характеристики от изображението на съдържанието (които имат обвързване с пространствени координати), а също така ще има „стилови“ характеристики, които не са обвързани с пространствени координати, т.е. ще се надяваме, че детайлите на изображението на съдържанието остават непокътнати, но са преначертани с правилния стил.



Всъщност има и регулатор, но ще го пропуснем за простота. Остава да се отговори на следния въпрос: какви слоеве (тегла) да използваме при оптимизацията? И се страхувам, че аз нямам отговор на този въпрос, както и авторите на статията. Те имат предложение да използвате следното, но това изобщо не означава, че друга комбинация също ще работи по-зле голямо пространствоТърсене. Единственото правило, което следва от разбирането на модела е, че няма смисъл да се вземат съседни слоеве, т.к техните знаци няма да се различават много един от друг, затова към стила се добавя слой от всяка група conv*_1.


# Дефиниране загуби на функция загуба = # загуба на съдържание losses.append(0.001 * content_loss(photo_features, gen_features, "conv4_2")) # загуба на стил losses.append(0.2e6 * style_loss(art_features, gen_features, "conv1_1append")) загуби (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) losses.append(0.2e6 * style_loss(art_features, gen_confeatures_, gen_confeatures_) ) losses.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # общо вариация наказателни загуби.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = sum(losses)

Крайният модел може да бъде представен в следната форма.




А ето и резултата от къщите с Ван Гог.



Опитайте се да контролирате процеса

Нека си спомним предишните части, вече две години преди настоящата статия, други учени изследваха какво наистина научава невронната мрежа. Въоръжени с всички тези статии, можете да генерирате визуализации на функции. различни стилове, различни изображения, различни разделителни способности и размери и се опитайте да разберете кои слоеве с каква тежест да вземете. Но дори повторното претегляне на слоевете не дава пълен контрол върху случващото се. Проблемът тук е по-концептуален: оптимизираме грешната функция! Как така, питате? Отговорът е прост: тази функция минимизира остатъчното ... е, разбирате идеята. Но това, което наистина искаме, е изображението да ни харесва. Изпъкналата комбинация от функции за загуба на съдържание и стил не е мярка за това, което умът ни смята за красиво. Наблюдавано е, че ако стилизирането продължи твърде дълго, функцията на разходите естествено пада все по-ниско, но естетическата красота на резултата пада рязко.




Добре, има още един проблем. Да кажем, че сме намерили слой, който извлича функциите, от които се нуждаем. Да кажем, че някои текстури са триъгълни. Но този слой все още съдържа много други функции, като кръгове, които наистина не искаме да виждаме в полученото изображение. Най-общо казано, ако можехме да наемем милион китайци, бихме могли да визуализираме всички характеристики на едно стилово изображение и чрез изчерпателно търсене просто да маркираме тези, от които се нуждаем, и да ги включим само във функцията за разходи. Но по очевидни причини не е толкова лесно. Но какво ще стане, ако просто премахнем всички кръгове, които не искаме да се показват в резултата от таблицата със стилове? Тогава активирането на съответните неврони, които отговарят на кръговете, просто няма да работи. И, разбира се, тогава това няма да се появи в получената снимка. Същото е и с цветята. Представете ярко изображение с много цветове. Разпределението на цветовете ще бъде много размазано в цялото пространство, разпределението на полученото изображение ще бъде същото, но по време на процеса на оптимизация тези върхове, които са били на оригинала, вероятно ще бъдат загубени. Оказа се, че простото намаляване на битовата дълбочина на цветовата палитра решава този проблем. Плътността на разпространение на повечето цветове ще бъде близо до нула и ще има големи пикове в няколко области. По този начин, като манипулираме оригинала във Photoshop, ние манипулираме характеристиките, които са извлечени от изображението. За човек е по-лесно да изрази желанията си визуално, отколкото да се опита да ги формулира на езика на математиката. Чао. В резултат на това дизайнерите и мениджърите, въоръжени с Photoshop и скриптове за визуализиране на функции, постигнаха три пъти по-бързи резултати, по-добри от това, което направиха математиците и програмистите.


Пример за манипулиране на цвета и размера на елементите


И можете веднага да вземете просто изображение като стил



резултати








А ето и видосик, но само с правилната текстура

Текстурни мрежи: Синтез на текстури и стилизирани изображения с подаване напред (10 март 2016 г.)

Изглежда, че това може да бъде спряно, ако не един нюанс. Горният алгоритъм за стайлинг работи много дълго време. Ако вземем реализация, при която lbfgs се изпълнява на процесора, тогава процесът отнема около пет минути. Ако го пренапишете, така че оптимизацията да отиде в графичния процесор, тогава процесът ще отнеме 10-15 секунди. Не е добре. Може би авторите на тази и следващата статия са мислили за същото. И двете публикации излязоха независимо с разлика от 17 дни, почти година след предишната статия. Авторите на настоящата статия, както и авторите на предишната, се занимаваха с генериране на текстури (ако просто нулирате загубата на стил, това е приблизително това, което получавате). Те предложиха да се оптимизира не изображение, получено от бял шум, а някаква невронна мрежа, която генерира стилизирано изображение.




Сега, ако процесът на стилизиране не включва никаква оптимизация, трябва да се направи само преминаване напред. И оптимизация се изисква само веднъж за обучение на генераторната мрежа. Тази статия използва йерархичен генератор, където всеки следващ zпо-голям от предишния и се взема проби от шум в случай на генериране на текстура и от някаква база данни с изображения за обучение на стилизатор. От решаващо значение е да използвате нещо различно от обучаващата част на imagenet, т.к характеристиките вътре в мрежата за загуби се изчисляват от мрежата, обучена само на обучаващата част.



Загуби на възприятие за прехвърляне на стил в реално време и супер разделителна способност (27 март 2016 г.)

Както подсказва името, авторите, които закъсняха само 17 дни с идеята за генерираща мрежа, бяха заети с увеличаването на разделителната способност на изображенията. Изглежда, че са били вдъхновени от успеха на остатъчното обучение в най-новия imagenet.




Съответно остатъчен блок и конв блок.



По този начин, в допълнение към управлението на стила, вече имаме в ръцете си бърз генератор (благодарение на тези две статии времето за генериране на едно изображение се измерва в десетки ms).

Краят

Използвахме информацията от прегледаните статии и кода на авторите като отправна точка за създаване на друго приложение за стайлинг за първото приложение за стилизиране на видео:



Генерирайте нещо подобно.


В най-обикновените снимки се появяват многобройни и не напълно различими същности. Най-често по някаква причина кучета. Такива изображения започнаха да изпълват интернет през юни 2015 г., когато стартира DeepDream от Google - един от първите отворени услугибазирани на невронни мрежи и предназначени за обработка на изображения.

Това се случва приблизително така: алгоритъмът анализира снимки, намира в тях фрагменти, които му напомнят за някои познати обекти - и изкривява изображението в съответствие с тези данни.

Първо, проектът беше заложен като отворен код, а след това в Интернет се появиха онлайн услуги, създадени на същите принципи. Един от най-удобните и популярни е Deep Dream Generator: обработката на малка снимка тук отнема само около 15 секунди (преди това потребителите трябваше да чакат повече от час).

Как невронните мрежи се научават да създават такива изображения? И защо, между другото, се наричат ​​така?

Невронните мрежи в своя дизайн имитират реалните невронни мрежи на жив организъм, но правят това с помощта на математически алгоритми. След като създадете основна структура, можете да я обучите с помощта на методи за машинно обучение. Ако говорим за разпознаване на модели, тогава през невронната мрежа трябва да бъдат предадени хиляди изображения. Ако задачата на невронната мрежа е различна, тогава тренировъчните упражнения ще бъдат различни.

Алгоритмите за игра на шах, например, анализират игрите на шах. По същия път алгоритъмът AlphaGo на Google на DeepMind в китайската игра Go - която беше приветствана като пробив, защото Go е много по-сложна и нелинейна от шаха.

    Можете да си поиграете с опростен модел на невронна мрежа и да разберете по-добре принципите му.

    YouTube също има поредица от разбираеми ръчно рисувани ролкиза това как работят невронните мрежи.

Друга популярна услуга е Dreamscope, която може не само да мечтае за кучета, но и да имитира различни стилове на рисуване. Обработката на изображения тук също е много проста и бърза (около 30 секунди).

Очевидно алгоритмичната част на услугата е модификация на програмата Neural style, която вече обсъдихме.

Съвсем наскоро се появи програма, която реалистично рисува черно-бели изображения. В предишните версии подобни програми се представяха далеч по-слабо и се смяташе за голямо постижение, ако поне 20% от хората не могат да направят разликата между реална картина и компютърно оцветена.

Освен това оцветяването тук отнема само около 1 минута.

Същата компания за разработка също пусна услуга, която разпознава в снимки различни видовеобекти.

Тези услуги може да изглеждат просто забавно забавление, но всъщност всичко е много по-интересно. Новите технологии навлизат в практиката на хората на изкуството и променят нашето разбиране за изкуството. Може би скоро хората ще трябва да се състезават с машини в областта на творчеството.

Преподаването на алгоритми за разпознаване на модели е задача, с която разработчиците се борят от дълго време. изкуствен интелект. Следователно програмите, които оцветяват стари снимки и рисуват кучета в небето, могат да се считат за част от по-голям и по-интригуващ процес.