Ostagram: Usługa oparta na sieci neuronowej, która łączy zdjęcia i ozdoby w artystyczne arcydzieła. Stylizacja obrazów za pomocą sieci neuronowych: bez mistycyzmu, tylko matan Sieć neuronowa rysuje obrazy

Od sierpnia 2015 r. niemieccy badacze z Uniwersytetu w Tybindze przedstawili swoje na temat możliwości przeniesienia stylu znany artysta na innych zdjęciach zaczęły pojawiać się serwisy, które zarabiały na tej okazji. Wszedł na rynek zachodni, a na rynek rosyjski - jego kompletny egzemplarz.

Do zakładek

Pomimo tego, że Ostagram wystartował w grudniu, w połowie kwietnia zaczął szybko zdobywać popularność w sieciach społecznościowych. Jednocześnie, na dzień 19 kwietnia, w projekcie na VKontakte było mniej niż tysiąc osób.

Aby skorzystać z usługi należy przygotować dwa zdjęcia: zdjęcie do obróbki oraz zdjęcie z przykładowym stylem do nałożenia na zdjęcie oryginalne.

Usługa ma wersję darmową: tworzy obraz w minimalnej rozdzielczości do 600 pikseli wzdłuż najdłuższego boku obrazu. Użytkownik otrzymuje wynik tylko jednej z iteracji nałożenia filtra na zdjęcie.

Dostępne są dwie wersje płatne: Premium tworzy obraz do 700 pikseli wzdłuż najdłuższego boku i stosuje do obrazu 600 iteracji przetwarzania sieci neuronowej (im więcej iteracji, tym ciekawsze i intensywniejsze przetwarzanie). Jedno takie zdjęcie kosztuje 50 rubli.

W wersji HD możesz dostosować liczbę iteracji: 100 kosztuje 50 rubli, a 1000 - 250 rubli. W takim przypadku obraz na najdłuższym boku będzie miał rozdzielczość do 1200 pikseli i można go wykorzystać do drukowania na płótnie: Ostagram oferuje tę usługę z dostawą od 1800 rubli.

W lutym przedstawiciele Ostagramu nie przyjmą próśb o obróbkę zdjęć od użytkowników „z krajów o rozwiniętym kapitalizmie”, ale potem będą mieli dostęp do obróbki zdjęć dla użytkowników VKontakte z całego świata. Sądząc po kodzie Ostagram opublikowanym na GitHub, został on opracowany przez Siergieja Morugina, 30-letniego mieszkańca Niżnego Nowogrodu.

Skontaktował się z TJ dyrektor handlowy projekt, wprowadzony przez Andreya. Według niego Ostagram pojawił się przed Instapainting, ale został zainspirowany podobnym projektem o nazwie Vipart.

Ostagram został opracowany przez grupę studentów z NNSTU. Alekseeva: po wstępnych testach na wąskiej grupie przyjaciół pod koniec 2015 roku postanowili upublicznić projekt. Początkowo przetwarzanie obrazu było całkowicie bezpłatne i planowano zarabiać na sprzedaży drukowanych obrazów. Według Andrieja pieczęć okazała się najbardziej wielki problem: zdjęcia ludzi przetwarzane przez sieć neuronową rzadko wyglądają przyjemnie dla ludzkiego oka, a klient końcowy musi długo korygować wynik przed nałożeniem go na płótno, co wymaga dużych zasobów maszynowych.

Do przetwarzania obrazu twórcy Ostagramu chcieli wykorzystać serwery w chmurze Amazon, ale po napływie użytkowników stało się jasne, że ich koszt przekroczy tysiąc dolarów dziennie przy minimalnym zwrocie z inwestycji. Andrey, który jest również inwestorem projektu, wynajął serwerownie w Niżnym Nowogrodzie.

Publiczność projektu to około tysiąca osób dziennie, ale w niektóre dni docierał on do 40 tysięcy osób ze względu na przejścia z zagraniczne media, którzy już zauważyli projekt przed krajowymi (Ostagramowi udało się nawet współpracować z europejskimi DJ-ami). W nocy, przy małym natężeniu ruchu, przetwarzanie obrazu może zająć 5 minut, aw ciągu dnia nawet godzinę.

O ile wcześniej zagraniczni użytkownicy celowo ograniczali dostęp do przetwarzania obrazu (myślano, że zacznie zarabiać od Rosji), teraz Ostagram już bardziej polega na zachodnich odbiorcach.

