kshitizrimal / deepStyle

Okt 19, 2021
admin

Dies ist eine TensorFlow-Implementierung mehrerer Techniken, die in den Papers:

  • 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

Zusätzlich werden Techniken zur semantischen Segmentierung und zum Transfer mehrerer Stile vorgestellt.

Der Neural Style Algorithmus synthetisiert ein Pastiche, indem er den Inhalt eines Bildes mit dem Stil eines anderen Bildes unter Verwendung von Faltungsneuronalen Netzen (CNN) trennt und kombiniert. Nachfolgend ein Beispiel für die Übertragung des künstlerischen Stils von „The Starry Night“ auf ein Foto eines afrikanischen Löwen:

Die Übertragung des Stils verschiedener Kunstwerke auf dasselbe Inhaltsbild führt zu qualitativ überzeugenden Ergebnissen:

Hier reproduzieren wir Abbildung 3 aus der ersten Arbeit, die ein Foto der Neckarfront in Tübingen im Stil von 5 verschiedenen ikonischen Gemälden wiedergibt Der Untergang des Minotaurus, Die Sternennacht, Komposition VII, Der Schrei, Sitzender Akt:

Inhalt / Stil Tradeoff

Das relative Gewicht des Stils und des Inhalts kann kontrolliert werden.

Hier rendern wir mit einer zunehmenden Stilgewichtung, die auf Red Canna angewendet wird:

Mehrere Stilbilder

Mehr als ein Stilbild kann verwendet werden, um mehrere künstlerische Stile zu mischen.

Obere Reihe (von links nach rechts): Die sternenklare Nacht + Der Schrei, Der Schrei + Komposition VII, Sitzender Akt + Komposition VII
Untere Reihe (von links nach rechts): Sitzender Akt + Sternennacht, Überseele + Frische der Kälte, David Bowie + Schädel

Stilinterpolation

Bei Verwendung mehrerer Stilbilder kann der Grad der Überblendung zwischen den Bildern gesteuert werden.

Obere Reihe (von links nach rechts): Inhaltsbild, .2 Sternennacht + .8 Der Schrei, .8 Die Sternennacht + .2 Der Schrei
Untere Reihe (von links nach rechts): .2 Überseele + .8 Frische der Kälte, .5 Überseele + .5 Frische der Kälte, .8 Überseele + .2 Frische der Kälte

Stil, aber nicht Farbe übertragen

Das Farbschema des Originalbildes kann durch Einfügen der Markierung --original_colors erhalten bleiben. Farben werden entweder in den Farbräumen YUV, YCrCb, CIE L*a*b* oder CIE L*u*v* übertragen.

Hier reproduzieren wir Abbildung 1 und Abbildung 2 im dritten Aufsatz unter Verwendung der reinen Luminanzübertragung:

Von links nach rechts: Inhaltsbild, stilisiertes Bild, stilisiertes Bild mit den ursprünglichen Farben des Inhaltsbildes

Texturen

Der Algorithmus ist nicht auf künstlerische Malstile beschränkt. Er kann auch auf fotografische Texturen angewendet werden, um pareidolische Bilder zu erzeugen.

Segmentierung

Der Stil kann auf semantische Segmentierungen im Inhaltsbild übertragen werden.

Mehrere Stile können auf den Vorder- und Hintergrund des Inhaltsbildes übertragen werden.

Von links nach rechts: Inhaltsbild, Vordergrundstil, Hintergrundstil, Vordergrundmaske, Hintergrundmaske, stilisiertes Bild

Video

Animationen können gerendert werden, indem der Algorithmus auf jedes Quellbild angewendet wird. Um die besten Ergebnisse zu erzielen, wird der Gradientenabstieg mit dem zuvor stilisierten Bild initialisiert, das entsprechend dem optischen Fluss zwischen den beiden Bildern auf das aktuelle Bild verzerrt wird. Verlustfunktionen für die zeitliche Konsistenz werden verwendet, um Pixel zu bestrafen, die nicht berücksichtigte Regionen und Bewegungsgrenzen ausschließen.


Obere Reihe (von links nach rechts): Quellbilder, visualisierter optischer Fluss der Grundwahrheit
Untere Reihe (von links nach rechts): Ausgeschlossene Regionen und Bewegungsgrenzen, stilisierte Bilder

Initialisierung des Gradientenabstiegs

