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

Pozdrawiam, Habro! Z pewnością zauważyłeś, że temat stylizacji zdjęć w celu dopasowania ich do różnych stylów artystycznych jest aktywnie dyskutowany 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 tak naprawdę wyobraża sobie i przerysowuje obraz od zera. Tak się złożyło, że nasz zespół stanął przed podobnym zadaniem: w ramach wewnętrznego hackatonu firmowego wykonaliśmy stylizację wideo, bo… Była już aplikacja do zdjęć. W tym poście dowiemy się, jak sieć „przerysowuje” obrazy i przeanalizujemy artykuły, które to umożliwiły. Polecam przeczytać poprzedni wpis przed zapoznaniem się z tym materiałem i ogólnie z podstawami splotowych sieci neuronowych. Znajdziesz tu trochę formuł, trochę kodu (podam przykłady na Theano i Lasagne), a także mnóstwo zdjęć. Ten post jest zorganizowany w porządku chronologicznym według pojawiania się artykułów i, odpowiednio, samych pomysłów. Czasami rozcieńczę to naszymi niedawnymi doświadczeniami. Oto chłopiec z piekła rodem, który ma zwrócić twoją 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ą w pełni interpretowalną (swoją drogą, dziś można to powiedzieć nie tylko o sieciach splotowych dla komputerów wizja). Autorzy postanowili nauczyć się interpretować aktywacje neuronów w warstwach ukrytych; wykorzystali w tym celu dekonwolucyjną sieć neuronową (deconvnet), zaproponowaną kilka lat wcześniej (swoją drogą przez tych samych Seilera i Fergusa, którzy są autorami tej pracy). opublikowanie). Sieć dekonwolucyjna to właściwie ta sama sieć ze splotami i pulami, ale zastosowana w odwrotnej kolejności. Oryginalna praca nad deconvnet wykorzystywała sieć w trybie uczenia się bez nadzoru do generowania obrazów. Tym razem autorzy wykorzystali go po prostu do cofnięcia się od cech uzyskanych po przejściu przez sieć do oryginalnego obrazu. W rezultacie powstaje obraz, który można zinterpretować jako sygnał powodujący tę aktywację w neuronach. Naturalnie pojawia się pytanie: jak dokonać odwrotnego przejścia przez splot i nieliniowość? Co więcej, w przypadku maksymalnego łączenia zasobów z pewnością nie jest to operacja odwracalna. Przyjrzyjmy się wszystkim trzem komponentom.

Odwróć ReLu

W sieciach splotowych często wykorzystuje się funkcję aktywacji ReLu(x) = max(0, x), co sprawia, że ​​wszystkie aktywacje na warstwie są nieujemne. W związku z tym, przechodząc przez nieliniowość, konieczne jest również uzyskanie wyników nieujemnych. W tym celu autorzy sugerują użycie tego samego ReLu. Z architektonicznego punktu widzenia Theano musi zastąpić funkcję operacji na gradientach (nieskończenie cenny notatnik znajduje się w Przepisach na Lasagna, stamtąd można uzyskać szczegółowe informacje na temat klasy ModifiedBackprop).

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

Odwrotny splot

To jest trochę bardziej skomplikowane, ale wszystko jest logiczne: wystarczy zastosować transponowaną wersję tego samego jądra splotu, ale na wyjściach z odwrotnego ReLu zamiast poprzedniej warstwy użytej w przebiegu do przodu. Ale obawiam się, że nie jest to tak oczywiste słowami, spójrzmy na wizualizację tej procedury (znajdziesz jeszcze więcej wizualizacji splotów).


Splot z krokiem = 1

Splot z krokiem = 1 Wersja odwrotna

Splot z krokiem = 2

Splot z krokiem = 2 Wersja odwrotna

Odwrotne łączenie

Tej operacji (w przeciwieństwie do poprzednich) generalnie nie można odwrócić. Ale i tak chcielibyśmy w drodze powrotnej jakoś przebić się przez maksimum. W tym celu autorzy sugerują wykorzystanie mapy miejsc, w których znajdowało się maksimum podczas bezpośredniego przejazdu (przełączniki lokalizacji maksymalnych). Podczas przejścia wstecznego sygnał wejściowy jest konwertowany na unpooling w taki sposób, aby w przybliżeniu zachować strukturę oryginalnego sygnału, tutaj naprawdę łatwiej to zobaczyć niż opisać;



