So führen Sie eine Übertragung des neuronalen Stils mit Python 3 und PyTorch durch

Einführung

Maschinelles Lernen oder ML ist ein Teilgebiet der KI, das sich auf Algorithmen konzentriert, die Modelle aus Daten lernen.

Schauen wir uns eine praktische Anwendung des maschinellen Lernens im Bereich Computer Vision an, dieneural style transfer heißt. Im Jahr 2015 verwendeten die Forscher Deep-Learning-Techniken, um einen Algorithmus zu erstellen, der den Inhalt eines Bildes mit dem künstlerischen Stil eines anderen mischte. Dieser neue Algorithmus erzeugte einzigartige Bilder, bot aber auch eine einzigartige Perspektive, wie unser visuelles System auf neue künstlerische Konzepte schließen kann.

Wie der Name schon sagt, stützt sich die Übertragung des neuronalen Stils auf neuronale Netze, um diese Aufgabe auszuführen. Die genauen Details dieser Implementierung gehen über den Rahmen dieses Lernprogramms hinaus. Sie können jedoch mehrin this blog post on artistic style transfer oderoriginal research manuscript lernen.

In diesem Tutorial wenden Sie die Übertragung des neuronalen Stils mit Jupyter Notebook und der Linux-Befehlszeile an, um ein Bild wie das folgende zu erstellen:

An image of Rocket Sammy

und transformieren Sie es, indem Sie den künstlerischen Stil von Vincent van Goghs „Sternennacht“ anwenden, um dieses Bild zu erstellen:

An image of Starry night’s style transferred to Rocket Sammy

Voraussetzungen

Um dieses Tutorial abzuschließen, benötigen Sie:

Das Arbeiten mit Modellen für maschinelles Lernen kann sehr speicherintensiv sein. Daher sollte Ihr Computer über mindestens 8 GB Speicher verfügen, um einige der Berechnungen in diesem Lernprogramm durchzuführen.

[[Schritt-1 - Installieren von Abhängigkeiten und Klonen des Pytorch-Transfer-Github-Repository]] == Schritt 1 - Installieren von Abhängigkeiten und Klonen des GitHub-Repositorys im PyTorch-Stil

In diesem Tutorial verwenden wir eine Open-Source-Implementierung der Übertragung des neuronalen Stils, die vonHang Zhang bereitgestellt wird und alsPyTorch-Style-Transfer bezeichnet wird. Diese spezielle Implementierung verwendet die BibliothekPyTorch.

Aktivieren Sie Ihre Programmierumgebung und installieren Sie PyTorch und das Pakettorchvision mit dem folgenden Befehl:

pip install http://download.pytorch.org/whl/cu75/torch-0.1.12.post1-cp35-cp35m-linux_x86_64.whl
pip install torchvision

Beachten Sie, dass wir für dieses Tutorialtorch-0.1.12_2 benötigen.

Um zu vermeiden, dass Ihr Home-Verzeichnis mit Dateien überfüllt ist, erstellen Sie ein neues Verzeichnis mit dem Namenstyle_transfer und verwenden Sie es als Arbeitsverzeichnis:

mkdir style_transfer
cd style_transfer

Klonen Sie anschließend das Repository vonPyTorch-Style-Transfermit dem Befehlgit clone in Ihr Arbeitsverzeichnis. Sie können mehr über Git inthis Git tutorial series erfahren.

git clone https://github.com/zhanghang1989/PyTorch-Style-Transfer.git

Der Autor dieses Repositorys hat den Code, den wir verwenden werden, in den Ordnerexperiments des RepositorysPyTorch-Style-Transfergelegt. Wechseln Sie also in dieses Verzeichnis, sobald alle Dateien geklont wurden:

cd PyTorch-Style-Transfer/experiments

Sehen Sie sich den Inhalt des Verzeichnissesexperimentsan:

ls

Folgende Verzeichnisse werden angezeigt:

Outputcamera_demo.py  dataset  images  main.py  models  net.py  option.py  utils.py

In diesem Lernprogramm arbeiten Sie mit dem Verzeichnisimages/, das Bilder enthält, und dem Skriptmain.py, mit dem die Übertragung im neuronalen Stil auf Ihre Bilder angewendet wird.

