まだタイトルない

アウトプット用です

【kaggle】NFLのTop solutionsメモ

NFLコンペのソリューションを読みました。ソリューション一覧はココにまとめられています。
上位の傾向として2ステージに分けていて1ステージ目に物体検知を行ってから2ステージ目で画像分類をする流れが多く見られました。impactを選び切るのをどの段階で行うかが別れていました。また、コンペ中そこまで理解できていなかったのですが、正解ラベル1つに付き予測は1つしか正解にならないため学習時には正ラベルの範囲を増やすが、sub時には同一衝突は1レコードになるようなpostprocessingが必要だったみたいです。

せっかく手元にまとめたのでここに供養します。

英語力も物体検知のドメイン知識も不足しているため間違った解釈が多いと思います。原文がありますのでそちらを参考ください。

あと単純にcssがカスタムできず非常に見にくくなっていることはすみません!


1st place solution

  • Public/Private 0.7469/0.7527
  • solution
    • 1st Stage(Helmet detection)
      • YoloV5-l
    • 1.5 Stage?(tracking of helmets)
      • optical flow
    • 2nd Stage(Classification)
      • EfficientNet B0-B3、Resnet18、Resnet34
      • 3d convolutionの代わりにtemporal shift Module
    • post processing
      • false positiveの除去
  • YoloV5-lはimagesの画像約1万枚(フル解像度)で学習
    • EfficientDetよりYoloのほうがうまくいった
  • 検出されたそれぞれのヘルメットとその周辺フレームをつかってoptical flow
    • フレーム間のヘルメットの追跡と画像平面状での平均速度の推定
    • RAFTのほうが少しうまくいったが、submitはOpenCVを使用している
  • 2.5D classificationには16x3x128x128にクロップして使用
    • ヘルメットの中心が画像の中心40pxに来るようにスケーリング
    • 部分的に見えているヘルメットについて、検出されたバウンディング・ボックスの変動にロバストで一貫したスケールがえられる
  • ヘルメットのフレーム間の動きの補正をした
    • 8番目のframeのヘルメットを常に中央にする
    • 前後のフレームをトラッキングで推測されたスピードを用いてシフトさせる
      • 加速、減速があった場合ヘルメットが中心からずれる
  • 分類モデルでは3d convolution のかわりに Temporal Shift Moduleを使用
    • residual blocksのはじめにTSMを加えた小さいモデルがうまく機能した
  • EfficientNet B0-B3、Resnet18、Resnet34のアンサンブルを使用しました
  • train時に周辺3フレームを正ラベルにした
  • 正ラベル比率は5,10%
  • 訓練不足のモデルから検出されたfalsepositiveラベルを追加した
  • fold数4
  • classificationの高速化のために、高速なモデルで分類を実行し95%ほどの負のサンプルをフィルタリングした
  • postprocessing
    • 確信度の高いフレームを選択して、オプティカルフローとトラッキングの情報を使って同じプレーヤーの周囲のフレームの確信度を抑制する

2nd Place Solution: Helmet Detection + 3d Impact Detection + Post Processing

  • Public/Private 0.6832/0.7079
  • Solution
    • 1st Stage(Helmet impact detection)
      • YOLOv5でヘルメットを検出
      • 検出されたboxとgtboxのiouが0.35以上のものをimpact,未満をnon impactにする(nmsを使用)
    • 2nd Stage(Classification impact type)
      • +-4frameの9frame分の画像を使った3D-CNN複数モデルのアンサンブル
      • 6種類のEfficientnet
      • efficientnet-b3 and b5
      • 最初の2d convを3d convに置き換えた
    • post processing
  • 学習にはextra imageも使用
  • Validation strategy
    • GameIDでのGroupKfold(5fold)
    • stage1では1888の衝突のうち1863を検出できた
  • width,heightを2倍にpadした画像を2ndの入力
  • optimized a softmax loss with class weights split 0.8:0.2 (non-impact : impact)
  • 0.99:0.01(非衝突/衝突)になるようにアンダーサンプリング
  • cosine annealing / Adam / 30epochs
  • augmentation
    • HorizontalFlip,CoarseDropout, GridMask, ShiftScaleRotate, RandomBrightnessContrast, Blur.
  • tta
    • horizontal filp tta
  • postprocessing
    • YOLOの出力のconfidence0.4以下は削除
    • 推論の高速化のために最初の25フレームは除去(動画の頭に衝突がないため)
    • 1つの動画のすべてのフレームにIOU閾値0.5のNMSを適用する
      • 後続のフレームで重複するボックスのフィルタリングをし、ステージ②のスコアが高いものだけ保持させる
      • False Positiveがかなり削除されるため効果が大きい
    • TOPkフィルター
      • ステージ2のスコアに基づいて上位19このモデルのみを考慮
    • 0.15以下で残っているものを削除

