今回は前回作成した上白石データセットを用いて、GANで上白石姉妹を生成しました。
とりあえずGAN自体が何をしているのかを説明していこうと思います。
GANの機構
参考にしたサイトは以下。
はじめてのGAN
stanford-cs231n-2018
GANと言われると色んなGANがある(Deep LearningのGANで打線組んでみた【画像生成】)が、今回実装するのはGoodfellowさんが最初に提案したGAN(Goodfellow et al. (2014))である。
個人的に、GANのアイデアは、Generator(生成器)とDiscriminator(弁別器)を用意してそれぞれの精度を上げていくところにあると思う。
紙幣の偽造者と警察の関係によく例えられるらしい。
紙幣の偽造者は偽札を上手く作ろうとしてその能力が上がっていくが、それと同時に警官の方もその偽札を見抜く能力を上げていくので、二人で競わせればその能力は上がっていく。(単調増加ではなさそう)
式は以下のように表せる。
$\underset{G}{\min}\underset{D}{\max}V(D, G) = E_{x{\sim}p_{data}(x)}[\log D(x)] +E_{z{\sim}p_{data}(z)}[\log(1-D(G(z)))]$
$D(x)$はそのデータが訓練データであると判定される確率、$D(G(z))$は生成したものが訓練データであると判定される確率、$1-D(G(z))$は生成したものが訓練データではないと判定される確率である。
最終的には、GeneratorとDiscriminatorがどちらも均衡する50%の精度がでるのが理想である。
データセットの用意
前回スクレイピングで集めて、cv2で顔だけ切りとった画像達を使用した。
スクレイピングの仕方は前回記事を参照してください。
実装してみる
以下を参考に実装しました。
PyTorch-GAN
Colabで動かした結果はこちら
DiscriminatorとGeneratorは単純に多層パーセプトロン。
データのロードの仕方も前回とほとんど変更はない。(__MACOSXファイルを削除しないとエラーが出まくったので気をつけたい)
結果
まじでやばい。頭がおかしくなりそう。色覚が混乱している。
次回はCNNを使ったDCGANを使ってみようと思う。