Bevor Sie mit dem nächsten Abschnitt fortfahren, müssen Sie auch das vorgefertigte Deep-Learning-Modell herunterladen, das für die Ausführung der Übertragung des neuronalen Stils erforderlich ist. Diese Modelle können groß sein und eignen sich daher nicht zum Speichern auf GitHub. Der Autor stellt daher ein kleines Skript zum Herunterladen der Datei zur Verfügung. Sie finden das Skript untermodels/download_model.sh.

Machen Sie zuerst das Skript ausführbar:

chmod +x ./models/download_model.sh

Führen Sie dann das Skript aus, um das Modell herunterzuladen:

./models/download_model.sh

Nachdem Sie alles heruntergeladen haben, können Sie mit diesen Tools einige Bilder transformieren.

[[Schritt 2 - Ausführen Ihres ersten Übertragungstransperimentes]] == Schritt 2 - Ausführen Ihres ersten Übertragungsexperiments

Um zu veranschaulichen, wie die Übertragung im neuronalen Stil funktioniert, verwenden wir zunächst das Beispiel des Autors desPyTorch-Style-Transfer-Repositorys. Da wir Bilder anzeigen und anzeigen müssen, ist es bequemer, ein Jupyter-Notebook zu verwenden.

Starten Sie Jupyter von Ihrem Terminal aus:

jupyter notebook

Greifen Sie dann auf Jupyter zu, indem Sie die angezeigten Anweisungen befolgen.

Sobald Jupyter angezeigt wird, erstellen Sie ein neues Notizbuch, indem Sie im Pulldown-Menü oben rechtsNew > Python 3 auswählen:

Jupyter Notebook

Dies öffnet ein neues Notizbuch, in das Sie Ihren Code eingeben können.

Fügen Sie oben im Notizbuch den folgenden Code hinzu, um die erforderlichen Bibliotheken zu laden.

Notizbuch

import torch
import os
import subprocess
from IPython.display import Image
from IPython.display import display

Nebentorch importieren wir auch die Standardbibliothekenos undsubprocess, mit denen wir Python-Skripte direkt aus dem Jupyter-Notizbuch ausführen. Wir enthalten auch die BibliothekIPython.display, mit der wir Bilder im Jupyter-Notizbuch anzeigen können.

[.note] #Note: Geben SieALT+ENTER (oderSHIFT+ENTER unter macOS) ein, um den Code auszuführen und in einen neuen Codeblock in Ihrem Notizbuch zu wechseln. Führen Sie dies nach jedem Codeblock in diesem Lernprogramm aus, um Ihre Ergebnisse anzuzeigen.
#

In dem Beispiel in der DateiREADMEdes RepositorysPyTorch-Style-Transferwerden Bilder verwendet, die sich im Verzeichnisimages/und im Skriptmain.pybefinden. Sie müssen mindestens fünf Argumente angeben, um das Skriptmain.pyausführen zu können:

  • Der Pfad zum Inhaltsbild (in/images/content).

  • Der Pfad zum Stilbild (in/images/21styles).

  • Der Pfad zum vorab trainierten GAN-Modell (Generative Adversarial Network), das zur Durchführung der Stilübertragung verwendet wird (in/models).

  • Der Pfad und der Name des Ausgabebilds.

  • Deep Learning-Modelle laufen auf GPUs viel schneller. Wenn Sie einen zur Verfügung haben, geben Sie den Parameter--cuda=1 an, andernfalls verwenden Sie--cuda=0.

Um den Übertragungscode für den neuronalen Stil auszuführen, geben wir die erforderlichen Argumente an und verwenden die Bibliotheksubprocess, um den Befehl in der Shell auszuführen.

Definieren wir zunächst den Pfad zu unserem Arbeitsverzeichnis. Wir speichern in einer Variablen namensworkingdir:

Notizbuch

# define the path to the working directory
experiment_dir = 'style_transfer/PyTorch-Style-Transfer/experiments'
workingdir = '{}/{}'.format(os.environ['HOME'], experiment_dir)

Wir verwenden diese Variable im gesamten Code, wenn wir auf Bilder und andere Dateien verweisen.

Definieren wir nun den Pfad zummain.py-Skript sowie die Liste der Argumente, die wir als Eingabe für diesen Testlauf verwenden werden. Wir geben an, dass das Inhaltsbildvenice-boat.jpg ist, das Stilbild`starry_night.jpg, and we’ll save the output of our neural style transfer to a file called `test.jpg:

