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

CycleGANとは?ディープラーニングで馬をシマウマに変換する仕組みの解説

thumb image

CycleGANは馬の画像からシマウマの画像へ変換したり、その逆方向(シマウマから馬)の変換をするデモで有名です。今回はこのCycleGANの仕組みを解説します。

しかし、pix2pixでも似たようなことが可能でした。CycleGANでは何が異なるのでしょうか?

実は、CycleGANはpix2pixでの幾つかの不都合を解決しており、それらの問題点を知ることでCycleGANの仕組みが理解しやすくなります。

1. pix2pixの不都合な真実🔝

1.1. 訓練用のペア画像が必要🔝

pix2pixでは「画像から画像への翻訳」と称して、画像の内容を違うスタイルに変換することが可能です。例えば、スケッチ画像から写真のような画像を生成できます。

しかし、pix2pixは教師あり学習を使うので、訓練用に2つの画像をペアにしたものをたくさん用意する必要がありました。

引用元:CycleGAN

画像変換用のデータセットで入力画像と正解画像が1対1になっているものがそんなにたくさん存在するわけでもありません。未知の画像変換を実現したくとも、訓練そのものよりもデータを集めることの方が大変になります。

教師あり学習では共通の悩みどころではありますが、pix2pixに存在する不都合の一つ目です。

1.2. 一方向の画像生成🔝

pix2pixでは生成ネットワークを一つだけ訓練します。

たとえば、白黒のスケッチからカラーの画像を生成するネットワークを訓練したとします。

カラー画像から白黒のスケッチへの逆変換をするためには、新たにpix2pixの訓練をする必要があります。

同じデータセットを使って2度訓練を繰り返すことになります。両方向の画像変換のために2つの生成ネットワークを同時に訓練したほうが効率的です。

まとめると、pix2pixでは教師ありデータを集めるのが大変なのと、両方向の生成ネットワークを作る際に倍の時間がかかるといった不都合があります。

その一方で、CycleGANは教師なし学習で2つの生成ネットワークを同時に訓練できる仕組みになっています。

2. CycleGANの仕組み🔝

2.1. 画像集合レベルでの対応🔝

画像は2つのデータセットを用意しますが、その中身に1対1のペアが存在する必要はありません。

例えば、写真画像のデータセットを$X$とし、画家によるペインティングの画像のデータセットを$Y$とします。繰り返しますが、$X$と$Y$が対応するペア画像を持つ必要はありません。

引用元:CycleGAN

それぞれのデータセットの画像で独特の質感やスタイルがあります。$X$からの写真画像が持つスタイルと$Y$からの画家の画像の持つスタイルは異なるものを準備します。

$X$の画像から$Y$の画像のスタイルをもった画像を生成するネットワークを$G$とします。

例えばデータセット$X$からの山の写真$x$が生成ネットワーク$G$によって変換されると、生成画像$G(x)$は画家が描いた山の絵のようになります。

引用元:CycleGAN

ここで識別ネットワーク$D_Y$が生成画像$G(x)$が本物のペイントかどうかを判断します。この識別ネットワーク$D_Y$は通常のGANでも使われる敵対的損失(Adversarial Loss)と同じです。

この敵対的損失関数を$L_{GAN}(G, D_Y, X, Y)$と呼びます。

ただし、$G(x)$ に対応する正解画像がないのでこのままだと$G(x)$が元の画像$x$の内容(形など)を維持する保証はありません。何らかの追加条件が必要となります。この点については後ほど解説します。

2.2. 逆方向の生成ネットワーク🔝

逆方向の生成ネットワーク$F$ではデータセット$Y$の画像からデータセット$X$の画像のスタイルや質感をもった画像を生成します。識別ネットワーク$D_X$が生成画像$F(y)$がデータセット$X$から来たものかどうかを判断します。

引用元:CycleGAN

これも通常のGANのように識別ネットワーク$D_X$による敵対的損失を使います。

この敵対的損失関数を$L_{GAN}(F, D_X, Y, X)$と呼びます。

しかし、これだけでは、$F(y)$が元画像$y$の内容を維持する保証がありません。

また、訓練も両方向で別々に繰り返すのでは不都合の解決になりません。

そのためCycleGANの一番重要な仕組みである次の条件をつけます。

2.3. サイクル一貫性🔝

生成ネットワーク$G$と$F$を教師データなし訓練するためにはどのような条件が必要でしょうか?

$G$も$F$も元の画像の内容を維持できるように学習しなければなりません。

仮に、$G$と$F$が元の画像の内容を保持することができたとすると、生成された画像$G(x)$を$F$で変換した画像$F(G(x))$ は元の画像$x$に近いものになるはずです。

$F(G(x)) \approx x$

つまり必要な条件は、「データセット$X$からの画像$x$を$G$で変換した$G(x)$をさらに$F$で変換したら元の画像$x$に近いものになるべき」ということになります。これなら教師データは必要ありません。

引用元:CycleGAN

上図では$\hat{Y} =G(x)$となっていますが、なるべく記号を増やさないで説明したいので、$G(x)$のままで生成画像の意味で解説します。