Die Initialisierung des Gradientenabstiegs wird mit --init_img_type für Einzelbilder und --init_frame_type oder --first_frame_type für Videobilder gesteuert. Mit weißem Rauschen kann eine beliebige Anzahl von Einzelbildern erzeugt werden. Die Initialisierung mit einem festen Bild konvergiert hingegen immer zum gleichen Ergebnis.

Hier wird Abbildung 6 aus der ersten Arbeit wiedergegeben:

Oberste Reihe (von links nach rechts): Initialisiert mit dem Inhaltsbild, dem Stilbild, weißem Rauschen (RNG-Seed 1)
Untere Reihe (von links nach rechts): Initialisiert mit weißem Rauschen (RNG-Seeds 2, 3, 4)

Schichtrepräsentationen

Die Komplexität der Merkmale und die Größe des rezeptiven Feldes nehmen in der CNN-Hierarchie nach unten hin zu.

Hier reproduzieren wir Abbildung 3 aus der Originalarbeit:

1 x 10^-5 1 x 10^-4 1 x 10^-3 1 x 10^-2
konv1_1
konv2_1
konv3_1
conv4_1
conv5_1

Zeilen: Aufsteigende Teilmengen von CNN-Schichten; d.z. B. ‚conv4_1‘ bedeutet die Verwendung von ‚conv1_1‘, ‚conv2_1‘, ‚conv3_1‘, ‚conv4_1‘.
Spalten: alpha/beta-Verhältnis der Inhalts- und Stilrekonstruktion (siehe Content / Style Tradeoff).

Setup

Abhängigkeiten:

  • tensorflow
  • opencv

Optionale (aber empfohlene) Abhängigkeiten:

  • CUDA 7.5+
  • cuDNN 5.0+

Nach der Installation der Abhängigkeiten:

  • Laden Sie die VGG-19-Modellgewichte herunter (siehe Abschnitt „VGG-VD-Modelle aus dem Projekt Very Deep Convolutional Networks for Large-Scale Visual Recognition“). Weitere Informationen über das VGG-19-Netzwerk finden Sie hier.
  • Kopieren Sie nach dem Herunterladen die Gewichtungsdatei imagenet-vgg-verydeep-19.mat in das Projektverzeichnis.

Verwendung

Grundlegende Verwendung

Einzelnes Bild

  1. Kopiere 1 Inhaltsbild in das Standard-Inhaltsverzeichnis ./image_input
  2. Kopiere 1 oder mehrere Stilbilder in das Standard-Stilverzeichnis ./styles
  3. Starte den Befehl:
bash stylize_image.sh <path_to_content_image> <path_to_style_image>

Beispiel:

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

Hinweis: Unterstützte Bildformate sind: .png, .jpg, .ppm, .pgm

Hinweis: Pfade zu Bildern sollten nicht das Zeichen ~ enthalten, um Ihr Heimatverzeichnis darzustellen; Sie sollten stattdessen einen relativen Pfad oder den absoluten Pfad verwenden.

Videoframes

  1. Kopieren Sie 1 Inhaltsvideo in das Standardvideoinhaltsverzeichnis ./video_input
  2. Kopieren Sie 1 oder mehrere Stilbilder in das Standardstilverzeichnis ./styles
  3. Ausführen des Befehls:
bash stylize_video.sh <path_to_video> <path_to_style_image>

Beispiel:

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

Hinweis: Unterstützte Videoformate sind: .mp4, .mov, .mkv

Erweiterte Verwendung

Einzelne Bilder oder Videoframes

  1. Kopieren von Inhaltsbildern in das Standardverzeichnis für Bildinhalte ./image_input oder Kopieren von Videoframes in das Standardverzeichnis für Videoinhalte ./video_input
  2. Kopieren von 1 oder mehreren Stilbildern in das Standardstilverzeichnis ./styles
  3. Ausführen des Befehls mit bestimmten Argumenten:
python neural_style.py <arguments>

Beispiel (Einzelbild):

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;

Um mehrere Stilbilder zu verwenden, übergeben Sie eine durch Leerzeichen getrennte Liste der Bildnamen und Bildgewichte wie folgt:

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

Beispiel (Videobilder):

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;

Hinweis: Wenn Sie --init_frame_type prev_warp verwenden, müssen Sie zuvor den optischen Rückwärts- und Vorwärtsfluss zwischen den Bildern berechnet haben. Siehe ./video_input/make-opt-flow.sh und ./video_input/run-deepflow.sh

