🌱

えっちなサイトを作る(25)

2021/08/19に公開

引き続きえっちなゲームがプレイできちゃうサイトを作ろうと頑張ります。

GANやっていきます😎

モザイク除去から学ぶ最先端のディープラーニング本をやる(11)

https://qiita.com/koshian2/items/aefbe4b26a7a235b5a5e

7章 Generative Adversarial Network

  • GAN
    • 敵対的生成ネットワーク
    • 本物と見分けがつかないような画像生成が可能
      • 良質なデータと膨大な計算資源が必要
    • 2つのネットワークを利用
      • G : Generator : 画像を生成
      • D : Discriminator : 画像の真偽を判定
        • 2項分類
    • \underset{G}{min} \underset{D}{max} L(G,D)
      • min-max問題
      • Dは確率を出力する
        • 派生したGANの出力は確率ではない場合もあるので注意
  • DCGAN
    • 基本的なGAN
    • ノイズを入力し画像を生成する
  • GANの種類
    • Conditional GAN
      • 入力がノイズでないGAN
    • Unconditional GAN
      • 入力がノイズのGAN
      • DCGANはこちら
  • DCGANの簡易実装を見る
    • モデル2個
    • オプティマイザー2個
    • Adversarial Loss
      • GとDの損失関数
        • 古典的には2項分類の交差エントロピー
        • 最近は改良したHinge Lossが使われる
    • Hinge Loss
      • 強化を頭打ちにすることで出力画像の品質を良くする
      • 損失関数を弱くすることがGANの安定化につながる
  • GANの問題
    • 不安定性
      • 勾配消失
      • モード崩壊
    • Unconditional GANでよく発生する
    • Conditional GANだとあまり問題にならない
      • 不安定性への対策を切ってシンプルな構成にできる
  • GANことはじめ
    • まずはNon-GANで訓練する
      • 不安定性と戦う前にNon-GANでの性能を見ておくと基準になる
      • P-Conv
      • 本物っぽさが足りない場合はGAN方式を検討
      • そもそも学習データ不足ではないか?
    • Non-GANで損失関数のチューニングがひどくなりそうならGAN
      • Adversarial Loss + L1 loss 構成
      • ハイパーパラメータのチューニングは不毛…
    • Persection-Distortion tradeoffを考える
      • Perseption軸が大事ならGAN方式を検討
  • GANの安定化対策
    • 画像の綺麗さは入力パラメータΦと出力P(Φ)がなめらかにマッピングされていること
    • リプシッツ連続、リプシッツ定数のコントロール
      • Dのモデルや損失関数にリプシッツ連続を考慮する
      • WGAN,WGAN-GPで考慮された
    • Spectral Normalization
      • BatchNormalizationの改良
        • 微分不可能な部分で連続性を損ねている
      • 係数を最大特異値で割る(リプシッツ連続を保証し定数が1になるようにコントロール)
      • 特異値:numpy.linalg.svd(x)
        • こいつは計算量が多いので、実装時にはPower Iterationで実装する
      • SNGANで考慮された
  • Paired Data
    • Conditional GANで入出力がペアにできるもの
      • 目的にあったデータを使う
    • 生成画質が良い
    • pix2pixが基本
    • pairが作れないケースはUnpaierd Data
      • 男性顔を女性にする、アニメ化する等
      • cycle GANが基本
  • pix2pix
    • PairedDataのConditional GAN
    • 構造はDCGANとほとんど同じ
    • Gの損失関数 : L_G = L_{adv} + λL_1
    • Adversarial LossとL1 LossでPerseption-Distortion Tradeoffのバランスを取っている
  • Cycle GAN
    • UnpairedDataのConditional GAN
    • CNN4つある
      • ドメインが2つあると考える
      • 各ドメインごとにCNNが1つ
      • ドメイン間の相互変換でCNNが2つ
  • pix2pixとCycle GANの比較
    • 同じ問題を適用した場合は、pix2pixの方が性能が良い
    • 32倍のモザイクの回復
      • pix2pixは十分な品質の画像を生成
      • PSNRは低い
        • GANがそれっぽく生成している部分が多いため
      • Cycle GANは形状は今ひとつの品質
        • 学習データの性質に引きずられてしまっていた
  • Patch GAN
    • pix2pixとcycle GANのDの構造
    • 小さいパッチ単位で真偽の確率を求める

演習7-1

  • Spectral Normalizationの実装
    • np.linalg.svdを用いた特異点分解
    • PoserIterationを用いた特異点分解
    • layer関数化(ConvSN2D)
  • Generatorの実装
    • ConvSN2D -> Instance Normalization -> ReLU
  • Discriminatorの実装
    • ConvSN2D -> ReLU
  • pix2pixのネットワーク
    • Spectral Norm追加済みのネットワークを準備
    • PatchGAN構成の確認
    • summary
      • Total params: 9,728,514
      • Trainable params: 9,724,289
      • Non-trainable params: 4,225
  • Hinge Lossの実装
  • pix2pixの損失関数
    • $L_G = L_{adv} + 100 L_1
    • Adversarial Loss をHingeLossとしてGとDに実装
  • データセットの準備
    • kaggleのanimefacedataset
    • 64x64の画像に32倍のモザイクを適用
  • 訓練ループ作成
  • Validation作成
    • Paired DataのためGのPSNRで判定可能
  • 訓練
    • 100Epoch : 67分(TPU)
    • Epoch = 100, g_loss = 16.812715530395508, d_loss = 0.558040976524353, val_psnr = 15.308026313781738
    • 32倍モザイク -> pix2pixでの画像生成

すげー🤯
あとところどころ怖い!

  • 考察
    • 32倍の強烈なモザイクデータから結構よい品質の画像が生成された
    • 若干怖いものもある
      • GANにベクトルを与えてやると良いとかいう記事を見たことがあるので、さらに上の品質を目指せそう
      • 元絵(Dataset)のデッサンが崩れてると良くない、みたいな話も聞いた
    • オッドアイ率が高い。両目を共通化するような表現が無いからか。
      • こういう属性?を付与するのもベクトルでやるのかな?(要調査)

終わりに

参考書はまだ半ばですが、自分の課題も適切に使えばpix2pixで実現可能では?と感じます。
基礎知識が増えてきたので、GAN派生についての良し悪しも今ならある程度判断できるようになってると感じます。
ぼちぼち、最近の動向についても調べたい感じです。
次回はCycle GANの実装演習と8章やります。

Discussion