Notizbuch

# specify the path to the main.py script
path2script = '{}/main.py'.format(workingdir)

# specify the list of arguments to be used as input to main.py
args = ['eval',
        '--content-image',
        '{}/images/content/venice-boat.jpg'.format(workingdir),
        '--style-image',
        '{}/images/21styles/starry_night.jpg'.format(workingdir),
        '--model',
        '{}/models/21styles.model'.format(workingdir),
        '--output-image',
        '{}/test.jpg'.format(workingdir),
        '--cuda=0']

Bevor Sie das Testbeispiel ausführen, können Sie einen kurzen Blick auf den Inhalt und die Formatvorlagen werfen, die Sie für dieses Beispiel ausgewählt haben, indem Sie diesen Code in Ihrem Notizbuch ausführen:

Notizbuch

content_image = Image('{}/images/content/venice-boat.jpg'.format(workingdir))
style_image = Image('{}/images/21styles/starry_night.jpg'.format(workingdir))
display(content_image)
display(style_image)

Diese Bilder werden in der Ausgabe angezeigt:

The content image for your first example of neural style transfer

The style image for your first example of neural style transfer

Verketten Sie abschließend den Aufruf mitmain.py und seiner Liste von Argumenten und führen Sie ihn in der Shell mit der Funktionsubprocess.check_output aus:

Notizbuch

# build subprocess command
cmd = ['python3', path2script] + args

# run the command
x = subprocess.check_output(cmd, universal_newlines=True)

Abhängig von der auf Ihrem Computer verfügbaren Speicherkapazität kann die Ausführung ein oder zwei Minuten dauern. Nach Abschluss sollte einetest.jpg-Datei in Ihrem Arbeitsverzeichnis angezeigt werden. In einem Jupyter-Notizbuch können SieIpython magic commands verwenden, um den Inhalt Ihres Arbeitsverzeichnisses im Jupyter-Notizbuch anzuzeigen:

Notizbuch

!ls $workingdir

Alternativ können Sie den Befehlls in Ihrem Terminal verwenden. In beiden Fällen wird die folgende Ausgabe angezeigt:

Output__pycache__ dataset  main.py  myutils  option.py
camera_demo.py  images   models   net      test.jpg

Sie sehen eine neue Datei mit dem Namentest.jpg, die die Ergebnisse der Übertragung des neuronalen Stils unter Verwendung Ihrer Eingabeinhalte und Stilbilder enthält.

Verwenden Sie die FunktionImage, um den Inhalt vontest.jpg anzuzeigen:

Notizbuch

Image('{}/test.jpg'.format(workingdir))

Starry night’s style transferred to the content of our image of Venitian boats

Der künstlerische Stil von Vincent van Goghs Sternennacht-Leinwand wurde auf den Inhalt unserer venezianischen Bootsbilder übertragen. Sie haben die Übertragung des neuronalen Stils mit einem Lehrbuchbeispiel erfolgreich angewendet. Versuchen Sie daher, diese Übung mit verschiedenen Bildern zu wiederholen.

[[Schritt 3 - Transformieren Ihrer eigenen Bilder]] == Schritt 3 - Transformieren Ihrer eigenen Bilder

Bisher haben Sie die Bilder verwendet, die vom Autor der von uns verwendeten Bibliothek bereitgestellt wurden. Verwenden wir stattdessen unsere eigenen Bilder. Dazu können Sie entweder ein Bild finden, das Sie interessiert, und die URL für das Bild im folgenden Befehl verwenden, oder die URL verwenden, die für die Verwendung von Sammy the Shark angegeben ist.

Wir werden wieder etwas IPython-Magie verwenden, um das Bild in unser Arbeitsverzeichnis herunterzuladen und in einer Datei namenssammy.png abzulegen.

Notizbuch

!wget -O - 'https://assets.digitalocean.com/blog/static/sammy-the-shark-gets-a-birthday-makeover-from-simon-oxley/sammy-jetpack.png' > $workingdir/sammy.png

Wenn Sie diesen Befehl in Ihrem Notizbuch ausführen, wird die folgende Ausgabe angezeigt:

