画像変換系のGANを使用して別の特徴を持つ画像に変換

はじめに

通常のGANは潜在変数から画像を生成するというものですが、 今回は異なった特徴を持つ画像ペア間での変換(Image to image translation)が可能なGANについて見ていきます。 こういったGANの敵対的ネットワークは基本的には入力画像から出力画像へのマッピングを学習することになります。 紹介するのは以下の3つのGANになります。

  • Pix2pix
  • CycleGAN
  • GANSketching

このようなネットワークを使用することで、スケッチのようなエッジマップから写真画像に変換することや、セグメンテーションラベル画像から写真画像への変換、 写真画像から画像のスタイル変換などを行うことが可能になります。

Pix2pix

https://phillipi.github.io/pix2pix/

このPix2pixの元論文におけるネットワークはconditional GANs(条件付きGAN)と呼ばれ入力画像を条件として対応する出力画像を生成します。 画像間の変換においては各出力画素は全ての入力画像から条件付き独立であると考えて出力空間を「unstructured」として扱ってきましたが、 条件付きGANはこのstructured loss(構造化の損失)を学習します。 このアプローチによりあらゆる可能な構造に損失を課すことが可能となり、広範な問題に対して対応できるようになったようです。 学習は入力は通常GANはランダムノイズのみですが、条件付きGANは入力画像とランダムノイズを使用して行われます。

ネットワークの構造については、識別器はPatchGANの分類器を使用し、生成器はU-Netをベースとしています。 PatchGANは生成器のL1損失で画像の低周波成分を捉えることができることから、 画像の高周波成分のみつまり局所的なパッチスケール構造のみにペナルティを与えるものになっています。 N*N個のパッチへの応答を平均化して出力します。

生成器の損失関数は通常のGANのminmaxクロスエントロピー損失とground truthとのL1損失の和を使用します。

Pix2pixによる画像変換コード

https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix のコードを使用すれば可能です。 unet_256を使用するのでopenCVで256x256にリサイズした後にtest.pyを適用すればよいです。 また入力データは/content/dataフォルダに入れています。

    dataroot = f"/content/data"
model = f"{modelname}_pretrained"
        
!python test.py --dataroot $dataroot --model test --name $model --netG unet_256 --norm batch
    

手元で生成した例が以下になります。 day2nightモデルを使用して画像を昼から夜に変換をします。 day2nightの事前学習モデルでは、入力画像によってはうまく生成できないケースが目立ちました。

CycleGAN

https://junyanz.github.io/CycleGAN/

Pix2pixでは学習データにペアとなるデータが必要でしたが、多くのケースではペア学習データを使用するのは難しいです。 CycleGANは画像スタイル変換、オブジェクトの変換、季節の変換、写真の変換などのタスクでペアデータがない場合で変換を学習することができます。 ペアではなく、集合として入力と出力間の関係を学習することになりますが、入力に対して出力の分布は無限に存在するため最適化が進まず敵対的な目的で最適化するのは困難でした。 このような問題に対してアプローチとして入力Xから出力Yと出力Yから入力Xと双方向のマッピングを学習して元のデータに戻す際に生じる損失、サイクル整合性損失(cycle consistency loss)を導入しています。 サイクル整合性損失と敵対的損失を組み合わせて学習を行います。

正式にはF: X → Y、G: Y → Xとすれば、 $\mathbb{E} \left[ \left\| F\left( G\left( x\right) \right) -x\right\| _{1}\right] + \mathbb{E} \left[ \left\| G\left( F\left( y\right) \right) -y\right\| _{1}\right]$ がサイクル整合性損失になります。これと双方向の一般的なクロスエントロピー敵対的損失の和が損失の目的関数となりますが、CycleGANでは学習を安定させるため負の対数尤度ではなく最小二乗損失に置き換えています。 また、振動(model oscillation)を抑える目的で識別器の更新は最新の生成画像を使用するのではなく、過去に生成された画像の履歴を使用して更新を行います。

ネットワークは識別器にはpix2pixと同じくPatchGANsを使用し、 生成器には3つの畳み込み層、残差ブロック(residual blockS)、2つのストライド畳み込み(strided convolution)、1つのRGBmap畳み込みを1ブロックとした複数ブロック構造ネットワークを使用している。

CycleGANによる画像変換コード

pix2pixと同じく https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix のコードを使用すれば可能です。

    dataroot = f"/content/data"
pretrained = f"{modelname}_pretrained"

!python test.py --dataroot $dataroot --name $pretrained --model test --no_dropout
    

手元で生成した例が以下になります。 写真の画像をゴッホ調に変換を行っています。

GANSketching

GANSketchingはstyleGAN2で生成する画像を指定されたスケッチ画像を通じてカスタマイズするモデルになります。 CycleGANとの機能的な違いは、学習において使用するのはStyleGAN2の既成の事前学習モデルと写真をスケッチに変換するPhotoSketchモデルを使用して、 StyleGAN2の事前学習モデルのファインチューニングを行うことです。 この時の学習データは変換先の出力データ(この場合はスケッチ画像)の数が少なくてよいこと(1-数枚で機能し、精度を求めるなら多くても30枚程度)がCycleGANとは違った長所になります。 ただしこのスケッチ画像というのはStyleGAN2事前学習モデルで生成可能な特徴を持つスケッチであることが必要で、 生成する画像はスケッチの特徴を踏襲した元の事前学習モデルの生成画像に類似したものになります。 CycleGANの場合は上で述べたように双方向の学習を行うため入力・出力データともに同程度の数のデータが必要でした。

学習にはstyleGAN2由来の生成器、生成された画像を識別する識別器Dyとその生成画像をPhotoSketchでスケッチに変換した画像と元スケッチを識別する識別器Dxからなります。 目的関数はスケッチ識別器のクロスエントロピー損失と生成画像識別器の損失の重み付き和になります。 Dyは生成した画像がスケッチ画像に一致するように促す目的、Dxは出力画像の品質と多様性を保持する目的で用いられます。 更新するのは元の識別器の重みを使用したDx、DyおよびstyleGAN2生成器のマッピングネットワークのみです。生成器自体は変更せず元の生成分布をスケッチの特徴を持つ分布へ変更するようにしています。 またdata augmentationに関して、Photosketchから生成された30枚のデータを学習にする際は改善せず、数枚の手書きデータを学習に使用する際は必須ということのようです。

GANSketchingによる画像変換コード

https://github.com/peterwang512/GANSketching のコードを使用すれば可能です。 以下で馬と騎手の構図の画像を生成することができます。

    !python generate.py --ckpt weights/photosketch_horse_riders_aug.pth --save_dir output/photosketch_horse_riders

うまくいった画像のみを挙げますが、時々生成に失敗します。 それぞれ別の学習重みを使用しstanding catの画像、teaser catの画像、horse and riderの画像、gabled churchの画像になります。 いずれも姿勢や構図などがスケッチの指定通りになっています。 スケッチスタイルが独特であったり、複雑なポーズのスケッチである場合などは難しいようです。 これはPhotoSketch部分の問題であるようにも感じます。

まとめ

pix2pixからcycleGAN、GANsketchingの流れは学習時におけるデータセットの問題を改善している側面もあるようにも見えます。 個人的には生成画像を制御することができるstyleGANの優秀さが印象に残りました。

Reference

  1. https://phillipi.github.io/pix2pix/
  2. https://junyanz.github.io/CycleGAN/
  3. https://peterwang512.github.io/GANSketching/
Next Post Previous Post
No Comment
Add Comment
comment url