前書き

機械学習(ML)は、データからモデルを学習するアルゴリズムに焦点を当てたAIのサブフィールドです。

_neural style transfer_と呼ばれるコンピュータービジョンの分野での機械学習の実用的なアプリケーションを見てみましょう。 2015年、研究者はディープラーニング技術を使用して、1つの画像のコンテンツと別の画像の芸術的なスタイルを組み合わせたアルゴリズムを作成しました。 この新しいアルゴリズムは独自の画像を生成しましたが、視覚システムが新しい芸術的概念を推測する方法について独自の視点を提供しました。

その名前が示すように、ニューラルスタイルの転送は、このタスクを実行するためにニューラルネットワークに依存しています。 この実装の正確な詳細はこのチュートリアルの範囲を超えていますが、https://harishnarayanan.org/writing/artistic-style-transfer/ [アーティスティックスタイルの転送に関するこのブログ投稿]またはhttps: //arxiv.org/abs/1508.06576 [元の研究原稿]。

このチュートリアルでは、Jupyter NotebookとLinuxコマンドラインを使用してニューラルスタイル転送を適用し、次のような画像を撮影します。

image:https://assets.digitalocean.com/articles/nst_pytorch/vQtl1Lh.png [ロケットサミーの画像]

ヴィンセントヴァンゴッホの「スターリーナイト」の芸術的なスタイルを適用してこのイメージを作成し、それを変換します。

image:https://assets.digitalocean.com/articles/nst_pytorch/N7T9kWz.jpg [ロケットサミーに移された星空のスタイルの画像]

前提条件

このチュートリアルを完了するには、次のものが必要です。

機械学習モデルの操作はメモリを大量に消費する可能性があるため、このチュートリアルの計算の一部を実行するには、マシンに少なくとも8GBのメモリが必要です。

手順1-依存関係のインストールとPyTorch-Style-Transfer GitHubリポジトリの複製

このチュートリアルでは、http://hangzh.com/ [Hang Zhang]が提供するhttps://github.com/zhanghang1989/PyTorch-Style-Transfer[PyTorch-スタイル転送]。 この特定の実装では、 `+ PyTorch +`ライブラリを使用します。

プログラミング環境をアクティブにし、次のコマンドでPyTorchと `+ torchvision +`パッケージをインストールします:

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

このチュートリアルでは、 `+ torch-0.1.12_2 +`が必要であることに注意してください。

ホームディレクトリがファイルで乱雑にならないように、 `+ style_transfer +`という新しいディレクトリを作成し、作業ディレクトリとして使用します:

mkdir style_transfer
cd style_transfer

次に、 + git clone`コマンドを使用して、作業ディレクトリに + PyTorch-Style-Transfer`リポジトリのクローンを作成します。 Gitの詳細については、https://www.digitalocean.com/community/tutorial_series/introduction-to-git-installation-usage-and-branches [このGitチュートリアルシリーズ]をご覧ください。

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

このリポジトリの作成者は、使用するコードを `+ PyTorch-Style-Transfer `リポジトリの ` experiments +`フォルダに配置しているため、すべてのファイルのクローンが作成されたらこのディレクトリに切り替えます。

cd PyTorch-Style-Transfer/experiments

`+ experiments +`ディレクトリの内容を見てください:

ls

次のディレクトリが表示されます。

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

このチュートリアルでは、ストック画像を含む `+ images / `ディレクトリと、画像にニューラルスタイルの転送を適用するために使用される ` main.py +`スクリプトを使用します。

次のセクションに進む前に、ニューラルスタイルの転送を実行するために必要な事前学習済みの深層学習モデルもダウンロードする必要があります。 これらのモデルは大きくなる可能性があるため、GitHubに保存するのに適さないため、作成者はファイルをダウンロードするための小さなスクリプトを提供します。 スクリプトは「+ models / download_model.sh +」にあります。

まず、スクリプトを実行可能にします。

chmod +x ./models/download_model.sh

次に、スクリプトを実行してモデルをダウンロードします。

./models/download_model.sh

すべてがダウンロードされたので、これらのツールを使用していくつかの画像を変換しましょう。

ステップ2-最初のスタイル転送実験の実行

ニューラルスタイル転送の仕組みを説明するために、 `+ PyTorch-Style-Transfer +`リポジトリの作成者が提供する例を使用して始めましょう。 画像を表示および表示する必要があるため、Jupyterノートブックを使用する方が便利です。

