kshitizrimal / deepStyle

10月 19, 2021
admin

これは論文で説明されているいくつかの技術のTensorFlow実装です:

  • Image Style Transfer Using Convolutional Neural Networksby Leon A. Gatys, Alexander S. Ecker, Matthias Bethge
  • Artistic style transfer for videosby Manuel Ruder, Alexey Dosovitskiy, Thomas Brox
  • Preserving Color in Neural Artistic Style Transferby Leon A. Gatys, Matthias Bethge, Aaron Hertzmann, Eli Shechtman

Additional, techniques are presented for semantic segmentation and multiple style transfer.

The Neural Style algorithm syntises a pastiche by separated and combining of one image with the style of another image using convolutional neural networks (CNN).その内容は、CNNを使用して、ある画像のコンテンツに別の画像のスタイルを組み合わせる。 以下は、アフリカのライオンの写真に「星降る夜」の芸術的スタイルを転送する例です。

同じコンテンツ画像にさまざまな芸術作品のスタイルを転送すると、定性的な説得力を持つ結果が得られます。

ここで、最初の論文からの図 3 を再現します。これは、ドイツのチュービンゲンのネッカフロントの写真を 5 種類の象徴的絵画、ミーノータウロスの難破、星の輝く夜、構成 VII、叫び、座るヌードのスタイルに描きます。

Content / Style Tradeoff

スタイルとコンテンツの相対的な重みは制御可能です。

Red Canna に適用されるスタイルの重みを増やしてレンダリングします。

複数のスタイル イメージ

複数のスタイル イメージを使って、複数のアート スタイルをブレンドできるようになります。 星月夜」+「叫び」、「叫び」+「コンポジションVII」、「座った裸婦」+「コンポジションVII」
下段(左から右へ):「星月夜」+「叫び」、「叫び」+「コンポジションVII」。 Seated Nude + The Starry Night、Oversoul + Freshness of Cold、David Bowie + Skull

Style Interpolation

複数のスタイル画像を使用する場合、画像間のブレンドの度合いを制御することが可能です。8 The Scream, .8 The Starry Night + .2 The Scream
Bottom row (left to right): .2 Oversoul + .8 Freshness of Cold, .5 Oversoul + .5 Freshness of Cold, .8 Oversoul + .2 Freshness of Cold

Transfer style but not color

flags --original_colorsを入れることによりオリジナルイメージの色調を保持できるようになりました。 色は、YUV、YCrCb、CIE L*a*b*、またはCIE L*u*v*色空間のいずれかを使用して転送されます。

ここで、輝度のみの転送を使用して、第 3 論文の図 1 と図 2 を再現します。

左から右: コンテンツ画像、スタイライズ画像、コンテンツ画像の元の色でスタイライズ画像

Textures

このアルゴリズムは美術絵画様式に制約されることはありません。 また、写真のテクスチャに適用して、パレイドリックなイメージを作ることもできる。

Segmentation

スタイルが、コンテンツのイメージでセマンティックに分割するために転送することができます。

コンテンツ画像の前景と背景に複数のスタイルを転送することができる。

左から右: コンテンツ画像、前景スタイル、背景スタイル、前景マスク、背景マスク、スタイライズ画像

動画

各ソースフレームにアルゴリズムを適用しアニメーションはレンダーすることが可能です。 最良の結果を得るために、勾配降下は、フレームのペア間のオプティカルフローに従って、現在のフレームにワープした以前のスタイライズされたフレームで初期化される。 時間的整合性のための損失関数は、除外された領域と動きの境界を除くピクセルにペナルティを与えるために使用される。


上段(左から右):ソースフレーム、グランドトゥルスのオプティカルフローを視覚化
下段(左から右):ソースフレーム。 disoccluded regions and motion boundaries, stylized frames

Gradient Descent Initialization

勾配降下の初期化は、シングルイメージでは--init_img_type、ビデオフレームでは--init_frame_typeまたは--first_frame_typeを用いて制御される。 ホワイトノイズにより、任意の数の別個の画像を生成することができる。 一方、固定画像で初期化すると常に同じ出力に収束する。

ここで最初の論文の図6を再現する:

