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:
und transformieren Sie es, indem Sie den künstlerischen Stil von Vincent van Goghs „Sternennacht“ anwenden, um dieses Bild zu erstellen:
Voraussetzungen
Um dieses Tutorial abzuschließen, benötigen Sie:
-
Ein Ubuntu 16.04-Server, der von folgendenthe Ubuntu 16.04 initial server setup guide eingerichtet wurde, einschließlich eines Sudo-Nicht-Root-Benutzers und einer Firewall.
-
Python 3 und eine Programmierumgebung, die durch Befolgen vonour Python setup tutorial eingerichtet wurde.
-
Jupyter Notebook installiert mit folgendenHow to Set Up Jupyter Notebook for Python 3.
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-Transfer
mit 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-Transfer
gelegt. Wechseln Sie also in dieses Verzeichnis, sobald alle Dateien geklont wurden:
cd PyTorch-Style-Transfer/experiments
Sehen Sie sich den Inhalt des Verzeichnissesexperiments
an:
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:
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 DateiREADME
des RepositorysPyTorch-Style-Transfer
werden Bilder verwendet, die sich im Verzeichnisimages/
und im Skriptmain.py
befinden. Sie müssen mindestens fünf Argumente angeben, um das Skriptmain.py
ausfü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:
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))
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))
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:
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 FunktionImage
an:
Notizbuch
Image('{}/musing_sammy.jpg'.format(workingdir))
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:
-
Packen Sie den obigen Code infunction, die Sie jederzeit aufrufen können.
-
Lernen Sie, Zeitreihendaten mittutorials published here zu visualisieren und vorherzusagen.
-
Probieren Sie einige der Beispiele aus, die inTensorFlow documentation oder sogar inTensorFlow implementation for artistic style transfer enthalten sind.