kshitizrimal / deepStyle

paź 19, 2021
admin

To jest implementacja TensorFlow kilku technik opisanych w pracach:

  • Image Style Transfer Using Convolutional Neural Networksby Leon A. Gatys, Alexander S. Ecker, Matthias Bethge
  • Artistic style transfer for videosby Manuel Ruder, Alexey Dosovitskiy, Thomas Brox
  • Preserving Color in Neural Artistic Style Transferby Leon A. Gatys, Matthias Bethge, Aaron Hertzmann, Eli Shechtman

Dodatkowo przedstawiono techniki segmentacji semantycznej i wielokrotnego transferu stylów.

Algorytm Neural Style syntetyzuje pastisz poprzez separację i łączenie treści jednego obrazu ze stylem innego obrazu przy użyciu konwolwentowych sieci neuronowych (CNN). Poniżej znajduje się przykład przeniesienia stylu artystycznego Gwiaździstej nocy na zdjęcie lwa afrykańskiego:

Przeniesienie stylu różnych dzieł sztuki na ten sam obraz treści daje jakościowo przekonujące wyniki:

Tutaj reprodukujemy Rysunek 3 z pierwszej pracy, który oddaje fotografię Neckarfront w Tybindze, Niemcy w stylu 5 różnych ikonicznych obrazów Rozbicie Minotaura, Gwiaździsta noc, Kompozycja VII, Krzyk, Siedzący akt:

Content / Style Tradeoff

Względna waga stylu i treści może być kontrolowana.

Tutaj renderujemy z rosnącą wagą stylu zastosowaną do Red Canna:

Wielokrotne obrazy stylu

Więcej niż jeden obraz stylu może być użyty do mieszania wielu stylów artystycznych.

Górny rząd (od lewej do prawej): The Starry Night + The Scream, The Scream + Composition VII, Seated Nude + Composition VII
Dolny rząd (od lewej do prawej): Seated Nude + The Starry Night, Oversoul + Freshness of Cold, David Bowie + Skull

Style Interpolation

Przy użyciu wielu obrazów stylów można kontrolować stopień mieszania między obrazami.

Górny rząd (od lewej do prawej): obraz zawartości, .2 The Starry Night + .8 The Scream, .8 The Starry Night + .2 The Scream
Dolny rząd (od lewej do prawej): .2 Oversoul + .8 Freshness of Cold, .5 Oversoul + .5 Freshness of Cold, .8 Oversoul + .2 Freshness of Cold

Transfer style but not color

Schemat kolorów oryginalnego obrazu może być zachowany przez dołączenie flagi --original_colors. Kolory są przenoszone przy użyciu przestrzeni kolorów YUV, YCrCb, CIE L*a*b* lub CIE L*u*v*.

Tutaj reprodukujemy Rysunek 1 i Rysunek 2 z trzeciej pracy z wykorzystaniem transferu tylko luminancji:

Od lewej do prawej: obraz zawartości, obraz stylizowany, obraz stylizowany z oryginalnymi kolorami obrazu zawartości

Tekstury

Algorytm nie jest ograniczony do artystycznych stylów malarskich. Może być również stosowany do tekstur fotograficznych w celu tworzenia obrazów pareidolicznych.

Segmentacja

Styl może być przeniesiony na semantyczne segmentacje w obrazie treści.

Można przenieść wiele stylów na pierwszy plan i tło obrazu zawartości.

Od lewej do prawej: obraz zawartości, styl pierwszego planu, styl tła, maska pierwszego planu, maska tła, obraz stylizowany

Wideo

Animacje mogą być renderowane przez zastosowanie algorytmu do każdej klatki źródłowej. Aby uzyskać najlepsze rezultaty, zejście gradientowe jest inicjowane z poprzednio stylizowaną klatką wypaczoną do bieżącej klatki zgodnie z przepływem optycznym pomiędzy parą klatek. Funkcje strat dla spójności czasowej są używane do karania pikseli wykluczających wyłączone regiony i granice ruchu.


Górny rząd (od lewej do prawej): klatki źródłowe, wizualizacja przepływu optycznego prawdy o podłożu
Dolny rząd (od lewej do prawej): wyłączone regiony i granice ruchu, stylizowane klatki

Inicjalizacja zejścia gradientowego

Inicjalizacja zejścia gradientowego jest kontrolowana za pomocą --init_img_type dla pojedynczych obrazów i --init_frame_type lub --first_frame_type dla klatek wideo. Biały szum pozwala na wygenerowanie dowolnej liczby różnych obrazów. Natomiast inicjalizacja z ustalonym obrazem zawsze zbiega do tego samego wyjścia.