Wynik

Algorytm wizualizacji jest niezwykle prosty:

  1. Wykonaj proste przejście.
  2. Wybierz interesującą nas warstwę.
  3. Zarejestruj aktywację jednego lub więcej neuronów i zresetuj resztę.
  4. Wyciągnij odwrotny wniosek.

Każdy szary kwadrat na obrazku poniżej odpowiada wizualizacji filtra (który jest używany do splotu) lub wag jednego neuronu, a każdy kolorowy obraz jest częścią oryginalnego obrazu, która aktywuje odpowiedni neuron. Dla przejrzystości neurony w ramach jednej warstwy pogrupowano 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 wzrokowego, za co w 1981 roku otrzymali Nagrodę Nobla. Dzięki temu artykułowi otrzymaliśmy wizualną reprezentację tego, czego uczy się splotowa sieć neuronowa w każdej warstwie. To właśnie ta wiedza umożliwi później manipulowanie zawartością wygenerowanego obrazu, ale do tego jeszcze daleko; kolejne kilka lat poświęcono udoskonalaniu metod „trepanowania” sieci neuronowych. Dodatkowo autorzy artykułu zaproponowali sposób analizy, jak najlepiej zbudować architekturę splotowej sieci neuronowej, aby osiągnąć lepsze wyniki (choć nie wygrali ImageNet 2013, ale dotarli na sam szczyt; UPD: okazuje się, że wygrali, Clarifai jest tym, czym są).


Wizualizacja funkcji


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


Mapy istotności przy użyciu deconvnet

Głęboko w sieciach konwolucyjnych: wizualizacja modeli klasyfikacji obrazów i map istotności (19 kwietnia 2014 r.)

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

Wizualizacja modelu klasowego

Wyobraźmy sobie więc, że mamy wytrenowaną sieć neuronową, która rozwiązuje problem klasyfikacji na określoną liczbę klas. Oznaczmy wartość aktywacji neuronu wyjściowego, która odpowiada klasie C. Następnie następujący problem optymalizacyjny daje nam dokładnie taki obraz, który maksymalizuje wybraną klasę:



Ten problem można łatwo rozwiązać za pomocą Theano. Zwykle prosimy framework o wzięcie pochodnej w odniesieniu do parametrów modelu, ale tym razem zakładamy, że parametry są stałe, a pochodną oblicza się w odniesieniu do obrazu wejściowego. Poniższa funkcja wybiera maksymalną wartość warstwy wyjściowej i zwraca funkcję obliczającą pochodną obrazu wejściowego.


def Compare_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"], deterministyczny=True) max_outp = T.max(outp, oś=1) istotność = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, oś=1) zwróć theano.function(, )

Prawdopodobnie widziałeś w Internecie dziwne obrazy z twarzami psów - DeepDream. W oryginalnej pracy autorzy wykorzystują następujący proces do generowania obrazów maksymalizujących wybraną klasę:

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

Powstałe obrazy to:




A co jeśli zainicjujemy pierwszy obraz prawdziwą fotografią i rozpoczniemy ten sam proces? Ale przy każdej iteracji będziemy wybierać losową klasę, resztę resetować i obliczać wartość pochodnej, otrzymamy coś w rodzaju tego głębokiego snu.


Uwaga 60mb


Dlaczego jest tak wiele psich twarzy i oczu? To proste: w imagenecie jest prawie 200 psów na 1000 klas, mają one oczy. A także wiele klas, w których są po prostu ludzie.

Ekstrakcja istotności klas

Jeśli proces ten zainicjujemy fotografią prawdziwą, zatrzymamy po pierwszej iteracji i wylosujemy wartość pochodnej, to otrzymamy taki obraz, dodając do oryginalnego, zwiększymy wartość aktywacyjną wybranej klasy.


Mapy istotności przy użyciu pochodnej


Ponownie wynik jest „taki sobie”. Warto zaznaczyć, że jest to nowy sposób wizualizacji aktywacji (nic nie stoi na przeszkodzie, abyśmy ustalili wartości aktywacji nie na ostatniej warstwie, ale w ogóle na dowolnej warstwie sieci i wzięli pochodną względem obrazu wejściowego ). Następny artykuł połączy oba poprzednie podejścia i dostarczy nam narzędzia umożliwiającego skonfigurowanie transferu stylu, co zostanie opisane później.

