SinGANという論文を軽く読んだのでメモ。
この記事は自分用にまとめたもので間違っている可能性があります。
もし間違い等あればご指摘して頂けると助かります。
どんなもの?
1枚の学習画像の内部統計をキャプチャする無条件の(つまり、ノイズから生成する)生成モデル。
つまりSinGANは画像「1枚だけ」から、それと似たような画像を生成出来る。
推論時に任意の解像度に変更可能で, 下層の入力画像をいじることで, ペイントから画像への変換、画像の編集、画像の調和、超解像度およびアニメーションを、アーキテクチャの変更やさらなるチューニングなしで実行するために使用できる。
先行研究と比べてどこがすごい?
1枚の自然画像に対してGANベースのモデルを提案したものはあるが、画像を画像にマッピングする(ある画像を入れると必ず決まった画像が出力される)ので、ランダムサンプルの生成には向いていない。
というか1枚の画像で生成するGANは今までテクスチャを生成するものがほとんどだった(らしい)。
その証拠に従来の1枚の画像で生成できるGANを使うとFigure 3のようになる。
非テクスチャ画像だと意味のあるサンプルを生成していない。一方SinGANはPSGAN、Deep Texture Synthesisよりうまく描画できている。SinGANではテクスチャ画像に限定されずに一般的な自然画像(非テクスチャ画像)でも1枚の画像から生成が可能になった(Figure 1)。
技術や手法のキモはどこ?
軽量なFCN (Fully Convolutional Network)のGANを何層かに積み重ねたようなGANピラミッドによって構成され、それぞれが異なるスケールでパッチの分布をキャプチャする。学習が完了すると、SinGANはさまざまな高品質の画像サンプル(任意のサイズ)を生成できる。
以下のFigure 4はSinGANの全体図である。各スケールに対してPatchGANを行うイメージ。
ピラミッド形式のGANで学習と推論の両方が「荒い→精巧」のような流れで行われる。
各スケールで Generator は、すべてのオーバーラップパッチを Discriminator がダウンサンプリングされた学習画像 のパッチと騙されるような画像サンプルを生成するように学習する。
大雑把な流れは以下の図のようになる。
パッチサイズとは?
patchGANというGANで用いられたものです。パッチサイズごとにDiscriminatorがRealかFakeを判定している。
https://blog.shikoan.com/pytorch_pix2pix_colorization/より
https://blog.paperspace.com/unpaired-image-to-image-translation-with-cyclegan/より
(追記:なおSinGANでは識別器だけでなく生成器にもpatchGANを適用してあるとのことです。言葉足らずで申し訳ございませんでした。 参考https://github.com/Yagami360/MachineLearning-Papers_Survey/issues/40)
Generator
画像サンプルの生成は、最も粗いスケール N (Figure 4の1番下側)から開始し、すべてのジェネレーターに最も細かいスケール 0 (Figure 4の1番上側)まで順次渡していく。
以下の図は Generator の様子。
Generatorは5つの畳み込みブロック(「Conv3x3」-「BatchNorm」-「LeakyReLU)」)を持つFCN (Fully Convolutional Network)である(つまり畳み込み層のみのネットワーク)。
ブロックごとに、最も粗いスケールで32個のカーネル(畳み込みフィルターのこと)から開始し、4スケールごとに2倍のカーネル数にする。
は と同じアーキテクチャで、パッチサイズは11×11。
なおノイズマップの次元を変更することにより、テスト時に任意のサイズとアスペクト比の画像を生成できる。
Discriminator
各Discriminator はマルコフ識別器(PatchGAN)であり、 の各N×NパッチがRealかFakeか(つまり、 のパッチijがRealかFakeか)を判別する。
学習
GANを粗いスケールから細かいスケールまで順番に学習される。
各GANが学習されると、固定される。
Loss
n番目のGANのトレーニング損失は敵対項と再構成項で構成。
敵対損失 は、 のパッチの分布と生成されたサンプルのパッチの分布の間の距離に対してペナルティを科す。
論文では敵対的損失に対してWGAN-GP損失(最終的な識別損失=パッチ識別マップの平均)を用いているよう。
再構成損失 は、 特定のノイズマップセットからを生成できることを保証するために
を設定する。なお は固定されたノイズマップ(学習中にサンプリングされたノイズで学習中は固定されたまま)。
以上を踏まえて再構成損失 を以下のように定義する。
は からの再構成画像で、各スケールでのノイズ の標準偏差 の決定に使用されるらしい。
は に比例し、そのスケールで追加する必要がある詳細の量を示すらしい。
どうやって有効だと検証した?
以下はランダム画像サンプル生成結果。
1つの画像でSinGANをトレーニングした後、モデルは新しい構造とオブジェクト構成を表すリアルなランダム画像サンプルを生成できる。
また学習画像のパッチ分布は保持される。
以下は高解像度の生成結果。
以下はさまざまなスケールからの生成(推論時)。
より細かいスケールnから生成するために、ダウンサンプリングされた元の画像 をそのスケールへの入力とする。
これにより、生成された構造のスケールを制御することができる。
例えば、Zebraの形状とポーズを保持し から生成を開始することでストライプテクスチャのみを変更できる。
以下は異なる数のスケールでの学習の効果。
SinGANのスケールの数は、結果に大きく影響する。
スケールの数が少ないモデルは、テクスチャのみをキャプチャする。
スケールの数が増えると、SinGANは画像内物体のより大きな構造をキャプチャすることができるということを示している。
以下は超解像の結果。
以下はペイント→写真変換の結果。
以下は画像編集の結果。
以下は画像調和の結果。
議論はある?
色々なものに応用できる点が本当にすごいしクオリティも高い。
Twitterでは「SinGANがbest paperかぁ...」みたいな微妙な反応がちらほらあったのが気になりました。
次に読むべき論文は?
InGAN : http://openaccess.thecvf.com/content_ICCV_2019/html/Shocher_InGAN_Capturing_and_Retargeting_the_DNA_of_a_Natural_Image_ICCV_2019_paper.html
参考
http://peluigi.hatenablog.com/entry/2019/10/29/190927
https://github.com/Yagami360/MachineLearning-Papers_Survey/issues/40
著者実装(Pytorch)
https://github.com/tamarott/SinGAN