pix2pixについてまとめた
pix2pixについて論文と各サイトを自分用にまとめました。詳しい説明は論文と各サイトを見ることをおすすめします。
論文
https://arxiv.org/pdf/1611.07004v1.pdf
引用・参考サイト
https://qiita.com/miyamotok0105/items/8ed0a8943f5318e826e0
https://qiita.com/mine820/items/36ffc3c0aea0b98027fd
https://www.wantedly.com/companies/xcompass/post_articles/76117
https://www.slideshare.net/motonari728/pix2pix-87334394?next_slideshow=1
https://spjai.com/pix2pix-image-generation/#pix2pix
https://qiita.com/knok/items/4cfa2f9ca06b57cb233b
どんなもの?
pix2pixとは、GANを利用した画像生成アルゴリズムの一種で、2つのペアの画像から画像間の関係を学習することで、1枚の画像からその関係を考慮した補間をしてペアの画像を生成する技術です。
先行研究と比べてどこがすごい?
2つの画像のペアを与えるだけで似たような画像加工を全自動で行ってくれるところである。pix2pixは他のGANとは扱うタスクが異なります。
大体のGANは画像の生成タスクに用いられますが、pix2pixは画像の変換タスクが対象という点で立ち位置が大きく異なります。
pix2pixは変換前画像と変換後画像をペアとしてDiscriminatorに入力し、Discriminatorは本物同士のペアかを判定します(一般的なGANはDiscriminatorが本物かどうかを判定します)。
つまり、学習データに含まれている (変換元画像, 変換先画像) というペアなのか、 (変換元画像, 変換元画像からGeneratorが生成した画像) のペアなのかという判断を下すようになっています。
技術や手法のキモはどこ?
モデルはConditional GANになっていて、入力画像はGとDの両方に与えられます。また、通常Gはノイズをサンプルしますが、このモデルでは直接ノイズをサンプルするのではなく、複数の層に渡ってドロップアウトという形でノイズを入れるようにしています。ドロップアウトは普通学習時だけに入れるものですが、このモデルではテスト時にも入れるようになっています。
つまり一般的なGANとは違い、Generatorにノイズではなく画像を入れる。
学習とテスト時にドロップアウトを入れることでノイズとしています。
また、基本方針はDCGAN ( Conv – BatchNorm - ReLu ) 採用しています。
Generator
生成ネットワーク(Generator)はEncoder-Decoderモデルとなっています。入力画像を低次元ベクトルに埋め込み、期待する出力へと復元する構造です。
エンコーダ・デコーダ間の同じ階層同士を直接繋げるskip connectionを持ったU-Netという構造を用いています。
skip connectionをもたせることによって、中間層同士の特徴を直に伝播させ、細部の復元を忠実に行うことができるようになるようです(共通の特徴量におけるデータ欠損を回避する)。
単純に生成画像だけを用いて真贋判定を行うのではなく、入力画像とペアで判定をさせます。
これによってDiscriminatorは2つの画像間の関係性の特徴を学習することになります。
さらにこの結果はU-Net側の学習にも反映されます。
pix2pixではよりリアルな画像を生成するために、目的関数へのL1正則化項の追加と、PatchGANと呼ばれる仕組みの導入を行っています。L1正則化項は、変換先画像とGeneratorが生成した画像がピクセル単位でどれくらい違っているかということを表しており、これを最小化するということは、ピクセル単位で正解画像に近いような画像を生成するようになるということです。これにより、Discriminatorによって大域的な正しさを判定しつつ、L1正則化でピクセル単位での正しさも勘案する、ということが可能になります。
PatchGANは、Discriminatorに画像を与える際に、画像すべてではなく、16x16や70x70といった小領域(=Patch)を切り出してから与えるようにするという仕組みです。
これにより、ある程度大域的な判定を残しながらも学習パラメータ数を削減することができ、より効率的に学習することができるそうです。
小さい領域で本物/偽物を評価することで狙っていた高周波成分の特徴をとらえているようです。
これはcGANモデルにL1モデルを組み込むことで、大雑把な画像をL1で捉え、cGANがその詳細を捉えるという方法です。L1による画像生成だけでは細部がぼやけ、cGANのみの画像生成だけではDiscriminatorを騙すための違和感が生じてしまうので、これらを組み合わせることで互いの得意な作業を使い分け、精度を向上させます。
論文だと70×70patchが良いとされている。
低周波成分の学習は生成画像と訓練画像とのL1ノルムを求めることにより得ている。論文の中で実験的に確かめられています。
以上のことをまとめると最終的な目的関数は以下のようになります。
どうやって有効だと検証した?
まずはEncoder-decoderとU-Netの比較から。
図よりEncoder-decoderだと写真の基本構造がぼやけてしまっている一方で、U-Netを用いることで写真の基本構造を維持できていることがわかります。やはりEncoder-decoderでは共通の特徴量が欠損しています。
次にL1/cGAN/L1+cGANの比較です。
図からL1だけではかなり画像がぼやけていていることがわかります。
またcGANだけのときも、一見上手く生成できているように思えますが、よく見てみると一部違和感のある部分があります。こうして横並びで比較してみるとL1+cGANが一番上手く生成できていることがよくわかります。
議論はある?
図は地図と航空写真間の生成結果でpix2pixでは地図から航空写真のような一方向ではなく、両方向に生成可能という点で汎用性がかなり高いと考えられます。また、この実験では学習時のPatchサイズと実験時のPatchサイズを変えており、それでも尚このような精度の高い結果が生じています。一方で、このモデルは地図から航空写真のような単純な画像から複雑な画像の生成は得意なのですが、航空写真から地図のような複雑な画像から単純な画像の生成ではL1に劣ることもあります。
次に読むべき論文は?
調べてたらCycleGANとDCGANというものが出てきたので余裕ができたら読みたいと思います。