Kaggle APTOS 2019 Blindness Detection

もう終わってから三週間になりそうですが、いろいろ書き残しておきます。

20th / 2943 teamsでした。ソロ銀狙いで50位前後をふらふらしていたらPrivateでジャンプアップしてびっくりでした。

モデル

  • Model A (public: 0.822, Private: 0.925)
    • EfficientNet-b5
    • 2015のデータ全て(train + test)使ってpretrainしたのち、2019のtrainでfine-tuning。ただしfine-tuning時にbodyの学習率はheadと比べて1/10に設定
    • 320x320, Ben's Crop
    • Flip, ShiftScaleRotate, RandomContrast, RandomBrightness, Cutout
    • regression / MSE loss
  • Model B (public: 0.794, Private: 0.918)
    • EfficientNet-b5
    • 2015のデータ全て(train + test)使ってpretrainしたのち、2019のtrainでfine-tuning
    • 320x320, Ben's Crop
    • Flip, ShiftScaleRotate, RandomContrast, RandomBrightness, Cutout
    • soft label for ordinal regression / BCE loss
  • Model C (Public: 0.817, Private: 0.924)
    • EfficientNet-b5
    • 2015のデータ全て(train + test)使ってpretrainしたのち、2019のtrainでfine-tuning
    • 224x224, blank除去のみ
    • Flip, ShiftScaleRotate, RandomContrast, Cutout
    • regression / MSE loss

学習

  • pretrain時はheadのみ10エポック→body+headを10エポック
  • fine-tuning時はCosineLR(1e-3 ~ 1e-6、Tmax=32)で128エポック
  • optimizerはAdam
  • fine-tuning時に2019のtrainを5foldに分割しcv

推論

  • TTA 5回
  • モデル三種類×5fold×TTA5回で計75predictionを作成したのちweighted average
  • Model Cのみ最初のfoldのseed averageがCVより良かったので、cv averageではなく最初のfoldのseed averageになっている。
  • testはリサイズすればRAMに全部乗ることが分かったので、最初にリサイズすることで画像読み込みの時間を減らしました。結果としてpredictionをたくさん作れるようになりましたが、モデルが少なかったので時間が余ってしまいました。上位のようにもっとがんばって200predictionくらい作るべきでした……。

Model Cだけ過激なことをやっていました。ちなみにModel Bは今年のCVPRに採択された手法を使ってモデル多様性に貢献させようとしたのですが、なくても0.929出てましたね……。

敗因

pseudo labelingしなかった。なぜか禁止されてるものだと思い込んでました……。

余談

僕より強いひとからチームマージのお誘いが来たのがエモかったです。マージ期限過ぎていたのでマージしませんでしたが、今回のコンペで一番うれしかったです。