3rd Place Solution -- Simple 2-Stage Pipeline

  • Public/Private 0.6887/0.6981
  • Solution
    • 動画,画像のみを使用
    • 1st Stage
      • EfficientDet*7でimpact bbox候補を生成して小さな画像にcrop
    • 2nd Stage
      • binary image classfication
      • +-4フレームの計9フレームを使って分類
    • post processing
      • マルチビュー情報を使ってbboxを調整
      • 似たようなbboxを9つのフレームを通してドロップさせる
  • EfficientDet
    • helmetとimpactの2クラス分類(EfficientNet)
    • 閾値を設定してbbox候補を作成
    • 正のフレームと負のフレーム50%,1万枚の静止画像を使用
    • WBFでアンサンブル
    • 2ndstageのためにrecall重視
  • EfficientNet
    • bboxの高さと幅を元の3倍拡大してフレームからcropした画像を入力とする。
    • グレースケールにして(h, w, 9)の形状にする
      • 9は変数パラメータ
    • インパクトbboxとその+1フレームに対応するbboxのみを正の値とみなした
    • これで0.3から0.6くらいになる
  • postprocessing
    • もう一方の視点で一定の期間(例えば前後1フレームの範囲)で検出があるかどうかで閾値を変更させる。
    • 予測は4フレームの範囲でずれてよいが、複数の予測は受け付けない
      • 連続した9フレーム内で類似したbboxを除いて、最大の信頼度を持つ1つのbboxを残す処理
        • iou > 0.25
  • Ensemble
    • 2ndステージは18models

4th place solution

  • Public/Private 0.5813/0.6355
  • Solution
    • 動画と画像を使用
    • 1st Stage
      • helmet detection
    • 2nd Stage
      • 3D-CNNを用いたROI classification
  • Validation strategy
    • GameIDでのGroupKfold(5fold)
  • detectron2 を使用して ResNet-50 FPN バックボーンを使用して Faster-RCNN を訓練
    • ヘルメットのboxが小さいので minimum anchor sizeを32から16に下げた
    • 1class(helmet)検出
  • ヘルメット検知のAP50は93.607
  • ROI分類機にSlowFastライブラリを使用
  • Action detection
    • 3DCNNに全画面を入力し特徴マップを計算
    • RoI Align QiitaでROIの特徴を抽出して分類
    • ResNet50をbackboneにSlowFastを使用
    • backboneからステージ5を削除し3つのupscale deconvolutionを追加することで特徴マップを大きくした
    • 前後2フレームを正ラベルにした
    • augmentation
      • multiscale, random crop, random flip and color augmentation
    • 隣接するフレームから一番確信度の高いboxを選択
  • Action classification
    • 検知されたbox周辺をcrop、20フレームを3D-CNNに入力しimpactかどうか分類
    • SlowFastモデル(backbone ResNet50)
    • imagesize:128*128
    • 入力チャンネルを3→5
      • 関心が向いてるヘルメットの中心のヒートマップ
      • 画像内の全ヘルメットの中心のヒートマップ
    • 前後2枚の計5枚の画像を使用
    • オーバーサンプリングでimpactを10%ほどにした
    • augmentation
      • multiscale, random crop, random flip and color augmentation
    • 隣接するフレームから一番確信度の高いboxを選択
  • TTA
    • horizontal flips

[6th place solution] EfficientDet + resnet18

  • Public/Private 0.5605/0.5910
  • solution
    • 1st stage
      • helmet detection
      • EfficientDet-d5
    • 2nd stage
      • impactとno impact分類
      • resnet18 2Dと3D(3 x 9 x 112 x 112)
  • 1st
    • lossの収束が早いのでaugmentationはhorizontal flipのみ
    • 元画像と反転画像に対して推論し、WBFでマージ
  • 2nd
    • 前後4フレームの計9フレームを入力
    • ヘルメット周辺をcrop→正方形にpadding→112*112にリサイズ
    • 2ndでは数多くのaugmentationを実施
    • TTAにhorizontal flip
  • postprocessing
    • 4フレーム以内で同じ位置にヘルメットがあったときは真ん中のフレームを残す
    • 動画の最初と最後のフレームは衝突が少ないと予想できるため無視

Team tara 13th place solution

  • solution
    • 1st stage
      • impact detection
        • EfficientDet
    • 2nd stage
      • impact classification
      • Resnet3D
  • 1st stageでは視点別でモデルを作成
  • 一定の時間内のiou閾値以上のボックスをグループ化し、グループの中央のボックス以外をフィルタリング
  • 2nd stage
    • 前後4フレームを使用
    • 8個でアンサンブル
    • 水平反転TTAでアンサンブル
    • Endzone,Sideline両方の映像で学習
  • impact数/ビデオが10-20だったため、予測値が15-25の範囲になるような閾値を設定