pix2pix モデル

基本アイディアと応用例

線画をリアルな写真に変換したり、風景写真を昼から夜に変換したりするタスクをドメイン変換という。

pix2pix モデルは Conditional GAN のアイディアを拡張して、ノイズベクトル $z$ の代わりに画像そのものを入力することで、GANの技術でドメイン変換のタスクを実現した。 共通化されたアーキテクチャを用いて複雑なドメイン変換のタスクを学習することに成功している。

変換の応用例

モデル構造

1対1対応する2つのドメインの画像を入力とする。

pix2pix モデルは、生成器 $G$ と識別器 $D$ から構成される。 生成器 $G$ は、ドメインAの画像を入力して、ドメインBの画像を生成するように学習する。 識別器 $D$ は、ドメインAとドメインBの2つの画像を1組の入力として、その画像の組が本物の組み合わせか、生成画像を含む偽物の組み合わせかを識別するように学習する。

pix2pix は Conditional GAN と3点で異なっている。

  1. Conditional GAN では生成器 $G$ の入力をノイズ $z$ (潜在空間のベクトル)としていたが、pix2pix では画像そのものを種として生成器 $G$ が画像を生成する。
  2. Conditional GAN では、生成器 $G$ の生成した偽物画像を識別器 $D$ の入力としていたが、pix2pix では2つのドメインの画像ペアを識別器 $D$ の入力とする。
  3. Conditional GAN において、生成器 $G$ への入力 $z$ は、学習データ以外のペアも確率的に生成できるようにする役割を持っていた。 pix2pix では、ノイズ $z$ を$G$への入力として使うことはない。生成器 $G$ に含まれるドロップアウト層がノイズの役割をい果たしている。

損失関数と学習の流れ

生成器 $G$ は、識別器 $D$ が本物と間違えるような出力を生成するように学習する。 識別器 $D$ は、2つのドメインの画像ペアが本物か偽物か識別するように学習する。

敵対的損失 (Adversarial loss):
$\displaystyle L_{cGAN} (G, D) = \mathbb{E}_{x,y} [ \log D(x,y) ] + \mathbb{E}_{x,z}[ \log (1 - D(x,G(x,z)))] \quad\quad\quad\mbox{(式1)}$
ただし、
$\displaystyle D(x,y) = \begin{cases} 1 \quad\quad\quad if ~~~ \mbox{画像} x \mbox{も画像} y \mbox{も本物} \\ 0 \quad\quad\quad otherwise \end{cases}$

右辺の第1項は、学習データのペア画像($x$, $y$)に対して、識別器 $D$ が正しく本物と識別できるほど大きくなる。 右辺の第2項は、画像$x$と生成画像$G(x,z)$ のペア画像に対して、識別器 $D$ が正しく偽物と識別できるほど大きくなる。

識別器$D$ は$L$を最大化するように、生成器 $G$ は $L$ を最小化するように学習する。

生成器 $G$ が、データセットの画像を無視した極端な画像を生成しないように次の $L_1$ 損失も考える(ただし $L_1$ は $D$の習時には考慮されない)。

$\displaystyle L_1(G) = \mathbb{E}_{x,y,z} [|| y - G(x,z)||_1 ] \quad\quad\quad \mbox{(式2)}$

pix2pix の2つの損失について生成器$G$に対するメリットとデメリット

損失 メリット デメリット
敵対性損失 $L_{cGAN}$ 本物に近いシャープでカラフルな画像 本物を無視した極端な画像
$L_1$ 損失 画像全体としては本物に近い画像 エッジがぼやけた灰色(中間色)の画像

$L_1$ 損失を考慮すると生成器 $G$ がデータセットに近い本物らしい画像を生成するが、全データセットを平均化したぼやけた模様や中間色を生成する傾向がある。 pix2pixの論文では、実験によって $lambda = 100$ を選択している。

PatchGAN

$L_1$ 損失を考慮すると本物に近い生成画像が得られるが、ぼやけてしまう欠点がある。 その欠点を補うために pix2pix では PatchGAN を導入した。 画像を $N\times N$ サイズのパッチに分割して、パッチ単位で識別器 $D$ に判定させる方法である。 これにより生成器 $G$ は、画像全体ではなく、狭い範囲の画像で本物らしい画像を生成できるようになる。

識別器 $D$ は、単純な畳み込みネットワークであるが、最終出力をあるサイズを持った特徴マップにしておき、各ピクセル毎に本物か偽物を判別する。 そうすると、識別器 $D$ は入力画像 $x$ の実効的な受容野 (Receptive Field, RF, パッチ)に対して本物か偽物かを判別することになる。 pix2pix では実験的に $70 \times 70$ のパッチサイズを選択している。 実装では $256 \times 256$ サイズの入力画像に対して最終的な特徴マップを $30 \times 30$ とすることで、パッチサイズを $70 \times 70$ となるようにしている。

ネットワーク構造

識別器 $D$ は、単純な畳み込みニューラルネットワークである。 異なるドメインのペア画像を結合したものを入力し、そのペアが本物かどうかを識別する。 PatchGAN で実効的な受容野が $70 \times 70$ のサイズになるようにネットワークが設計される。

生成器 $G$ のネットワーク構造は、U-Net とよばれる、 入力画像をボトルネック層までダウンサンプリングするエンコーダ部分と、 ボトルネック表現を出力画像サイズまでアップサンプリングするデコーダ部分から構成されている。 エンコーダ部とデコーダ部の間に skip-connection が追加されていて、ピクセルレベルの詳細な情報をボトルネック層を飛び越して伝播できる。 また、層の間には Dropout 層が追加されているのでこれがノイズ要素となり、学習データにないような画像に対しても、リアルな画像が生成できる。

学習の流れ

  1. step 1: 識別器 $D$ の重みパラメータを更新する
  2. 本物の画像ペアと、偽物の画像ペアの両方を入力し、その結果に対する敵対性損失を計算して、誤差伝播により識別器 $D$ の重みを更新する。

  3. step 2: 生成別器 $G$ の重みパラメータを更新する
  4. 識別器 $D$ に偽物の画像ペアを入力したときの識別結果に対する損失と、生成器 $G$ の偽物画像に対する $L_1$ 損失を合計して、誤差逆伝播により生成器 $G$ のおもっみを更新する。このステップでは本物画像は利用しない。

for 反復ステップ do
  ドメインA, B の正解ペア画像を取得する --> (realA, realB)
  realAを生成器Gに入力して偽物画像 G(x,z)を生成する --> fakeB

識別器Dの学習開始 (realA, realB)のペア画像をDに入力して本物か偽物かを識別する -->pred_real (realA, fakeB)のペア画像をDに入力して本物か偽物かを識別する -->pred_fake それぞれのスコアに対して損失を計算する -->LossD_real, LossD_fake 損失の重み付き加算 -->LossD 誤差逆伝播により識別器Dの重みを更新

識別器Gの学習開始 (realA, fakeB) のペア画像をDに入力して本物か偽物か再度識別する -->pred_fake Dのスコアに対して損失を計算する -->LossG_GAN fakeBとrealBのL1損失を計算する -->LossG_L1 損失の重み付き加算 -->LossG 誤差逆伝播により生成器Gの重みを更新する End for

準備

データセットの取得

ペア画像のデータ作成

学習

Tensorboard でのLossの確認

パラメータ設定

学習の開始