Argumente

  • --content_img: Dateiname des Inhaltsbildes. Beispiel: lion.jpg
  • --content_img_dir: Relativer oder absoluter Verzeichnispfad zum Inhaltsbild. Standardwert: ./image_input
  • --style_imgs: Dateinamen der Stilbilder. Um mehrere Stilbilder zu verwenden, übergeben Sie eine durch Leerzeichen getrennte Liste. Beispiel: --style_imgs starry-night.jpg
  • --style_imgs_weights: Die Überblendungsgewichte für jedes Stilbild. Voreinstellung: 1.0 (geht von nur 1 Stilbild aus)
  • --style_imgs_dir: Relativer oder absoluter Verzeichnispfad zu den Stilbildern. Standardwert: ./styles
  • --init_img_type: Bild, das zur Initialisierung des Netzwerks verwendet wird. Auswahlmöglichkeiten: content, random, style. Voreinstellung: content
  • --max_size: Maximale Breite oder Höhe der Eingabebilder. Voreinstellung: 512
  • --content_weight: Gewicht für die Inhaltsverlustfunktion. Voreinstellung: 5e0
  • --style_weight: Gewichtung für die Stilverlustfunktion. Voreinstellung: 1e4
  • --tv_weight: Gewicht für die Gesamtvariationsverlustfunktion. Voreinstellung: 1e-3
  • --temporal_weight: Gewicht für die temporale Verlustfunktion. Voreinstellung: 2e2
  • --content_layers: Durch Leerzeichen getrennte VGG-19-Schichtnamen, die für das Inhaltsbild verwendet werden. Voreinstellung: conv4_2
  • --style_layers: Durch Leerzeichen getrennte VGG-19-Ebenennamen, die für das Stilbild verwendet werden. Voreinstellung: relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
  • --content_layer_weights: Durch Leerzeichen getrennte Gewichtung der einzelnen Inhaltsebenen für den Inhaltsverlust. Voreinstellung: 1.0
  • --style_layer_weights: Leerzeichen-getrennte Gewichte jeder Stilebene zum Verlust. Standardwert: 0.2 0.2 0.2 0.2 0.2
  • --original_colors: Boolesches Flag, das angibt, ob der Stil übertragen wird, aber nicht die Farben.
  • --color_convert_type: Farbräume (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*) für die Konvertierung in Originalfarben mit Luminanzanpassung. Auswahlmöglichkeiten: yuv, ycrcb, luv, lab. Voreinstellung: yuv
  • --style_mask: Boolesches Flag, das angibt, ob der Stil auf maskierte Bereiche übertragen wird.
  • --style_mask_imgs: Dateinamen der Stilmaskenbilder (Beispiel: face_mask.png). Um mehrere Stilmaskenbilder zu verwenden, übergeben Sie eine durch Leerzeichen getrennte Liste. Beispiel: --style_mask_imgs face_mask.png face_mask_inv.png
  • --noise_ratio: Interpolationswert zwischen dem Inhaltsbild und dem Rauschbild, wenn das Netz mit random initialisiert wird. Voreinstellung: 1.0
  • --seed: Setzwert für den Zufallszahlengenerator. Voreinstellung: 0
  • --model_weights: Gewichte und Verzerrungen des VGG-19-Netzwerks. Hier herunterladen. Voreinstellung:imagenet-vgg-verydeep-19.mat
  • --pooling_type: Art des Poolings im neuronalen Faltungsnetzwerk. Auswahlmöglichkeiten: avg, max. Voreinstellung: avg
  • --device: GPU- oder CPU-Gerät. Der GPU-Modus wird dringend empfohlen, erfordert aber NVIDIA CUDA. Auswahlmöglichkeiten: /gpu:0 /cpu:0. Standard: /gpu:0
  • --img_output_dir: Verzeichnis, in das die Ausgabe geschrieben wird. Voreinstellung: ./image_output
  • --img_name: Dateiname des Ausgabebildes. Voreinstellung: result
  • --verbose: Boolesches Flag, das angibt, ob Anweisungen auf der Konsole ausgegeben werden sollen.

