サイトアイコン NegativeMindException

CGAN (Conditional GAN):条件付き敵対的生成ネットワーク

GAN, DCGANに引き続きGAN手法のお勉強。


GAN (Generative Adversarial Network):敵対的生成ネットワーク アルゴリズムまとめ
これまで勉強したGAN (Generative Adversarial Network):敵対的生成ネットワーク手法のアルゴリズム一覧。


次はCGAN (Conditional GAN)を勉強しよう。
日本語で言うと「条件付き敵対的生成ネットワーク」といったところでしょうか。

CGAN (Conditional GAN)

CGAN (Conditional GAN)は2014年にarXivで公開された論文 Conditional Generative Adversarial Netsで提案された生成手法。arXivで公開されただけで、学会発表はしていないようです。中身も割とあっさりした論文。学会発表されていない論文が後に引用される時代か。

CGANは以下の図のように、Generator, DiscriminatorによるGANの基本構造を踏襲しつつ、条件を与えられるように拡張されている↓

G:Generator
D:Discriminator
z:ノイズベクトル
y:条件ベクトル
x:本物のデータ (学習データ)
G(z):Generatorが生成した偽のデータ



オリジナルのGANCGANの大きな違いは、Generatorの入力にノイズベクトルだけでなく、条件ベクトルも与えている点。それに伴い、Discriminatorも条件ベクトルに相当する条件データを入力できるよう改良されている。

CGANの目的関数

そのため、CGANの目的関数は以下の式のように、GANの目的関数に条件ベクトルyを加えた形になる↓

ノイズだけでなく、条件の情報を入力することで、CGANは特定の条件のデータを生成できるようになっている。ここで「条件」として使用する情報はほとんどの場合クラスラベルや文章などですが、他にもあらゆる情報を想定できるそうです。(Pix2Pixは条件に画像を使ったCGANです)

Generatorの入力

通常のGANGeneratorの入力をn桁のノイズベクトルだとすると、CGANの入力は、n桁のノイズベクトルに条件ベクトル分の桁を結合したベクトルとなる。
つまり、ノイズベクトルの要素が100個、条件ベクトルの要素が10個だとすると、110個の要素を持つベクトルがGeneratorの入力となる。
条件ベクトルはone-hot表現のベクトルとして与える。
例えば0~9までの数字画像を生成する場合、4という数字を表す条件ベクトルは [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]となる。


スポンサーリンク

Discriminatorの入力

通常、GANDiscriminatorの入力はwidth × heightの実データ(画像)または生成データ(画像)だけだが、CGANではデータ生成時の条件も入力する。
しかし、実装上DiscriminatorにはGeneratorのように条件ベクトルをそのまま入力することができないため、条件をwidth × heightのデータ(画像)として入力する。これは、Generatorに入力するone-hot表現の条件ベクトルの各要素をそれぞれ1枚の条件画像に変換するということ。(条件数分チャンネルを持った1枚の画像とも言えますが)
例えば、0~9までの数字を条件とする場合は10枚の条件画像を用意することになる。この場合、4という数字に相当する5枚目の条件画像のピクセル値は全て1で埋める。

CGANの学習

CGANも通常のGANの考え方に則り、GeneratorDiscriminatorを競わせるように学習する。
CGANの学習ステップは通常のGANとほぼ同様なので割愛。

MNISTデータセットを用いた実験

MNISTデータセットを使い、数字のラベルを条件として使用した実験結果↓

Generatorの入力となる条件ベクトルが数字の指定、ノイズベクトルが同じ数字のバリエーションを生成するパラメータとして機能している。

ちなみに、CGANDCGANのようにネットワークを畳み込み層で構成すると、DCGANと同様に高品質な画像を特定の条件で生成できるようになる。これはCDCGAN (Conditional DCGAN)と呼ばれたりもする。ネットでCGANの実装例を探すと、むしろCDCGANの実装例の方が多い気がする。

この他、論文ではFlickrの画像データを用いてタグ情報を条件に使用した実験も行っている。

CGANの実装

これをフォークして自分で実装を試してみてるけど、まだ実装途中です。。。
https://github.com/NegativeMind/Pytorch-conditional-GANs

PyTorchでの実装例はCDCGANのサンプルばかりで、純粋なCGANの良い例が見つけられない。。。

次はいよいよPix2Pix


GAN (Generative Adversarial Network):敵対的生成ネットワーク アルゴリズムまとめ
これまで勉強したGAN (Generative Adversarial Network):敵対的生成ネットワーク手法のアルゴリズム一覧。


Pix2Pix以降はこれに従って順に勉強していこう↓


スポンサーリンク

関連記事

  • 機械学習について最近知った情報
  • ManimML:機械学習の概念を視覚的に説明するためのライブラリ
  • Mask R-CNN:ディープラーニングによる一般物体検出・Instance Segmentatio...
  • Zibra Liquids:Unity向け流体シミュレーションプラグイン
  • OpenCVで顔のランドマークを検出する『Facemark API』
  • MeshroomでPhotogrammetry
  • Faceshiftで表情をキャプチャしてBlender上でMakeHumanのメッシュを動かすデモ
  • Mitsuba 2:オープンソースの物理ベースレンダラ
  • Point Cloud Libraryに動画フォーマットが追加されるらしい
  • 手を動かしながら学ぶデータマイニング
  • TensorFlowでCGを微分できる『TensorFlow Graphics』
  • TeleSculptor:空撮動画からPhotogrammetryするツール
  • Adobe MAX 2015
  • FreeMoCap Project:オープンソースのマーカーレスモーションキャプチャ
  • 顔追跡による擬似3D表示『Dynamic Perspective』
  • OpenCVで顔のモーフィングを実装する
  • fSpy:1枚の写真からカメラパラメーターを割り出すツール
  • Facebookの顔認証技術『DeepFace』
  • OpenCVの三角測量関数『cv::triangulatepoints』
  • Iridescence:プロトタイピング向け軽量3D可視化ライブラリ
  • Cartographer:オープンソースのSLAMライブラリ
  • Photogrammetry (写真測量法)
  • Faster R-CNN:ディープラーニングによる一般物体検出手法
  • PCA (主成分分析)
  • Deep Fluids:流体シミュレーションをディープラーニングで近似する
  • 畳み込みニューラルネットワーク (CNN: Convolutional Neural Network...
  • Rerun:マルチモーダルデータの可視化アプリとSDK
  • OpenGV:画像からカメラの3次元位置・姿勢を推定するライブラリ
  • C#で使える遺伝的アルゴリズムライブラリ『GeneticSharp』
  • 海外ドラマのChromaKey
  • 写真に3Dオブジェクトを違和感無く合成する『3DPhotoMagic』
  • Adobeの手振れ補正機能『ワープスタビライザー』の秘密
  • BGSLibrary:OpenCVベースの背景差分ライブラリ
  • 書籍『仕事ではじめる機械学習』を読みました
  • PeopleSansPeople:機械学習用の人物データをUnityで生成する
  • RefineNet (Multi-Path Refinement Network):ディープラーニン...
  • オンライン英会話ネイティブキャンプを始めてみた
  • Physics Forests:機械学習で流体シミュレーションを近似する
  • OpenMVSのサンプルを動かしてみる
  • openMVGをWindows10 Visual Studio 2015環境でビルドする
  • CGのためのディープラーニング
  • Kornia:微分可能なコンピュータービジョンライブラリ
  • モバイルバージョンを終了