Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Generative Dog Images

hirune924
August 15, 2019

Generative Dog Images

kaggle Generative Dog Images competition Solutions

hirune924

August 15, 2019
Tweet

Other Decks in Research

Transcript

  1. コンペ概要 • Kaggle初(世界初?)のGANコンペ • 主催:Kaggle • 期間:2019年6月28日~8月14日 • Data:Stanfordの公開している犬画像データセット •

    20579枚の犬の画像+犬種と犬のBounding Boxのannotation • 提出物:GANによって生成された10000枚の64x64の犬画像 • Kernel Onlyコンペ • Submitの計算はすべてKernel上で行わなければならない • Kernel要件 • インターネット接続無し • 9時間以下の実行時間 • 13GBのRAM • 外部データの使用無し https://www.kaggle.com/c/generative-dog-images/overview
  2. MiFID • Inception Score(IS) • ImageNetで学習済みのInception Networkを用いた評価指標 • InceptionNetworkが識別しやすい→質が高い •

    識別されるラベルのバリエーションが多い→多様 • FID • 現在GANの評価指標としてよく使用されているもの • ISでは実画像の分布が考慮されていないという欠点を改善するため、実画像と生成画像の分 布間の距離をFrechet距離によって測る • 小さいほど良い指標 • MiFID • FIDでは学習に使用した画像を暗記して、そのまま提出すると非常に良いスコアが得られて しまうため、実画像との距離平均が一定の閾値を下回る場合にペナルティを設定したもの
  3. コンペ初期 • Imitation Game Kernelの公開 • MiFIDの閾値を決定するための距離を簡単に騙せることが判明 • 画像を0.999:0.001の割合で混ぜ合わせることで簡単に20程度のスコアが出る •

    さすがにこの方法はルール違反であったが、一時の快楽を味わいたい人たちがKernelを Fork&Submitし始める。早くもLB崩壊 • 純粋なGANを極めようとする集団と評価指標をうまくハックしようとする集団が生まれる https://www.kaggle.com/jazivxt/imitation-game
  4. コンペ中期 • Dog Memorizer GAN kernelの公開 • Imitation Gameはさすがにルール違反だったが、モデルに画像を丸暗記させるなら合法で は?という発想

    • GANは程度の違いはあれど学習画像を覚えているケースがあるし合法と違法の線引きが難 しい • 例えばCGANのクラス数を学習画像数と同じにすればそれはGANなのか?という問題 • 画像をクロップすることで評価指標をハック、そしてスコアは一桁台に… • これに対するKaggleの判断 この方法はグレーゾーンであり、現在それは許可されていると思う Kaggleの判断にがっかりする純粋GAN勢 完全に崩壊するLB https://www.kaggle.com/cdeotte/dog-memorizer-gan
  5. 試したGAN一覧 • LSGAN • StyleGAN • Memorizer CGAN (Public LB

    5位) • ACGAN • ACLSGAN • DRAGAN • WGAN-GP • SNGAN • SAGAN • Conditional SAGAN • VQ-VAE-2 • VAEでpretrain→LSGAN • Data Cleaning Methods • 手作業でアノテーション(犬の顔が引きで写っているか寄りで写っているか) • PCA→k-means • Segmentation→PCA→k-means • VGG16→PCA→k-means 色々と試したが、多すぎるので以降では最終サブミットしたGANを中心に解説する
  6. Final Submission - architecture • モデル構造 • Upsampling→Convは上手く機能しなかったためConvTransposeを使用 • Spectral_normはスコアを56→46まで引き上げた

    • 重いGANはkernelの制約下では上手く学習することが出来なかった • nzは128、nfeatsは64がベスト https://www.kaggle.com/hirune924/public-lb-38-92350-solution
  7. Final Submission - how to train • 基本的にはLSGAN • Loss:

    MSELoss • Optimizer: Adam(betas=(0.5, 0.999), weight_decay=1e-5) • Learning Rate • Generator: 0.0008 • Discriminator: 0.0002 • CosineAnnealingで減衰 • DataAugmentation • RandomResizedCrop(scale=(0.7, 1.0), ratio=(1., 1.))→RandomHorizontalFlip→Normalize • Gradient Penaltyは上手くいかなかった(lambdaなどのチューニングが足りなかったかも?) • LearningRateを通常より大きくすることでスコアが46→39まで向上 • 小細工は基本的に通用しない • 計算リソースが許すならハイパーパラメータチューニングはもっとするべきだったかも • Truncation trick(thresh=0.5)を使うとスコアが39→38まで向上 • Final best score: 38.92350 https://www.kaggle.com/hirune924/public-lb-38-92350-solution
  8. 結果と考察 • StyleGAN → kernel9時間で実行するには重すぎた。もっと削れるところはあったかも • ACGAN → 犬種ラベルを使ってもスコアを改善できなかった •

    ACLSGAN → ACGANよりはスコアは良かったが… • DRAGAN → 学習失敗、犬が崩壊する • WGAN-GP → 学習はできたがスコアは少し悪くなった • SNGAN → PFNのChainer実装を試したがKernel上で動かせず…(Chainerのversion違い?) • SAGAN → 悪くはなかったがスコアの改善ならず • Conditional SAGAN → 犬種ラベルを使ってもスコアを改善できなかった • VQ-VAE-2 → 2段階目の学習が重すぎ • VAEでpretrain→LSGAN → pretrain意味なし、破壊的忘却? • Data Cleaning Methods • 手作業でアノテーション(犬の顔が引きで写っているか寄りで写っているか) → スコアの改善ならず。特定の写り方をしている画像だけを用いて学習すると生成画像は 綺麗になるが多様性を下げる結果になる。 • PCA→k-means → クラスタリングはまぁまぁ上手くできた。だが上に同じく… • 犬Segmentation→PCA→k-means → クラスタリングも機能せず • VGG16→PCA→k-means → クラスタリングも機能せず
  9. Happy GAN Solution (score: 38.70295) • モデルアーキテクチャはシンプル • 入力データにわずかなノイズをのせている •

    Learning RateはDG共に0.0005 • Real_labelは0.7 Fale labelは0.0(固定) • Loss: BCELoss, Optimizer: Adam • 750 epochでアーリーストッピング https://www.kaggle.com/leonshangguan/dcgan-data-cleaning-sub-v1?scriptVersionId=18470145
  10. Johannl Solution (score: 38.26191) • StyleGANを使用? • LearningRateはDG共に0.001 • lr_scheduler.ExponentialLR(gamma=0.99)

    • 入力ノイズが512 • ラベルはノイズをのせて変動 • 段階的に解像度を上げていくような実装は見つけられなかった。解像度固定? • 250epoch!? https://www.kaggle.com/johannl/sn-dcgan-style?scriptVersionId=18780768
  11. Theo Viel Solution (score: 30.33340) • Progressive GANをConditionalにしたものを使用 • Real

    imageに変わったnormalizeを使用(2をかけて1を引く?) • bboxを上下左右に10px拡大して使用 • Generatorの学習を安定させるのにEMA Weights Decayを使用? • LossはHingeLossを使用 • Learning Rateはともに6e-3 • Latent dim は256 • Epochは[5, 10, 20, 40, 100]ごとに解像度を上げる、解像度は[4, 8, 16, 32, 64] • それぞれの犬種だけの生成画像を採点し、スコアの悪い犬種は除いて提出物を作ったがスコアは改善され なかった https://www.kaggle.com/theoviel/conditional-progan-30-public?scriptVersionId=18873238
  12. yabae Solution (score: 15.81605) • BigGANベースのモデルを使用 • shared embedding of

    dog breed labels • hierarchical latent noise • projection • auxiliary classifier (ACGAN) • RaLSのLossを使用 • Batchsizeは128 • LearningRateがG: 2e-4, D: 4e-4と他とは違った感じ? • Exponential Moving Average of generator weights(Generatorの学習安定用?) • 入力画像にuniform noiseをのせる • なんか複雑なことをしている割には実装がきれいな気がする https://www.kaggle.com/yukia18/sub-rals-ac-biggan-with-minibatchstddev?scriptVersionId=18828724 https://www.kaggle.com/c/generative-dog-images/discussion/104211
  13. Dmitry Vorobiev Solution (score: 14.95516) • BigGANを使用(https://github.com/ajbrock/BigGAN-PyTorch) • Generatorの2倍のチャンネルを持つDiscriminatorを使用 •

    多様性を維持しながら意味のある部分をできるだけ多く保持したData Augmentation • Bboxを上手く活用し、回転やズームを利用 • Paddingをとても工夫している • 生成した画像にノイズ除去を使用することで場合によってはMiFIDを10以上も改善 • 元のアーキテクチャに大きな変更は加えていないがAttentionの層に微調整を加えて軽量に • Truncation trickでは大きな改善はなかったが少しは良くなる • BigGAN-deepは上手くいかなかった • stochastic weight averaging (SWA)を使用(元のコードについているものを使用) https://www.kaggle.com/dvorobiev/doggies-biggan-sub-data-aug-3
  14. Memorizer CGAN • 一時期Kaggle運営はMemorizer GANを許可していたので、 ある意味Kaggleを信じてMemorizer GANを極めてみた。 • 基本的にはクロップのみでMiFIDの距離を騙すのがポイント(ブレンドはしない) •

    元のMemorizer CGANではスコアが7.2ほど出ていたがクロップの方法が雑かった • 元のクロップ方法ではアス比が0.75以上の画像のクロップ領域が小さくなり、距離が小さくな りがちだった→画像のアス比に応じてクロップの方法を微調整 • ランダムシードサーチによって57という神シード値を見つける(score: 5.17518) • そして一時の快楽に… https://www.kaggle.com/hirune924/public-lb-5-17518-solution-memorizer-cgan https://www.kaggle.com/jesucristo/memorizer-cgan-for-dummies