これは、レオン・A・ガティス、アレクサンダー・S・エッカー、マティアス・ベッジによる芸術スタイルの神経アルゴリズムである論文のピトルチの実装です。このコードは、ジャスティンジョンソンのニューラルスタイルに基づいています。
このペーパーでは、ある画像の内容を畳み込みニューラルネットワークを使用して別の画像のスタイルと組み合わせるためのアルゴリズムを提示します。星空の夜の芸術的なスタイルをスタンフォードキャンパスの夜間の写真にマッピングする例は次のとおりです。
同じコンテンツ画像に異なる画像のスタイルを適用すると、興味深い結果が得られます。ここでは、ドイツのチュービンゲンの写真をさまざまなスタイルでレンダリングする論文から図2を再現します。
ゴールデンゲートブリッジのこの写真にさまざまなアートワークのスタイルを適用した結果は次のとおりです。
このアルゴリズムにより、ピカソの1907年の自画像のスタイルをブラッドピットに移植するこの例に示すように、ユーザーはスタイルとコンテンツの再構成用語の相対的な重みをトレードオフできます。
スタイル機能を抽出する前にスタイルイメージをサイズ変更することにより、スタイルイメージから転送される芸術的特徴の種類を制御できます。 -style_scaleフラグでこの動作を制御できます。以下に、星空の夜のスタイルでゴールデンゲートブリッジをレンダリングする3つの例を示します。左から、 -style_scaleは2.0、1.0、および0.5です。
複数のスタイルのイメージを使用して、複数の芸術スタイルをブレンドできます。
左上から時計回り:「The Starry Night」 +「The Scream」、「The Scream」 +「Composition VII」、「座ったヌード」 +「構成VII」、および「座ったヌード」 +「The Starry Night」 +
複数のスタイルの画像を使用する場合、それらがブレンドされる程度を制御できます。
Flag -original_colors 1を追加すると、出力画像は元の画像の色を保持します。
依存関係:
オプションの依存関係:
依存関係をインストールした後、VGGモデルをダウンロードするには、次のスクリプトを実行する必要があります。
python models/download_models.py
これにより、元のVGG-19モデルがダウンロードされます。元のVGG-16モデルもダウンロードされます。デフォルトでは、元のVGG-19モデルが使用されます。
メモリGPUが小さい場合、Nin Imagenetモデルを使用すると、やや悪化しているが同等の結果が得られます。 BVLC Caffe ModelZooからモデルの詳細を入手できます。 NINモデルは、 download_models.pyスクリプトを実行するときにダウンロードされます。
インストールガイドには、UbuntuとWindowsの詳細なインストール手順を見つけることができます。
基本的な使用法:
python neural_style.py -style_image <image.jpg> -content_image <image.jpg>
NINモデルでのCudnnの使用:
python neural_style.py -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet.pth -gpu 0 -backend cudnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 500 -image_size 512 -optimizer adam
複数のスタイルの画像を使用するには、このようなコンマ区切りリストに合格します。
-style_image starry_night.jpg,the_scream.jpg 。
画像へのパスは、ホームディレクトリを表す~文字を含めるべきではないことに注意してください。代わりに、相対パスまたは完全な絶対パスを使用する必要があります。
オプション:
-image_size :生成された画像の最大側の長さ(ピクセル単位)。デフォルトは512です。-style_blend_weights : -style_blend_weights 3,7などのコンマ分離リストとして、複数のスタイル画像のスタイルをブレンドするための重み。デフォルトでは、すべてのスタイルの画像が等しく重み付けされています。-gpu :使用するGPUのゼロインデックスインドID。 CPUモードの場合-gpuをcに設定します。最適化オプション:
-content_weight :コンテンツの再構成用語を重み付けする量。デフォルトは5E0です。-style_weight :スタイルの再構築用語を重み付けする量。デフォルトは1E2です。-tv_weight :総変換(TV)正規化の重み。これは、画像を滑らかにするのに役立ちます。デフォルトは1E-3です。テレビの正則化を無効にするために0に設定します。-num_iterations :デフォルトは1000です。-init :生成された画像を生成する方法。 randomまたはimageの1つ。デフォルトはrandomで、論文のようにノイズ初期化を使用します。 imageコンテンツ画像で初期化します。-init_image :初期化画像をユーザー指定画像に置き換えます。-optimizer :使用する最適化アルゴリズム。 lbfgsまたはadamいずれか。デフォルトはlbfgsです。 L-BFGはより良い結果をもたらす傾向がありますが、より多くのメモリを使用します。 Adamに切り替えると、メモリの使用量が減少します。 Adamを使用する場合、おそらく他のパラメーターでプレイして、特にスタイルの重み、コンテンツの重量、学習率を得る必要があります。-learning_rate :Adam Optimizerで使用する学習率。デフォルトは1E1です。-normalize_gradients :このフラグが存在する場合、各レイヤーからのスタイルとコンテンツの勾配はL1正規化されます。出力オプション:
-output_image :出力画像の名前。デフォルトはout.pngです。-print_iter :printの進行状況すべてのprint_iter iterations。印刷を無効にするために0に設定します。-save_iter :すべてのsave_iter反復を保存します。 0に設定して、中間結果を保存することを無効にします。レイヤーオプション:
-content_layers :コンテンツの再構成に使用するレイヤー名のコンマ集合リスト。デフォルトはrelu4_2です。-style_layers :スタイルの再構築に使用するレイヤー名のコンマ集合リスト。デフォルトはrelu1_1,relu2_1,relu3_1,relu4_1,relu5_1です。その他のオプション:
-style_scale :スタイル画像から機能を抽出するスケール。デフォルトは1.0です。-original_colors :これを1に設定すると、出力画像はコンテンツ画像の色を保持します。-model_file :VGG Caffeモデルの.pthファイルへのパス。デフォルトは元のVGG-19モデルです。元のVGG-16モデルを試すこともできます。-pooling :使用するプーリングレイヤーの種類。 maxまたはavgの1つ。デフォルトはmaxです。 VGG-19モデルは最大プーリングレイヤーを使用していますが、これらのレイヤーを平均プーリング層に置き換えると結果が改善されると述べています。平均的なプーリングを使用して良い結果を得ることができませんでしたが、オプションはこちらです。-seed :繰り返し可能な結果を指定できる整数値。デフォルトでは、この値は実行ごとにランダムです。-multidevice_strategy :複数のデバイスを使用するときにネットワークを分割するレイヤーインデックスのコンマ分離リスト。詳細については、Multi-GPUスケーリングを参照してください。-backend : nn 、 cudnn 、 openmp 、またはmkl 。デフォルトはnnです。 mkl IntelのMKLバックエンドを必要とします。-cudnn_autotune :cudnnバックエンドを使用する場合は、このフラグを渡して、組み込みのcudnnオートツナを使用して、アーキテクチャに最適な畳み込みアルゴリズムを選択します。これにより、最初の反復が少し遅くなり、もう少しメモリを取得できますが、Cudnnバックエンドを大幅に高速化する可能性があります。 問題:プログラムはメモリがなくなって死にます
解決策:画像サイズを減らしてみてください: -image_size 256 (またはlower)。さまざまな画像サイズが、 -style_weightに非デフォルト値と-content_weight最適な結果に必要である可能性が高いことに注意してください。 GPUで実行している場合は、 -backend cudnnと一緒に実行してメモリの使用量を削減することもできます。
問題: -backend cudnn 、デフォルトのnnバックエンドよりも遅いです
解決策: flag -cudnn_autotuneを追加します。これにより、組み込みのcudnnオートチューナーを使用して、最適な畳み込みアルゴリズムを選択します。
問題:次のエラーメッセージを取得します。
Missing key(s) in state_dict: "classifier.0.bias", "classifier.0.weight", "classifier.3.bias", "classifier.3.weight". Unexpected key(s) in state_dict: "classifier.1.weight", "classifier.1.bias", "classifier.4.weight", "classifier.4.bias".
解決策:レイヤーの場所と混同されるため、古いモデルでは、Pytorchの新しいバージョンと互換性があるため、修正が必要です。付属のdonwload_models.pyスクリプトは、モデルをダウンロードした後、これらの修正を自動的に実行します。
デフォルトでは、 neural-style-pt nnバックエンドを畳み込みおよびL-BFGに最適化に使用します。これらは良い結果をもたらしますが、両方とも多くのメモリを使用できます。次のことでメモリの使用量を減らすことができます。
-backend cudnnを追加して、cudnnバックエンドを使用します。これはGPUモードでのみ機能します。-optimizer adamを追加して、L -BFGSの代わりにAdamを使用します。これにより、メモリの使用量が大幅に削減されるはずですが、良好な結果を得るには他のパラメーターの調整が必要になる場合があります。特に、学習率、コンテンツの重量、スタイルの重みで遊ぶ必要があります。これは、CPUモードとGPUモードの両方で機能するはずです。-image_size 256を渡して、デフォルトサイズの半分の画像を生成します。デフォルト設定では、Neural Style-PTは私のシステムで約3.7 GBのGPUメモリを使用します。 AdamとCudnnに切り替えると、GPUメモリフットプリントが約1GBに削減されます。
速度は、バックエンドとオプティマイザーによって大きく異なります。さまざまな設定を持つテスラK80で-image_size=512で500回の反復を実行することがあります。
-backend nn -optimizer lbfgs :117秒-backend nn -optimizer adam :100秒-backend cudnn -optimizer lbfgs :124秒-backend cudnn -optimizer adam :107秒-backend cudnn -cudnn_autotune -optimizer lbfgs :109秒-backend cudnn -cudnn_autotune -optimizer adam :91秒GTX 1080で同じベンチマークを次に示します。
-backend nn -optimizer lbfgs :56秒-backend nn -optimizer adam :38秒-backend cudnn -optimizer lbfgs :40秒-backend cudnn -optimizer adam :40秒-backend cudnn -cudnn_autotune -optimizer lbfgs :23秒-backend cudnn -cudnn_autotune -optimizer adam :24秒複数のCPUおよびGPUデバイスを使用して、より高い解像度で画像を処理できます。ネットワークの異なるレイヤーは、異なるデバイスで計算されます。 -gpuフラグで使用されるGPUおよびCPUデバイスを制御でき、 -multidevice_strategyフラグを使用してデバイス間でレイヤーを分割する方法を制御できます。
たとえば、4つのGPUを備えたサーバーでは、GPU -gpu 0,1,2,3にGPU 0、1、2、および3で処理することができます。また、Flag -multidevice_strategy 3,6,12与えることにより、最初の2つのレイヤーをGPU 0で計算する必要があることを示します。レイヤー3〜5はGPU 1で計算する必要があります。レイヤー6〜11はGPU 2で計算し、残りの-multidevice_strategyはGPU 3で計算する必要があります。
レオン・A・ガティス、アレクサンダー・S・エッカー、マティアス・ベッジ、アーロン・ヘルツマン、エリ・シェクトマンによる神経スタイルの伝達における知覚要因を制御する論文で説明されているように、マルチGPU処理とマルチスケール生成を組み合わせることにより、高分解能で非常に高品質の結果を達成できます。
これは、8つのTesla K80 GPUを持つサーバーで生成された4016 X 2213画像です。
この画像を生成するために使用されるスクリプトは、ここにあります。
画像はホワイトノイズで初期化され、L-BFGSを使用して最適化されます。
conv1_1 、 conv2_1 、 conv3_1 、 conv4_1 、およびconv5_1レイヤーを使用して、 conv4_2レイヤーを使用してコンテンツの再構成を使用して、スタイルの再構成を実行します。論文のように、5つのスタイルの再構成損失は等しい重みです。
このコードが研究に役立つと思われる場合は、提供された引用を使用して引用してください。