端末からJupyterを起動します。

jupyter notebook

次に、表示される指示に従ってJupyterにアクセスします。

Jupyterが表示されたら、右上のプルダウンメニューから[新規]> [Python 3]を選択して、新しいノートブックを作成します。

image:https://assets.digitalocean.com/articles/nst_pytorch/ZvkVoIa.png [Jupyter Notebook]

これにより、コードを入力できる新しいノートブックが開きます。

ノートブックの上部に次のコードを追加して、必要なライブラリをロードします。

ノート

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

「+ torch 」に加えて、Jupyterノートブックから直接Pythonスクリプトを実行するために使用する標準ライブラリ「 os 」および「 subprocess 」もインポートします。 また、Jupyterノートブック内に画像を表示できる ` IPython.display +`ライブラリも含まれています。

`+ PyTorch-Style-Transfer `リポジトリの ` README `ファイルで提供されている例では、 ` images / `ディレクトリにあるストックイメージと ` main.py `スクリプトを使用しています。 ` main.py +`スクリプトを実行するには、少なくとも5つの引数を提供する必要があります。

  • コンテンツ画像へのパス( `+ / images / content +`にあります)。

  • スタイル画像へのパス( `+ / images / 21styles +`にあります)。

  • スタイルの転送を実行するために使用される事前学習済みのGAN(Generative Adversarial Network)モデルへのパス( `+ / models +`にあります)。

  • 出力画像のパスと名前。

  • ディープラーニングモデルはGPUではるかに高速に実行されます。 使用可能なものがある場合は、「-cuda = 1 +」パラメーターを指定し、そうでない場合は「-cuda = 0 +」を使用します。

ニューラルスタイルの転送コードを実行するには、必要な引数を指定し、 `+ subprocess +`ライブラリを使用してシェルでコマンドを実行します。

まず、作業ディレクトリへのパスを定義しましょう。 `+ workingdir +`という変数に保存します:

ノート

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

画像やその他のファイルをポイントするときに、コード全体でこの変数を使用します。