Optimierungsargumente

  • --optimizer: Verlustminimierungs-Optimierer. L-BFGS liefert bessere Ergebnisse. Adam verbraucht weniger Speicher. Auswahlmöglichkeiten: lbfgs, adam. Voreinstellung: lbfgs
  • --learning_rate: Lernrate-Parameter für den Adam-Optimierer. Voreinstellung: 1e0

  • --max_iterations: Maximale Anzahl von Iterationen für den Adam- oder L-BFGS-Optimierer. Voreinstellung: 1000
  • --print_iterations: Anzahl der Iterationen zwischen Optimierer-Druckanweisungen. Voreinstellung: 50
  • --content_loss_function: Verschiedene Konstanten K in der Inhaltsverlustfunktion. Auswahlmöglichkeiten: 1, 2, 3. Voreinstellung: 1

Video Frame Argumente

  • --video: Boolesches Flag, das angibt, ob der Benutzer ein Video erstellt.
  • --start_frame: Nummer des ersten Bildes. Voreinstellung: 1
  • --end_frame: Letzte Bildnummer. Voreinstellung: 1
  • --first_frame_type: Bild, das zur Initialisierung des Netzwerks während des Renderings des ersten Bildes verwendet wird. Auswahlmöglichkeiten: content, random, style. Voreinstellung: random
  • --init_frame_type: Bild, das zur Initialisierung des Netzwerks bei jedem Rendering nach dem ersten Bild verwendet wird. Auswahlmöglichkeiten: prev_warped, prev, content, random, style. Voreinstellung: prev_warped
  • --video_input_dir: Relativer oder absoluter Verzeichnispfad zu den Eingabeframes. Voreinstellung: ./video_input
  • --video_output_dir: Relativer oder absoluter Verzeichnispfad, in den die Ausgabebilder geschrieben werden. Voreinstellung: ./video_output
  • --content_frame_frmt: Format-String der Eingabe-Frames. Voreinstellung: frame_{}.png
  • --backward_optical_flow_frmt: Formatstring der rückwärtsgerichteten optischen Flussdateien. Voreinstellung: backward_{}_{}.flo
  • --forward_optical_flow_frmt: Formatzeichenfolge der Vorwärtsdateien des optischen Flusses. Voreinstellung: forward_{}_{}.flo
  • --content_weights_frmt: Formatzeichenfolge der Konsistenzdateien des optischen Flusses. Voreinstellung: reliable_{}_{}.txt
  • --prev_frame_indices: Vorherige Bilder, die für die langfristige zeitliche Konsistenz zu berücksichtigen sind. Voreinstellung: 1
  • --first_frame_iterations: Maximale Anzahl der Optimierungsiterationen des ersten Frames. Voreinstellung: 2000
  • --frame_iterations: Maximale Anzahl der Optimierungsiterationen für jedes Bild nach dem ersten Bild. Voreinstellung: 800

Fragen und Errata

Senden Sie Fragen oder Probleme:

Speicher

Standardmäßig verwendet neural-style-tf das NVIDIA cuDNN GPU-Backend für Faltungen und L-BFGS für die Optimierung, die bessere und schnellere Ergebnisse liefern, aber viel Speicher verbrauchen können. Sie können die Speichernutzung wie folgt reduzieren:

  • Adam verwenden: Fügen Sie das Flag --optimizer adam hinzu, um Adam anstelle von L-BFGS zu verwenden. Dies sollte die Speichernutzung erheblich reduzieren, erfordert aber die Abstimmung anderer Parameter, um gute Ergebnisse zu erzielen; insbesondere sollten Sie mit verschiedenen Werten von --learning_rate, --content_weight, --style_weight
  • experimentieren: Sie können die Größe des generierten Bildes mit dem Argument --max_size reduzieren.

Implementierungsdetails

Alle Bilder wurden auf einem Rechner gerendert mit:

  • CPU: 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

Danksagungen

Die Implementierung basiert auf den Projekten:

  • Torch (Lua)-Implementierung ’neural-style‘ von jcjohnson
  • Torch (Lua)-Implementierung ‚artistic-videos‘ von manuelruder

Quellvideobilder wurden bezogen von:

  • MPI Sintel Flow Dataset

Künstlerische Bilder wurden von den modernen Künstlern erstellt:

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

Künstlerische Bilder wurden von den bekannten historischen Künstlern geschaffen:

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

Bash-Shell-Skripte für Tests wurden von meinem Bruder Sheldon Smith erstellt.

Zitat

Wenn Sie diesen Code für Ihre Forschung nützlich finden, zitieren Sie bitte:

@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}},}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.