上段(左から右)。 コンテンツ画像、スタイル画像、ホワイトノイズ(RNGシード1)で初期化
下段(左から右へ)。 ホワイトノイズで初期化(RNGシード2、3、4)

Layer Representations

特徴の複雑さと受容野のサイズは、CNN階層を下るにつれて大きくなっている。

ここで、原著論文から図3を転載しておく。

1 x 10^-5

1 x 10^-5 1 x 10^-

となる。

1 x 10^-5 1 x 10^-4 1 x 10^-3 1 x 10^- 1 x 10^- 1 x 10^-5
conv1_1
コンバージョン2_1
conv3_1
conv4_1
conv5_1

Rows.Low: CNNレイヤーのサブセットを増加させる。例えば、’conv4_1′ は ‘conv1_1’, ‘conv2_1’, ‘conv3_1’, ‘conv4_1’ を使うことを意味します。
Columns:コンテンツとスタイルの再構成のα/β比(コンテンツ/スタイルトレードオフを参照)。

Setup

Dependencies:

  • tensorflow
  • opencv

Optional (but recommended) dependencies:

  • CUDA 7.0
  • CUDA 7.5+
  • cuDNN 5.0+

依存関係のインストール後:

  • VGG-19 モデルの重みをダウンロードします (「大規模視覚認識用 Very Deep Convolutional Networks プロジェクトからの VGG-VD モデル」の項を参照). VGG-19ネットワークの詳細はこちら。
  • ダウンロード後、重みファイルimagenet-vgg-verydeep-19.matをプロジェクトディレクトリにコピーしてください。

使い方

基本的な使い方

Single Image

  1. コンテンツイメージを1つデフォルトのイメージコンテンツディレクトリにコピー ./image_input
  2. スタイルイメージを1つかそれ以上デフォルトスタイルディレクトリにコピー ./styles
  3. コマンドを実行します。
bash stylize_image.sh <path_to_content_image> <path_to_style_image>

例:

bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg

注:サポートされている画像形式は以下のとおりです。 .png, .jpg, .ppm, .pgm

Note: 画像へのパスには、ホームディレクトリを表す ~ 文字を含めないで、相対パスか絶対パスを使用するようにしてください。

Video Frames

  1. Copy 1 content video to the default video content directory ./video_input
  2. Copy 1 or more style images to the default style directory ./styles
  3. Run the command:
bash stylize_video.sh <path_to_video> <path_to_style_image>

bash stylize_video.sh ./video_input/video.mp4 ./styles/kandinsky.jpg

Note:supported video formats are include: .mp4, .mov, .mkv

高度な使用法

単一画像またはビデオフレーム

  1. コンテンツ画像をデフォルト画像コンテンツディレクトリにコピー ./image_input またはビデオフレームをデフォルト動画コンテンツディレクトリにコピー ./video_input
  2. 1つ以上のスタイル画像をデフォルトスタイルディレクトリにコピー ./styles
  3. 特定の引数を使用して、このコマンドを実行する。
python neural_style.py <arguments>

例 (単一イメージ):

python neural_style.py --content_img golden_gate.jpg \ --style_imgs starry-night.jpg \ --max_size 1000 \ --max_iterations 100 \ --original_colors \ --device /cpu:0 \ --verbose;

複数のスタイル イメージを使用するには、次のようにイメージ名とイメージ重みのスペース区切りリストを渡します:

--style_imgs starry_night.jpg the_scream.jpg --style_imgs_weights 0.5 0.5

例 (ビデオ フレーム):

python neural_style.py --video \ --video_input_dir ./video_input/my_video_frames \ --style_imgs starry-night.jpg \ --content_weight 5 \ --style_weight 1000 \ --temporal_weight 1000 \ --start_frame 1 \ --end_frame 50 \ --max_size 1024 \ --first_frame_iterations 3000 \ --verbose;

Note: --init_frame_type prev_warp を使う場合、事前にフレーム間の前後方向および前方向への光路計算をしていることが必要です。 ./video_input/make-opt-flow.sh および ./video_input/run-deepflow.sh

