キカベン
機械学習でより便利な世の中へ
G検定対策
お問い合わせ
   

pix2pixが条件付き敵対的生成ネットワーク(CGAN)で画像翻訳をする仕組み

thumb image

pix2pixとは画像を変換するディープラーニングのモデルです。今回はその仕組みを解説します。

下記のビデオはpix2pixを利用したもので、芸術家であるMemo Aktenによって制作されました。

また、以下はChristopher Hesse(2021年現在OpenAI在籍)によるもので、スケッチからネコ入り画像を作り出すという荒技で話題になりました。

引用元:Image-to-Image Demo

そのほかにも様々な応用例がpix2pixのサイトから伺えます。

ではpix2pixとは一体何を目指して開発されたのでしょうか?

1. 画像から画像への翻訳とは?🔝

CVPR2017で発表された論文のタイトルは「Image-to-Image Translation with Conditional Adversarial Networks」で直訳すると「条件付き敵対的生成ネットワークで画像から画像への翻訳」です。

画像を変換することを「画像から画像への翻訳」(Image-to-Image Translation)と称しています。

画像の翻訳とはどういった意味なのでしょうか?

下図は、論文からの引用で、画像翻訳の例が示されています。

引用元:pix2pix

おのおの左側が入力画像で、右側が出力画像です。

入力画像と出力画像は、画像の内容が同じですが、表現が異なります。

「画像から画像への翻訳」という言い回しには、画像の内容を維持した上で表現を変えるとの意図があります。

日本語から英語への翻訳で例えると、日本語で表現された内容を英語で表現するというのと似ています。

意味を変えない、つまり内容を維持するというのが翻訳の条件ですね。

この翻訳という概念を画像の変換に適応すると画像の内容を維持しつつ表現を変える作業と捉えられます。

つまり、pix2pixはもともとの画像の内容を維持したまま表現が異なる画像へと変換することを目指しています。

画像の内容を変えないという条件をどのようにニューラルネットワークに与えているのでしょうか?

2. 条件付き敵対的生成ネットワーク🔝

論文のタイトルが「条件付き敵対的生成ネットワークで」(with Conditional Adversarial Networks)と言っているることからも、CGAN(Conditional GAN)を使っているのがわかります。

CGANでは、生成ネットワークに条件を与えることで、その条件に沿った映像を生成することができました。

以前の記事で、数字を与えてMNISTのような画像を生成するCGANモデルを作って訓練しました。

生成ネットワークと識別ネットワークに同じ条件を与えるのですが、条件はベクトル形式で1次元の数字の羅列でした。

例えば、数字の1を条件として、MNIST風のモノクロ画像を生成したい場合は、数字の1をone-hotエンコーディングでベクトルしたものを条件として入力します。

pix2pixでは、入力画像が条件となるので画像データをそのまま使います。

例えば、下図では、白黒で描かれた靴の画像を条件として、カラーの靴の画像を出力しています。

引用元:pix2pix
条件画像x
生成ネットワークG
生成画像G(x)
本物画像y
識別ネットワークD

生成ネットワークGは、条件画像xを元に、生成画像G(x)を出力します。

識別ネットワークDはyを本物、G(x)を偽物と判断できるように訓練していきます。

以上の仕組みは、条件が画像であるものの基本的にはこれまでの条件付きGANと同様ですね。

しかし、条件付きGANのやり方のままでは生成された画像が入力画像から大きな異なる可能性があります。

pix2pixでは入力画像の内容を維持するという条件があるので、大きく変わるようでは問題です。

生成ネットワークは入力(条件)画像から得た形の特徴を維持しながら画像を生成しなくてはなりません。

では、pix2pixの生成ネットワークには、どのような構造のネットワークが採用されたのでしょうか?

3. 生成ネットワーク🔝

生成ネットワークは画像の入力画像からの細かい部分を維持して出力画像でも再現できる必要があります。

3.1. U-Net🔝

pix2pixの論文ではU-Netを採用しており、その理由が書かれています。

U-Netは医用画像でのセグメンテーションを行うモデルで入力画像の細部の特徴を出力画像でも利用できます。

引用元:U-Net

U-NetはEncoder-decoder方式の各層にスキップ接続を追加したもので、各層で得た特徴量をエンコーダーからデコーダーへと伝えられるようになっています。

引用元:pix2pix

このようにして入力画像の特徴を維持しながら画像生成するための生成ネットワークが定義されました。

しかし、U-Netだけだと毎回同じ入力映像に対して同じ出力映像が生成されてしまいます。

それまでのGANでは乱数を入力することで出力画像にバリエーションがあるようにしていました。

乱数を使うことで様々な画像を生成できるように訓練することが可能になりますし、様々な入力条件にも対応できるようになるます。

しかし、pix2pixの論文によるとそのような方法ではうまくいかなかったと書いてあります。

ノイズを注入しても無視されるだけだったそうで、いかにU-Netが入力画像の内容を維持する力が強いかがわかります。

3.2. Dropout🔝

pix2pixではノイズの注入というやり方を諦めて、Dropoutを採用しました。

Dropoutは本来は過学習を回避する手法です。

訓練中にランダムに選ばれたニューラルネットワーク上のノードの値を無視します。

このため訓練の過程で毎回ネットワークの構造が入れ替わることになり、複数のネットワークを含んだアンサンブル学習と似たような効果があると言われています。

毎回ネットワークの構造が変わるので出力画像も毎回変化します。

pix2pixではDropoutを出力画像のバリエーションを増やすために使っています。

おそらく過学習を回避する効果もあるとは思いますが、それが主目的ではないので、訓練時だけでなく推論時にもDropoutを使用します。

