Dies ist eine Pytorch -Implementierung des Papiers, ein neuronaler Algorithmus des künstlerischen Stils von Leon A. Gatys, Alexander S. Ecker und Matthias Bethge. Der Code basiert auf Justin Johnsons neuronalem Stil.
Das Papier präsentiert einen Algorithmus, um den Inhalt eines Bildes mit dem Stil eines anderen Bildes mithilfe von Faltungsnetzwerken zu kombinieren. Hier ist ein Beispiel, das den künstlerischen Stil der Sternennacht auf ein nächtliches Foto des Stanford Campus ordnet:
Die Anwendung des Stils verschiedener Bilder auf dasselbe Inhaltsbild liefert interessante Ergebnisse. Hier reproduzieren wir Abbildung 2 aus dem Papier, das ein Foto des Tubingens in Deutschland in einer Vielzahl von Stilen macht:
Hier sind die Ergebnisse der Anwendung des Stils verschiedener Kunstwerke auf dieses Foto der Golden Gate Bridge:
Der Algorithmus ermöglicht es dem Benutzer, das relative Gewicht der Stil- und Inhaltsrekonstruktionsbegriffe in Einklang zu bringen, wie in diesem Beispiel gezeigt, in dem wir den Stil von Picassos Self-Portrait von 1907 auf Brad Pitt portieren:
Durch die Größe des Stilbildes vor dem Extrahieren von Stilfunktionen können wir die Arten von künstlerischen Merkmalen steuern, die aus dem Stilbild übertragen werden. Sie können dieses Verhalten mit der Flagge -style_scale steuern. Unten sehen wir drei Beispiele für die Rendern der Golden Gate Bridge im Stil der Sternennacht. Von links nach rechts beträgt -style_scale 2,0, 1,0 und 0,5.
Sie können mehr als ein Stilbild verwenden, um mehrere künstlerische Stile zu mischen.
Im Uhrzeigersinn von oben links: "The Starry Night" + "The Scream", "The Scream" + "Komposition VII", "Nuded" + "Komposition VII" und "sitzen nackt" + "The Starry Night"
Bei Verwendung mehrerer Bilder im Stil können Sie den Grad steuern, in dem sie gemischt werden:
Wenn Sie die Flag -original_colors 1 hinzufügen, behält das Ausgangsbild die Farben des Originalbildes bei.
Abhängigkeiten:
Optionale Abhängigkeiten:
Nach der Installation der Abhängigkeiten müssen Sie das folgende Skript ausführen, um das VGG -Modell herunterzuladen:
python models/download_models.py
Dadurch wird das Original-VGG-19-Modell heruntergeladen. Das ursprüngliche VGG-16-Modell wird ebenfalls heruntergeladen. Standardmäßig wird das ursprüngliche VGG-19-Modell verwendet.
Wenn Sie eine kleinere Speicher -GPU haben, ist das Verwenden von NIN ImageNet -Modell besser und liefert etwas schlechtere und vergleichbare Ergebnisse. Sie können die Details zum Modell von BVLC Caffe Modelzoo erhalten. Das NIN -Modell wird heruntergeladen, wenn Sie das Skript download_models.py ausführen.
In der Installationshandbuch finden Sie detaillierte Installationsanweisungen für Ubuntu und Windows.
Grundnutzung:
python neural_style.py -style_image <image.jpg> -content_image <image.jpg>
Cudnn -Verwendung mit NIN -Modell:
python neural_style.py -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet.pth -gpu 0 -backend cudnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 500 -image_size 512 -optimizer adam
Um mehrere Bilder mit mehreren Stilen zu verwenden, geben Sie eine von Kommas getrennte Liste wie folgt weiter:
-style_image starry_night.jpg,the_scream.jpg .
Beachten Sie, dass Wege zu Bildern das ~ -Scharakter nicht enthalten sollten, um Ihr Heimverzeichnis darzustellen. Sie sollten stattdessen einen relativen Pfad oder einen vollständigen absoluten Weg verwenden.
Optionen :
-image_size : Maximale Seitenlänge (in Pixeln) des generierten Bildes. Standard ist 512.-style_blend_weights : Das Gewicht zum Mischen des Stils mehrerer Stilbilder als von Comma getrennte Liste wie -style_blend_weights 3,7 . Standardmäßig sind alle Stilbilder gleich gewichtet.-gpu : Null-Indexed-ID der GPU; Für den CPU -Modus set -gpu nach c .Optimierungsoptionen :
-content_weight : Wie viel zu dem Inhaltsrekonstruktionsbegriff gewichten. Standard ist 5E0.-style_weight : Wie viel zu dem Stil der Stilrekonstruktion. Standard ist 1E2.-tv_weight : Gewicht der Total-Variations-Regularisierung; Dies hilft, das Bild zu glätten. Standard ist 1E-3. Setzen Sie auf 0, um die TV -Regularisierung zu deaktivieren.-num_iterations : Standard ist 1000.-init : Methode zum Generieren des generierten Bildes; Eines von random oder image . Standard ist random , der eine Rauschinitialisierung wie im Papier verwendet. image initialisiert mit dem Content -Bild.-init_image : Ersetzt das Initialisierungsbild durch ein vom Benutzer angegebenes Bild.-optimizer : Der zu verwendende Optimierungsalgorithmus; entweder lbfgs oder adam ; Standard ist lbfgs . L-BFGs liefert tendenziell bessere Ergebnisse, verwendet jedoch mehr Speicher. Durch die Umstellung auf Adam wird der Speicherverbrauch verringert. Bei der Verwendung von Adam müssen Sie wahrscheinlich mit anderen Parametern spielen, um gute Ergebnisse zu erzielen, insbesondere mit dem Stilgewicht, dem Inhaltsgewicht und der Lernrate.-learning_rate : Lernrate, die mit dem Adam -Optimierer verwendet werden soll. Standard ist 1E1.-normalize_gradients : Wenn dieses Flag vorhanden ist, werden Stil- und Inhaltsgradienten aus jeder Schicht L1 normalisiert.Ausgabeoptionen :
-output_image : Name des Ausgabebildes. Standard ist out.png .-print_iter : Drucken Sie Fortschritte bei jeder print_iter -Iterationen. Auf 0 einstellen, um den Druck zu deaktivieren.-save_iter : Speichern Sie das Bild bei jeder save_iter -Iterationen. Setzen Sie auf 0, um das Speichern von Zwischenergebnissen zu deaktivieren.Ebenenoptionen :
-content_layers : Komma-getrennte Liste von Ebenennamen, die für die Rekonstruktion des Inhalts verwendet werden sollen. Standard ist relu4_2 .-style_layers : Komma-getrennte Liste von Ebenennamen, die für die Stilrekonstruktion verwendet werden sollen. Standard ist relu1_1,relu2_1,relu3_1,relu4_1,relu5_1 .Andere Optionen :
-style_scale : Skala, auf dem Merkmale aus dem Stilbild extrahiert werden können. Standard ist 1.0.-original_colors : Wenn Sie dies auf 1 festlegen, hält das Ausgabebild die Farben des Content -Bildes.-model_file : Pfad zur .pth -Datei für das VGG -Kaffeemodell. Standard ist das ursprüngliche VGG-19-Modell; Sie können auch das ursprüngliche VGG-16-Modell ausprobieren.-pooling : Die Art der zu verwendenden Poolschichten; einer von max oder avg . Standard ist max . Die VGG-19-Modelle verwenden maximale Poolschichten, aber das Papier erwähnt, dass das Ersetzen dieser Schichten durch durchschnittliche Pooling-Schichten die Ergebnisse verbessern kann. Ich konnte mit durchschnittlichem Pooling keine guten Ergebnisse erzielen, aber die Option ist hier.-seed : Ein ganzzahliger Wert, den Sie für wiederholbare Ergebnisse angeben können. Standardmäßig ist dieser Wert für jeden Lauf zufällig.-multidevice_strategy : Eine von Kommas getrennte Liste von Ebenenindizes, bei denen das Netzwerk bei Verwendung mehrerer Geräte aufgeteilt werden soll. Weitere Informationen finden Sie unter Multi-GPU-Skalierung.-backend : nn , cudnn , openmp oder mkl . Standard ist nn . mkl benötigt das MKL -Backend von Intel.-cudnn_autotune : Wenn Sie das Cudnn-Backend verwenden, können Sie dieses Flag über den integrierten Cudnn-Autotuner verwenden, um die besten Faltungsalgorithmen für Ihre Architektur auszuwählen. Dadurch wird die erste Iteration etwas langsamer und kann etwas mehr Speicher nehmen, kann das Cudnn -Backend erheblich beschleunigen. Problem: Das Programm hat kein Gedächtnis und stirbt
Lösung: Versuchen Sie, die Bildgröße zu reduzieren: -image_size 256 (oder niedriger). Beachten Sie, dass unterschiedliche Bildgrößen für optimale Ergebnisse wahrscheinlich nicht -default -Werte für -style_weight und -content_weight erforderlich sind. Wenn Sie auf einer GPU laufen, können Sie auch versuchen, mit -backend cudnn zu laufen, um die Speicherverwendung zu reduzieren.
Problem: -backend cudnn ist langsamer als Standard -NN -Backend
Lösung: Fügen Sie das Flag -cudnn_autotune hinzu; Dadurch wird das eingebaute Cudnn-Autotuner verwendet, um die besten Faltungsalgorithmen auszuwählen.
Problem: Holen Sie sich die folgende Fehlermeldung:
Missing key(s) in state_dict: "classifier.0.bias", "classifier.0.weight", "classifier.3.bias", "classifier.3.weight". Unexpected key(s) in state_dict: "classifier.1.weight", "classifier.1.bias", "classifier.4.weight", "classifier.4.bias".
Lösung: Aufgrund einer Mischung mit Schichtpositionen benötigen ältere Modelle eine Fix, um mit neueren Pytorch -Versionen kompatibel zu sein. Das mitgelieferte Skript donwload_models.py führt diese Korrekturen nach dem Herunterladen der Modelle automatisch durch.
Standardmäßig verwendet der nn Backend für Konvolutionen und L-BFGs zur Optimierung neural-style-pt Backend. Diese liefern gute Ergebnisse, können aber beide viel Speicher verwenden. Sie können den Speicherverbrauch mit Folgendem reduzieren:
-backend cudnn hinzu, um das Cudnn -Backend zu verwenden. Dies funktioniert nur im GPU -Modus.-optimizer adam hinzu, um Adam anstelle von L -BFGs zu verwenden. Dies sollte den Speicherverbrauch erheblich verringern, kann jedoch möglicherweise andere Parameter für gute Ergebnisse einstellen. Insbesondere sollten Sie mit der Lernrate, dem Inhaltsgewicht und dem Stilgewicht spielen. Dies sollte sowohl in CPU- als auch in GPU -Modi funktionieren.-image_size 256 über, um ein Bild mit der Hälfte der Standardgröße zu generieren.Mit den Standardeinstellungen verwendet mein System etwa 3,7 GB GPU-Speicher auf meinem System. Durch den Umschalten auf Adam und Cudnn reduziert sich der GPU -Speicher Fußabdruck auf etwa 1 GB.
Die Geschwindigkeit kann je nach Backend und Optimierer stark variieren. Hier sind einige Male zum Ausführen von 500 Iterationen mit -image_size=512 auf einem Tesla K80 mit unterschiedlichen Einstellungen:
-backend nn -optimizer lbfgs : 117 Sekunden-backend nn -optimizer adam : 100 Sekunden-backend cudnn -optimizer lbfgs : 124 Sekunden-backend cudnn -optimizer adam : 107 Sekunden-backend cudnn -cudnn_autotune -optimizer lbfgs : 109 Sekunden-backend cudnn -cudnn_autotune -optimizer adam : 91 SekundenHier sind die gleichen Benchmarks auf einem GTX 1080:
-backend nn -optimizer lbfgs : 56 Sekunden-backend nn -optimizer adam : 38 Sekunden-backend cudnn -optimizer lbfgs : 40 Sekunden-backend cudnn -optimizer adam : 40 Sekunden-backend cudnn -cudnn_autotune -optimizer lbfgs : 23 Sekunden-backend cudnn -cudnn_autotune -optimizer adam : 24 Sekunden Sie können mehrere CPU- und GPU -Geräte verwenden, um Bilder bei höheren Auflösungen zu verarbeiten. Auf verschiedenen Geräten werden verschiedene Ebenen des Netzwerks berechnet. Sie können steuern, welche GPU- und CPU -Geräte mit dem -gpu -Flag verwendet werden, und Sie können steuern, wie die Ebenen über Geräte über das Flag -multidevice_strategy aufgeteilt werden.
In einem Server mit vier GPUs können Sie die Flag -gpu 0,1,2,3 in dieser Reihenfolge auf GPUS 0, 1, 2 und 3 verarbeiten. Indem Sie auch das Flag -multidevice_strategy 3,6,12 geben, geben Sie an, dass die ersten beiden Schichten auf GPU 0 berechnet werden sollten, Schichten 3 bis 5 auf GPU 1 berechnet werden sollten, Schichten 6 bis 11 sollten auf GPU 2 berechnet werden, und die verbleibenden -multidevice_strategy sollten auf GPU 3 berechnet werden.
Wir können bei hoher Auflösung sehr hohe Qualitätsergebnisse erzielen, indem wir die Multi-GPU-Verarbeitung mit Multiscale-Erzeugung kombinieren, wie in dem Papier beschrieben, der Wahrnehmungsfaktoren im neuronalen Stiltransfer von Leon A. Gatys, Alexander S. Ecker, Matthias Bethge, Aaron Hertzmann und Eli Shechtman kontrolliert .
Hier ist ein 4016 x 2213 -Bild, das auf einem Server mit acht Tesla K80 -GPUs generiert wird:
Das Skript, das zum Erstellen dieses Bildes verwendet wird, finden Sie hier.
Die Bilder werden mit weißem Rauschen initialisiert und unter Verwendung von L-BFGs optimiert.
Wir führen Stilrekonstruktionen unter Verwendung der Ebenen von conv1_1 , conv2_1 , conv3_1 , conv4_1 und conv5_1 mithilfe der Ebene conv4_2 durch. Wie in der Zeitung haben die Rekonstruktionsverluste im fünften Stil gleiche Gewichte.
Wenn Sie diesen Code für Ihre Forschung nützlich finden, zitieren Sie ihn bitte mit dem bereitgestellten Zitat.