今回は、NNabla のサンプルプログラムPGGANを使って、セレブの顔画像生成をやってみます。
こんにちは cedro です。
実は、私はGAN(Generative Adversarial Networks)が大好きなんです。だって、ランダムノイズから画像を生成するんですよ。凄いと思いませんか。但し、GANは思春期の少女の様に、とても不安定です。
自分でも色々やってみて、つくづく思いましたが、画像が28×28ピクセルの小さいものや、画像バリエーションが似通っているものは、比較的安定的に学習が進みます。しかし、画像が64×64ピクセルくらいに大きくなったり、画像のバリエーションが豊かなものになると途端に不安定になって、学習の途中で砂嵐に戻ってしまうことが多いです。
そうした状況の中で、昨年末にNVIDIAが衝撃的な発表をしたのが、PGGAN(Progressive Growing of Gans )です。なんと、1024×1024の高画質で、しかもバリエーションの豊かな CelebA のデータを使って、顔画像生成するんです。これには、ぶっ飛びました。
最初は どうせ NVIDIA の超高価なGPUじゃないと出来ないだろうと思っていたのですが、最近NNabla のサンプルプログラムにさりげなくあのPGGANが追加されているではありませんか。
ということで、今回は、NNabla のサンプルプログラムPGGANを使って、セレブの顔画像生成をやってみます。
PGGANって何?
これが、PGGANの学習プロセスです。何と、4×4ピクセルの画像から学習を開始します。そして、順次8×8、16×16とレイヤーを追加しながら学習を進めて行くのです。
新たなレイヤーを追加しても、全てのレイヤーで学習は継続します。
最初は、画像の大まかな配置を学習し、徐々に細部を作り込んで行くという合理的なプロセスを取ることによって、安定性、画像の質、多様性の3つを同時に実現しています。
サンプルプログラムを準備します
まず、このリンクから celebA のデータセットを入手します。
赤枠の「Google Drive」をクリックし、Img > img_align_celeba_png.7z にある、16個のファイルを適当なフォルダーに全てダウンロードします。
1つが700MBくらいありますので、結構時間がかかります。
ダウンロードしたファイルを解凍すると、img_align_celeba_png というデータフォルダーが出来ます。NNabla のプログラムでは、これを使います。
なお、この7z という形式を解凍できるアプリをお持ちでない場合は、7zip がお勧めです。
nnabla の Github からプログラムをダウンロードします。nnabla-examples/GANs/pggan に、先ほど入手したデータセットを追加します。
出力サイズはカラー128×128です。本家はカラー1024×1024ですが、その大きさで普通のGPUではいつ終わるかわからないでしょうから、こんなものでしょう。ランダム入力のベクトルは512次元です。
1 2 3 |
> python train.py -c cudnn --img-path img_align_celeba_png |
と入力すれば、プログラムが起動します。
result > example_0 > Image-Tile の中に、学習の進捗状況が画像で記録されて行きます。GTX1060 を使って約40時間で学習が完了しました。お疲れ様でした。
1 2 3 |
> python generate.py --model-load-path model/Gen_phase_128_epoch_4.h5 --monitor-path monitor |
学習が完了したら、上記コマンドを入力し、作成された重みパラメーターを読み込んで、画像生成を行います。重みパラメーターは、model というフォルダーを作って、その中に入れています。
ランダムな画像生成です。生成失敗もありますね。
ランダムなベクトル空間の2点を選んで、間を補完することで、いわゆるモーフィングを行っています。
さあ、学習済みモデルが出来てしまえば、後はこっちのものです。
5/19 のブログ「NNabla DCGAN 顔画像のモーフィングをやってみる」でご紹介した様に、ランダムに生成させた画像の中から、いくつか綺麗なもののベクトルを調べ、その間を線形で補完したベクトルデータを作って、そのデータでそのまま画像を生成させて、GIF動画を作れば、YouTubeで見るような動画が完成します。
いい感じですね。
では、もう一丁!
適当に男性も混ぜた方がよいみたいですね。
では、また。
コメントを残す