前書き
機械学習(ML)は、データからモデルを学習するアルゴリズムに焦点を当てたAIのサブフィールドです。
neural style transferと呼ばれるコンピュータビジョンの分野での機械学習の実用的なアプリケーションを見てみましょう。 2015年、研究者はディープラーニング技術を使用して、1つの画像のコンテンツと別の画像の芸術的なスタイルを組み合わせたアルゴリズムを作成しました。 この新しいアルゴリズムは独自の画像を生成しましたが、視覚システムが新しい芸術的概念を推測する方法について独自の視点を提供しました。
その名前が示すように、ニューラルスタイルの転送は、このタスクを実行するためにニューラルネットワークに依存しています。 この実装の正確な詳細はこのチュートリアルの範囲を超えていますが、in this blog post on artistic style transferまたはoriginal research manuscriptからさらに学ぶことができます。
このチュートリアルでは、Jupyter NotebookとLinuxコマンドラインを使用してニューラルスタイル転送を適用し、次のような画像を撮影します。
ヴィンセントヴァンゴッホの「スターリーナイト」の芸術的なスタイルを適用してこのイメージを作成し、変換します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
sudo非rootユーザーとファイアウォールを含むthe Ubuntu 16.04 initial server setup guideをフォローしてセットアップされた1つのUbuntu16.04サーバー。
-
Python 3と、our Python setup tutorialに従ってセットアップされたプログラミング環境。
-
How to Set Up Jupyter Notebook for Python 3に従ってインストールされたJupyterNotebook。
機械学習モデルの操作はメモリを大量に消費する可能性があるため、このチュートリアルの計算の一部を実行するには、マシンに少なくとも8GBのメモリが必要です。
[[step-1 -—- installing-dependencies-and-cloning-the-pytorch-style-transfer-github-repository]] ==ステップ1—依存関係のインストールとPyTorch-Style-TransferGitHubリポジトリのクローン作成
このチュートリアルでは、PyTorch-Style-Transferと呼ばれるHang Zhangによって提供されるニューラルスタイル転送のオープンソース実装を使用します。 この特定の実装では、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の詳細については、this Git tutorial seriesを参照してください。
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
すべてがダウンロードされたので、これらのツールを使用していくつかの画像を変換しましょう。
[[step-2 -—- running-your-first-style-transfer-experiment]] ==ステップ2—最初のスタイルの転送実験を実行する
ニューラルスタイルの転送がどのように機能するかを説明するために、PyTorch-Style-Transfer
リポジトリの作成者によって提供された例を使用することから始めましょう。 画像を表示および表示する必要があるため、Jupyterノートブックを使用する方が便利です。
端末からJupyterを起動します。
jupyter notebook
次に、表示される指示に従ってJupyterにアクセスします。
Jupyterが表示されたら、右上のプルダウンメニューからNew > Python 3を選択して、新しいノートブックを作成します。
これにより、コードを入力できる新しいノートブックが開きます。
ノートブックの上部に次のコードを追加して、必要なライブラリをロードします。
ノート
import torch
import os
import subprocess
from IPython.display import Image
from IPython.display import display
torch
に加えて、標準ライブラリos
とsubprocess
もインポートします。これらは、Jupyterノートブックから直接Pythonスクリプトを実行するために使用します。 また、Jupyterノートブック内に画像を表示できるIPython.display
ライブラリも含まれています。
[.note]#Note:ALT+ENTER
(またはmacOSではSHIFT+ENTER
)と入力してコードを実行し、ノートブック内の新しいコードブロックに移動します。 このチュートリアルの各コードブロックの後にこれを実行して、結果を確認します。
#
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, and we’ll save the output of our neural style transfer to a file called `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',
'{}/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']
テスト例を実行する前に、ノートブックで次のコードを実行して、この例で選択したコンテンツとスタイルの画像を簡単に確認できます。
ノート
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)
次の画像が出力に表示されます:
最後に、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ノートブックから、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
関数を使用して、test.jpg
の内容を表示します。
ノート
Image('{}/test.jpg'.format(workingdir))
ヴィンセントヴァンゴッホのスターリーナイトキャンバスの芸術的なスタイルは、ベネチアンボートの画像のコンテンツにマッピングされています。 教科書の例でニューラルスタイルの転送を正常に適用できたので、異なる画像でこの演習を繰り返してみましょう。
[[step-3 -—- transforming-your-own-images]] ==ステップ3—自分の画像を変換する
これまでは、使用しているライブラリの作成者が提供した画像を使用しました。 代わりに独自の画像を使用しましょう。 これを行うには、興味のある画像を見つけて、次のコマンドでその画像のURLを使用するか、Sammy the Sharkを使用するために提供されたURLを使用します。
もう一度IPythonマジックを使用して、イメージを作業ディレクトリにダウンロードし、sammy.png
というファイルに配置します。
ノート
!wget -O - 'https://assets.digitalocean.com/blog/static/sammy-the-shark-gets-a-birthday-makeover-from-simon-oxley/sammy-jetpack.png' > $workingdir/sammy.png
ノートブックでこのコマンドを実行すると、次の出力が表示されます。
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('{}/sammy.png'.format(workingdir))
テスト実行と同じワークフローに従って、コンテンツ画像としてRocket Sammyを使用し、スタイル画像と同じStarry Nightの画像を使用して、芸術的なスタイル転送モデルを実行します。
以前に使用したのと同じコードを使用しますが、今回はコンテンツイメージをsammy.png
に、スタイルイメージをstarry_night.jpg
に指定し、出力を%というファイルに書き込みます。 (t2)s。 次に、コマンドを実行します。
ノート
# 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)
次に、Image
関数を使用して、フィンセントファンヴォーの星月夜の芸術的なスタイルをロケットサミー画像のコンテンツに転送した結果を表示します。
ノート
Image('{}/starry_sammy.jpg'.format(workingdir))
新しい様式化されたロケットサミーが表示されます。
別のスタイルの画像をロケットサミーの写真にマッピングして、これをもう一度試してみましょう。 今回はピカソの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',
'{}/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)
コードの実行が終了したら、指定した出力ファイル名とImage
関数を使用して作業の出力を表示します。
ノート
Image('{}/musing_sammy.jpg'.format(workingdir))
ここまでに、これらの変換の使用方法について十分に理解する必要があります。 自分の画像をまだ使用していない場合は、使用してみてください。
結論
このチュートリアルでは、Pythonとニューロスタイル転送モデルのオープンソースPyTorch実装を使用して、画像にスタイル転送を適用しました。 機械学習とAIの分野は広大であり、これはそのアプリケーションの1つにすぎません。 以下に、探索できる追加事項をいくつか示します。
-
上記のコードを、いつでも呼び出すことができるfunctionにパッケージ化します。
-
tutorials published hereを使用して、時系列データで視覚化および予測する方法を学びます。
-
TensorFlow documentationまたはTensorFlow implementation for artistic style transferで共有されている例のいくつかを試してみてください。