引数

  • --content_img を参照してください。 コンテンツ画像のファイル名。 例 lion.jpg
  • --content_img_dir: コンテンツ・イメージの相対パスまたは絶対パス。 デフォルトは ./image_input
  • --style_imgs: スタイルイメージのファイル名。 複数のスタイル画像を使用する場合は、スペースで区切ったリストを渡します。 例 --style_imgs starry-night.jpg
  • --style_imgs_weights: 各スタイルイメージのブレンドウェイトを指定します。 デフォルトは 1.0 (1つのスタイルイメージのみ)
  • --style_imgs_dir: スタイルイメージの相対的または絶対的なディレクトリパス。 デフォルトは ./styles
  • --init_img_type: ネットワークを初期化するためのイメージ。 選択肢は以下の通りです。 content, random, style. デフォルト。 content
  • --max_size: 入力画像の最大幅または最大高さを指定します。 デフォルトは 512
  • --content_weight: コンテンツロス関数の重み デフォルトは 5e0
  • --style_weight: スタイルロス関数に対する重みです。 デフォルトは 1e4
  • --tv_weight: 全変分損失関数に対する重み デフォルトは 1e-3
  • --temporal_weight: 時間的損失関数に対する重みです。 デフォルトは 2e2
  • --content_layers: コンテンツ画像に使用される空間的に区切られたVGG-19レイヤーの名前です。 デフォルトは conv4_2
  • --style_layers: スタイル画像に使用されるスペースで区切られたVGG-19レイヤーの名前です。 デフォルトは relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
  • --content_layer_weights: 各コンテンツレイヤーのコンテンツロスに対する重みをスペースで区切ったもの。 デフォルトは 1.0
  • --style_layer_weights: 各スタイルレイヤの損失に対するスペースで区切られた重み付け。 デフォルトは 0.2 0.2 0.2 0.2 0.2
  • --original_colors: 色ではなくスタイルが転送されるかどうかを示すブール値フラグ.
  • --color_convert_type: 元の色にルミナンスマッチ変換するための色空間 (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*). 選択できる。 yuv, ycrcb, luv, lab. デフォルト yuv
  • --style_mask: スタイルをマスク領域に転送するかどうかを示すブール値フラグ.
  • --style_mask_imgs: スタイルマスク画像のファイル名 (例: face_mask.png). 複数のスタイルマスク画像を使用する場合は、スペースで区切られたリストを渡す。 Example: --style_mask_imgs face_mask.png face_mask_inv.png
  • --noise_ratio: ネットワークがrandomで初期化された場合のコンテンツ画像とノイズ画像の補間値。 デフォルト。 1.0
  • --seed: 乱数発生器のシード。 デフォルト。 0
  • --model_weights: VGG-19 ネットワークの重みと偏り. ダウンロードはこちら。 デフォルト:imagenet-vgg-verydeep-19.mat
  • --pooling_type: 畳み込みニューラルネットワークのプーリングの種類。 選択肢は avg, max. デフォルトは avg
  • --device: GPUまたはCPUのデバイス。 GPUモードは強く推奨されますが、NVIDIA CUDAが必要です。 選択肢は /gpu:0 /cpu:0. デフォルト。 /gpu:0
  • --img_output_dir: 出力の書き込み先ディレクトリ。 デフォルトは ./image_output
  • --img_name: 出力画像のファイル名. デフォルトは result
  • --verbose: ステートメントをコンソールに出力するかどうかを示すブール値フラグ。

Optimization Arguments

  • --optimizer: 損失最小化オプティマイザ。 L-BFGS の方が良い結果が得られる。 Adamはより少ないメモリを使用します。 選択肢 lbfgs, adam. デフォルト lbfgs
  • --learning_rate: Adamオプティマイザの学習速度パラメータ. デフォルトは 1e0

  • --max_iterations: AdamまたはL-BFGSオプティマイザーの最大反復回数。 デフォルト。 1000
  • --print_iterations: オプティマイザのprintステートメント間の反復回数。 デフォルト。 50
  • --content_loss_function: コンテンツロス関数の定数Kを変更しました。 選択肢は 1, 2, 3. デフォルトは 1