この$G(x)$に対して識別ネットワーク$D_Y$が本物らしさの評価をするので$G(x)$はまるでデータセット$Y$から来たような画像が生成されるようになります。

さらに$G(x)$を生成ネットワーク$F$で変換した$F(G(x))$が元画像$x$と似た画像になるように条件となるための損失関数を追加します。

引用元:CycleGAN

論文では、その損失関数をcycle consistency lossと呼んでおり、日本語に直訳するならば「循環一貫性損失」とか「サイクル一貫性損失」になります。

このサイクル一貫性がCycleGANの名前の由来になります。

循環した生成画像$F(G(x))$が元画像$x$と似ているかの判断はL1損失($||F(G(x))-x||_1$)の平均値を使います。

pix2pixではL1損失を生成画像と正解画像の間で使われていましたたが、CycleGANでは循環した生成画像$F(G(x))$と元画像$x$との間で使うので正解データが必要ありません。

2.4. 逆方向🔝

データセット$Y$からデータセット$X$への画像変換におけるサイクル一貫性も同様に成立するようにします。

$G(F(y)) \approx y$

必要な条件は、データセット$Y$からの画像$y$を$F$で変換した$F(y)$をさらに$G$で変換したら元の画像$y$に近いものになるべきということで、こちらも教師データは必要ありません。

引用元:CycleGAN

この方向でのサイクル一貫性が条件となり損失関数に追加されます。これもL1損失($||G(F(y))-y||_1$)の平均です。

引用元:CycleGAN

両方向のサイクル一貫性(L1損失の平均)の和を$L_{cycle}(G, F)$と呼びます。

このようにして、CycleGANでは入力画像と正解画像が1対1のペアになっているデータセットを用意する必要がないだけでなく両方向の生成ネットワークを同時に学習させることができます。

以下は論文からの例で、馬の画像がシマウマに変換されたものをさらに馬の画像に変換したものを比べて見ることができます。

引用元:CycleGAN

ここまでをまとめると、敵対的損失に条件としてのサイクル一貫性損失を付け加えてトレーニングすることでCycleGANは教師なしで両方向の生成ネットワークを学習させることができます。

$L(G, F, D_X, D_Y) = L_{GAN}(G, D_Y, X, Y) + L_{GAN}(F, D_X, Y, X) + \lambda L_{cycle}(G, F)$

$\lambda$で敵対的損失とサイクル一貫性損失のバランスを取っています。

通常のGANのように生成ネットワーク($G$と$F$)が損失関数$L$を最小にしようと努め、識別ネットワーク($D_X$と$D_Y$)が$L$を最大にするように訓練が行われます。

以上で、両方向からの画像変換が教師なし学習で可能になりました。

引用元:CycleGAN

これでめでたしメデタシと言いたいところですが、もうひと工夫必要なケースがありました。

2.5. 自己同一性🔝

画家モネ(Monet)の絵とFlickrの写真との間でCycleGANを訓練すると、昼と夜が入れ替わったような画像変換が生じました。

下図でInputとCycleGANの列を比較してください。時間帯が変わったかのように色が変化しています。

引用元:CycleGAN

昼と夜が入れ替わっても識別ネットワークからすれば本物らしさは変わらないし、サイクル一貫性のL1損失も色の認識をしているわけではなく平均的な誤差しか見ていないのでこのようなことが起こり得るとのことでした。

そこで、論文では自己同一性損失(identity mapping loss)を追加して改善したと書かれています。

上図でCycleGAN+$L_{identity}$の列を見るとその効果が一目瞭然です。

この損失関数では生成ネットワークにターゲットのスタイルを持った画像を与えたときに画像のスタイルを変更しないように学習するためのものです。

例えば、生成ネットワークGにターゲットのデータセットYからの画像yを与えた時は、画像をなるべく変更せずに出力するように訓練します。

$G(y) \approx y$

逆方向の生成ネットワークにも同様の条件を与えます。

$F(x) \approx x$

この損失関数でもL1関数が使われています。

論文ではあまり詳しい説明がなく、CycleGANのGithub issueでその理由について質問があり、論文の筆者からの回答を読むことができます。要約すると、自己同一性損失によって、生成ネットワークが入力画像に未知の要素がある場合などに大きな変更をしないようになるとのことでした。

よって、自己同一性損失によって夜から昼にスタイルを変えるようなことがなくなります。この辺りはあまり深く分析されていないので、更なる研究が必要でもありそうです。

3. 失敗例🔝

以上、CycleGANの仕組みの説明が終わりました。

論文の最後にたくさんのCycleGANの例があるので興味のある方は参照することを勧めます。

引用元:CycleGAN

モネやゴッフォやスザンヌと並んで浮世絵のスタイルも使われているのが興味深いですね。

また、失敗例もあり、ちょっと微笑ましくなりました。

引用元:CycleGAN

SF映画ならあり得そうですが…😁

4. 参照🔝

4.1. Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks🔝

Jun-Yan ZhuTaesung ParkPhillip IsolaAlexei A. Efros

UC Berkeley

https://junyanz.github.io/CycleGAN/



コメントを残す

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