Do tej pory perspektywy zwrotu są warunkowe. Gdyby każdy użytkownik zapłacił za przetwarzanie 10 rubli, być może to się opłaci. […]

W naszym kraju zarabianie jest bardzo trudne: nasi ludzie są gotowi czekać tydzień, ale nie zapłacą za to ani grosza. Europejczycy są na to bardziej przychylni – jeśli chodzi o płacenie za przyspieszenie, poprawę jakości – więc orientacja jest skierowana na ten rynek.

Andrey, przedstawiciel Ostagram

Według Andreya zespół Ostagram pracuje nad Nowa wersja strona z silnym naciskiem na społeczności: „Będzie wyglądać jak jedna dobrze znana usługa, ale co robić”. Projektem zainteresowali się już przedstawiciele Facebooka w Rosji, ale do umowy nie doszło jeszcze do negocjacji w sprawie sprzedaży.

Przykłady prac serwisowych

W feedzie na stronie Ostagram można też zobaczyć, jaka kombinacja obrazów zaowocowała końcowymi ujęciami: często jest to nawet ciekawsze niż sam wynik. Jednocześnie filtry - zdjęcia wykorzystywane jako efekt do obróbki - mogą być zapisywane do dalszego wykorzystania.

Pozdrowienia, Habr! Na pewno zauważyłeś, że motyw stylizacji zdjęć na różne style artystyczne aktywnie omawiane w tych Twoich internetach. Czytając te wszystkie popularne artykuły, można by pomyśleć, że pod maską tych aplikacji dzieje się magia, a sieć neuronowa naprawdę fantazjuje i rysuje obraz od zera. Tak się złożyło, że nasz zespół stanął przed podobnym zadaniem: w ramach wewnętrznego hackathonu firmowego wykonaliśmy stylizację wideo, bo. istniała już aplikacja do zdjęć. W tym poście przyjrzymy się, jak sieć „przerysowuje” obrazy i przyjrzymy się artykułom, które to umożliwiły. Polecam zapoznać się z ostatnim postem przed przeczytaniem tego materiału i ogólnie z podstawami splotowych sieci neuronowych. Znajdziesz kilka formuł, trochę kodu (podam przykłady na Theano i Lasagne), a także dużo obrazków. Ten post jest wbudowany porządek chronologiczny pojawienie się artykułów i odpowiednio samych pomysłów. Czasami rozcieńczam to naszym ostatnim doświadczeniem. Oto chłopiec z piekła rodem na uwagę.


Wizualizacja i zrozumienie sieci splotowych (28 listopada 2013)

Przede wszystkim warto wspomnieć o artykule, w którym autorom udało się wykazać, że sieć neuronowa nie jest czarną skrzynką, ale rzeczą dosyć interpretowalną (swoją drogą, dziś można to powiedzieć nie tylko o sieciach splotowych dla komputera). wizja). Autorzy postanowili nauczyć się interpretować aktywacje neuronów warstwy ukrytej, do tego wykorzystali dekonwolucyjną sieć neuronową (deconvnet) zaproponowaną kilka lat wcześniej (notabene przez tych samych Zeilera i Fergusa, którzy są autorami tej publikacji dobrze). Sieć dekonwolucyjna to w rzeczywistości ta sama sieć, w której sploty i pulowanie są stosowane w odwrotnej kolejności. Oryginalna praca nad deconvnetem wykorzystywała sieć w trybie uczenia nienadzorowanego do generowania obrazów. Tym razem autorzy użyli go po prostu do odwrotnego przejścia od cech uzyskanych po przejściu w przód przez sieć do oryginalnego obrazu. Rezultatem jest obraz, który można zinterpretować jako sygnał, który spowodował tę aktywację na neuronach. Naturalnie pojawia się pytanie: jak sprawić, by odwrotność przeszła przez splot i nieliniowość? Tym bardziej, że dzięki maksymalnej puli, z pewnością nie jest to operacja odwrócona. Przyjrzyjmy się wszystkim trzem komponentom.

Odwróć ReLu

W sieciach konwolucyjnych często wykorzystywana jest funkcja aktywacji ReLu(x) = max(0, x), co sprawia, że ​​wszystkie aktywacje na warstwie są nieujemne. W związku z tym, przechodząc z powrotem przez nieliniowość, konieczne jest również uzyskanie wyników nieujemnych. W tym celu autorzy proponują wykorzystanie samego ReLu. Z punktu widzenia architektury Theano konieczne jest nadpisanie funkcji gradientu operacji (nieskończenie cenny notatnik znajduje się w przepisach na lasagne, stamtąd dowiesz się, czym jest klasa ModifiedBackprop).

