序章
機械学習(ML)は、データからモデルを学習するアルゴリズムに焦点を当てたAIのサブフィールドです。
ニューラルスタイル転送と呼ばれるコンピュータビジョンの分野での機械学習の実用的なアプリケーションを見てみましょう。 2015年、研究者はディープラーニング技術を使用して、ある画像のコンテンツを別の画像の芸術的なスタイルと混合するアルゴリズムを作成しました。 この新しいアルゴリズムは独自の画像を生成しましたが、視覚システムが新しい芸術的概念をどのように推測するかについても独自の視点を提供しました。
その名前が示すように、ニューラルスタイルの転送はこのタスクを実行するためにニューラルネットワークに依存しています。 この実装の正確な詳細はこのチュートリアルの範囲を超えていますが、芸術的なスタイルの転送に関するこのブログ投稿または元の研究原稿から詳細を学ぶことができます。
このチュートリアルでは、Jupyter NotebookとLinuxコマンドラインを使用してニューラルスタイル転送を適用し、次のような画像を取得します。
フィンセントファンゴッホの「星月夜」の芸術的なスタイルを適用して変換し、次の画像を作成します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Ubuntu20.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu20.04サーバー(sudo非rootユーザーとファイアウォールを含む)。
- Python 3と、Pythonセットアップチュートリアルに従ってセットアップされたプログラミング環境。
- Python3用のJupyterNotebookのセットアップ方法に従ってインストールされたJupyterNotebook。
機械学習モデルの操作はメモリを大量に消費する可能性があるため、このチュートリアルの計算の一部を実行するには、マシンに少なくとも8GBのメモリが必要です。
ステップ1—依存関係のインストールとPyTorch-Style-TransferGitHubリポジトリのクローン作成
このチュートリアルでは、 HangZhangによって提供されるPyTorch-Style-Transferと呼ばれるニューラルスタイル転送のオープンソース実装を使用します。 この特定の実装では、 PyTorch
図書館。
プログラミング環境をアクティブにして、 torchvision
と torchfile
次のコマンドを使用したパッケージ:
- pip install torchvision torchfile
Pipは自動的に依存関係を取得します。
OutputSuccessfully installed numpy-1.22.0 pillow-9.0.0 torch-1.10.1 torchfile-0.1.0 torchvision-0.11.2 typing-extensions-4.0.1
ホームディレクトリがファイルで乱雑にならないようにするには、次の名前の新しいディレクトリを作成します。 style_transfer
作業ディレクトリとして使用します。
- mkdir style_transfer
- cd style_transfer
次に、クローンを作成します PyTorch-Style-Transfer
を使用して作業ディレクトリへのリポジトリ git clone
指図。 Gitの詳細については、このGitチュートリアルシリーズをご覧ください。
- git clone https://github.com/zhanghang1989/PyTorch-Style-Transfer.git
このリポジトリの作成者は、使用するコードを experiments
のフォルダ PyTorch-Style-Transfer
リポジトリなので、すべてのファイルのクローンが作成されたら、このディレクトリに切り替えます。
- 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が表示されたら、右上のプルダウンメニューから New> Python 3 を選択して、新しいノートブックを作成します。
これにより、コードを入力できる新しいノートブックが開きます。
ノートブックの上部に、次のコードを追加して、必要なライブラリをロードします。
import torch
import os
import subprocess
from IPython.display import Image
from IPython.display import display
一緒に torch
、標準ライブラリもインポートしています os
と subprocess
、Jupyterノートブックから直接Pythonスクリプトを実行するために使用します。 また、 IPython.display
ライブラリ。Jupyterノートブック内に画像を表示できます。
注:タイプ ALT+ENTER
(また SHIFT+ENTER
macOSの場合)コードを実行し、ノートブック内の新しいコードブロックに移動します。 このチュートリアルの各コードブロックの後にこれを実行して、結果を確認します。
で提供されている例 README
のファイル PyTorch-Style-Transfer
リポジトリは、にあるストック画像を使用します images/
ディレクトリと main.py
脚本。 を実行するには、少なくとも5つの引数を指定する必要があります main.py
脚本:
- コンテンツ画像へのパス(
/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',
'{}/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マジックコマンドを使用して、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))
ヴィンセントヴァンヴォーの星月夜のキャンバスの芸術的なスタイルは、ヴェネツィアのボートの画像のコンテンツにマッピングされています。 教科書の例でニューラルスタイルの転送を正常に適用したので、別の画像でこの演習を繰り返してみましょう。
ステップ3—独自の画像を変換する
これまで、使用しているライブラリの作成者から提供された画像を使用してきました。 代わりに私たち自身の画像を使用しましょう。 これを行うには、興味のある画像を見つけて次のコマンドでその画像のURLを使用するか、提供されたURLを使用してSammytheSharkを使用します。
もう一度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))
テスト実行と同じワークフローに従って、コンテンツ画像としてロケットサミーを使用し、スタイル画像と同じ星月夜の画像を使用して、芸術的なスタイル転送モデルを実行してみましょう。
以前に使用したのと同じコードを使用しますが、今回はコンテンツ画像を指定します 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',
'{}/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))
新しい定型化されたロケットサミーが表示されます。
別のスタイルの画像をロケットサミーの写真にマッピングして、これをもう一度試してみましょう。 今回はピカソのミューズを使用します。 繰り返しますが、 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つにすぎません。 探索できるその他の事項は次のとおりです。
- 上記のコードを、いつでも呼び出すことができる関数にパッケージ化します。
- ここで公開されているチュートリアルを使用して、時系列データで視覚化および予測する方法を学びます。
- TensorFlowドキュメントまたはTensorFlow実装で芸術的なスタイルの転送で共有されている例のいくつかを試してみてください。