Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Style transfer

655 views

Published on

Description: https://zaburo-ch.github.io/post/style-transfer/
Implementation: https://github.com/zaburo-ch/style_transfer

Published in: Technology
  • Be the first to comment

Style transfer

  1. 1. Style Transfer 概観 2016年12月17日 今回はStyle Transferに関する手法についていくつかの論文を紹介します.手 法自体はシンプルですがとても面白いです.表紙スライドの背景にはスタイル としてよく使われるゴッホの星月夜を使ってみました. 1 / 16
  2. 2. Style Transferとは Gatys et al. 2016より引用 ある画像にコンテンツ(内容)を損なわ ないように別の画像のスタイル(画風) を写す手法のこと. いわゆる画風変換 Neural Networkを使ったStyle Transfer がGatys et al. 2016aで提案され(プレ プリント版 Gatys et al. 2015 は 2015 年8月)その後続々と改良版が提案さ れている
  3. 3. Gatys et al. 2016a で提案された手法の概要 コンテンツ画像 𝑝 生成画像を,はじめ一様乱数で初期化し,勾配降下法で スタイルの損失とコンテンツの損失が小さくなるように変化させる スタイルの損失 ℒstyle コンテンツの損失 ℒcontent 生成画像 𝑥 この線形和を最小化するように勾配降下法を行う 𝑥 ← 𝑥 − 𝜆 𝜕ℒtotal 𝜕 𝑥 ℒtotal = 𝛼ℒstyle + 𝛽ℒcontent 𝜆:学習率 スタイル画像 𝑎
  4. 4. Gatys et al. 2016a で提案された手法の概要 コンテンツ画像 𝑝 スタイル画像 𝑎 生成画像を,はじめ一様乱数で初期化し,勾配降下法で スタイルの損失とコンテンツの損失が小さくなるように変化させる スタイルの損失 ℒstyle コンテンツの損失 ℒcontent 生成画像 𝑥 𝜆:学習率 この線形和を最小化するように勾配降下法を行う 𝑥 ← 𝑥 − 𝜆 𝜕ℒtotal 𝜕 𝑥 ℒtotal = 𝛼ℒstyle + 𝛽ℒcontent
  5. 5. Gatys et al. 2016a で提案された手法の新しい点 この損失関数 ℒstyle と ℒcontent を計算するのに訓練済みCNNを使う conv5_3conv5_2conv5_1 conv4_3conv4_2conv4_1 conv2_2conv2_1 Dense Dense conv1_2conv1_1 pooling conv3_3conv3_2conv3_1 pooling pooling pooling pooling & flatten VGG 16 layers (Simonyan & Zisserman, 2014) Dense 画像認識のコンペで優勝したモデルVGGを使う 𝑥 を入力した時の中間層 𝑛_𝑚 の出力の 𝑖 番目のチャンネルの座標 𝑗 の値を次で表す conv 𝑛_𝑚 𝑥 𝑖,𝑗 • コンテンツの損失 ℒcontent = 𝑖,𝑗 conv4_2 𝑥 𝑖,𝑗 − conv4_2 𝑝 𝑖,𝑗 2 • スタイルの損失 次のGram matrix 𝐺 を用いて 𝐺( 𝑥)𝑖1,𝑖2 𝑙 = 𝑘 (conv𝑙 𝑥 𝑖1,𝑘conv𝑙 𝑥 𝑖2,𝑘) ℒstyle = 𝑛=1 5 1 𝐴𝑙 𝑖1,𝑖2 𝐺 𝑥 𝑖1,𝑖2 𝑛_1 − 𝐺 𝑎 𝑖1,𝑖2 𝑛_1 2 (𝐴𝑙は層の画素数などの違いを吸収する係数) 2次元座標を 𝑗の1文字で表す
  6. 6. Gatys et al. 2016a で提案された手法の新しい点 この損失関数 ℒstyle と ℒcontent を計算するのに訓練済みCNNを使う conv5_3conv5_2conv5_1 conv4_3conv4_2conv4_1 conv2_2conv2_1 Dense Dense conv1_2conv1_1 pooling conv3_3conv3_2conv3_1 pooling pooling pooling pooling & flatten VGG 16 layers (Simonyan & Zisserman, 2014) Dense 画像認識のコンペで優勝したモデルVGGを使う 𝑥 を入力した時の中間層 𝑛_𝑚 の出力の 𝑖 番目のチャンネルの座標 𝑗 の値を次で表す conv 𝑛_𝑚 𝑥 𝑖,𝑗 • コンテンツの損失 ℒcontent = 𝑖,𝑗 conv4_2 𝑥 𝑖,𝑗 − conv4_2 𝑝 𝑖,𝑗 2 • コンテンツの損失 次のGram matrix 𝐺 を用いて 𝐺( 𝑥)𝑖1,𝑖2 𝑙 = 𝑘 (conv𝑙 𝑥 𝑖1,𝑘conv𝑙 𝑥 𝑖2,𝑘) ℒstyle = 𝑛=1 5 1 𝐴𝑙 𝑖1,𝑖2 𝐺 𝑥 𝑖1,𝑖2 𝑛_1 − 𝐺 𝑎 𝑖1,𝑖2 𝑛_1 2 (𝐴𝑙は層の画素数などの違いを吸収する係数) 2次元座標を 𝑗の1文字で表す Gatys et al. 2016a ではVGG19が使われています がVGG19でもVGG16結果があまり変わらず,以降 の手法でVGG16が使われているためVGG16で例 を書きました.
  7. 7. コンテンツの損失について conv5_3conv5_2conv5_1 conv4_3conv4_2conv4_1 conv2_2conv2_1 Dense Dense conv1_2conv1_1 pooling conv3_3conv3_2conv3_1 pooling pooling pooling pooling & flatten VGG 16 layers (Simonyan & Zisserman, 2014) Dense コンテンツの損失 ℒcontent = 𝑖,𝑗 conv4_2 𝑥 𝑖,𝑗 − conv4_2 𝑝 𝑖,𝑗 2 画像を分類するように訓練されたVGGでは 左図の下層に行けば行くほど 分類に必要な情報が強調されるようになる そのため下層のみを使うことで 色などのスタイルに依存しない損失を計算できる 論文では特に言及されていないが, 𝑥 と 𝑝 の同じ座標を比較しているので エッジなどの特徴的な部分は 変換後も大きくはずれないはず (convとpoolで小さくなるので多少はずれうる)
  8. 8. 選ぶ層の深さによるコンテンツ表現の違い Gatys et al. 2016aより引用 コンテンツの損失を計算するときに使う 層としてconv4_2が選ばれているが, これは(おそらく)実験的に最もそれらし い画像が得られる層を選んでいるのだと 思う(たぶん). 左の図はコンテンツの損失に使う層に よって結果として得られる図がどのように 変化するか見たもので,conv4_2の方が それっぽくなっていることがわかる.
  9. 9. スタイルの損失について conv5_3conv5_2conv5_1 conv4_3conv4_2conv4_1 conv2_2conv2_1 Dense Dense conv1_2conv1_1 pooling conv3_3conv3_2conv3_1 pooling pooling pooling pooling & flatten VGG 16 layers (Simonyan & Zisserman, 2014) Dense スタイルの損失 𝐺( 𝑥)𝑖1,𝑖2 𝑙 = 𝑘 (conv𝑙 𝑥 𝑖1,𝑘conv𝑙 𝑥 𝑖2,𝑘) ℒstyle = 𝑛=1 5 1 𝐴𝑙 𝑖1,𝑖2 𝐺 𝑥 𝑖1,𝑖2 𝑛_1 − 𝐺 𝑎 𝑖1,𝑖2 𝑛_1 2 行列𝐺 𝑙 の各要素は 同じ層の各チャンネル間の相関を表す コンテンツの損失と違って 各層の出力をGram matrixにしてから 二乗誤差を計算しているので どの場所に何があるかの配置は 損失に関係してこない
  10. 10. 個人的おもしろポイントと問題点 • 個人的おもしろポイント 一般に損失関数と言えば,二乗誤差などの簡単な関数を使うが CNNという非常に複雑な関数を損失関数として使ったのが面白い! 転移学習とも違う学習済みモデルの使い方 (Deep dreamと似たような枠組みだが実用性が高い) • 問題点 生成のために順伝播・逆伝播を繰り返すので とにかく遅い! 1枚の画像を生成するのにハイエンドGPU使っても10秒以上かかるとのこと GTX980TiとTensorflowを使って実験してみたところ 1000イテレーションで数分くらいだった
  11. 11. Gatys et al. 2016a で提案された手法の概要(再掲) コンテンツ画像 𝑝 生成画像を,はじめ一様乱数で初期化し,勾配降下法で スタイルの損失とコンテンツの損失が小さくなるように変化させる スタイルの損失 ℒstyle コンテンツの損失 ℒcontent 生成画像 𝑥 この線形和を最小化するように勾配降下法を行う 𝑥 ← 𝑥 − 𝜆 𝜕ℒtotal 𝜕 𝑥 ℒtotal = 𝛼ℒstyle + 𝛽ℒcontent 𝜆:学習率 スタイル画像 𝑎
  12. 12. 高速化するために… コンテンツ画像 𝑝 生成画像 𝑥 なんらかの 関数 一様乱数 𝑧 入力 一様乱数 𝑧 とコンテンツ画像 𝑝 を入力し 画風変換された画像を出力する変換を 何らかの関数で近似したい! → ここにもCNNを使う!
  13. 13. Ulyanov et al. 2016a で提案された手法の概要 コンテンツ画像 𝑝 スタイル画像 𝑎 ノイズとコンテンツ画像から画像を生成するCNNを学習する 生成画像 𝑥 Generator Network VGG Gatys et al. 2016a では 学習はしていない 一様乱数 𝑧 入力 画像を生成 損失とその勾配 を計算 入力 入力 入力500倍 速い!
  14. 14. Ulyanov et al. 2016a のネットワーク構造 図はUlyanov et al. 2016aより引用 図はtexture generationのタスクの場合. Style transferの場合は𝑧6まであって各𝑧にコンテンツ画像がconcatされる Gatys et al. 2016a では毎回1から生成していたので スタイルの損失とコンテンツの損失の重み付けを画像ごとにできたが, この手法では学習時に設定した重み付けがテスト時にも使われ調節ができない → 入力するノイズのスケールを調節することで調節できることを発見 ResNetっぽいが逆にUpsamplingで大きくなっていく
  15. 15. Ulyanov et al. 2016a における重み付け Ulyanov et al. 2016a より引用 ノイズのスケール𝑘を変化させたときの生成画像の変化 スケールが小さい方がコンテンツ(枝にとまった鳥)が大きく残り, スケールが大きくなるとほぼスタイルだけになっている
  16. 16. Johnson et al. 2016 で提案された手法の概要 図はJohnson et al. 2016より引用 CNNは Downsampling→Residual blocks→Upsampling という構成になっている スタイルとコンテンツの重みの調整はおそらくできない(言及されていない)が Gatys et al. 2016a のおよそ1000倍の速度で画像を生成できる (実装によっては入力画像にノイズを入れて重みの調節をしているものも) この論文のおもしろポイントは 同じネットワークを使って画像の高解像度化ができることを示していること → 大きなCNNを使った損失関数はStyle Transfer以外でも利用できる
  17. 17. Johnson et al. 2016 による高解像度化 Johnson et al. 2016より引用
  18. 18. Dumoulin et al. 2016 のアイディア これまでの手法では1つのスタイルへの変換を1つのCNNで行っている → 複数のスタイルへの変換を1つのCNNで行うことはできないのか? 同じ画家の絵なら同じような筆遣いが見られる → ある程度共有できるはず!
  19. 19. Dumoulin et al. 2016 における発見 we found a very surprising fact about the role of normalization in style transfer networks: to model a style, it is sufficient to specialize scaling and shifting parameters after normalization to each specific style. Dumoulin et al. 2016 より引用 最近のCNNでは一般にBatch Normalizationというテクニックが使われている → 伝播してきたミニバッチの中で各次元の平均を0に分散を1にする Batch Normalizationをかけた後に適当な定数を指定しておいて これをスケールしたりシフトしたりすることがあるが このスケールやシフトのパラメータを学習させてスタイル毎に切り替えるだけで (他の畳み込み層などのパラメータは同じのままで) 複数のスタイルに変換することができるということを発見した この発見に基づき conditional instance normalization を提案した
  20. 20. Conditional instance normalization 学習するスタイル数を𝑁,このバッチで使うスタイルの番号を𝑠とする Conditional instance normalizationでは チャンネル毎に学習対象となる𝑁次元ベクトル 𝛾, 𝛽 を用意しておき 入力を正規化した後 𝛾𝑠 でスケールし 𝛽𝑠 でシフトしたものを出力する 図はDumoulin et al. 2016より引用
  21. 21. 実行例(同じ画家の複数の絵から学習) 10種類のモネの絵のスタイルを学習した結果の一部 一つのネットワークで複数のスタイルを学習することができている Dumoulin et al. 2016 より引用
  22. 22. 実行例(別の画家の複数の絵から学習) 32種類の別々の画家による絵のスタイルを学習した結果の一部 驚くべきことに大きく異なる画風もスケールとシフトの違いだけで学習できている Dumoulin et al. 2016 より引用
  23. 23. 実行例(32種類全部) https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization のコードを用いて生成したもの Githubでコードと学習済みモデルが公開されているので簡単に試せる
  24. 24. Dumoulin et al. 2016 による画風の合成 学習された 𝛾, 𝛽 はスタイルのEmbeddingになっていると考えられ, 凸結合でスタイルを合成することができる 𝛾new = 𝑠=1 𝑁 𝑤𝑠 𝛾𝑠 , 𝛽new = 𝑠=1 𝑁 𝑤𝑠 𝛽𝑠 但し 𝑤𝑠 ≥ 0 かつ 𝑠=1 𝑁 𝑤𝑠 = 1 Dumoulin et al. 2016 より引用
  25. 25. Dumoulin et al. 2016 における新しいスタイルの追加 畳み込み層などの重みは全てのスタイルで共有されているので, 学習済みのネットワークに新しいスタイルを追加する場合には ネットワークの重みは固定したまま,新しい 𝛾, 𝛽 だけを学習することで 少ない更新で学習することができる 5000 step 程度で1から学習させた場合の40000 step に近いlossになっている 図はDumoulin et al. 2016 より引用
  26. 26. Dumoulin et al. 2016 におけるスタイルのパラメータ数 Dumoulin et al. 2016 より引用 • ネットワークのパラメータ数 1674432 ≓ 𝟏. 𝟔𝐌 • チャンネル数の合計 1603 • 1スタイルのパラメータ数 2 × 1603 ≓ 𝟑. 𝟐𝐊 非常に少ないパラメータが 結果に大きな影響を与えている ネットワーク構成が過剰なのか 少ないパラメータで変換できる ようにするのが難しいのか… このスタイル毎のパラメータを 予測するようなNNをつくれたら 何の学習もなく画風変換する ことができるようになる(すごい)
  27. 27. まとめ • Style Transferに関する論文をいくつか紹介した • プレプリントが出た2015年8月から1年ちょいで複数スタイルまで出る • すごい • 時間の関係により紹介できなかったもの • Novak & Nikulin 2016 • 損失関数の工夫などで改善を行っている.職人芸 • Gatys et al. 2016b • 元画像の色を保持したまま画風変換を行う • 色の平均・分散を合わせる方法と輝度値だけ変換する方法 • Ruder et al. 2016 • Style Transferを動画に用いる手法を提案 • Ulyanov et al. 2016b • instance normalizationで明度などの影響を除去 • Chen & Schmidt 2016 • Patch-basedな手法でスタイルとコンテンツの両方を入力とする Feedforward Networkを構築.任意のスタイルを適用できる
  28. 28. Reference I
  29. 29. Reference II
  30. 30. Reference III 絵の引用元 • Vincent van Gogh - The Starry Night https://commons.wikimedia.org/wiki/File:VanGogh-starry_night.jpg • Claude Monet - Rouen Cathedral. Facade (Morning effect) https://commons.wikimedia.org/wiki/File:Claude_Monet_- _Rouen_Cathedral,_Facade_(Morning_effect).JPG • Claude Monet - Poppy Field in Argenteuil https://commons.wikimedia.org/wiki/File%3APoppy_Field_in_Argenteuil%2C_Claude_Monet.jpg • Claude Monet - Plum Trees In Blossom At Vetheuil https://www.wikiart.org/en/claude-monet/plum-trees-in-blossom-at-vetheuil • Claude Monet - Les Nymphéas https://commons.wikimedia.org/wiki/File:Claude_Monet_038.jpg

×