ころがる狸

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

【Conditional GAN】仕組み解説と画像生成の結果

こんにちは、Dajiroです。今回の記事では【ConditionalGAN】(条件付きGAN, CGAN)についてご紹介します。GANという機械学習技術を用いることで乱数から画像を自動生成できますが、CGANを用いるとどのような画像を生成するか条件付きで指定することができるようになります。例えば『1』と指定すると1の画像を自動生成するといった具合です。本記事では仕組みの概要とCGANの実験結果を見ていきましょう。

GANに関する過去記事はこちらになります。
【GAN + PyTorch】仕組みの解説とMNISTで画像生成 - ころがる狸
【DCGAN vs GAN】MNISTの生成画像比較と実装のコツ - ころがる狸

本記事の目次です。

CGANの解説

CGANの骨格部分の設計は非常にシンプルです。以下の2つのステップを繰り返すことにより、本物らしい条件付きの画像を生成できます。

  1. 画像とラベルを入力として画像の真偽を判定する識別器の学習
  2. 指定した条件通りの画像を生成する生成器の学習

以下では、識別器、生成器がそれぞれどのように画像とラベルの組を処理しているのか具体的な内容をイラスト付きで解説します。説明が簡単な生成器の方から見ていきましょう。

生成器

生成器では、ラベルと乱数を入力として画像を生成します。そのために、多層パーセプトロンを用いてラベルを表す1次元配列が乱数のベクトルと同じ次元を持つように埋め込みを行います。その後、埋め込みベクトルと乱数ベクトルの要素ごとの積を取ることで1つの1次元配列を生成します。この配列に対して転置畳み込みニューラルネットワークによる処理を施すことで、画像へと変換します。なお、転置畳み込みとは1次元配列を拡張し段階的に画像を生成する技術を指します。以下記事で簡単な説明が記載しています。
【DCGAN vs GAN】MNISTの生成画像比較と実装のコツ - ころがる狸

ここで生成された画像とそのラベルは識別器に入力され、識別器が正しくラベルを予測し、画像が真であると判定するように生成器の学習が行われます。つまり画像が偽であると見抜かれた場合、損失関数が大きくなり生成器にはペナルティが課せられます。

f:id:Dajiro:20200712210039p:plain
CGANの生成器。ラベルと乱数ベクトルから画像を生成。

識別器

識別器では、本物または偽物の画像とラベルを入力して計算します。ラベルを入力した全結合層を導入し、画像と同様の2次元配列(チャネル含めると3次元配列)に変形します。その変形後の配列と入力画像をチャネル方向に結合し、新しい3次元配列を生成します。例えば、元の画像サイズが28×28×1ならば結合後は28×28×2になります。その後は一般的な畳み込みニューラルネットワークによる処理を施し、入力画像が真か、偽かの判定を行います。

ここで1つの疑問が湧くかもしれません。単に画像の真偽判定をするだけならラベル情報はいらないんじゃね?と。確かにその通りです。CGANでは上記のような画像の真偽判定に加えて、入力した画像がラベルとマッチしているかの判定も同時に行うように学習させます。そのため、生成器が識別器を騙すには単に本物らしい画像を生成するだけではなく、指定したラベルに適した画像を生成しなければいけなくなります。これにより条件付きの画像生成が初めて可能となります。よく考えられていますねぇ。

f:id:Dajiro:20200724172206p:plain
CGANの識別器。画像の真偽判定とラベル予測を行う。

もう一度学習の手順を確認しましょう。

  1. 真の画像と偽の画像を使って識別器を訓練
  2. 識別器のパラメータは固定し、生成器が作った画像を識別させる。その判定結果を用いて生成器のみ学習を行う。
  3. 1に戻る。

これを繰り返すことでラベルで指定した通りの画像を生み出す生成器が完成します。

CGANによる画像生成

それでは実際に画像を生成してみます。以下のレポジトリにあるコードを参考にしました。CGAN含め、こちらの日本語書籍に詳しく記載されています。是非購入して読んでみて下さい!
gans-in-action/Chapter_8_CGAN.ipynb at master · GANs-in-Action/gans-in-action · GitHub

おなじみのMNISTでの実験結果がこちらです。数字の0から9までを生成していますが、1000, 2000エポックの学習序盤では全く形を成していないことが分かります。まるでバグったゲーム画面のようです。

f:id:Dajiro:20200724181236p:plain
1000, 2000エポックでの数字0-9の生成結果。

続いて、12000エポックの学習終了段階での生成画像です。こちらは完全な数字の体をなしていますね。素晴らしい。

f:id:Dajiro:20200724181655p:plain
12000エポックでの数字の生成例。

最後に、それぞれの数字を5個ずつ生成してみましょう。色々な1が、色々な9が生成されており狙い通りです。しかし9などは形が瓦解しており、イマイチな結果であることが分かります。しかし概ね理想的な結果と言えるのではないでしょうか!?

f:id:Dajiro:20200724182017p:plain
DCGANによる各数字の生成。

おわりに

CGANは構造はシンプルですが、条件付き画像を生成できる非常に強力な武器です。応用先としては、学習用データをCGANによって拡張し、高精度な画像分類モデルを生成するなどが考えられます。学習データの各クラスの数が不均衡なとき、CGANで水増しする・・・。是非使いこなしたいものです。