5.2 CycleGAN モデル

基本アイデアと応用例

pix2pix モデルでは、1対1のペア画像を準備する必要があり、学習データの作成コストが大きいという課題があった。 論文では「馬をシマウマに変換する」「蜜柑を林檎に変換する」例を挙げて、完全に1対1対応するペア画像を用意するのが難しい点が指摘されている。 CyclicGAN では「変換してから逆変換すると元に戻る」というアイディアを用いてこの課題を解決している。 共通の特徴を持つ画像集合さえ準備できれば、ドメイン間の変換を学習できるようになった。

応用例

猫から犬への変換のように、形状が大きく変化するものはうまく変換できない、という課題が残されている。

モデル構造

ドメインAの画像集合 $X_i$ と、ドメインBの画像集合 $Y_i$ からなるデータセットを入力とする。 それぞれのデータセットは対応している必要がなく、共通の特徴を持つ画像集合であればよい。

CyclicGAN のモデルは、生成器2個、識別器2個から構成される。 識別器 $D_x$ と $D_y$ がそれぞれの画像集合 $X$, $y$ に属する画像を入力し、本物か偽物かを識別する。 生成器は2つのドメイン間の画像変換を行うが、$G$ は $X$ → $Y$ への変換を、$F$ は $Y$ → $X$ への変換を行う。

損失関数と学習の流れ

ドメインAからドメインBへの変換に関する損失関数を考える。 CyclicGAN の識別器 $D_Y$ は、入力された画像が「ドメインBの学習データに含まれる本物のデータ $y$ 」か、 「生成器 $G$ がドメインAの画像$x$を種として生成した偽物画像 $G(x)$ 」かを識別するように学習する。

敵対的損失関数(ドメインA → ドメインB):
$\displaystyle L_{GAN} (G, D_Y, X, Y) = \mathbb{E}_{y \thicksim P_{data}(y)} [ \log D_Y (y)] + \mathbb{E}_{x \thicksim P_{data}(x)} [ \log (1 - D_Y (G(x)))]$

右辺第1項は、識別器 $D_Y$ がドメインBの正解データに対して1に近い値を予測するほど大きくなる。 右辺第2項は、識別器 $D_Y$ がドメインBの偽物画像 $G(x)$ に対して0に近い値を予測するほど大きくなる。

識別器 $D_Y$ は、$L_{GAN}$ が最大化するように、生成器 $G$ は $L_{GAN}$ を最小化するように学習する。

サイクル一貫性損失 Cycle-consistency loss

「サイクル一貫性損失」とは、 2つの生成器 $G$ と $F$ を用いて画像を変換して元に戻した結果($A \rightarrow B \rightarrow $ or $B \rightarrow A \rightarrow B$)画像が、 元と同じ画像になるという制約条件のことである。

サイクル一貫性損失:
$\displaystyle L_{cyc} (G, F) = \mathbb{E}_{x \thicksim P_{data}(x)} [|| F(G(x)) j- x||_1] + \mathbb{E}_{y \thicksim P_{data}(y)} [|| G(F(y)) - y||_1 ]$

CycleFGAN の損失関数:
$\displaystyle L(G,F,D_X, D_Y) = L_{GAN}(G, D_Y, X, Y) + L_{GAN} (F,D_X, Y, X) + \lambda L_{cyc}(G,F)$

論文では実験的に $\lambda = 10$ が選択されている。

同一性損失

画像の全体的な色構造を保持するための損失。 画像に対する不要な変更にペナルティを課す。

ネットワーク構造

CycleGAN の識別器のネットワーク構造は、pix2pix とほぼ同じで、シンプルな畳み込みネットワークである。 2層目以降の畳み込み層ではactivation にLeakyReLU を用いている。 また $70 \times 70$ の PatchGANを採用している。

生成器 $G$ のネットワークは, encoder, transformer, decoder から構成されている。 Johnsonの論文 でスタイル変換と超解像のタスクで高性能を出したのと同じアーキテクチャである。

encoder は3つの畳み込み層で交際され、チャネル数を増やしながら特徴マップのサイズを縮小する。 encoderの出力を、6個の残差ブロック (Residual Block) から構成される transformer に渡す。 decoder によって、画像サイズが拡大され、2つの転置畳み込み層によって表現サイズを拡大し、1つの畳み込み層を通って最終的なRGB画像を生成する。

学習の流れ

モデルを安定して学習させるための2つのテクニックを用いる。

敵対性損失の対数尤度損失を「最小二乗損失」に置き換える。 すなわち、$G$については $(D(G(x))-1)^2$ の期待値が小さくなるように、 $D$ については $(D(y)-1)^2 + (D(G(x)))^2 $ が小さくなるように学習を進める。

学習中の損失がイテレーションごとに大きく変化することを防ぐため、 識別器$D$は生成器$G$の生成画像の履歴を用いて学習する。 最近生成された50枚の画像をバッファに保存する。 学習率は $0.0002$ からスタートし、最初の100 エポックは同じ学習率を維持し、 次の100エポックでは学習率が0になるまで直線的に減少させる。 バッチサイズは1に設定されているため、インスタンス正規化と呼ばれている。

学習のプロセス:

  1. ドメイン$X$ と$Y$から、それぞれ画像$x$と$y$を取得する。
  2. 生成器$G$と$F$により偽物画像を生成する($y'$, $x'$)
  3. 識別器$D_X$に$x$と$x'$, $D_Y$ に$y$と$y'$を入力して識別を実行する。
  4. 識別器$D$の損失を計算する。
  5. $x'$と$y'$を入力として生成器$G$と$F$を再度実行し、サイクル画像$y_{cycle}$ と$x_{cycle}$ を生成する。
  6. $x$と$x_{cycle}$、および$y$と$y_{cycle}$ からサイクル一貫性損失を計算する。
  7. 最後に生成器$G$の損失を計算する。

CycleGAN は、教師無しドメイン変換の中では最高で、 pix2pix など教師あり学習と同等の本物らしい画像を生成できる。

データの準備

Google Colab の環境に、 Drive から大きなファイルをコピーするには gdown コマンドを使う。ダウンロードする対象は url または id で指定する。

$ gdown --help
usage: gdown [-h] [-V] [-O OUTPUT] [-q] [--id] [--proxy PROXY] [--speed SPEED]
             [--no-cookies]
             url_or_id