Output--2017-08-15 20:03:27--  https://assets.digitalocean.com/blog/static/sammy-the-shark-gets-a-birthday-makeover-from-simon-oxley/sammy-jetpack.png
Resolving assets.digitalocean.com (assets.digitalocean.com)... 151.101.20.233
Connecting to assets.digitalocean.com (assets.digitalocean.com)|151.101.20.233|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10483 (10K) [image/png]
Saving to: 'STDOUT'

-                   100%[===================>]  10.24K  --.-KB/s    in 0.001s

2017-08-15 20:03:27 (12.9 MB/s) - written to stdout [10483/10483]

Verwenden Sie den BefehlImage, um das neue Bild im Notizbuch anzuzeigen:

Notizbuch

Image('{}/sammy.png'.format(workingdir))

An image of Rocket Sammy

Führen Sie nach demselben Workflow wie beim Testlauf unser Übertragungsmodell für künstlerische Stile aus, und verwenden Sie dabei Rocket Sammy als Inhaltsbild und dasselbe Sternennachtbild als Stilbild.

Wir verwenden denselben Code wie zuvor, aber dieses Mal geben wir das Inhaltsbild alssammy.png und das Stilbild alsstarry_night.jpg an und schreiben die Ausgabe in eine Datei namensstarry_sammy.jpg. Dann führen wir den Befehl aus:

Notizbuch

# specify the path to the main.py script
path2script = '{}/main.py'.format(workingdir)

# specify the list of arguments to be used as input to main.py
args = ['eval',
        '--content-image',
        '{}/sammy.png'.format(workingdir),
        '--style-image',
        '{}/images/21styles/starry_night.jpg'.format(workingdir),
        '--model',
        '{}/models/21styles.model'.format(workingdir),
        '--output-image',
        '{}/starry_sammy.jpg'.format(workingdir),
        '--cuda=0']

# build subprocess command
cmd = ['python3', path2script] + args

# run the bash command
x = subprocess.check_output(cmd, universal_newlines=True)

Verwenden Sie dann die FunktionImage, um die Ergebnisse der Übertragung des künstlerischen Stils von Vincent van Voghs Sternennacht auf den Inhalt Ihres Rocket Sammy-Bildes anzuzeigen.

Notizbuch

Image('{}/starry_sammy.jpg'.format(workingdir))

Sie sehen die neue stilisierte Rakete Sammy:

An image of Starry night’s style transferred to Rocket Sammy

Versuchen wir es noch einmal, indem wir ein anderes Stilbild unserem Bild von Rocket Sammy zuordnen. Wir werden diesmal Picassos Muse verwenden. Auch hier verwenden wirsammy.png als Inhaltsbild, aber wir ändern das Stilbild inla_muse.jpg. Wir speichern die Ausgabe inmusing_sammy.jpg:

Notizbuch

# specify the path to the main.py script
path2script = '{}/main.py'.format(workingdir)

# specify the list of arguments to be used as input to main.py
args = ['eval',
        '--content-image',
        '{}/sammy.png'.format(workingdir),
        '--style-image',
        '{}/images/21styles/la_muse.jpg'.format(workingdir),
        '--model',
        '{}/models/21styles.model'.format(workingdir),
        '--output-image',
        '{}/musing_sammy.jpg'.format(workingdir),
        '--cuda=0']

# build subprocess command
cmd = ['python3', path2script] + args

# run the bash command
x = subprocess.check_output(cmd, universal_newlines=True)

Wenn der Code ausgeführt wurde, zeigen Sie die Ausgabe Ihrer Arbeit mit dem von Ihnen angegebenen Ausgabedateinamen und der FunktionImagean:

Notizbuch

Image('{}/musing_sammy.jpg'.format(workingdir))

An image of The Muse’s style transferred to Rocket Sammy

Inzwischen sollten Sie eine gute Vorstellung davon haben, wie Sie diese Transformationen verwenden können. Versuchen Sie, einige Ihrer eigenen Bilder zu verwenden, falls Sie dies noch nicht getan haben.

Fazit

In diesem Lernprogramm haben Sie Python und eine Open-Source-PyTorch-Implementierung eines Übertragungsmodells für neuronale Stile verwendet, um die stilistische Übertragung auf Bilder anzuwenden. Das Gebiet des maschinellen Lernens und der KI ist riesig und dies ist nur eine seiner Anwendungen. Hier sind einige zusätzliche Dinge, die Sie erkunden können: