PGGAN:段階的に解像度を上げて学習を進めるGAN

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


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


次はPGGAN (Progressive Growing GAN)について。

PGGAN (Progressive Growing GAN)

PGGAN (Progressive Growing GAN)ICLR 2018で発表された研究 Progressive growing of GANs for improved quality, stability, and variationで提案された手法。



NVIDIAが発表した研究で、関連資料が沢山公開されていますね↓
https://github.com/tkarras/progressive_growing_of_gans

スライドだけでなくポスターも公開されてるけど、この研究はポスター発表だったのか?


スポンサーリンク


これまで、GANDCGANで生成できる画像の解像度は64×64程度が限界で、解像度を上げると不安定になって学習が上手く収束しなかった。

Progressive Growing GAN(PGGAN)は、GANで高解像度な画像生成を可能にした手法の1つ。
PGGANでは1024×1024解像度の画像が生成できるようになった↓

言われなければ生成画像とは分からないレベルだ。

PGGANのネットワーク構造

PGGANの大枠のアーキテクチャは通常のGANと同様、本物の画像とGeneratorが生成した偽画像をDiscriminatorが見分けるイタチゴッコを学習する構造だ。



PGGANは畳み込み層、転置畳み込み層を使っているので、DCGANの進化系と捉えた方が分かりやすいでしょうか。
DCGAN (Deep Convolutional GAN):畳み込みニューラルネットワークによる敵対的生成
引き続きGAN(敵対的生成ネットワーク)手法のお勉強。次はGANsの発展形のDCGAN (Deep Convolutional GAN)について。GANの例としてはオリジナルのGANよりもDCGANの方がよく紹介されているイメージ。DCGA...


PGGANDCGANの大きく違う点は、以下の図のように、段階的に学習データの解像度を上げて行き、それに合わせてGeneratorDiscriminatorのネットワークもその対称構造を保ったまま層を追加して解像度を上げて行くこと↓

つまり、PGGANでは低解像度の画像生成から学習を始めて、学習が進むのに合わせてGeneratorDiscriminatorそれぞれに段階的に解像度の高い畳み込み・転置畳み込み層を追加し、生成画像の解像度を上げていく。この方法によって、PGGANは学習を安定させて高解像度な画像を生成することが可能になった。


スポンサーリンク

PGGANの学習過程

PGGANでは、まずGeneratorはノイズベクトルから4×4の画像を生成し、Discriminatorは入力された4×4の画像が生成画像か実画像かを識別する。この学習の流れは通常のGANの学習と同様だ。

その後、Generatorに転置畳み込み層を追加、Discriminatorに畳み込み層を追加する。
Generatorは8×8の画像を生成するように、Discriminatorは8×8の画像が生成画像か実画像かを識別するように学習する。

このように、学習が進むごとに段階的(縦・横2倍)に層の追加と高解像化を行っていき、最終的に1024×1024解像度まで学習を行う。
これにより、学習の初期段階では低解像度な画像で全体的な特徴を捉え、学習の進度に合わせて解像度を上げていくことで徐々に詳細部分を捉えていくことができる。

PGGANに施された工夫

実際に高解像度の画像を生成するには、単純に層を追加して解像度を上げていくだけでは不十分。PGGANでは、特徴マップの正規化方法やミニバッチの与え方、層の追加方法に工夫を施している。

Pixelwise Normalizationによる特徴マップの正規化

PGGANでは、畳み込み処理によって得られる特徴マップをPixelwise Normalizationという手法でピクセルごとに正規化している。Pixelwise Normalizationは以下の式のようになる↓

ax,yは正規化前の特徴マップのピクセル値、bx,yは正規化後の特徴マップのピクセル値、Nは特徴マップの数。
特徴マップをピクセルごとに正規化することで、特徴マップの値が発散するのを防ぐことができる。

Minibatch Standard Deviation

一般的にGANの学習では、GeneratorDiscriminatorを騙せる平均的な画像の生成を習得してしまい、本物そっくりの画像生成を学習しない状態に陥ることがある。これは意図とは違う誤った学習だ。

この誤った学習を防ぐために、PGGANではGeneratorが多様な画像を生成できるように、Discriminator側にミニバッチ内のデータの多様性を知らせるMinibatch Standard Deviationという仕組みを導入している。