Tutaj powielamy rysunek 6 z pierwszej pracy:

Górny rząd (od lewej do prawej): Inicjalizowany obrazem zawartości, obrazem stylu, białym szumem (RNG seed 1)
Dolny rząd (od lewej do prawej): Inicjalizowany z białym szumem (nasiona RNG 2, 3, 4)

Reprezentacje warstw

Złożoność cech i rozmiary pól receptywnych rosną w dół heirarchii CNN.

Tutaj powielamy rysunek 3 z oryginalnej pracy:

.

.

.

1 x 10^-5 1 x 10^-4 1 x 10^-3 1 x 10^-.2
conv1_1
conv2_1 conv2_1
conv2_1
conv3_1
conv4_1
conv5_1

Rzędy: rosnące podzbiory warstw CNN; i.np. 'conv4_1′ oznacza użycie 'conv1_1′, 'conv2_1′, 'conv3_1′, 'conv4_1′.
Kolumny: stosunek alfa/beta rekonstrukcji treści i stylu (patrz Content / Style Tradeoff).

Setup

Zależności:

  • tensorflow
  • opencv

Opcjonalne (ale zalecane) zależności:

  • CUDA 7.5+
  • cuDNN 5.0+

Po zainstalowaniu zależności:

  • Pobierz wagi modelu VGG-19 (zobacz sekcję „Modele VGG-VD z projektu Very Deep Convolutional Networks for Large-Scale Visual Recognition”). Więcej informacji o sieci VGG-19 można znaleźć tutaj.
  • Po pobraniu skopiuj plik z wagami imagenet-vgg-verydeep-19.mat do katalogu projektu.

Użycie

Użycie podstawowe

Pojedynczy obraz

  1. Kopiuj 1 obraz zawartości do domyślnego katalogu zawartości obrazu ./image_input
  2. Kopiuj 1 lub więcej obrazów stylów do domyślnego katalogu stylów ./styles
  3. Uruchom polecenie:

bash stylize_image.sh <path_to_content_image> <path_to_style_image>

Przykład:

bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg

Uwaga: Obsługiwane formaty obrazów obejmują: .png, .jpg, .ppm, .pgm

Uwaga: Ścieżki do obrazów nie powinny zawierać znaku ~ reprezentującego katalog domowy; zamiast tego należy użyć ścieżki względnej lub ścieżki bezwzględnej.

Ramki wideo

  1. Kopiuj 1 wideo zawartości do domyślnego katalogu zawartości wideo ./video_input
  2. Kopiuj 1 lub więcej obrazów stylów do domyślnego katalogu stylów ./styles
  3. Wykonaj polecenie:
bash stylize_video.sh <path_to_video> <path_to_style_image>

Przykład:

bash stylize_video.sh ./video_input/video.mp4 ./styles/kandinsky.jpg

Uwaga: Obsługiwane formaty wideo obejmują: .mp4, .mov, .mkv

Advanced Usage

Pojedyncze obrazy lub klatki wideo

  1. Kopiuj obrazy zawartości do domyślnego katalogu zawartości obrazów ./image_input lub skopiuj klatki wideo do domyślnego katalogu zawartości wideo ./video_input
  2. Kopiuj 1 lub więcej obrazów stylów do domyślnego katalogu stylów ./styles
  3. Uruchom polecenie z określonymi argumentami:
python neural_style.py <arguments>

Przykład (Pojedynczy obraz):

python neural_style.py --content_img golden_gate.jpg \ --style_imgs starry-night.jpg \ --max_size 1000 \ --max_iterations 100 \ --original_colors \ --device /cpu:0 \ --verbose;

Aby użyć wielu obrazów stylów, przekaż listę nazw obrazów i wag obrazów oddzieloną spacjami, jak poniżej:

--style_imgs starry_night.jpg the_scream.jpg --style_imgs_weights 0.5 0.5

Przykład (Klatki wideo):

python neural_style.py --video \ --video_input_dir ./video_input/my_video_frames \ --style_imgs starry-night.jpg \ --content_weight 5 \ --style_weight 1000 \ --temporal_weight 1000 \ --start_frame 1 \ --end_frame 50 \ --max_size 1024 \ --first_frame_iterations 3000 \ --verbose;

Uwaga: W przypadku użycia --init_frame_type prev_warp musisz wcześniej obliczyć przepływ optyczny wstecz i do przodu między klatkami. Zobacz ./video_input/make-opt-flow.sh i ./video_input/run-deepflow.sh

