AdaINを用いた画風変換

Lento
6 min readAug 30, 2018

--

Introduction

一番左がcontent、真ん中がstyle、一番右が画風変換後

今回は画風変換を行います。と言っても、CycleGANやStarGANのような予め決められたドメイン間での変換ではなく、推論の際にスタイルが指定可能な画風変換です。具体的には、左図のように、content(最左)に対してスタイル(真ん中)を与え、最右画像のように画風を変換します。ネットワーク学習の際に含めていなかったスタイルにも変換出来るのが理想です。そこで、今回試したのがAdaptive Instance Normalization(AdaIN)です。

AdaIN

Instance Normalizationを用いた画風変換では、下記画像のようにstyle-dependent parameters vectorから対応する係数とバイアスを設定して画風を変換しますが、対応させたいstyle画像が増える毎にsytle-dependent parameters vectorのサイズが大きくなり、学習が難しくなります。何より、学習に用いていないstyle画像は用いることができません。

Vincent Dumoulin et al.,”A Learned Representation for Artistic Style”

そこで登場したのがAdaptive Instance Normalization(AdaIN)です。AdaINの式は以下のようになります。

ここで、xはcontent、yはstyleを表し、μはチャネル毎の平均、σはチャネル毎の標準偏差を表しています。普通のInstance Normalizationを用いた手法と異なり係数とバイアスにstyle画像の平均と標準偏差を用いているのが特徴です。これによってstyle画像毎に係数とバイアスが定まるので、学習に用いないstyle画像でも画風変換が可能となります。AdaINを用いた画風変換のネットワーク構造は以下のようになります。VGGを用いて特徴抽出し、AdaINを通した後Decoderによって画風変換されたものが生成される仕組みです。

Xun Huang et al.,”Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization”

Dataset

今回は、content用とstyle用にそれぞれ異なるデータセットを用いました。contentにはCOCO、styleにはWikiartを用いました。WikiartはkaggleにDatasetがあったのでそれをそのまま使っています。
content、styleそれぞれ20000枚ずつ用意し、それらに対してうまく512✕512のサイズにした後、ランダムに256✕256をcropしました。

Experiment

ハイパーパラメータ等含めた詳細は以下に記します。

  • 損失関数としては、content lossとstyle lossを考慮。style lossにVGGの各層の出力を利用するが、今回は論文と同様にrelu1_1, relu2_1, relu3_1, relu4_1からの出力とした。またcontent lossの重みは1.0, style lossの重みは10.0とした
  • バッチサイズは3
  • 最適化手法はAdam(α=0.0001, β1=0.9, β2=0.99)

Results

まず、写真からWikiartにあるような絵画の画風変換を載せます。いずれも、学習用データにないものです。下記画像のように若干content寄りではありますが、画風変換出来ていることが分かります。

同様に、イラストから絵画への変換も同じネットワークを用いて行ってみました。変換結果を以下に示します。下記画像のようにイラストにおいても画風変換が出来ています。

Summary

今回はAdaINを用いて画風変換を行いました。写真、イラストから絵画のような絵へと学習に用いてないデータでも変換出来ることが分かりました。と、こう書くとあたかも完璧な手法のように見えるのですが、現実はそうでもないです。実際は、なんとなくこの色にしておけば、この画風にしておけば満足でしょ?といった具合に適当な画風変換も見られました。特にイラストの画風変換は、contentとstyle共に絵であるためか綺麗に変換できたものの方が少なかったです。画風というよりかは色がうまくTransfer出来ていない….

AdaINは学習に用いていないstyle画像でも画風変換できますが、style画像の平均と標準偏差のみ(寧ろこれだけでここまで出来るのか….)を用いているので、論文著者も仰っているようにもっと別の特徴量を用いた方が良い気がします。ですのでそれを探したいですね。こういった特徴量を用いるとより良いorこういった手法があるという方は是非教えていただきたいです。また、ネットワーク構造としても今回はDecoderに簡素なNearest neighbor upsampling -> Convを用いましたが、そうではなくResidual blocksを用いたり、VGGの出力に関してもrelu4_2, relu5_1, relu5_2等を用いるとどうなるか等も試していきたいと思います。

Environment

OS : Ubuntu 16.04 LTS (64-bit)
CPU : Intel(R) Core(TM) i5–4590 CPU @ 3.30 GHZ
GPU : NVIDIA GTX970
メモリ : 8GB

--

--