Minibatch Standard Deviationは、Discriminatorの中間層で、現在の入力画像の特徴ベクトルと、ミニバッチ内の残りの画像の特徴ベクトルとのノルムを算出し、それを元の特徴ベクトルに連結する。
これによって、Generatorに多様性を反映させるような勾配を伝搬させることができる。

層の追加方法

PGGANの学習では、畳み込み層、転置畳み込み層を追加する際に、単に層を追加するのではなく、以下の図のような処理を行っている。この図は16×16から32×32へ解像度が移り変わる際の例↓

G:Generator
D:Discriminator
toRGB:特徴マップをRGB画像に変換する処理
fromRGB:RGB画像を特徴マップに変換する処理
2×:最近傍補間で解像度を拡大する処理
0.5×:平均値Poolingで解像度を縮小する処理
α:0〜1の範囲で線形増加する重み係数

1つ前の層で生成された特徴マップと、新たに追加された層で生成された特徴マップの解像度を合わせ、2つの特徴マップそれぞれに重みをかけて加算したものを出力特長マップとすることで、安定して画像生成ができるようになる。

PGGANの実装

NVIDIA公式でTensorFlowによる実装が公開されている↓
https://github.com/tkarras/progressive_growing_of_gans

こちらは有志によるPyTorch実装↓
https://github.com/nashory/pggan-pytorch

PGGANぐらいになると、もはやオイラの貧弱なGPU環境では試せないな。。。

PyTorch公式ページGoogle Colab用のコードと学習済みモデルが公開されているようなので、ただ実行するだけならこっちで遊べば良いかな↓
https://pytorch.org/hub/facebookresearch_pytorch-gan-zoo_pgan/

ここまで何となく有名なGAN手法(もはや古典)を原著論文を読みながらおさらいしてきたけど、ここでいったん生成モデルの括りでオートエンコーダーや変分オートエンコーダーについて改めて勉強しようかな。



スポンサーリンク

関連記事

pythonの機械学習ライブラリ『scikit-learn』
ヘッドマウントディスプレイとビジュアリゼーションの未来
ZBrushの作業環境を見直す
Konashiを買った
機械学習のオープンソースソフトウェアフォーラム『mloss(machine learning ope...
hloc:SuperGlueで精度を向上させたSfM実装
参考になりそうなサイト
タマムシっぽい質感
ガメラ生誕50周年
OpenCVで顔のモーフィングを実装する
YOLO (You Only Look Once):ディープラーニングによる一般物体検出手法
ZBrushでアヴァン・ガメラを作ってみる 歯を配置
ZBrushで仮面ライダーBLACK SUNを作る 頭部~バストの概形
PythonのHTML・XMLパーサー『BeautifulSoup』
Kaolin:3Dディープラーニング用のPyTorchライブラリ
Unity ARKitプラグインサンプルのチュートリアルを読む
Structure from Motion (多視点画像からの3次元形状復元)
SculptrisとBlenderで作ったGodzilla 2014 (Fan Made)
SVM (Support Vector Machine)
BlenderProc:Blenderで機械学習用の画像データを生成するPythonツール
SIGGRAPH ASIA 2009で学生ボランティア募集してるみたい
AndroidもopenGLも初心者さ (でもJavaは知ってるよ)
ZBrushのキャンバスにリファレンス画像を配置する
参考書
オープンソースのネットワーク可視化ソフトウェアプラットフォーム『Cytoscape』
映画『ジュラシック・ワールド/炎の王国』のVFXブレイクダウン まとめ
トランスフォーマー/ロストエイジのメイキング
Quartus II
ZBrushで仮面ライダー3号を造る 仮面編 PolyGroupを分割する
Siggraph Asia 2009 カンファレンスの詳細
SONYの自律型エンタテインメントロボット『aibo』
手を動かしながら学ぶデータマイニング
IronPythonを使ってUnity上でPythonのコードを実行する
昔Mayaでモデリングしたモデルをリファインしてみようか
HD画質の無駄遣い
ZBrushでゴジラ2001を作ってみる 姿勢の変更
Phongの表現力パネェ 材質別のPhong Shader用パラメータ一覧
ブログのデザイン変えました
リメイク版ロボコップスーツのメイキング
python-twitterで自分のお気に入りを取得する
UnityでLight Shaftを表現する
動的なメモリの扱い

コメント