Style Transfer いろいろ

Dec 17, 2016   #Python  #TensorFlow 

研究室のゼミでStyle Transferに関して論文紹介を行った際に使用したスライドを
少し修正してslide shareにアップロードしました.

Style transfer from zaburo

TensorFlowの練習も兼ねて実装してみたので
この記事では,実装するときに悩んだところなどついていくつか取り上げたいと思います.

下記の実装を参考にさせていただきました.
https://github.com/cysmith/neural-style-tf
https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization

まずはスライド中でGatys et al. 2016aとして紹介している
もっとも基本的なStyle Transferを実装します.コードはこちら

基本的には論文の式を実装するだけですが
コンテンツの損失の式がピクセル数で割るような形になっていないのに
論文に入力画像のサイズが書いていないので(見逃しているだけ?),
論文のalphaとbetaの比をそのままつかってもうまくいきませんでした.

そこでJohnson et al. 2016に書かれている式を使うことにしました.
具体的にはコンテンツの損失で二乗和をとっているところを二乗平均にしました.
ついでに,スタイルの損失についてもJohnson et al. 2016に従って修正します.
ここはGram matrixをheight * widthで割って二乗平均をとる形にしました.
(Gram matrixをchannel * height * widthで割るのと等価なはずです)

VGGについてはTensorFlow-Slimを使ってサクッと書きました.
基本はslimの下にあるvgg_16から全結合層を除いたものになっています.
endpointはそのままだとkeyがvgg_16/convN/convN_Mのような形になるので,
使いやすいようにkeyを変更して使っています.
slimを使うと数行でVGG16が実装できるので非常に便利でした.

また,損失の定義する方法としては,コンテンツ・スタイル画像をテンソルとして別々に定義し
最適化の際にそれらをVGGに入力した値などを計算させるような方法も考えられますが,
損失を定義する段階でコンテンツ・スタイル画像を入力した場合の計算しておき,
それを定数として扱った方が高速に動作したのでそのように書きました.

次にGatys et al. 2016bで提案された色を保存したままStyle Transferを行う手法の1つである
Luminance-only Transferを実装します.コードはこちら
これは英語版WikipediaのYIQの記事にYIQとRGBの相互変換が載っているので
これを実装すればほとんどおしまいです.

あとは,RGB -> YIQ -> YチャンネルはそのままでIQチャンネルを全て0にしたもの -> RGB
という流れで変換してStyle Transferして結果のIQチャンネルを元のIQチャンネルに戻すだけです.
また,コンテンツのYチャンネルとスタイルのYチャンネルの平均・分散が 同じになるように途中でスタイルのYチャンネルを変換するとより結果がよくなるそうです.

Johnson et al. 2016についてもmagentaのimage_stylizationを参考にして実装してみましたが,
いまひとつ綺麗な画像が生成できていないので要改善という感じです…
コードはこちら

もしかしたらTensorFlowのバージョンによって違うのかもしれませんが,
tf.image.convert_image_dtype(image, dtype=tf.float32)
は使った段階で[0, 1)に値が丸められるので,この後で255で割る必要はないようです.
参考にしたコードでは255で割っていたのでそれを真似していたらハマってしまいました…

あとデバッグの際にはsummaryで値を眺めてみるというのもありですが,
tf.Printで実際の値を見るのも非常に役に立ちました.↓このへんを参考に. http://stackoverflow.com/questions/38810424/how-does-one-debug-nan-values-in-tensorflow/38813502 https://www.tensorflow.org/api_docs/python/control_flow_ops/debugging_operations#Print

とりあえず思いつくことは以上になります.
ついこの間1ネットワークで任意のスタイルに適用できるという凄い論文
(Chen & Schmidt 2016)が出たのでこれについても試してみたいですね.

参考文献
- Gatys et al. 2016a Image Style Transfer Using Convolutional Neural Networks
- Gatys et al. 2016b Preserving Color in Neural Artistic Style Transfer
- Johnson et al. 2016 Perceptual Losses for Real-Time Style Transfer and Super-Resolution
- Chen & Schmidt 2016 Fast Patch-based Style Transfer of Arbitrary Style

このエントリーをはてなブックマークに追加