Class ZeilerBackprop(ModifiedBackprop): def grad(self, input, out_grads): (inp,) = input (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype)) # jawnie sprostuj return (self.nonlinearity(grd),) # użyj podanej nieliniowości

Odwrotny splot

Tutaj jest trochę bardziej skomplikowanie, ale wszystko jest logiczne: wystarczy zastosować transponowaną wersję tego samego jądra splotowego, ale na wyjścia z odwrotnego ReLu zamiast poprzedniej warstwy użytej w przejściu do przodu. Ale obawiam się, że słowami nie jest to takie oczywiste, spójrzmy na wizualizację tego zabiegu (znajdziesz jeszcze więcej wizualizacji zwojów).


Konwolucja, gdy krok = 1

Konwolucja, gdy krok = 1 odwrócona wersja

Konwolucja przy kroku = 2

Konwolucja przy kroku = 2 odwrócona wersja

Odwrotne łączenie

Ta operacja (w przeciwieństwie do poprzednich) generalnie nie jest odwracalna. Ale nadal chcielibyśmy w jakiś sposób przejść przez maksimum podczas odwrotnego przejścia. W tym celu autorzy sugerują skorzystanie z mapy, gdzie podczas bezpośredniego przejścia znajdowało się maksimum (maksymalne przełączniki lokalizacji). Podczas przejścia wstecznego sygnał wejściowy jest zamieniany na unpooling w taki sposób, aby w przybliżeniu zachować strukturę oryginalnego sygnału, naprawdę łatwiej to zobaczyć niż opisać tutaj.



Wynik

Algorytm wizualizacji jest niezwykle prosty:

  1. Wykonaj proste podanie.
  2. Wybierz interesującą nas warstwę.
  3. Napraw aktywację jednego lub więcej neuronów i zresetuj resztę.
  4. Zrób wnioskowanie.

Każdy szary kwadrat na poniższym obrazku odpowiada wizualizacji filtra (który jest stosowany do splotu) lub wag pojedynczego neuronu, a każdy kolorowy obraz jest tą częścią oryginalnego obrazu, która aktywuje odpowiedni neuron. Dla jasności neurony w obrębie jednej warstwy są pogrupowane w grupy tematyczne. W ogóle nagle okazało się, że sieć neuronowa uczy się dokładnie tego, o czym pisali Hubel i Weisel w swojej pracy nad strukturą układu wizualnego, za co zostali nagrodzeni. nagroda Nobla w 1981 roku. Dzięki temu artykułowi otrzymaliśmy wizualną reprezentację tego, czego splotowa sieć neuronowa uczy się na każdej warstwie. To właśnie ta wiedza pozwoli później manipulować treścią generowanego obrazu, ale do tego jeszcze daleko, kolejne lata upłynęły na doskonaleniu metod „trepanacji” sieci neuronowych. Ponadto autorzy artykułu zaproponowali sposób analizy, jak najlepiej zbudować architekturę konwolucyjnej sieci neuronowej, aby osiągnąć najlepsze wyniki(nie wygrali jednak ImageNet 2013, ale dostali się na szczyt; UPD: okazuje się, że wygrali, Clarifai jest tym, czym są).


Wizualizacja funkcji


Oto przykład wizualizacji aktywacji za pomocą deconvnet, dziś ten wynik już tak wygląda, ale wtedy był to przełom.


Mapy Saliency przy użyciu deconvnet

Deep Inside Convolutional Networks: Wizualizacja modeli klasyfikacji obrazów i map istotności (19 kwietnia 2014)

Artykuł poświęcony jest badaniu metod wizualizacji wiedzy zawartych w splotowej sieci neuronowej. Autorzy proponują dwie metody wizualizacji oparte na opadaniu gradientowym.

Wizualizacja modelu klas

Wyobraźmy sobie więc, że mamy wytrenowaną sieć neuronową do rozwiązania problemu klasyfikacji na określoną liczbę klas. Oznacz jako wartość aktywacji neuronu wyjściowego odpowiadającego klasie c. Wtedy następujący problem optymalizacji daje nam dokładnie taki obraz, który maksymalizuje wybraną klasę:



