Generative Dog Images

9151c3c3c82846ace9461b5255a6a34f?s=47 hirune924
August 15, 2019

Generative Dog Images

kaggle Generative Dog Images competition Solutions

9151c3c3c82846ace9461b5255a6a34f?s=128

hirune924

August 15, 2019
Tweet

Transcript

  1. Generative Dog Images Experiment with creating puppy pics @hirune924

  2. コンペ概要 • 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
  3. 評価指標

  4. MiFID • Inception Score(IS) • ImageNetで学習済みのInception Networkを用いた評価指標 • InceptionNetworkが識別しやすい→質が高い •

    識別されるラベルのバリエーションが多い→多様 • FID • 現在GANの評価指標としてよく使用されているもの • ISでは実画像の分布が考慮されていないという欠点を改善するため、実画像と生成画像の分 布間の距離をFrechet距離によって測る • 小さいほど良い指標 • MiFID • FIDでは学習に使用した画像を暗記して、そのまま提出すると非常に良いスコアが得られて しまうため、実画像との距離平均が一定の閾値を下回る場合にペナルティを設定したもの
  5. 評価パイプライン • Public LBでは学習データと公開されたInceptionモ デルによってスコアが計算される • Private LBでは未知のデータと未知のモデルによっ てスコアが計算される https://www.kaggle.com/c/generative-dog-images/overview/evaluation

  6. Solution紹介の前に… コンペ中のドラマを振り返る

  7. コンペ初期 • Imitation Game Kernelの公開 • MiFIDの閾値を決定するための距離を簡単に騙せることが判明 • 画像を0.999:0.001の割合で混ぜ合わせることで簡単に20程度のスコアが出る •

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

    • GANは程度の違いはあれど学習画像を覚えているケースがあるし合法と違法の線引きが難 しい • 例えばCGANのクラス数を学習画像数と同じにすればそれはGANなのか?という問題 • 画像をクロップすることで評価指標をハック、そしてスコアは一桁台に… • これに対するKaggleの判断 この方法はグレーゾーンであり、現在それは許可されていると思う Kaggleの判断にがっかりする純粋GAN勢 完全に崩壊するLB https://www.kaggle.com/cdeotte/dog-memorizer-gan
  9. コンペ後期 締め切りを5日延ばして14日にするわ、あとMemorizer GANは禁止な 提出物は全部コードチェックするからサブミットはKaggle運営とshare すること Kaggleの判断に大歓喜する純粋GAN勢 手のひら返しをくらったMemorizer GANを極めた勢 • コンペ終了(9日)まで一週間を切ったころ、それまで沈黙していたKaggle運営が動き出す

    • なお禁止の基準を明確に定義すると必ずハックする人が現れるからか、禁止の基準についての 質問に対しては悉く沈黙
  10. Solution

  11. 試した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を中心に解説する
  12. 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
  13. 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
  14. Final Submission - result • DOGS https://www.kaggle.com/hirune924/public-lb-38-92350-solution

  15. 上手くいかなかった手法たち

  16. 結果と考察 • 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 → クラスタリングも機能せず
  17. 上位Solutionは公開され次第 随時更新予定

  18. 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
  19. Happy GAN Solution (score: 38.70295) • DOGS https://www.kaggle.com/leonshangguan/dcgan-data-cleaning-sub-v1?scriptVersionId=18470145

  20. 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
  21. Johannl Solution (score: 38.26191) • DOGS https://www.kaggle.com/johannl/sn-dcgan-style?scriptVersionId=18780768

  22. 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
  23. • DOGS Theo Viel Solution (score: 30.33340) https://www.kaggle.com/theoviel/conditional-progan-30-public?scriptVersionId=18873238

  24. 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
  25. • DOGS https://www.kaggle.com/yukia18/sub-rals-ac-biggan-with-minibatchstddev?scriptVersionId=18828724 yabae Solution (score: 15.81605)

  26. 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
  27. • DOGS Dmitry Vorobiev Solution (score: 14.95516) https://www.kaggle.com/dvorobiev/doggies-biggan-sub-data-aug-3

  28. おまけ Solution(Memorizer CGAN)

  29. 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