Dążenie do prostoty: cała sieć splotowa (13 kwietnia 2015)

Artykuł ten generalnie nie jest o wizualizacji, ale o tym, że zastąpienie łączenia 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 wykorzystali do dokładniejszej analizy tego, czego uczy się model. Ich idea jest następująca: jeśli po prostu weźmiemy pochodną, ​​to podczas dekonwolucji te cechy, które w obrazie wejściowym były mniejsze od zera, nie są przekazywane z powrotem (używając ReLu dla obrazu wejściowego). A to prowadzi do tego, że na propagowanym z powrotem obrazie pojawiają się wartości ujemne. Z drugiej strony, jeśli użyjesz deconvnet, wówczas z pochodnej ReLu zostanie pobrany kolejny ReLu - pozwala to nie przekazywać wartości ujemnych, ale jak widziałeś, wynik jest „taki sobie”. Ale co, jeśli połączysz te dwie metody?




klasa 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),)

Otrzymasz wtedy całkowicie czysty i możliwy do zinterpretowania obraz.


Mapy istotności wykorzystujące kierowaną propagację wsteczną

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, a także tworzy trójwymiarowy tensor jako wynik, 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 o rozmiarze w ith x H osiem.


Spróbujmy wykonać następujący eksperyment w sieci VGG-19:



konw1_2

Tak, prawie nic nie widać, bo... obszar recepcyjny jest bardzo mały, jest to odpowiednio drugi splot 3x3, całkowity obszar wynosi 5x5. Ale powiększając, widzimy, że ta funkcja jest po prostu detektorem gradientu.




konw3_3


konw4_3


konw5_3


basen5


Wyobraźmy sobie teraz, że zamiast maksimum po bloku, weźmiemy pochodną wartości sumy wszystkich elementów bloku po obrazie wejściowym. Wtedy oczywiście obszar recepcyjny grupy neuronów obejmie cały obraz wejściowy. Dla wczesnych warstw zobaczymy jasne mapy, z których wnioskujemy, że są to detektory kolorów, następnie gradienty, następnie krawędzie 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, więc mapa aktywacji zanika. Pierwsza metoda jest odpowiednia do zrozumienia warstw o ​​złożonych wzorach, a druga tylko do prostych.


konw1_1


konw2_2


konw4_3


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

Algorytm neuronowy stylu artystycznego (2 września 2015)

Tak więc minęło kilka lat od pierwszej udanej trepanacji sieci neuronowej. My (w sensie ludzkości) mamy w rękach potężne narzędzie, które pozwala nam zrozumieć, czego uczy się sieć neuronowa, a także usunąć to, czego tak naprawdę nie chcemy, aby się uczyła. Autorzy artykułu opracowują metodę, która pozwala na wygenerowanie z jednego obrazu mapy aktywacji podobnej do jakiegoś obrazu docelowego, a być może nawet więcej niż jednego – to jest podstawa stylizacji. Do danych wejściowych stosujemy biały szum i stosując podobny proces iteracyjny jak w głębokim śnie, redukujemy ten obraz do takiego, którego mapy cech są podobne do obrazu docelowego.

Utrata treści

Jak już wspomniano, każda warstwa sieci neuronowej wytwarza trójwymiarowy tensor o pewnym wymiarze.




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



Aby poeksperymentować z tym artykułem, możesz użyć tego magicznego laptopa, w którym odbywają się obliczenia (zarówno na GPU, jak i 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 ocena_grad według obrazu wejściowego X. Następnie jest to wprowadzane do lbfgs i rozpoczyna się proces iteracyjny.


# Zainicjuj obrazem szumu wygenerowany_image.set_value(floatX(np.random.uniform(-128, 128, (1, 3, IMAGE_W, IMAGE_W)))) x0 = wygenerowany_image.get_value().astype("float64") xs = xs.append(x0) # Optymalizuj, zapisując wynik okresowo dla i w zakresie(8): print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = wygenerowany_image.get_value().astype("float64") xs.append(x0)

Jeśli przeprowadzimy optymalizację takiej funkcji, szybko uzyskamy obraz podobny do docelowego. Teraz możemy użyć białego szumu do odtworzenia obrazów podobnych do niektórych obrazów treści.


Utrata treści: konv4_2



Proces optymalizacji




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

  • utracone zostały kolory - wynika to z faktu, że w konkretnym przykładzie wykorzystano jedynie warstwę conv4_2 (czyli inaczej waga w dla niej była niezerowa, a dla pozostałych warstw zerowa); jak pamiętacie, to wczesne warstwy zawierają informacje o kolorach i przejściach gradientowych, a późniejsze zawierają informacje o większych szczegółach i to właśnie obserwujemy - kolory giną, ale treść nie;
  • niektóre domy „przeniosły się”, tj. linie proste są lekko zakrzywione – dzieje się tak dlatego, że im głębsza warstwa, tym mniej informacji o położeniu przestrzennym obiektu w niej zawartego (efekt zastosowania splotów i łączenia).

Dodanie wczesnych warstw natychmiast poprawia sytuację kolorystyczną.


Utrata treści: konw1_1, konw2_1, konw4_2


Mamy nadzieję, że już czujesz, że masz kontrolę nad tym, co zostanie przerysowane na obrazie z białym szumem.

Utrata stylu

A teraz dochodzimy do najciekawszej części: jak przekazać styl? Czym jest styl? Oczywiście styl nie jest czymś, co optymalizowaliśmy w Content Loss, ponieważ zawiera wiele informacji o przestrzennym położeniu obiektów. Pierwszą rzeczą, którą musimy zrobić, to w jakiś sposób usunąć te informacje z widoków otrzymanych na każdej warstwie.


Autor sugeruje następującą metodę. Weźmy tensor na wyjściu pewnej warstwy, rozwińmy go wzdłuż współrzędnych przestrzennych i obliczmy macierz kowariancji pomiędzy blokami. Oznaczmy tę transformację jako G. Co tak naprawdę zrobiliśmy? Można powiedzieć, że obliczyliśmy, jak często cechy w obrębie plamy występują parami, czyli innymi słowy, przybliżyliśmy rozkład cech w plamach za pomocą wielowymiarowego rozkładu normalnego.




Następnie wprowadza się stratę stylu w następujący sposób, gdzie S- to jest obrazek ze stylem:



Może spróbujemy tego dla Vincenta? Dostajemy w zasadzie coś oczekiwanego – szum w stylu Van Gogha, informacja o przestrzennym rozmieszczeniu cech zostaje całkowicie utracona.


Wincenty




A co, jeśli zamiast obrazu stylu umieścisz zdjęcie? Otrzymasz znajome cechy, znajome kolory, ale pozycja przestrzenna zostanie całkowicie utracona.


Zdjęcie z utratą stylu


Prawdopodobnie zastanawiałeś się, dlaczego obliczamy macierz kowariancji, a nie coś innego? W końcu istnieje wiele sposobów agregowania obiektów, co powoduje utratę współrzędnych przestrzennych. To naprawdę otwarte pytanie i jeśli weźmiesz coś bardzo prostego, wynik nie zmieni się radykalnie. Sprawdźmy to, nie będziemy obliczać macierzy kowariancji, a po prostu średnią wartość każdej płytki.




prosta utrata stylu

Połączona strata

Naturalnie istnieje chęć połączenia tych dwóch funkcji kosztów. Następnie wygenerujemy obraz z białego szumu w taki sposób, aby zachował cechy obrazu zawartości (które są powiązane ze współrzędnymi przestrzennymi), a także zawierał cechy „stylu”, które nie są powiązane ze współrzędnymi przestrzennymi, tj. mamy nadzieję, że szczegóły obrazu zawartości pozostaną nienaruszone na swoich miejscach, ale zostaną przerysowane w pożądanym stylu.



W rzeczywistości istnieje również regularizer, ale pominiemy go dla uproszczenia. Pozostaje odpowiedzieć na pytanie: jakie warstwy (wagi) zastosować podczas optymalizacji? I obawiam się, że nie mam odpowiedzi na to pytanie, podobnie jak autorzy artykułu. Mają propozycję wykorzystania poniższych, ale to wcale nie oznacza, że ​​inna kombinacja będzie działać gorzej, przestrzeń poszukiwań jest za duża. Jedyna zasada, która wynika ze zrozumienia modelu: nie ma sensu brać sąsiednich warstw, bo ich charakterystyka nie będzie się zbytnio od siebie różnić, dlatego do stylu dodawana jest warstwa z każdej grupy conv*_1.


# Zdefiniuj straty funkcji straty = # straty treści.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") ) straty.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # łączna kara za odmianę loss.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = suma(straty)

Ostateczny model można przedstawić następująco.




A oto efekt domów z Van Goghiem.



Próbuję kontrolować proces

Przypomnijmy poprzednie części, już dwa lata przed obecnym artykułem inni naukowcy badali, czego tak naprawdę uczy się sieć neuronowa. Uzbrojeni w te wszystkie artykuły, możesz generować wizualizacje obiektów w różnych stylach, różnych obrazach, różnych rozdzielczościach i rozmiarach, a także próbować zrozumieć, których warstw użyć z jaką wagą. Ale nawet ponowne ważenie warstw nie daje pełnej kontroli nad tym, co się dzieje. Problem tutaj jest bardziej koncepcyjny: optymalizujemy niewłaściwą funkcję! Jak to, pytasz? Odpowiedź jest prosta: ta funkcja minimalizuje rozbieżności... cóż, rozumiesz. 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. Zauważono, że jeśli stylizacja będzie kontynuowana zbyt długo, funkcja kosztu w naturalny sposób spada coraz niżej, ale estetyczne piękno wyniku gwałtownie spada.




No dobra, 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 zawiera również wiele innych elementów, takich jak okręgi, których tak naprawdę nie chcemy widzieć na powstałym obrazie. Ogólnie rzecz biorąc, gdybyśmy mogli zatrudnić milion Chińczyków, moglibyśmy zwizualizować wszystkie cechy obrazu stylu i brutalną siłą po prostu zaznaczyć te, których potrzebujemy i uwzględnić je tylko w funkcji kosztu. Ale z oczywistych powodów nie jest to takie proste. Ale co, jeśli po prostu usuniemy z obrazu stylu wszystkie okręgi, których nie chcemy widzieć w wyniku? Wtedy aktywacja odpowiednich neuronów reagujących na koła po prostu nie zadziała. I oczywiście nie pojawi się to na wynikowym obrazie. Podobnie jest z kwiatami. Wyobraź sobie jasny obraz z dużą ilością kolorów. Rozkład kolorów będzie bardzo rozmazany w całej przestrzeni, a rozkład powstałego obrazu będzie taki sam, jednak w procesie optymalizacji prawdopodobnie utracone zostaną te piki, które były na oryginale. Okazało się, że samo zmniejszenie głębi bitowej palety kolorów rozwiązuje ten problem. Gęstość dystrybucji większości kolorów będzie bliska zeru, a w kilku obszarach wystąpią duże wartości szczytowe. Zatem manipulując oryginałem w Photoshopie, manipulujemy cechami wyodrębnionymi z obrazu. Łatwiej jest wyrazić swoje pragnienia wizualnie, niż próbować sformułować je w języku matematyki. Do widzenia. W rezultacie projektanci i menedżerowie, uzbrojeni w Photoshopa i skrypty do wizualizacji funkcji, osiągali wyniki trzy razy szybciej niż matematycy i programiści.


Przykład manipulowania kolorem i rozmiarem obiektów


Możesz też użyć prostego obrazu jako stylu



wyniki








Tutaj filmik, ale tylko z odpowiednią teksturą

Sieci tekstur: synteza tekstur i stylizowanych obrazów z wyprzedzeniem (10 marca 2016 r.)

Wydaje się, że gdyby nie jeden niuans, moglibyśmy na tym poprzestać. Wykonanie powyższego algorytmu stylizacji zajmuje bardzo dużo czasu. Jeśli weźmiemy implementację, w której lbfgs działa na procesorze, proces zajmie około pięciu minut. Jeśli przepiszesz go tak, aby optymalizacja trafiła do GPU, proces zajmie 10-15 sekund. To nie jest dobre. 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, niemal rok po poprzednim artykule. Autorzy obecnego artykułu, podobnie jak autorzy poprzedniego, zajmowali się generowaniem tekstur (jeśli po prostu zresetujesz stratę stylu do zera, otrzymasz to). Zaproponowali optymalizację nie obrazu uzyskanego z białego szumu, ale jakiejś sieci neuronowej, która generuje stylizowany obraz.




Teraz, jeśli proces stylizacji nie wymaga żadnej optymalizacji, wystarczy wykonać tylko podanie do przodu. Optymalizacja jest wymagana tylko raz, aby wyszkolić sieć generatorów. W tym artykule zastosowano generator hierarchiczny, w którym każdy następny z większy od poprzedniego i pobrany z szumu w przypadku generowania tekstur oraz z jakiejś bazy danych obrazów do szkolenia stylisty. Bardzo ważne jest użycie czegoś innego niż część szkoleniowa imagenetu, ponieważ... funkcje w sieci Loss są obliczane przez sieć przeszkoloną podczas części szkoleniowej.



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

Jak sugeruje tytuł, autorzy, którzy spóźnili się zaledwie 17 dni z koncepcją sieci generatywnej, pracowali nad zwiększeniem rozdzielczości obrazów. Najwyraźniej inspirowali się sukcesami uczenia resztkowego w najnowszym imagenecie.




W związku z tym blok resztkowy i blok konw.



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

Kończący się

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



Generuje coś takiego.


Na najzwyklejszych fotografiach pojawiają się liczne i nie do końca rozpoznawalne byty. Najczęściej z jakiegoś powodu psy. Internet zaczął się zapełniać takimi obrazami w czerwcu 2015 roku, kiedy uruchomiono DeepDream firmy Google – jedną z pierwszych otwartych usług opartych na sieciach neuronowych i przeznaczonych do przetwarzania obrazów.

Dzieje się to mniej więcej tak: algorytm analizuje zdjęcia, znajduje w nich fragmenty, które przypominają mu jakieś znajome obiekty – i na podstawie tych danych zniekształca obraz.

Najpierw projekt został opublikowany jako open source, a następnie w Internecie pojawiły się usługi online tworzone według tych samych zasad. Jednym z najwygodniejszych i najpopularniejszych jest Deep Dream Generator: przetworzenie małego zdjęcia zajmuje tutaj tylko około 15 sekund (wcześniej użytkownicy musieli czekać ponad godzinę).

W jaki sposób sieci neuronowe uczą się tworzyć takie obrazy? A swoją drogą, dlaczego tak się nazywają?

Sieci neuronowe swoją strukturą imitują rzeczywiste sieci neuronowe żywego organizmu, jednak robią to za pomocą algorytmów matematycznych. Po stworzeniu podstawowej struktury można ją trenować metodami uczenia maszynowego. Jeśli mówimy o rozpoznawaniu obrazu, to tysiące obrazów musi zostać przepuszczonych przez sieć neuronową. Jeżeli zadanie sieci neuronowej jest inne, wówczas ćwiczenia treningowe będą inne.

Na przykład algorytmy gry w szachy analizują partie szachowe. W ten sam sposób algorytm AlphaGo z Google DeepMind wprowadzono do chińskiej gry Go – co zostało odebrane jako przełom, gdyż Go jest znacznie bardziej złożone i nieliniowe niż szachy.

    Można pobawić się uproszczonym modelem sieci neuronowych i lepiej zrozumieć jego zasady.

    Na YouTubie dostępna jest także seria zrozumiałych rysunków rolki o tym, jak działają sieci neuronowe.

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

Najwyraźniej częścią algorytmiczną usługi jest modyfikacja programu „Neural style”, o którym już mówiliśmy.

Niedawno pojawił się program, który realistycznie koloruje czarno-białe obrazy. W poprzednich wersjach podobne programy radziły sobie znacznie słabiej, a za duże osiągnięcie uznawano fakt, że przynajmniej 20% osób nie potrafiło odróżnić obrazu prawdziwego od obrazu pokolorowanego komputerowo.

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

Ta sama firma deweloperska uruchomiła także usługę rozpoznawania różnych typów obiektów na zdjęciach.

Usługi te mogą wydawać się po prostu rozrywką, ale w rzeczywistości wszystko jest o wiele bardziej interesujące. Nowe technologie wkraczają w praktykę ludzkich artystów i zmieniają nasze rozumienie sztuki. Jest prawdopodobne, że ludzie wkrótce będą musieli konkurować z maszynami w dziedzinie kreatywności.

Nauczenie algorytmów rozpoznawania obrazów to zadanie, z którym twórcy sztucznej inteligencji borykają się od dawna. Dlatego programy kolorujące stare fotografie i rysujące psy na niebie można uznać za część większego i bardziej intrygującego procesu.

Odkąd w sierpniu 2015 roku niemieccy badacze z Uniwersytetu w Tybindze zaprezentowali swój pomysł przeniesienia stylu znanych artystów na inne fotografie, zaczęły pojawiać się serwisy, które monetyzują tę szansę. Został wprowadzony na rynek zachodni, a jego kompletny egzemplarz na rynek rosyjski.

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 uczestniczyło mniej niż tysiąc osób.

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

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

Istnieją dwie płatne wersje: Premium tworzy obraz o długości do 700 pikseli wzdłuż najdłuższego boku i poddaje obrazowi 600 iteracji przetwarzania sieci neuronowej (im więcej iteracji, tym ciekawsze i intensywniejsze przetwarzanie). Jedno takie zdjęcie będzie kosztować 50 rubli.

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

W lutym przedstawiciele Ostagramu ogłosili, że nie będą przyjmować próśb o obróbkę zdjęć od użytkowników „z krajów o rozwiniętym kapitalizmie”, ale wówczas umożliwią dostęp do obróbki zdjęć użytkownikom VKontakte z całego świata. Sądząc po kodzie Ostagramu opublikowanym na GitHubie, jego autorem jest Sergey Morugin, 30-letni mieszkaniec Niżnego Nowogrodu.

TJ skontaktował się z dyrektorem handlowym projektu, który przedstawił się jako Andrey. Według niego Ostagram pojawił się przed Instapainting, ale został zainspirowany podobnym projektem o nazwie Vipart.

Ostagram został opracowany przez grupę studentów z NSTU. Alekseeva: po wstępnych testach na wąskiej grupie przyjaciół pod koniec 2015 roku postanowiono upublicznić projekt. Początkowo obróbka zdjęć była całkowicie bezpłatna, a plan był taki, aby zarabiać na sprzedaży drukowanych obrazów. Według Andreya największym problemem okazał się druk: zdjęcia ludzi przetworzone przez sieć neuronową rzadko wyglądają przyjemnie dla ludzkiego oka, a klient końcowy potrzebuje dużo czasu na dopasowanie efektu przed nałożeniem go na płótno, co wymaga duże zasoby maszynowe.

Twórcy Ostagramu chcieli wykorzystać serwery w chmurze Amazon do przetwarzania obrazów, ale po napływie użytkowników stało się jasne, że koszty przekroczą tysiąc dolarów dziennie przy minimalnym zwrocie z inwestycji. Andrey, który jest także inwestorem projektu, wynajął pojemność serwerów w Niżnym Nowogrodzie.

Publiczność projektu to około tysiąca osób dziennie, ale w niektóre dni sięgała ona 40 tysięcy dzięki rekomendacjom mediów zagranicznych, które zauważyły ​​projekt już wcześniej niż krajowe (Ostagramowi udało się nawet współpracować z europejskimi DJ-ami). W nocy, gdy ruch jest niewielki, przetwarzanie obrazu może zająć 5 minut, a w ciągu dnia nawet godzinę.

O ile wcześniej dostęp do przetwarzania obrazu był celowo ograniczony do użytkowników zagranicznych (myśleli o rozpoczęciu monetyzacji w Rosji), teraz Ostagram bardziej liczy na zachodnich odbiorców.

Dziś perspektywy odbicia są warunkowe. Gdyby każdy użytkownik zapłacił 10 rubli za przetworzenie, być może udałoby się to odzyskać. […]

W naszym kraju bardzo trudno jest zarobić: nasi ludzie są gotowi poczekać tydzień, ale nie zapłacą za to ani grosza. Europejczycy są temu bardziej przychylni – jeśli chodzi o płacenie za przyspieszenie i poprawę jakości – dlatego kierują się na ten rynek.

Andrey, przedstawiciel Ostagramu

Według Andreya zespół Ostagramu pracuje nad nową wersją witryny z większym naciskiem na społecznościowość: „Będzie podobna do jednej znanej usługi, ale co zrobić”. Projektem zainteresowali się już przedstawiciele Facebooka w Rosji, jednak negocjacje w sprawie sprzedaży nie doszły jeszcze do punktu sprzedaży.

Przykłady pracy serwisowej

W kanale na stronie Ostagram możesz także zobaczyć kombinację obrazów, która dała efekt końcowy: często jest to nawet bardziej interesujące niż sam wynik. W takim przypadku filtry – zdjęcia użyte jako efekt do obróbki – można zapisać do wykorzystania w przyszłości.