次に、 `+ main.py `スクリプトへのパスと、このテスト実行の入力として使用する引数のリストを定義しましょう。 コンテンツ画像が「 venice-boat.jpg 」、スタイル画像が「 starry_night.jpg 」であることを指定し、ニューラルスタイル転送の出力を「 test.jpg +」というファイルに保存します。 `:

ノート

# 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',
       '{}'.format(workingdir),
       '--style-image',
       '{}'.format(workingdir),
       '--model',
       '{}/models/21styles.model'.format(workingdir),
       '--output-image',
       '{}'.format(workingdir),
       '--cuda=0']

テスト例を実行する前に、ノートブックで次のコードを実行して、この例で選択したコンテンツとスタイルの画像を簡単に確認できます。

ノート

content_image = Image('{}/images/content/'.format(workingdir))
style_image = Image('{}/images/21styles/'.format(workingdir))
display(content_image)
display(style_image)

次の画像が出力に表示されます:

image:https://assets.digitalocean.com/articles/nst_pytorch/Tro1a0h.jpg [ニューラルスタイル転送の最初の例のコンテンツ画像]

image:https://assets.digitalocean.com/articles/nst_pytorch/wwtiTfB.jpg [ニューラルスタイル転送の最初の例のスタイル画像]

最後に、 `+ main.py `の呼び出しと引数のリストを連結し、 ` subprocess.check_output +`関数を使用してシェルで実行します:

ノート

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

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

マシンで使用可能なメモリの量によっては、実行に1〜2分かかる場合があります。 完了すると、作業ディレクトリに `+ test.jpg +`ファイルが表示されます。 Jupyterノートブックから、https://ipython.org/ipython-doc/3/interactive/tutorial.html [Ipython magic commands]を使用して、Jupyterノートブック内の作業ディレクトリの内容を表示できます。

ノート

!ls $workingdir

あるいは、ターミナルで `+ ls +`コマンドを使用できます。 いずれにしても、次の出力が表示されます。

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

「+ test.jpg +」という新しいファイルが表示されます。このファイルには、入力コンテンツとスタイル画像を使用したニューラルスタイル転送の結果が含まれています。

`+ test.jpg `のコンテンツを表示するには、 ` Image +`関数を使用します。

ノート

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

image:https://assets.digitalocean.com/articles/nst_pytorch/2reIEHS.jpg [星空の夜のスタイルがヴェネツィアのボートの私たちの画像のコンテンツに転送されました]

ヴィンセントヴァンヴォーのスターリーナイトキャンバスの芸術的なスタイルは、ヴェネツィアのボートの画像のコンテンツにマッピングされています。 教科書の例でニューラルスタイルの転送を正常に適用できたので、異なる画像でこの演習を繰り返してみましょう。

ステップ3-独自の画像の変換

これまでは、使用しているライブラリの作成者が提供した画像を使用しました。 代わりに独自の画像を使用しましょう。 これを行うには、興味のある画像を見つけて、次のコマンドでその画像のURLを使用するか、Sammy the Sharkを使用するために提供されたURLを使用します。

再度IPythonマジックを使用して作業ディレクトリに画像をダウンロードし、 `+ sammy.png +`というファイルに配置します。

ノート

!wget -O - '' >

ノートブックでこのコマンドを実行すると、次の出力が表示されます。

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]

「+ Image +」コマンドを使用して、ノートブックに新しい画像を表示します。

ノート

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

image:https://assets.digitalocean.com/articles/nst_pytorch/vQtl1Lh.png [ロケットサミーの画像]

テスト実行と同じワークフローに従って、コンテンツ画像としてRocket Sammyを使用し、スタイル画像と同じStarry Nightの画像を使用して、芸術的なスタイル転送モデルを実行します。

以前に使用したのと同じコードを使用しますが、今回はコンテンツ画像を「+ sammy.png 」、スタイル画像を「 starry_night.jpg 」に指定し、出力をファイルに書き込みます「 starry_sammy.jpg +」と呼ばれます。 次に、コマンドを実行します。

ノート

# 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',
       '{}/'.format(workingdir),
       '--style-image',
       '{}/images/21styles/starry_night.jpg'.format(workingdir),
       '--model',
       '{}/models/21styles.model'.format(workingdir),
       '--output-image',
       '{}/'.format(workingdir),
       '--cuda=0']

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

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

次に、「+ Image」機能を使用して、ヴィンセントヴァンゴッホの星空の芸術的なスタイルをロケットサミー画像のコンテンツに転送した結果を表示します。

ノート

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

新しい様式化されたロケットサミーが表示されます。

image:https://assets.digitalocean.com/articles/nst_pytorch/N7T9kWz.jpg [ロケットサミーに移された星空のスタイルの画像]

別のスタイルの画像をロケットサミーの写真にマッピングして、これをもう一度試してみましょう。 今回はピカソのThe Museを使用します。 ここでも、コンテンツ画像として「+ sammy.png 」を使用しますが、スタイル画像を「 la_muse.jpg 」に変更します。 出力を ` musing_sammy.jpg +`に保存します。

ノート

# 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',
       '{}/'.format(workingdir),
       '--style-image',
       '{}/images/21styles/'.format(workingdir),
       '--model',
       '{}/models/21styles.model'.format(workingdir),
       '--output-image',
       '{}/'.format(workingdir),
       '--cuda=0']

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

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

コードの実行が終了したら、指定した出力ファイル名と `+ Image +`関数を使用して作業の出力を表示します。

ノート

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

image:https://assets.digitalocean.com/articles/nst_pytorch/RTmtcxU.jpg [ロケットサミーに転送されたミューズのスタイルの画像]

ここまでに、これらの変換の使用方法について十分に理解する必要があります。 自分の画像をまだ使用していない場合は、使用してみてください。

結論

このチュートリアルでは、Pythonとニューラルスタイル転送モデルのオープンソースPyTorch実装を使用して、画像にスタイル転送を適用しました。 機械学習とAIの分野は広大であり、これはそのアプリケーションの1つにすぎません。 以下に、探索できる追加事項をいくつか示します。

  • 上記のコードをhttps://www.digitalocean.com/community/tutorials/how-to-define-functions-in-python-3[function]にパッケージ化し、いつでも呼び出すことができます。

  • https://www.digitalocean.com/community/tutorial_series/time-series-visualization-and-forecasting [ここで公開されているチュートリアル]を使用して、時系列データで視覚化および予測する方法を学びます。

  • TensorFlow documentationまたはhttps://github.com/lengstrom/fast-style-transfer [芸術的スタイル転送のためのTensorFlow実装]で共有されているいくつかの例を試してください。 ]。