Argumenty

  • --content_img: Nazwa pliku obrazu zawartości. Przykład: lion.jpg
  • --content_img_dir: Względna lub bezwzględna ścieżka katalogu do obrazu zawartości. Domyślnie: ./image_input
  • --style_imgs: Nazwy plików obrazów stylów. Aby użyć wielu obrazów stylów, przekaż listę oddzieloną spacjami. Przykład: --style_imgs starry-night.jpg
  • --style_imgs_weights: Wagi mieszania dla każdego obrazu stylu. Domyślnie: 1.0 (zakłada tylko 1 obraz stylu)
  • --style_imgs_dir: Względna lub bezwzględna ścieżka katalogu do obrazów stylów. Domyślnie: ./styles
  • --init_img_type: Obraz używany do inicjalizacji sieci. Do wyboru: content, random, style. Domyślnie: content
  • --max_size: Maksymalna szerokość lub wysokość obrazów wejściowych. Domyślnie: 512
  • --content_weight: Waga dla funkcji utraty zawartości. Domyślnie: 5e0
  • --style_weight: Waga dla funkcji utraty stylu. Domyślnie: 1e4
  • --tv_weight: Waga dla funkcji całkowitej straty wariancyjnej. Domyślnie: 1e-3
  • --temporal_weight: Waga dla funkcji straty czasowej. Domyślnie: 2e2
  • --content_layers: Oddzielone od przestrzeni nazwy warstw VGG-19 używane dla obrazu zawartości. Domyślnie: conv4_2
  • --style_layers: Oddzielone od przestrzeni nazwy warstw VGG-19 używane dla obrazu stylu. Domyślnie: relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
  • --content_layer_weights: Oddzielone od siebie przestrzennie wagi każdej warstwy zawartości do straty zawartości. Domyślnie: 1.0
  • --style_layer_weights: Oddzielone od przestrzeni wagi każdej warstwy stylu do straty. Domyślnie: 0.2 0.2 0.2 0.2 0.2
  • --original_colors: Flaga boolean wskazująca, czy styl jest przenoszony, ale nie kolory.
  • --color_convert_type: Przestrzenie kolorów (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*) do konwersji dopasowującej luminancję do kolorów oryginalnych. Do wyboru: yuv, ycrcb, luv, lab. Domyślnie: yuv
  • --style_mask: Flaga boolean wskazująca, czy styl jest przenoszony do regionów maskowanych.
  • --style_mask_imgs: Nazwy plików obrazów masek stylów (przykład: face_mask.png). Aby użyć wielu obrazów masek stylów, należy przekazać listę oddzieloną spacjami. Przykład: --style_mask_imgs face_mask.png face_mask_inv.png
  • --noise_ratio: Wartość interpolacji między obrazem zawartości a obrazem szumu, jeśli sieć jest inicjalizowana za pomocą random. Domyślnie: 1.0
  • --seed: Seed dla generatora liczb losowych. Domyślnie: 0
  • --model_weights: Wagi i skośności sieci VGG-19. Pobierz tutaj. Domyślnie:imagenet-vgg-verydeep-19.mat
  • --pooling_type: Typ łączenia w sieci neuronowej konwolucyjnej. Wybory: avg, max. Domyślnie: avg
  • --device: Urządzenie GPU lub CPU. Tryb GPU jest wysoce zalecany, ale wymaga NVIDIA CUDA. Wybory: /gpu:0 /cpu:0. Domyślnie: /gpu:0
  • --img_output_dir: Katalog, do którego zapisywane są dane wyjściowe. Domyślnie: ./image_output
  • --img_name: Nazwa pliku obrazu wyjściowego. Domyślnie: result
  • --verbose: Flaga boolean wskazująca, czy oświadczenia powinny być wypisywane do konsoli.

Argumenty optymalizacji

  • --optimizer: Optymalizator minimalizacji strat. L-BFGS daje lepsze wyniki. Adam używa mniej pamięci. Wybory: lbfgs, adam. Domyślnie: lbfgs
  • --learning_rate: Parametr szybkości uczenia dla optymalizatora Adam. Domyślnie: 1e0

  • --max_iterations: Maksymalna liczba iteracji dla optymalizatora Adam lub L-BFGS. Domyślnie: 1000
  • --print_iterations: Liczba iteracji między instrukcjami drukowania optymalizatora. Domyślnie: 50
  • --content_loss_function: Różne stałe K w funkcji straty zawartości. Wybory: 1, 2, 3. Domyślnie: 1

