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



スポンサーリンク

関連記事

UnityのTransformクラスについて調べてみた
OpenCLに対応したオープンソースの物理ベースレンダラ『LuxRender(ルクスレンダー)』
Dlib:C++の機械学習ライブラリ
Google製オープンソース機械学習ライブラリ『TensorFlow』のWindows版が公開された
Konashiを買った
Netron:機械学習モデルを可視化するツール
ZBrushで基本となるブラシ
この本読むよ
世界一下品なクマと世界一紳士なクマ
KelpNet:C#で使える可読性重視のディープラーニングライブラリ
.NETで使えるTensorFlowライクなニューラルネットワークライブラリ『NeuralNetwo...
続・ディープラーニングの資料
映画『ミュータント・タートルズ』を観てきた
単純に遊びに行くのはだめなのか?
Googleが画像解析旅行ガイドアプリのJetpac社を買収
WinSCP
ZBrushでアヴァン・ガメラを作ってみる
PSPNet (Pyramid Scene Parsing Network):ディープラーニングによ...
写真から3Dメッシュの生成・編集ができる無料ツール『Autodesk Memento』
PyMC:Pythonのベイズ統計ライブラリ
チャットツール用bot開発フレームワーク『Hubot』
ラクガキの立体化
書籍『開田裕治 怪獣イラストテクニック』
OpenCV バージョン4がリリースされた!
OpenMesh:オープンソースの3Dメッシュデータライブラリ
ZBrushでゴジラ2001を作ってみる 頭の概形作り
Windows Server 2008にAutodesk Maya 2009をインストール
Siggraph Asia 2009 カンファレンスの詳細
Web経由でRaspberry PiのGPIOを操作したい
ベイズ推定とグラフィカルモデル
OpenCV3.3.0でsfmモジュールのビルドに成功!
C++始めようと思うんだ
ZBrushでアヴァン・ガメラを作ってみる 甲羅の修正・脚の作り込み
Google Colaboratoryで遊ぶ準備
iPadをハンディ3Dスキャナにするガジェット『iSense 3D Scanner』
リメイク版ロボコップスーツのメイキング
フォトンの放射から格納までを可視化した動画
GoogleのDeep Learning論文
Pythonの自然言語処理ライブラリ『NLTK(Natural Language Toolkit)』
adskShaderSDK
Qlone:スマホのカメラで3Dスキャンできるアプリ
ZBrushで仮面ライダー3号を造る ベース編

コメント