Introduction
Generative Adversarial Networks(GAN)による二次元美少女画像生成はmakegirlsmoeやCrypko始めオリジナル画像と遜色なく綺麗に行われています。今回はこちらの論文を元に、クオリティの高い二次元美少女画像生成を目指します。試行を様々に行ったのですが、論文のように再現できなかったので、これからの方向性を最後に述べます。
Network Architecture
今回の実験では、上記で述べた論文を参考にしています。従って、ネットワーク構造としても論文と同じようにSRResNet(下画像)を用いています。フィルターの数や層数も全く同じにしています。
ネットワーク構造の特徴としては以下が挙げられます。
- Generatorに超解像で用いられるSRResNetを導入、Residual BlocksとPixel Shufflerによる生成
- DiscriminatorにもResidual Blocksを導入
- Conditional GANを仮定。そのため、ACGANを導入しDiscrminatorではReal/Fakeの判別だけでなくどのドメインに属するかの判別を行い、Generatorでは入力にドメインをconcat。今回ドメインは論文と同じ34次元とした。
Dataset
Getchuからスクレイピングした画像に対して、opencv + lbpcascade_animeface.xmlで顔を切り出しました。この時、デフォルトでは顔いっぱいに切り出そうとするため、少し余裕を持たせました。具体的には以下に示すように顔全体が入るように切り出しました。サイズは128×128、画像枚数は25000枚です。
また、画像のドメイン推定にはillustration2vecのpre-trainedモデルを使いました(上記リポジトリにある手順では、現在のchainerのversionには対応していないので書き換える必要があります)。具体的には34次元のベクトルを用意し、以下の34個の特徴のうちconfidential 0.25以上のものはその要素を1としました。
['blonde hair','brown hair','black hair','blue hair','pink hair','purple hair','green hair','red hair','silver hair','white hair','orange hair','aqua hair','gray hair',long hair','short hair','twintails','drill hair','ponytail','blush','smile','open mouth','hat','ribbon','glasses','blue eyes','red eyes','brown eyes','green eyes','purple eyes','yellow eyes','pink eyes','aqua eyes','black eyes','gray eyes']
Experiment
上記で用意したデータセットに対して、学習を行いました。DRAGANベースです。ハイパーパラメータや詳細についても記しておきます。
- 損失関数は、Adversarial lossとAdversarial domain lossとGradient penalty。重みはそれぞれ34.0、1.0、0.5。
- 最適化手法はAdam。α=0.0002、β1=0.5、β2=0.99。
- バッチサイズは64
- ネットワーク重みはガウス分布(平均0、標準偏差0.02)で初期化。
- Discriminatorに入力する際にはInstance noise(平均0、標準偏差0.1のガウス分布)を付与。
- 勾配の更新は同時ではなく、Discriminator→Generatorの順で交互に更新。
- 学習を安定させるための工夫としてSpectral Normalization(SN)をDiscriminatorの層に導入することを考えましたが、こちらの記事でも述べているようにSNを用いると経験上生成画像の質が落ちます(ここではは単に見た目の綺麗さとしています)。従って、今回の実験ではSNは用いていません。
- Relativistic Discriminatorを導入することも考えましたが、こちらも経験上生成画像の質が落ちるので使用していません。
Results
生成結果を以下に示します。画像に示しているように、きちんと生成できていません。これはGeneratorとDiscriminatorのlossが、あるepochで莫大に大きくなるためです。そこでDiscriminatorがReal/Fakeを完璧に判別出来るようになったためと考え、Discriminatorのフィルターの数を全部の層において半分にしてDiscriminatorの表現力を抑えようとしました(例えば最初のconv層のフィルターの数は16)。
Discriminatorのフィルターの数を半分にした後の生成結果を以下に示します。この時にlossが莫大に大きくなる、ということは無かったです。生成自体は出来ているものの、論文の生成結果のように綺麗には出来ていないです(造形崩れが散見されます)…クリティカルな原因は定かではないのですが、課題と次の方向性は次節にて示します。
また、特別な意図はないのですが最近Adamのβ1を0.0、β2を0.9にしている実装を見かけるので、そのようにした場合の生成結果を示します。こちらも生成自体は出来ているものの、彩色に関して色褪せており不十分です。従って、β1はExperimentsで設定しているような0.5が良いと思われます。
Future
- Checkerboard Artifacts
Checkerboard Artifactsとは、下記画像に見える市松模様のような模様です。こちらの論文や記事によれば、これはDeconvolutionによるDeconvolution Overlapによって生じるものですが、Subpixel Conv(Pixel Shuffler)でも生じると述べています。論文の方では新たな重みの初期化を提案していますが、記事の方ではNearest Neighbor Upsampling -> Conv層(以後NN Resize)によってCheckerboard Artifactsが生じないことを示しています。次回からはこのNN Resizeを用いていきます。また、それに合わせてNetwork Architectureをこちらの論文のApprendix Cで述べられているようにResidual Blocksを主体とした構造にしていきます。ただ、Subpixel Convを用いた場合と比べて計算資源が必要となります。
- Zero-Centered Gradient Penalty
こちらの論文によれば、学習の安定性を与えるものとしてZero-centered gradient penalty(ゼロ中心勾配)が挙げられていました。特にZero-centered gradient penaltyの係数を特定の値にしたCritical Regularizerでは論文中の図のように一般的な最適化問題に落とし込めることが出来ています(下記画像における(h))。こちらを考慮しようと思います。ただ、予めの実験ではlossの爆上がりが生じてしまったりWGAN-GPとの違いが見えなかったりと有用性が見えていない状態です….
Summary
今回はGAN(SRResNet)を用いて二次元美少女画像を生成することを目指しましたが、論文中に示されているようなクオリティの高いものには届いていない状態でした。Futureで述べたことを次に行います。
GoogleからThe GAN Landscapeというタイトルで結局どのGANが良いのか?という論文が出ました。これは、FIDとMS-SSIMをMetricsとして損失関数、ネットワーク構造、制約項、正規化によるGANの違いを調べたものです。この論文によればGradient penaltyとSpectral Normalizationが有効とのことでした。
しかし個人的にこの論文で注目している点は第4節のCommon Pitfallsです。この節では、GANの評価手法、ネットワーク構造の詳細、データセット、実装する際の忖度(特に実装コードが公開されていない場合)でGANは問題を抱えていると述べています。私も特にデータセットは気を使うべきだと考えていて、論文ではCIFAR-10やLSUNでうまくいっていても今回の実験のような独自のデータセットで綺麗に生成されないなんてザラです。独自のデータセットを作る際のTipsがあると嬉しいですね….
また、上記論文ではGradient penaltyとSpectral Normalizationが有効だと述べていますが、最近ではRelativistic discriminatorやInstance noise、Zero-centered gradient penaltyが出てきました。どれも論文上では有効性が示されています。これらの手法は組み合わせが可能です、従って単独で用いた方が良いのか、組み合わせて用いた方が良いのか等「結局何が良いのか」は精査する必要があると思います。その精査から得た知見を次に生かせたら良いのですが….
最後になりますが、Futureの部分で述べたCheckerboard Artifactsやその他テクニックについて@Aixileさんにご教授頂きました、有難うございます。
Environment
OS : Ubuntu 16.04 LTS (64-bit)
CPU : Intel(R) Core(TM) i5–4590 CPU @ 3.30 GHZ
GPU : NVIDIA GTX970
メモリ : 8GB