To zadanie jest łatwe do rozwiązania za pomocą Theano. Zwykle prosimy framework, aby wziął pochodną parametrów modelu, ale tym razem zakładamy, że parametry są stałe i pochodna jest pobierana z obrazu wejściowego. Poniższa funkcja wybiera maksymalną wartość warstwy wyjściowej i zwraca funkcję, która oblicza pochodną w odniesieniu do obrazu wejściowego.


def compile_saliency_function(net): """ Kompiluje funkcję do obliczania map istotności i przewidywanych klas dla danej minipartii obrazów wejściowych. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], deterministic=True) max_outp = T.max(outp, axis=1) istotność = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, axis=1) return theano.function(, )

Prawdopodobnie widziałeś w Internecie dziwne obrazy psów - DeepDream. W oryginalnym artykule autorzy wykorzystują następujący proces do generowania obrazów, które maksymalizują wybraną klasę:

  1. Zainicjuj obraz początkowy zerami.
  2. Oblicz wartość pochodnej z tego obrazu.
  3. Zmień obraz, dodając do niego obraz wynikowy z pochodnej.
  4. Wróć do kroku 2 lub wyjdź z pętli.

Powstałe obrazy to:




Ale co, jeśli zainicjujesz pierwszy obraz prawdziwym zdjęciem i rozpoczniesz ten sam proces? Ale w każdej iteracji wybierzemy losową klasę, resztę ustawimy na zero i obliczymy wartość pochodnej, wtedy dostajemy taki głęboki sen.


Uwaga 60 mb


Dlaczego jest tak wiele psich pysków i oczu? To proste: w sieci wizerunkowej jest prawie 200 psów na 1000 klas, mają oczy. A także wiele zajęć, na których są tylko ludzie.

Ekstrakcja Saliency Klasy

Jeżeli proces ten zostanie zainicjowany prawdziwym zdjęciem, zatrzymany po pierwszej iteracji i wylosowaniu wartości pochodnej, to otrzymamy taki obraz, dodając do oryginalnego, zwiększymy wartość aktywacji wybranej klasy.


Mapy Saliency wykorzystujące pochodną


Znowu wynik jest „tak sobie”. Ważne jest, aby pamiętać, że to nowy sposób wizualizacja aktywacji (nic nie stoi na przeszkodzie, aby ustalić wartości aktywacji nie na ostatniej warstwie, ale generalnie na dowolnej warstwie sieci i wziąć pochodną względem obrazu wejściowego). Następny artykuł połączy oba poprzednie podejścia i da nam narzędzie, jak skonfigurować transfer stylu, co zostanie opisane później.

Dążenie do prostoty: The All Convolutional Net (13 kwietnia 2015)

Ten artykuł generalnie nie dotyczy wizualizacji, ale faktu, że zastąpienie poolingu splotem dużym krokiem nie prowadzi do utraty jakości. Jednak jako produkt uboczny swoich badań autorzy zaproponowali nowy sposób wizualizacji cech, który zastosowali do dokładniejszej analizy tego, czego uczy się model. Ich idea jest następująca: jeśli po prostu weźmiemy pochodną, ​​to te cechy, które były mniejsze od zera na obrazie wejściowym, nie wracają podczas dekonwolucji (używając ReLu dla obrazu wejściowego). A to prowadzi do tego, że na propagowanym obrazie tylnym pojawiają się wartości ujemne. Z drugiej strony, jeśli używasz deconvnet, to z pochodnej ReLu pobierane jest kolejne ReLu - to pozwala nie pomijać wartości ujemnych, ale jak widzieliście, wynik jest „tak sobie”. A co jeśli połączymy te dwie metody?




class GuidedBackprop(ModifiedBackprop): def grad(self, input, out_grads): (inp,) = input (grd,) = out_grads dtype = inp.dtype return (grd * (inp > 0).astype(dtype) * (grd > 0).astyp(dtyp),)

Otrzymasz wtedy całkowicie czysty i zrozumiały obraz.


Mapy Saliency przy użyciu Guided Backpropagation

Głębiej

Zastanówmy się teraz, co nam to daje? Przypomnę, że każda warstwa splotowa jest funkcją, która otrzymuje trójwymiarowy tensor jako dane wejściowe i wytwarza trójwymiarowy tensor jako dane wyjściowe, być może o innym wymiarze d x w x h; d epth to liczba neuronów w warstwie, każdy z nich generuje mapę cech z rozmiarem wósme x h osiem.


Wypróbujmy następujący eksperyment w sieci VGG-19:



konw1_2

Tak, prawie nic nie widzisz, ponieważ. obszar receptywny jest bardzo mały, jest to odpowiednio drugi zwój 3x3, całkowity obszar to 5x5. Ale powiększając, widzimy, że funkcja jest tylko detektorem gradientu.




konw3_3


konw4_3


konw5_3


basen5


A teraz wyobraź sobie, że zamiast maksimum nad płytką, weźmiemy pochodną wartości sumy wszystkich elementów płytki po obrazie wejściowym. Wtedy oczywiście obszar receptywny grupy neuronów pokryje cały obraz wejściowy. W przypadku wczesnych warstw zobaczymy jasne mapy, z których wywnioskujemy, że są to detektory kolorów, następnie gradienty, następnie granice i tak dalej w kierunku bardziej złożonych wzorów. Im głębsza warstwa, tym ciemniejszy obraz. Wyjaśnia to fakt, że głębsze warstwy mają bardziej złożony wzór, który wykrywają, a złożony wzór pojawia się rzadziej niż prosty, a zatem mapa aktywacji ciemnieje. Pierwszy sposób jest odpowiedni do zrozumienia warstw ze złożonymi wzorami, a drugi jest odpowiedni dla prostych.


konw1_1


konw.2_2


konw4_3


Możesz pobrać pełniejszą bazę danych aktywacji dla kilku obrazów i .

Neuronowy algorytm stylu artystycznego (2 września 2015)

Tak więc minęło kilka lat od pierwszej udanej trepanacji sieci neuronowej. My (w sensie człowieczeństwa) mamy w swoich rękach potężne narzędzie, co pozwala zrozumieć, czego uczy się sieć neuronowa, a także usunąć to, czego tak naprawdę nie chcielibyśmy, aby się nauczyła. Autorzy tego artykułu opracowują metodę, która pozwala sprawić, by jeden obraz generował podobną mapę aktywacji do jakiegoś docelowego obrazu, a być może nawet więcej niż jeden – to podstawa stylizacji. Wprowadzamy biały szum do danych wejściowych iw podobnym iteracyjnym procesie, jak w głębokim śnie, przenosimy ten obraz do takiego, w którym mapy cech są podobne do obrazu docelowego.

utrata treści

Jak już wspomniano, każda warstwa sieci neuronowej wytwarza trójwymiarowy tensor pewnego wymiaru.




Oznaczmy wyjście i th warstwa z wejścia jako . Następnie, jeśli zminimalizujemy ważoną sumę reszt między obrazem wejściowym i jakiś obraz, do którego dążymy c, otrzymasz dokładnie to, czego potrzebujesz. Może.



Do eksperymentowania z tym artykułem możesz użyć tego magicznego laptopa, na którym odbywają się obliczenia (zarówno na GPU, jak i na CPU). GPU służy do obliczania cech sieci neuronowej i wartości funkcji kosztu. Theano tworzy funkcję, która może obliczyć gradient funkcji celu eval_grad przez obraz wejściowy x. Jest on następnie podawany do lbfgs i rozpoczyna się iteracyjny proces.


# Zainicjuj z obrazem szumu generate_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) # Optymalizuj, okresowo zapisując wynik dla i w range(8): print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = generate_image.get_value().astype("float64") xs.append(x0)

Jeśli uruchomimy optymalizację takiej funkcji, to szybko uzyskamy obraz podobny do docelowego. Teraz możemy odtworzyć obrazy z białego szumu, które wyglądają jak jakiś obraz treści.


Utrata treści: conv4_2



Proces optymalizacji




Łatwo zauważyć dwie cechy powstałego obrazu:

  • utracone kolory – wynika to z faktu, że w konkretny przykład użyto tylko warstwy conv4_2 (czyli innymi słowy, waga w była dla niej niezerowa, a dla pozostałych warstw zero); jak pamiętasz, to wczesne warstwy zawierają informacje o kolorach i przejściach gradientowych, a późniejsze zawierają informacje o większych szczegółach, co obserwujemy - kolory giną, ale zawartość nie;
  • niektóre domy „chodźmy”, czyli linie proste są lekko zakrzywione - dzieje się tak dlatego, że im głębsza warstwa, tym mniej informacji o przestrzennym położeniu obiektu, który zawiera (wynik zastosowania splotów i pul).

Dodanie wczesnych warstw natychmiast koryguje sytuację z kolorami.


Utrata treści: konw.1_1, konw.2_1, konw.4_2


Mam nadzieję, że teraz masz wrażenie, że masz kontrolę nad tym, co zostanie przerysowane na obraz z białym szumem.

utrata stylu

A teraz doszliśmy do najciekawszego: jak przekazać styl? Czym jest styl? Oczywiście styl nie jest tym, co zoptymalizowaliśmy w Content Loss, ponieważ zawiera wiele informacji o przestrzennym położeniu obiektów.Więc pierwszą rzeczą do zrobienia jest w jakiś sposób usunięcie tych informacji z widoków otrzymywanych na każdej warstwie.


Autor proponuje następującą metodę. Weźmy tensor na wyjściu jakiejś warstwy, rozwińmy go we współrzędnych przestrzennych i obliczmy macierz kowariancji między płytkami. Oznaczmy tę transformację jako G. Co tak naprawdę zrobiliśmy? Można powiedzieć, że policzyliśmy, jak często cechy wewnątrz płytki występują parami, czyli inaczej przybliżyliśmy rozkład cech na płytkach o wielowymiarowym rozkładzie normalnym.




Następnie Style Loss wpisuje się w następujący sposób, gdzie s to jakiś obrazek ze stylem:



Spróbujemy dla Vincenta? W zasadzie otrzymujemy coś, czego się spodziewamy – szum w stylu Van Gogha, informacja o przestrzennym rozmieszczeniu funkcji ginie całkowicie.


Vincent




Co jeśli umieścimy zdjęcie zamiast stylowego obrazu? Okaże się już znajome funkcje, znajome kolory, ale nastawienie kompletnie zagubiony.


Zdjęcie z utratą stylu


Na pewno zastanawiałeś się, dlaczego obliczamy macierz kowariancji, a nie coś innego? W końcu istnieje wiele sposobów na agregację cech, dzięki czemu utracone zostaną współrzędne przestrzenne. To naprawdę pytanie otwarte, a jeśli weźmiesz coś bardzo prostego, wynik nie zmieni się dramatycznie. Sprawdźmy to, nie będziemy obliczać macierzy kowariancji, ale po prostu średnią wartość każdej płytki.




prosta utrata stylu

Połączona strata

Oczywiście istnieje potrzeba połączenia tych dwóch funkcji kosztów. Wtedy wygenerujemy taki obraz z białego szumu, że zachowa cechy z obrazu-treści (które mają powiązanie ze współrzędnymi przestrzennymi), a także pojawią się cechy „stylowe”, które nie są związane ze współrzędnymi przestrzennymi, tj. miejmy nadzieję, że szczegóły obrazu treści pozostaną nienaruszone, ale przerysowane we właściwym stylu.



W zasadzie jest też regularizer, ale dla uproszczenia go pominiemy. Pozostaje odpowiedzieć na pytanie: jakie warstwy (wagi) zastosować w optymalizacji? I obawiam się, że nie mam odpowiedzi na to pytanie, podobnie jak autorzy artykułu. Mają sugestię, aby skorzystać z poniższych, ale to wcale nie oznacza, że ​​inna kombinacja też będzie działać gorzej duża przestrzeń Szukaj. Jedyną zasadą, jaka wynika ze zrozumienia modelu jest to, że nie ma sensu brać sąsiednich warstw, ponieważ ich znaki nie będą się zbytnio różnić od siebie, dlatego do stylu dodawana jest warstwa z każdej grupy conv*_1.


# Zdefiniuj straty funkcji straty = # utrata zawartości loss.append(0.001 * content_loss(photo_features, gen_features, "conv4_2")) # style loss loss.append(0.2e6 * style_loss(art_features, gen_features, "conv1_1")) loss.append (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv4_1") ) lost.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # całkowita kara za zmianę loss.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = sum(losses)

Ostateczny model można przedstawić w następującej formie.




A oto wynik domów z Van Goghiem.



Próba kontrolowania procesu

Przypomnijmy poprzednie części, już dwa lata przed obecnym artykułem inni naukowcy badali to, czego naprawdę uczy się sieć neuronowa. Uzbrojony we wszystkie te artykuły, możesz generować wizualizacje funkcji. różne style, różne obrazy, różne rozdzielczości i rozmiary, a także spróbuj zrozumieć, które warstwy należy przyjąć. Ale nawet ponowne ważenie warstw nie daje pełnej kontroli nad tym, co się dzieje. Tutaj problem jest bardziej konceptualny: optymalizujemy niewłaściwą funkcję! Jak to, pytasz? Odpowiedź jest prosta: ta funkcja minimalizuje resztkowe ... cóż, masz pomysł. Ale tak naprawdę chcemy, żeby obraz nam się podobał. Wypukła kombinacja funkcji utraty treści i stylu nie jest miarą tego, co nasz umysł uważa za piękne. Zaobserwowano, że jeśli stylizacja jest kontynuowana zbyt długo, funkcja kosztów naturalnie spada coraz niżej, ale estetyczne piękno rezultatu gwałtownie spada.




OK, jest jeszcze jeden problem. Załóżmy, że znaleźliśmy warstwę, która wyodrębnia potrzebne nam funkcje. Powiedzmy, że niektóre tekstury są trójkątne. Ale ta warstwa nadal zawiera wiele innych cech, takich jak okręgi, których naprawdę nie chcemy widzieć na wynikowym obrazie. Ogólnie rzecz biorąc, gdybyśmy mogli zatrudnić milion Chińczyków, moglibyśmy zwizualizować wszystkie cechy stylu, a poprzez wyczerpujące wyszukiwanie po prostu zaznaczyć te, które są nam potrzebne, i uwzględnić je tylko w funkcji kosztów. Ale z oczywistych powodów nie jest to takie proste. Ale co, jeśli po prostu usuniemy z arkusza stylów wszystkie kółka, których nie chcemy w wyniku? Wtedy aktywacja odpowiednich neuronów, które reagują na koła, po prostu nie zadziała. I oczywiście wtedy nie pojawi się to na wynikowym obrazie. Tak samo jest z kwiatami. Zaprezentuj jasny obraz z dużą ilością kolorów. Rozkład kolorów będzie bardzo rozmazany w całej przestrzeni, rozkład wynikowego obrazu będzie taki sam, ale podczas procesu optymalizacji piki, które były na oryginale, prawdopodobnie zostaną utracone. Okazało się, że proste zmniejszenie głębi bitowej palety kolorów rozwiązuje ten problem. Gęstość dystrybucji większości kolorów będzie bliska zeru, aw kilku obszarach pojawią się duże piki. Tak więc, manipulując oryginałem w Photoshopie, manipulujemy funkcjami wyodrębnionymi z obrazu. Łatwiej jest człowiekowi wyrazić swoje pragnienia wizualnie, niż próbować je sformułować w języku matematyki. Do widzenia. W rezultacie projektanci i menedżerowie uzbrojeni w Photoshopa i skrypty do wizualizacji funkcji osiągnęli wynik trzy razy szybciej niż matematycy i programiści.


Przykład manipulacji kolorem i wielkością cech


I możesz od razu wziąć prosty obraz jako styl



wyniki








A oto vidosik, ale tylko z odpowiednią teksturą

Texture Networks: Feed-forward synteza tekstur i stylizowanych obrazów (10 marca 2016)

Wydaje się, że można by to powstrzymać, gdyby nie jeden niuans. Powyższy algorytm stylizacji działa bardzo długo. Jeśli weźmiemy implementację, w której lbfgs jest uruchamiany na procesorze, proces trwa około pięciu minut. Jeśli przepiszesz go tak, aby optymalizacja trafiła do GPU, proces zajmie 10-15 sekund. Nie jest dobrze. Być może autorzy tego i następnego artykułu myśleli o tym samym. Obie publikacje ukazały się niezależnie w odstępie 17 dni, prawie rok po poprzednim artykule. Autorzy obecnego artykułu, podobnie jak autorzy poprzedniego, zajmowali się generowaniem tekstur (jeśli po prostu zresetujesz utratę stylu, to mniej więcej to otrzymasz). Zasugerowali optymalizację nie obrazu uzyskanego z białego szumu, ale jakiejś sieci neuronowej, która generuje stylizowany obraz.




Teraz, jeśli proces stylizacji nie obejmuje żadnej optymalizacji, wystarczy wykonać tylko przejście do przodu. A optymalizacja jest wymagana tylko raz, aby wyszkolić sieć generatorów. W tym artykule zastosowano generator hierarchiczny, w którym każde z poniższych z większe niż poprzednie i jest próbkowane z szumu w przypadku generowania tekstur oraz z bazy danych obrazów do treningu stylizacji. Niezwykle ważne jest użycie czegoś innego niż szkoleniowej części imagenetu, ponieważ funkcje wewnątrz sieci strat są obliczane przez sieć przeszkoloną tylko w części szkoleniowej.



Straty percepcyjne przy transferze stylu w czasie rzeczywistym i superrozdzielczości (27 marca 2016 r.)

Jak sama nazwa wskazuje, autorzy, którzy spóźnili się zaledwie 17 dni na pomysł sieci generującej, zajęli się zwiększaniem rozdzielczości obrazów. Wydaje się, że zainspirował ich sukces uczenia się szczątkowego w najnowszym imagenecie.




Odpowiednio blok rezydualny i blok konw.



Tym samym teraz oprócz kontroli stylizacji mamy w rękach również szybki generator (dzięki tym dwóm artykułom czas generowania jednego obrazu mierzony jest w dziesiątkach ms).

Zakończenie

Informacje z recenzowanych artykułów oraz kod autorów wykorzystaliśmy jako punkt wyjścia do stworzenia kolejnej aplikacji do stylizacji dla pierwszej aplikacji do stylizacji wideo:



Wygeneruj coś takiego.


Na najzwyklejszych fotografiach pojawiają się liczne i nie do końca rozpoznawalne byty. Najczęściej z jakiegoś powodu psy. Takie obrazy zaczęły pojawiać się w Internecie w czerwcu 2015 roku, kiedy uruchomiono DeepDream od Google – jeden z pierwszych otwarte usługi oparte na sieciach neuronowych i przeznaczone do przetwarzania obrazu.

Dzieje się to mniej więcej tak: algorytm analizuje zdjęcia, znajduje w nich fragmenty, które przypominają mu znane obiekty - i zgodnie z tymi danymi zniekształca obraz.

Najpierw projekt został rozplanowany jako open source, a następnie w Internecie pojawiły się serwisy internetowe stworzone na tych samych zasadach. Jednym z najwygodniejszych i najpopularniejszych jest Deep Dream Generator: przetworzenie tutaj małego zdjęcia zajmuje tylko około 15 sekund (wcześniej użytkownicy musieli czekać ponad godzinę).

Jak sieci neuronowe uczą się tworzyć takie obrazy? A przy okazji, dlaczego tak się nazywają?

Sieci neuronowe w swojej konstrukcji imitują prawdziwe sieci neuronowe żywego organizmu, ale robią to za pomocą algorytmów matematycznych. Po stworzeniu podstawowej struktury możesz ją trenować za pomocą metod uczenia maszynowego. Jeśli mówimy o rozpoznawaniu wzorców, to tysiące obrazów trzeba przepuścić przez sieć neuronową. Jeśli zadanie sieci neuronowej jest inne, to ćwiczenia treningowe będą inne.

Na przykład algorytmy do gry w szachy analizują partie szachowe. Idąc tą samą ścieżką, algorytm AlphaGo Google DeepMind do chińskiej gry w Go – okrzyknięto przełomem, ponieważ Go jest znacznie bardziej złożone i nieliniowe niż szachy.

    Możesz bawić się uproszczonym modelem sieci neuronowej i lepiej zrozumieć jej zasady.

    YouTube ma również serię zrozumiałych, ręcznie rysowanych rolki o tym, jak działają sieci neuronowe.

Inną popularną usługą jest Dreamscope, który potrafi nie tylko marzyć o psach, ale także naśladować różne style malowania. Przetwarzanie obrazu jest tutaj również bardzo proste i szybkie (około 30 sekund).

Podobno algorytmiczna część serwisu to modyfikacja programu w stylu Neural, o której już wspominaliśmy.

Niedawno pojawił się program, który realistycznie maluje czarno-białe obrazy. W poprzednich wersjach podobne programy wykonywały swoją pracę znacznie gorzej i uznano za wielkie osiągnięcie, jeśli co najmniej 20% ludzi nie potrafiło odróżnić prawdziwego obrazu od komputera w kolorze.

Co więcej, koloryzacja zajmuje tutaj tylko około 1 minuty.

Ta sama firma deweloperska uruchomiła również usługę, która rozpoznaje na zdjęciach różne rodzaje przedmioty.

Usługi te mogą wydawać się zabawną rozrywką, ale w rzeczywistości wszystko jest o wiele ciekawsze. Nowe technologie wkraczają w praktykę ludzkich artystów i zmieniają nasze rozumienie sztuki. Być może już niedługo ludzie będą musieli konkurować z maszynami w dziedzinie kreatywności.

Uczenie algorytmów rozpoznawania wzorców to zadanie, z którym programiści zmagają się od dłuższego czasu. sztuczna inteligencja. Dlatego programy, które kolorują stare fotografie i rysują psy na niebie, można uznać za część większego i bardziej intrygującego procesu.