ころがる狸

ころがる狸のデータ解析ブログ

【Cycle GAN】GANによるスタイル変換の仕組み解説と実験

こんにちは、Dajiroです。今回は、GANを用いて画像のスタイルを変換できる【CycleGAN】の仕組みをご紹介します。スタイル変換とは、元の画像から別のスタイルの画像に変換できることを指します。6つの損失関数が登場するため中々複雑なモデルですが、1つ1つのパーツはシンプルです。忍耐力をもっていきましょう!最後にちょっとした実験結果も紹介します。

具体的な説明の前に、CycleGANでどのような画像が得られるのか先に実例を見ておきましょう。この例ではCycleGANの恩恵がイメージしづらいかもしれませんが、例えばシミュレーションの画像を現実世界の画像風に変換したり、別の芸術家の作風に変換するなど、科学や芸術の広い分野への適用が可能が優れた技術になります。

f:id:Dajiro:20200724195611p:plain
CycleGAnによるリンゴ(実画像)⇒オレンジ風リンゴ⇒リンゴ(再変換)

CycleGANの概要

CycleGANの4つのパーツ

CycleGANもGANの一種なので、やはり生成器と識別器が登場します。しかしここではA領域⇒B領域、それとB領域⇒A領域の変換のために機能を分離させます。つまりA⇒B用の生成器AB, 識別器AB、B⇒A用の生成器BA, 識別器BAの4つのパーツがCycleGANの重要な構成要素となります。以下の図のようなイメージとなります。

f:id:Dajiro:20200712223628p:plain
CycleGANにおける"サイクル"のイメージ図。

識別器に関しては、画像を入力として2値分類をする一般的な畳み込みニューラルネットワークになります。しかし生成器は画像を別のスタイルの画像に変換するネットワークが必要となります。これにはU-Netと呼ばれる画像を画像に変換できるネットワークを活用します。ざっくり説明すると、U-Netでは画像を畳み込んで圧縮し、それを転置畳み込みによって画像に引き戻します。またミクロ・マクロな画像の特徴を活用するため各階層ごとにクロップ(切り取り)⇒連結させています。またインスタンス標準化と呼ばれる手法を用いて精度の向上を行っています。

f:id:Dajiro:20200724201835p:plain
画像を画像に変換するU-Netのイメージ図。元論文から引用。

元論文のリンクはこちら。
https://arxiv.org/pdf/1505.04597.pdf

CycleGANの6つの損失関数

これら4つのパーツを効率的に賢くするために、CycleGANでは以下のような6つの損失関数を用います。A, B領域それぞれに敵対性損失、サイクル一貫性損失、同一性損失が定義されます。それぞれ詳しく見ていきましょう。

f:id:Dajiro:20200712223754p:plain
CycleGANにおける6つの損失関数。
  • 敵対性損失:一般的なGANにおける損失に対応しており、A(B)の画像の真偽を識別器によって判定し計算される損失です。ここで偽のAの画像とは、生成器AB, BAによって得られたA⇒B⇒A'の画像を指します。Bもまた同様です。
  • サイクル一貫性損失:A⇒B⇒A'によって変換された画像はもとの画像と理想的には一致するべきです(A=A')。例えばリンゴをオレンジ風に変換した画像を更にリンゴ風に変換すると、元のリンゴ画像と一致するように訓練をします。損失は画像の1ピクセル毎の比較を行って計算します。
  • 同一性損失:スタイル変換を行う生成器は、入力画像のうち必要箇所のみを変換するように訓練します。逆にいうと変更の必要のない箇所に関しては何もしないことが理想的です。このためには生成器BAにAを入力してA⇒A'、生成器ABにBを入力してB⇒B'と変換し、それぞれ一致するようにピクセル毎の損失を計算します。

さて、具体的な手順を説明するためのパーツが整いました。計算のワークフローを確認しましょう。

  1. 識別器の訓練:真の画像、偽の画像(A⇒B⇒A'、B⇒A⇒B')を識別器AB, BAに入力し識別器を訓練します。ここでは敵対性損失を用います。
  2. 生成器の訓練:生成器AB, BAに画像を入力し、画像に対する同一性損失、サイクル一貫性損失を計算します。さらに出力画像を識別器に入力して得られた敵対性損失も活用し、全ての損失関数をふんだんに使って生成器を訓練します。
  3. 1に戻ります。

CycleGANはややこしく難しいですが、何となく概要が掴めてきたのではないでしょうか?それでは、実験結果を見てみましょう。

実験結果

リンゴをオレンジに、オレンジをリンゴにするCycleGAを実行します。コードとデータは以下の書籍で提供されていたものです。GoogleColabではそのままで動かない部分があっため一部改良しています。様々なGANの詳細が説明されてるため是非ご購入下さい!

学習開始直後は以下のような画像が得られました。赤リンゴはちっともオレンジ風ではないですし、リンゴに再構成しても元の姿には戻っていません。まだまだノイズが多いことが分かります。むしろノイズのせいで(?)青くなっています・・・

f:id:Dajiro:20200724205850p:plain
1-3エポックの生成画像。(左)オリジナル、(中央)変換、(右)再変換

つづいて、学習終盤の結果です。入力画像がそもそも難しい場合もありますが、赤リンゴはオレンジ風へ、そして再変換がほぼ思った通りに出来ていることが分かります。オレンジもまた同様です。画像の変換という難しいタスクを上手く処理できていますね!

f:id:Dajiro:20200724210010p:plain
98, 99, 100エポックの生成画像。(左)オリジナル、(中央)変換、(右)再変換

おわりに

長くなりましたが、なんとかCycleGANの概要をここまで紹介してきました。特にU-Netを使った生成器と損失関数の設計を理解できれば、CycleGANをモノにできると思います。画像の変換と生成ができると、芸術などの感性に訴えかけるAIが作れそうですね。