この方法で出力画像にある程度のバリエーションを与えることができたそうですが、思ったよりも効果は少なく今後の研究課題だと述べられています。

以上で、U-NetとDropoutを組み合わせて出力画像にバリエーションのある生成ネットワークが定義されました。

しかし、このままでは生成ネットワークは正解画像と似た画像を生成できるようにはなりません。

損失関数に工夫を加える必要があります。

3.3. 本物らしさだけでは不十分🔝

従来のGANでは二値交差エントロピー(Binary Cross Entropy)を損失関数として使っていました。

この損失関数を使うと画像の本物らしさを判断できるように識別ネットワークを訓練できます。

ただし、生成画像の形が正解画像と大きく異なっていても識別ネットワークは本物らしいかどうかしか判断しません。

本物らしいかどうかの判断には生成画像が正解画像にどれだけ近いかの判断は含まれていないからです。

また、生成ネットワークがU-Net構造で入力画像の特徴をうまく利用したとしても正解画像とは直接の関係はありません。

よって、生成ネットワークを訓練する際に生成画像と正解画像がどれだけ似ているかという追加条件が必要になります。

そのため、pix2pixの訓練では二値交差エントロピーだけでなく、正解画像と生成画像との間でのL1距離(L1 distance)を損失関数に加えています。

3.4. L1距離🔝

L1距離は、ふたつの画像の各ピクセル値の差の絶対値の平均値で、マンハッタン距離とも呼ばれます。

生成ネットワークを訓練する際の損失関数は以下のようになり、従来の損失関数に加えてL1距離が追加されています。

引用元:pix2pix

λはハイパーパラメーターでL1距離と従来の損失関数の値のバランスを調整するために使います。

λが大きくなりすぎると識別ネットワークからの損失値が無視されてしまいます。

λが0だと従来の損失関数と同じになります。

ちなみに、論文ではL2距離(ユークリッド距離)を使うとぼんやりが増すと書いてあります。

これで準備万端でしょうか?

いや、まだ問題があります。

L1距離を加えたとしても、全体でL1距離が小さくなれば良いので、画像の各所での細かい相違を見逃してしまいます。

よってもうひと工夫が必要でした。

3.5. PatchGAN🔝

画像の各所を縦Nピクセル横Nピクセルの四角のパッチで捉えて識別ネットワークでの評価を行ったものを平均して損失値とすることで各所の特徴を捉えられるようにしたものを論文ではPatchGANと呼んでいます。

実際の実装では、パッチごとに画像を切り分けるような操作はなく、畳み込みとストライドを繰り返すことで縮小された画像の1ピクセルがもともとの画像のNxNのパッチ相当になるようにしているだけです。

識別ネットワークは畳み込み層の連続なのでパッチサイズに合わせて、畳み込み層の数とカーネルサイズとストライドを調節することになります。

例えば、パッチサイズが1×1の場合は、ストライドは1でカーネルサイズも1になり、画像の1ピクセルが識別ネットワークを通した後も同じ1ピクセルに対応していることになります。

また、パッチサイズが1×1の時はPixelGANと読んだり、パッチサイズが画像と同じサイズだったらImageGANと読んだりしています。

これらの特別な名前はそれなりの意味はありますが、ソースコードでみると識別ネットワークは通常のCNNであり、論文を読んでいないとその意図を見逃してしまいます。

さて、論文には生成ネットワークの訓練でL1損失関数だけを使った場合や様々なパッチのサイズの識別ネットワークを試した結果があります。

引用元:pix2pix
識別ネットワーク論文での感想
識別ネットワークなし(L1損失関数だけ)画像が全体的にぼんやりしている
PixelGAN(パッチが1×1)いろんな色が出てきたが形がはっきりしない。
PatchGAN (16×16)形がはっきりしてきたが、縞模様が気になる
PatchGAN (70×70)色も形も割とはっきりしている
ImageGAN (パッチと画像のサイズが同じ)一見70×70のケースと似ているがFCNスコアは悪くなった

注:FCNスコアとは、本物画像と生成画像に同じセグメンテーションモデル(FCN-8)を適用してスコアを計算するもの。生成画像が本物と同じであれば、セグメンテーションの結果も同じになるはずということを利用している。人間の目では定量的に評価するのが難しいためこのような方法をとっている。

こういうハイパーパラメーターは色々実験してみないと効果があるのかどうかわからないので調整が難しいところです。

以上、研究者による試行錯誤と様々な工夫によりpix2pixのような画像から画像への翻訳を行えるネットワークが訓練できるようになりました。

4. 最後に🔝

この論文にCityscapesのセマンティックセグメンテーションのラベルから実写画像へ変換する例があります。

引用元:pix2pix

このような画像翻訳の精度が良くなれば、3Dゲーム環境などから自動運転用の訓練データを自動生成するなどの応用も考えられます。

上記では、既存のデータセットの訓練データをうまく利用しています。

既存のデータセットがない場合は、一つの入力画像に対応する一つの正解画像を準備するのに時間と労力が必要です。

pix2pixの論文を執筆した研究者たちが後にCycleGANを発表し一対一に対応する訓練データを不要とするモデルを開発しました。

その話は今度また。

5. 参照🔝

5.1. Image-to-Image Translation with Conditional Adversarial Networks🔝

Phillip Isola, Jun-Yan Zhu, Tinghui Zhou, Alexei A. Efros

https://arxiv.org/abs/1611.07004

5.2. CycleGAN and pix2pix in PyTorch🔝

Jun-Yan ZhuTaesung Park, Tongzhou Wang

https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

5.3. Image-to-Image Translation with Conditional Adversarial Networks🔝

Papers with Code

https://paperswithcode.com/paper/image-to-image-translation-with-conditional



コメントを残す

メールアドレスは公開されません。