GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

titu1994

Neural-Style-Transfer – Keras 2.0+の論文「ニューラルアルゴリズムの芸術的スタイル」( )からの神経形式伝達のKeras実装

投稿日:

Keras 2.0+の論文「ニューラルアルゴリズムの芸術的スタイル」( http://arxiv.org/abs/1508.06576 )からの神経形式伝達のKeras実装

ニューラルスタイル転送&ニューラルDoodles

紙からニューラルスタイルの伝達を行うKeras 2.0+ における芸術的スタイルのニューラルアルゴリズム

INetwork は、芸術的スタイルのニューラルアルゴリズムの改良で提案されている特定の改善を実装し、焦点を合わせます。

色の保存は、神経芸術スタイルの転送で紙を保存することに基づいています。

Masked Style Transferは、 Show、Divide、Neural:Weighted Style Transferに基づいています

ガイド

スクリプトを使用して最良の結果を達成する方法の詳細については、 ガイドを参照してください

WindowsとLinuxの両方でTheano(GPUサポート付き)を設定する方法についても説明します。 Windows上のTheanoは、長くて面倒なプロセスなので、ガイドは正確な手順ですべてのステップを完了させるだけで、プロセスをスピードアップすることができるので、厄介なTheano + Windowsセットアップを台無しにすることはありません。

Script Helperプログラムは、このリポジトリのリリースタブ( Script Helper Releases)からダウンロードできます。 任意のフォルダに展開し、 Neural Style Transfer.exeプログラムを実行します。 Linuxでは、スクリプトヘルパープログラムを実行するためにMono C#をインストールする必要があります。

シングルスタイルの転送

INetworkを使用した100回の反復後の結果

DeepArt.ioの結果(1000反復、マルコフランダムフィールド正規化などの改良を使用)

色保存によるスタイル転送

コンテンツイメージとして金閣寺を仏教寺院で、芸術的スタイルとしてモネの「水蓮」を用いた色彩保存の例:


一例として、色が保存されているかどうかにかかわらず、「葉っぱ」のスタイルを持つ嵯峨野竹林の2つの画像があります

色の保存は、マスクを使用して行うこともできます。 color_transfer.pyスクリプトを使用し、白い領域がコンテンツの色を転送し、黒い領域がスタイル生成の色を維持するマスク画像を提供する。

以下、コンテンツイメージは “Sunlit Mountain”で、スタイルイメージはPicassoの “Seated Nude”です。 カラー保存マスクは、山が手つかずの間に、空の領域のみにカラー転送が行われることを保証します。

スタイルの補間

スタイルウェイトとコンテンツウェイトは、大幅に異なる結果を得るために操作できます。

Leonid Afremovの “Misty Mood”はスタイルイメージで、 “Dipping Sun”はコンテンツイメージです:

スタイル= 1、コンテンツ= 1000 スタイル= 1、コンテンツ= 1 スタイル= 1000、コンテンツ= 1

複数のスタイル転送

次のいくつかのイメージは、コンテンツイメージとしてブルームーン湖を使用し、スタイルイメージとして、ヴィンセント・ヴァン・ゴッホの「星空の夜」とジョージア・オキーフの「レッド・カンナ」を使用しています。

以下は、3種類のスタイルウェイトを使用した50回の繰り返し後の結果です。

スターリーナイト:1.0、レッドカンナ0.2 スターリーナイト:1.0、レッドカンナ0.4 星の夜:1.0、レッド・カナ1.0

マスクされたスタイルの転送

スタイルごとにバイナリマスクを追加することで、選択したリージョンにスタイルを適用し、他のリージョンのコンテンツを保持することができます。複数のマスクを使用して、同じコンテンツイメージの2つの異なるリージョンに2種類のスタイルを適用することもできます。

mask_transfer.pyスクリプトを使用すると、1つのコンテンツイメージを1つのマスクでマスクして、黒い領域内のコンテンツを保持し、生成されたイメージ内の白い領域のスタイル転送を保持することができます。 現在、処理された方法でコンテンツのみが転送されます。

「星空の夜」は、下の画像のスタイルイメージとして使用されます。 マスクは、他のすべての地域にスタイルを適用しながら、女性の形や色を維持しようとします。 「星空の夜」はコンテンツの形や色を圧倒する傾向があるため、結果は非常に良好です。

マスクされたスタイル転送の別の例を以下に示す。 「冬の狼」はコンテンツ画像として使用され、「竹林」はスタイル画像として使用されます。 マスクは暗い曇った空を保存しようとし、山と狼だけにスタイルを適用します。

これらの最後のいくつかの画像は、コンテンツ画像として「Cherry Blossoms」を使用し、それぞれのマスクを使用して「Candy Style」と「Water Lillies」というユニークな結果を持つ画像を作成します。

テクスチャ転送

非常に特有のテクスチャを持つスタイルイメージを使用して、このテクスチャをアルゴリズムに変更することなくコンテンツに適用することができます。 スタイルイメージは、正しく転送するには非常に強いテクスチャを所有していなければならないことに留意されたい。

以下はコンテンツイメージ “Aurea Luna”の例で、/ style / metalsディレクトリにあるテクスチャイメージはシルバーとゴールドです。 色の保存は両方の画像に適用され、 “Burnt Gold”画像にマスクが適用され、正方形の画像全体ではなく円だけがスタイルされます。

すべての転送テクニック

これらの技法のそれぞれは、一緒に、または段階的に使用して、驚くべき画像を生成することができる。

次の画像では、192×192,384×384,768×768のスケールで、超解像度アルゴリズム(4x、その後1920×1080に縮小)を適用し、カラー転送とマスク転送を再度適用して、マルチスケールスタイル転送技術でマスクされたスタイル転送を使用しました。エッジをシャープにし、シンプルなシャープニングアルゴリズムを使用して、最後にアルゴリズムをデノイズします。

結果:

色保存あり/なしの様々な結果

様々なスタイルの例(色の保存の有無にかかわらず)。 .Hack GUの “Lost Grounds”の画像

神経節約の例

Renoitスタイル+コンテンツイメージ

モネスタイル+落書きの作成

ヴァンゴッホ+落書きの創造

重み(VGG16)

ウェイトは自動的に ‘models’サブディレクトリの〜/ .keras(Users /。keras for Windows)フォルダに自動的にダウンロードされ、キャッシュされます。 ウェイトはゼロ埋め込みレイヤーなしの畳み込みレイヤーのみを含むより小さなバージョンであり、それによって実行のスピードが向上します。

注意:新しいメソッドを使用してファイルを取得し、.kerasディレクトリにキャッシュするため、Keras(1.0.7以降)の最新バージョンが必要です。

元の実装への変更:

  • ‘conv5_2’出力を使用してコンテンツ損失を測定します。 オリジナル紙は ‘conv4_2’出力を利用しています

  • 画像に使用される初期画像は、(ランダムノイズ画像の代わりに)ベース画像です。この方法は、より良い出力画像を作成する傾向がありますが、パラメータは十分に調整する必要があります。 したがって、それらは引数 ‘init_image’です。オプション ‘content’または ‘noise’を取ることができます

  • MaxPooling2Dレイヤの代わりにAveragePooling2Dを使うことができます元の論文では、より良い結果を得るためにAveragePoolingを使用していますが、– --pool_type="max"という引数で--pool_type="max"レイヤを使用するように変更できます。 デフォルトではMaxPoolingが使用されています。画像がシャープであれば、AveragePoolingはスタイルをより良く適用するからです(特にスタイル画像がVan Goghの “Starry Night”の場合)。

  • スタイルウェイトスケーリング

  • 損失のあるアップスケーリングを使用して元の寸法にイメージを再スケーリングする

  • 損失のあるアップスケーリングを使用して、中間および最終段階の画像のアスペクト比を維持する

ネットワークの改善

  • 紙の改善3.1:スタイル推論のための幾何学的レイヤー重み調整
  • Paper in Improvement 3.2:スタイル推論にVGG-16の全レイヤーを使う
  • 紙の改善3.3:グラム行列の活性化シフト
  • 紙の改善3.5:相関連鎖

これらの改良点は、Chain Blurredバージョンとほぼ同じですが、いくつかの違いがあります。

  • 著者は、結果がしばしば重大ではないと結論づける論文のように、グラム行列Gのぼかしは使用されず、非常に複雑な勾配のために収束速度が大幅に低下する。
  • Chain Blurredバージョンで提案されているように、すべてのレイヤーを使用するのではなく、コンテンツ推論用のレイヤーは1つだけです。
  • CNN MRFネットワークは使用しませんが、これらの変更を元のアルゴリズムに適用します。
  • このすべては、VGG-16ネットワークではなく、VGG-19ネットワークで適用されます。 これをVGG-19ネットワークに外挿するのは簡単です。 feature_layersリストにレイヤー名を追加するだけで、これらの変更をVGG-19ネットワークに適用するのに十分です。

スクリプトヘルパー

これは、PythonスクリプトNetwork.pyまたはINetwork.py(Neural Style Transferタブの使用)とneural_doodle.pyまたはImpro_neural_doodle.pyスクリプト(Neural Doodleタブの使用)の引数をより簡単に生成するために書かれたC#

  • 最初の実行時に、Pythonパスを要求します。 選択したPython.exeを見つけるためにディレクトリを走査します(Anacondaはテスト済みです)
  • スクリプトヘルパープログラムのコードはhttps://github.com/titu1994/Neural-Style-Transfer-Windowsから入手できます 。プログラムはLinuxでMono

利点

  • スタイル転送、ニューラル・デートル、カラー転送、マスク・スタイル転送を簡単に行うことができます
  • 引数に基づいて自動的にスクリプトを実行します。
  • 画像の簡単な選択(コンテンツ、スタイル(複数選択可)、出力プレフィックス)
  • 簡単なパラメータ選択
  • コマンドラインの実行が優先される場合は、引数リストを簡単に生成します。
  • 各実行のログフォルダを作成して、設定を保存することができます。
  • Windows(ネイティブ)およびLinux(Monoを使用)で実行

複数のスタイルイメージを使用するには、イメージ選択ウィンドウが開いたら、必要に応じてすべてのスタイルイメージを選択します。 パラメータセクションの各スタイルウェイトの間のスペースを使用して、複数のスタイルウェイトを渡します。

使用法

ニューラルスタイル転送

Network.pyとINetwork.pyはどちらも同様の使用スタイルを持ち、すべてのパラメータを共有します。

Network.py / INetwork.py

python network.py/inetwork.py "/path/to/content image" "path/to/style image" "result prefix or /path/to/result prefix"

複数のスタイルイメージを渡すには、コンテンツイメージパスを渡した後、各スタイルパスをスペースで区切ります

python inetwork.py "/path/to/content image" "path/to/style image 1" "path/to/style image 2" ... "result prefix or /path/to/result prefix" --style_weight 1.0 1.0 ... 

出力画像を変更するために変更することができる以下に述べる様々なパラメータがある。 多くのパラメータでは、コマンドを二重引用符( “”)で囲む必要があります。

例:

python inetwork.py "/path/to/content image" "path/to/style image" "result prefix or /path/to/result prefix" --preserve_color "True" --pool_type "ave" --rescale_method "bicubic" --content_layer "conv4_2"

既に生成された画像に対して色保存を行うには、以下のようにcolor_transform.pyを使用します。 それは “_original_color”接尾辞を持つ生成されたイメージと同じフォルダにイメージを保存します。

python color_transfer.py "path/to/content/image" "path/to/generated/image"

マスクは--mask引数を使って色保存スクリプトにも--maskことが--maskます。ここで白い領域は色の保存が行われることを示し、黒い領域は色が保存されないことを示します。

python color_transfer.py "path/to/content/image" "path/to/generated/image" --mask "/path/to/mask/image"

マスク画像に関する注記:

  • それらはバイナリイメージ(白黒のみ)でなければなりません。
  • 白は、スタイルの転送を行うイメージの部分を表します
  • 黒は、コンテンツを保存したい画像の部分を表します
  • Multi Style Multi Mask生成でマスク画像が表示される順序に注意してください。 スタイルイメージとスタイルマスクの間には1:1のマッピングがあります。
  • Script Helperプログラムを使用すると、名前による並べ替えのためにマスクが誤って注文されることがあります。 したがって、マスクの名前をアルファベット順に変更してこの欠陥を修正してください。

一般的な例として、マルチスタイルマルチマスクイメージを生成するためのパラメータのリストを以下に示します。

python network.py "Japanese-cherry-widescreen-wallpaper-Picture-1366x768.jpg" "candy-style.jpg" "water-lilies-1919-2.jpg" \
"Cherry Blossom" --style_masks "cherry-blossom-1.jpg" "cherry-blossom-2.jpg" --content_weight 5 --style_weight 1.0 1.0 \
--num_iter 20 --model "vgg16" --content_loss_type 0

カラー転送と同様に、単一のマスクスタイル転送は、スタイル転送スクリプトで直接行うのではなく、後処理ステップとして適用することもできます。 後処理スクリプトのmask_transfer.pyを使用して、生成されたイメージ内のコンテンツイメージの一部を保存することができます。

例:

python mask_transfer.py "path/to/content/image" "path/to/generated/image" "path/to/content/mask"

ニューデリー

neural_doodle.pyスクリプトとImproved_neural_doodle.pyスクリプトは、どちらも同じような使用スタイルを共有しています。

neural_doodle.py&improved_neural_doodle.py

python neural_doodle.py --nlabels -style-image --style-mask --target-mask --content-image --target-image-prefix

例1:スタイルイメージ、スタイルマスク、ターゲットマスクを使用した落書き(kerasの例から)

python neural_doodle.py --nlabels 4 --style-image Monet/style.png \
    --style-mask Monet/style_mask.png --target-mask Monet/target_mask.png \
    --target-image-prefix generated/monet

例2:スタイルイメージ、スタイルマスク、ターゲットマスク、およびオプションのコンテンツイメージを使用する落書き。

 python neural_doodle.py --nlabels 4 --style-image Renoir/style.png \
    --style-mask Renoir/style_mask.png --target-mask Renoir/target_mask.png \
    --content-image Renoir/creek.jpg \
    --target-image-prefix generated/renoir

複数のフェーズ例:スタイルイメージ、スタイルマスク、ターゲットマスクを使用し、より良い結果を達成するために複数回使用するDoodle。

  • 画像サイズ(400×600)があるとします。
  • イメージのサイズを4(100 x 125)
  • 以下のスクリプト#1( – img_size 100)にしたがって第1回のひな形を作成します。
  • 次のスクリプト#2に従って2番目の落書きを作成します(ここでは1番目の落書きをコンテンツ画像として渡します)(–img_size 200)
  • スクリプト#3の下に3番目と最後のdoodleを作成します(ここでは2番目のdoodleをコンテンツイメージとして渡します)(img_sizeパラメータは入れないでください)
# Script 1
python improved_neural_doodle.py --nlabels 4 --style-image srcl.jpg --style-mask srcl-m.png --target-mask dst-m.png  --target-image-prefix ./doodle3-100 --num_iter 50 --img_size 100 --min_improvement 5.0

# Script 2
python improved_neural_doodle.py --nlabels 4 --style-image srcl.jpg --style-mask srcl-m.png --target-mask dst-m.png  --target-image-prefix ./doodle3-200 --num_iter 50 --content-image ./doodle3-100_at_iteration_XXXX.png --img_size 200 --min_improvement 2.5

############# Replace XXXX by last iteration number ################

# Script 3 
python improved_neural_doodle.py --nlabels 4 --style-image srcl.jpg --style-mask srcl-m.png --target-mask dst-m.png  --target-image-prefix ./doodle3-500 --num_iter 50 --content-image ./doodle3-200_at_iteration_XXXX.png

############# Replace XXXX by last iteration number ################

カラー転写(後処理)

定型化された画像が既に生成された後に、カラー転送を行うことができる。 これは、 color_transfer.pyスクリプトまたはスクリプトヘルパーの[カラー転送]タブで行うことができます。 スクリプトは、 “_original_color”接尾辞付きの生成されたイメージと同じフォルダにイメージを保存することに注意してください。

例:

python color_transfer.py "path/to/content/image" "path/to/generated/image"

マスクは--mask引数を使って色保存スクリプトにも--maskことが--maskます。ここで白い領域は色の保存が行われることを示し、黒い領域は色が保存されないことを示します。

python color_transfer.py "path/to/content/image" "path/to/generated/image" --mask "/path/to/mask/image"

--hist_matchパラメータを1に設定すると、直接カラー転送ではなくヒストグラムカラーマッチングが実行されます

python color_transfer.py "path/to/content/image" "path/to/generated/image" --hist_match 1

カラー保存用とスタイル転送用のマスクには、それぞれ異なる表現があることに注意してください。 色の保存は白の領域を内容の色として保存し、マスクの転送は黒の領域を内容イメージとして保存します。

マスクスタイル転送(後処理)

一般的な要件は、スタイル化されたイメージ内のコンテンツの一部を保存することである場合、単にスクリプトヘルパーのmask_transfer.pyスクリプトまたはマスク転送タブを使用して後処理ステップとして行うことができます。

今のところ、コンテンツのみを保存することができます(マスク内の黒色に色を付ける)。 マルチスタイルのマルチマスクスタイルの転送を実行するには、スタイルとマスクをニューラルスタイルスクリプトに提供し、複数の繰り返し実行する必要があります。 これは、後処理工程として行うことはできません。

例:

python mask_transfer.py "path/to/content/image" "path/to/generated/image" "path/to/content/mask"

パラメータ(ニューラルスタイル)

--style_masks : Multiple style masks may be provided for masking certain regions of an image for style transfer. Number of 
  style_weight parameters must match number of style masks.
--color_mask : A single color mask, which defines the region where the color must be preserved. 

--image_size : Allows to set the Gram Matrix size. Default is 400 x 400, since it produces good results fast. 
--num_iter : Number of iterations. Default is 10. Test the output with 10 iterations, and increase to improve results.
--init_image : Can be "content", "noise" or "gray". Default is "content", since it reduces reproduction noise. "gray" is useful when you want only the color of the style to be used in the image.
--pool_type : Pooling type. MaxPooling ("max") is default. For smoother images, use AveragePooling ("ave").

--model : Can be "vgg16" or "vgg19". Changes between use of VGG 16 or VGG 19 model.
--content_loss_type : Can be 0, 1 or 2. 
                      0 does not add any scaling of the loss. 
                      1 = 1 / (2 * sqrt(channels) * sqrt(width * height))
                      2 = 1 / (channels * width * height)
--preserve_color : Preserves the original color space of the content image, while applying only style. Post processing technique on final image, therefore does not harm quality of style.
--min_improvement : Sets the minimum improvement required to continue training. Default is 0.0, indicating no minimum threshold. Advised values are 0.05 or 0.01

--content_weight : Weightage given to content in relation to style. Default if 0.025
--style_weight : Weightage given to style. Default is 1. When using multiple styles, seperate each style weight with a space
--style_scale : Scales the style_weight. Default is 1. 
--total_variation_weight : Regularization factor. Smaller values tend to produce crisp images, but 0 is not useful. Default = 8.5E-5

--rescale_image : Rescale image to original dimensions after each iteration. (Bilinear upscaling)
--rescale_method : Rescaling algorithm. Default is bilinear. Options are nearest, bilinear, bicubic and cubic.
--maintain_aspect_ratio : Rescale the image just to the original aspect ratio. Size will be (gram_matrix_size, gram_matrix_size * aspect_ratio). Default is True
--content_layer : Selects the content layer. Paper suggests conv4_2, but better results can be obtained from conv5_2. Default is conv5_2.

パラメータ(Neural Doodle)

--nlabels : Number of colors or labels in mask image
--image_size : Allows to set the Gram Matrix size. Default is -1, which means that it uses style image size automatically. 
--num_iter : Number of iterations. Default is 10. Test the output with 10 iterations, and increase to improve results.
--preserve_color : Preserves the original color space of the content image, while applying only style. Post processing technique on final image, therefore does not harm quality of style. Works only when using content image for guided style transfer
--min_improvement : Minimum improvement in percentage required to continue training. Set to 0.0 to disable.

--content_weight : Weightage given to content in relation to style. Default if 0.1
--style_weight : Weightage given to style in relation to content. Default is 1. 
--total_variation_weight : Regularization factor. Smaller values tend to produce crisp images, but 0 is not useful. Default = 8.5E-5
--region_style_weight : Weight for region style regularization. Keep it set to 1.0 unless testing for experimental purposes.

パラメータ(カラー転送)

--masks : Optional, performs masked color transfer
--hist_match : Performs histogram color matching if set to 1. Default is 0.

行動中のNetwork.py

要件

  • テアノ/テンソルフロー
  • ケラス
  • CUDA(GPU) – おすすめ
  • CUDNN(GPU) – 推奨
  • Scipy + PIL
  • ナンシー
  • h5py

速度

980M GPUでは、各エポックに必要な時間は主にイメージサイズ(グラム行列サイズ)に依存します。

400×400グラムのマトリックスの場合、各エポックは約8-10秒かかります。
512×512グラムの行列の場合、各エポックは約15-18秒かかります。
600×600グラムの行列の場合、各エポックは約24〜28秒かかる。

Masked Style Transferでは、マスクを使用しない場合と同じ速度になります。 これは、スタイルとコンテンツのフィーチャを掛けたマスクの勾配計算を防止することによって達成されました。

複数のスタイル転送の場合、INetwork.pyにはもう少し時間がかかります(2つのスタイルに対して上記のように2倍のシングルスタイル転送、3つのスタイルに対して〜3倍など)。 複数のスタイルの転送でINetwork.pyを使用すると結果が向上します。

マルチスタイルマルチマスクスタイル転送の場合、複数のスタイルを使用する場合と同じ速度になります。 スタイルとコンテンツの特徴を乗じたマスクの勾配計算を防止することによって達成されました。

  • マルチスタイルのマルチマスクネットワークの場合、Network.pyは反復ごとに約24(以前は72)秒必要ですが、INetwork.pyは反復ごとに87(以前は248)秒を必要とします

問題

  • 初期画像としてのコンテンツ画像の使用により、出力はパラメータ調整に大きく依存する。
    最初の10エポックでイメージが適切かどうかをテストし、正しい場合は、繰り返し回数を増やしてスムーズにし、出力の品質を向上させます。
  • グラムサイズが小さいため、出力画像は通常小さい。
    この問題を解決するには、このペーパー「Deep Convolutional Networksを使用したイメージの超解像度」( http://arxiv.org/abs/1501.00092)の実装を使用して、画像を最小限の損失で高画質化します。
    Windowsの上記の論文のいくつかの実装: https : //github.com/lltcggie/waifu2x-caffe/releases
    (waifu2x-caffe.zipをダウンロードし、抽出プログラムは英語をサポートしています)
  • マルコフランダムフィールドの実装正則化アルゴリズムとパッチマッチアルゴリズムは現在テスト中です。 MRFNetwork.pyには、Image Analogiesの論文のようにMRFとパッチマッチを使用するために統合する必要がある基本コードが含まれています。 画像合成のためにマルコフランダムフィールドと畳み込みニューラルネットワークを組み合わせる







-titu1994

執筆者: