pix2pixとは
pix2pixとは、対応する画像から所望の画像を生成する手法で、Image translationとも言われます。
具体例として、以下のような変換を行うことができます。
・グレースケールからカラー画像への変換
・一部のかけた画像の補完
・レンダリング画像の色付け
この技術があれば、色が褪せてしまったり、破れてしまった大事な写真を、画像データとして復元できるようになるかもしれません。
pix2pixのシステム構造
以下に示すようにcGANというネットワークを用いています。cGANは、GeneratorとDiscriminatorからなり、それぞれ、次のように敵対するように学習します。
Generator:元画像から対応画像を生成するネットワーク。Discriminatorに偽物と見破られないよう学習。
Discriminator:元画像と対応画像のペアを見て、Generatorが生成した偽物かどうかを判定。
Generator部の構造
論文では、エンコーダデコーダ構造とU-Net二つが検討されています。下の図のように、構造は似ていますが、スキップ結合をもつ点が異なります。リンクの記事でも述べましたが、スキップ結合をもつことで、高解像度な画像の生成が期待されます。
結論を言ってしまうと、エンコーダデコーダ構造よりも、U-Netの方が性能は良いです。
なぜ、あえてGANを使用するか
さて、なぜ、あえてGANを使用するか?Generator部だけを学習させても、対応画像は生成できるのではという疑問がわいてきます。
が、その答えは、論文によると、
従来、上記の例のように各タスクに対し、それぞれスキルを持った人が、適切な損失関数を設定する必要があり、不適切な損失関数を設定してしまうと、性能が良くならないといった課題がありました。
例えば、グレー画像の色付けタスクにはL1ノルムは不適だが、初心者が誤って使用してしまう場合が考えられます。
その点、pix2pixのようなGAN構造にすることで、あらゆるimage-to-image translationタスクにも安定して使用することができるというメリットがあるのだそうです。
自動運転データを使って実験してみた
以下のページを参考に、グレースケールの画像のカラー画像変換タスクを実際に試してみました。
GitHub - MuAuan/pix2pix: 有名なpix2pixの検証:GANの一種
Isola, Phillip, et al. "Image-to-image translation with conditional adversarial networks." Proceedings of the IEEE conference on computer vision and pattern recognition. 2017.
実験条件
用意した データセット:Cityspace leftImage画像(通常のカラー画像)をグレースケール化。グレースケール画像から、カラー画像の生成モデルを学習する
データ数:500枚(train, testに分ける)
epoch数:500
Generator部は、エンコーダデコーダ構造とU-Netを比較しました。
条件①(参考にしたGithubのまま)
・Generator部はEncoder-Decoder構造(Skip connectionなし)
・Decoder部はUp sampling使用
・LossをMAE(Mean Absolute Error)を使用
条件②(参考にしたソースを改良)
・Generator部はU-Netを使用(skip connectionあり)
→skip connectionにより、高解像度な情報が伝播されやすくなる
・U-NetのDecoder部はDeconvolutionを使用
→upsamplingよりも高解像度になることが期待される
・LossはMSE(Mean Squared Error)を使用
→MAEに比べ、大きな誤差に敏感になる
実験結果
条件①の結果は以下の図の通りです。5枚ずつ結果例を示しており、上からグレースケール画像、pix2pixで色付けしたカラー画像、教師画像です。
なんとなく色合いの雰囲気はつかめていますが、解像度がかなり低いです。
条件②の結果は以下の通りです。条件①と比べて明らかに解像度が高くなりました。
おそらくU-Netのskip connectionのおかげである可能性が高いです。
にしても、ここまで性能が向上するとは驚きでした。
追加実験(欠けた画像の修復)
pix2pixは同じネットワーク構成で、複数のタスクに使えるということが売りなようなので、先ほどの②と全く同じネットワークで、タスクだけを変更してみました。
もちろん、学習はやり直す必要がありますが、データの入力と出力を変更しただけです。
結果は以下の図の通りで、中段が生成された画像、下段が正解画像です。
欠けた部分と比較してしまうと違いはわかるものの、修復画像だけ見たら、どこが欠けていた部分なのかはわかりづらいレベルにまでは修復ができているように思います。
まとめ
今回は、pix2pixについて解説および実験を行いました。