Video Frame Arguments

  • --video: ユーザーがビデオを作成しているかを示すブール型フラグ。 最初のフレーム番号。 デフォルト。 1
  • --end_frame: 最後のフレーム番号。 デフォルトは 1
  • --first_frame_type: 最初のフレームのレンダリング中にネットワークを初期化するための画像。 選択肢は以下の通り。 content, random, style. デフォルト。 random
  • --init_frame_type: 最初のフレーム以降のすべてのレンダリングで、ネットワークの初期化に使用されるイメージ。 選択肢は以下の通りです。 prev_warped, prev, content, random, style. デフォルト prev_warped
  • --video_input_dir: 入力フレームへの相対または絶対ディレクトリパス。 デフォルトは ./video_input
  • --video_output_dir: 出力フレームを書き込むための相対/絶対ディレクトリパス. デフォルトは ./video_output
  • --content_frame_frmt: 入力フレームのフォーマット文字列。 デフォルトは frame_{}.png
  • --backward_optical_flow_frmt: 後方オプティカルフローファイルのフォーマット文字列。 デフォルトは backward_{}_{}.flo
  • --forward_optical_flow_frmt: forward オプティカルフローファイルのフォーマット文字列。 デフォルトは forward_{}_{}.flo
  • --content_weights_frmt: オプティカルフローコンシステンシーファイルのフォーマット文字列 デフォルトは reliable_{}_{}.txt
  • --prev_frame_indices: 長期的な時間的整合性のために考慮すべき前のフレーム。 デフォルトは 1
  • --first_frame_iterations: 最初のフレームのオプティマイザーイテレーションの最大数。 デフォルト。 2000
  • --frame_iterations: 最初のフレームの後の各フレームのオプティマイザーの最大反復回数。 デフォルトは 800

Q&A

Send questions or issues:

Memory

By default, neural-style-tf uses the NVIDIA cuDNN GPU backend for convolution and L-BFGS for optimization.These produce better and faster results, but can consumption a lot of memory.これは、最適化を行うために、より高速な結果を生成しますが、多くのメモリを消費します。 これらはより高速な結果を生成しますが、多くのメモリを消費します。

  • Use Adam: L-BFGS の代わりに Adam を使用するフラグ --optimizer adam を追加します。 特に、--learning_rate, --content_weight, --style_weight
  • の値を変えて実験してみる必要があります。

実装の詳細

すべての画像は次のマシンでレンダリングされました:

  • CPU: Intel Core i7-6800K @ 3.40GHz × 12
  • GPU: NVIDIA GeForce GTX 1080/PCIe/SSE2
  • OS. Linux Ubuntu 16.04.1 LTS 64bit
  • CUDA: 8.0
  • python: 2.7.12
  • tensorflow: 0.10.0rc
  • opencv: 2.4.9.1

謝辞

この実装は以下のプロジェクトに基づいています:

  • Torch (Lua) implementation ‘neural-style’ by jcjohnson
  • Torch (Lua) implementation ‘artistic-videos’ by manuelruder

ソースビデオフレームは以下から取得しています:Torch, Lua (Lua) implement [before]、[forward]。

  • MPI Sintel Flow Dataset

芸術的な画像は、現代の芸術家によって作成されました。

  • Alex Grey
  • Minjae Lee
  • Leonid Afremov
  • Françoise Nielly
  • James Jean
  • Ben Giles
  • Callie Fink
  • H.R. Giger
  • Voka

芸術的なイメージは、歴史上の人気アーティストたちによって生み出されたものである。

  • フィンセント・ファン・ゴッホ
  • ワシリー・カンディンスキー
  • ジョージア・オキーフ
  • ジャン・・・・・・・・・・・・。Michel Basquiat
  • Édouard Manet
  • Pablo Picasso
  • Joseph Mallord William Turner
  • Frida Kahlo

Bash shell scripts for testing は私の兄の Sheldon Smith によって作成されたものです。

引用

このコードがあなたの研究に役立つと思われる場合は、引用してください:

@misc{Smith2016, author = {Smith, Cameron}, title = {neural-style-tf}, year = {2016}, publisher = {GitHub}, journal = {GitHub repository}, howpublished = {\url{https://github.com/cysmith/neural-style-tf}},}

.

コメントを残す

メールアドレスが公開されることはありません。