Argumenty ramki wideo

  • --video: Flaga logiczna wskazująca, czy użytkownik tworzy wideo.
  • --start_frame: Numer pierwszej klatki. Domyślnie: 1
  • --end_frame: Numer ostatniej klatki. Domyślnie: 1
  • --first_frame_type: Obraz używany do inicjalizacji sieci podczas renderowania pierwszej ramki. Do wyboru: content, random, style. Domyślnie: random
  • --init_frame_type: Obraz używany do inicjalizacji sieci podczas każdego renderowania po pierwszej klatce. Do wyboru: prev_warped, prev, content, random, style. Domyślnie: prev_warped
  • --video_input_dir: Względna lub bezwzględna ścieżka katalogu do ramek wejściowych. Domyślnie: ./video_input
  • --video_output_dir: Względna lub bezwzględna ścieżka katalogu, do którego mają być zapisywane ramki wyjściowe. Domyślnie: ./video_output
  • --content_frame_frmt: Format łańcucha ramek wejściowych. Domyślnie: frame_{}.png
  • --backward_optical_flow_frmt: Ciąg formatu plików wstecznego przepływu optycznego. Domyślnie: backward_{}_{}.flo
  • --forward_optical_flow_frmt: Ciąg formatu plików przepływu optycznego do przodu. Domyślnie: forward_{}_{}.flo
  • --content_weights_frmt: Ciąg formatu plików spójności przepływu optycznego. Domyślnie: reliable_{}_{}.txt
  • --prev_frame_indices: Poprzednie ramki do uwzględnienia dla długoterminowej spójności czasowej. Domyślnie: 1
  • --first_frame_iterations: Maksymalna liczba iteracji optymalizatora dla pierwszej ramki. Domyślnie: 2000
  • --frame_iterations: Maksymalna liczba iteracji optymalizatora dla każdej ramki po pierwszej ramce. Default: 800

Pytania i errata

Wysyłanie pytań lub problemów:

Pamięć

Domyślnie program neural-style-tf używa backendu GPU NVIDIA cuDNN do konwolucji i L-BFGS do optymalizacji.Dają one lepsze i szybsze wyniki, ale mogą zużywać dużo pamięci. Możesz zmniejszyć zużycie pamięci, stosując następujące rozwiązania:

  • Użyj Adama: Dodaj flagę --optimizer adam, aby użyć Adama zamiast L-BFGS. Powinno to znacznie zmniejszyć zużycie pamięci, ale będzie wymagało dostrojenia innych parametrów w celu uzyskania dobrych wyników; w szczególności należy poeksperymentować z różnymi wartościami --learning_rate, --content_weight, --style_weight
  • Zmniejsz rozmiar obrazu: Możesz zmniejszyć rozmiar generowanego obrazu za pomocą argumentu --max_size.

Szczegóły implementacji

Wszystkie obrazy zostały wyrenderowane na maszynie z:

  • Procesor: Intel Core i7-6800K @ 3.40GHz × 12
  • GPU: NVIDIA GeForce GTX 1080/PCIe/SSE2
  • OS: Linux Ubuntu 16.04.1 LTS 64-bit
  • CUDA: 8.0
  • python: 2.7.12
  • tensorflow: 0.10.0rc
  • opencv: 2.4.9.1

Podziękowania

Implementacja powstała w oparciu o projekty:

  • Torch (Lua) implementacja 'neural-style’ by jcjohnson
  • Torch (Lua) implementacja 'artistic-videos’ by manuelruder

Źródłowe klatki wideo uzyskano z:

  • MPI Sintel Flow Dataset

Artystyczne obrazy zostały stworzone przez współczesnych artystów:

  • Alex Grey
  • Minjae Lee
  • Leonid Afremov
  • Françoise Nielly
  • James Jean
  • Ben Giles
  • Callie Fink
  • H.R. Giger
  • Voka

Obrazy artystyczne zostały stworzone przez popularnych artystów historycznych:

  • Vincent Van Gogh
  • Wassily Kandinsky
  • Georgia O’Keeffe
  • Jean-.Michel Basquiat
  • Édouard Manet
  • Pablo Picasso
  • Joseph Mallord William Turner
  • Frida Kahlo

Skrypty powłoki Bash do testowania zostały stworzone przez mojego brata Sheldona Smitha.

Cytowanie

Jeśli uznasz ten kod za przydatny w swoich badaniach, proszę cytuj:

@misc{Smith2016, author = {Smith, Cameron}, title = {neural-style-tf}, year = {2016}, publisher = {GitHub}, journal = {GitHub repository}, howpublished = {\url{https://github.com/cysmith/neural-style-tf}},}

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.