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

20250307_kaggle_CZIIコンペ振り返り_関西Kaggler会_交流会_in_O...

suguuuuuすぐー
March 06, 2025
160

 20250307_kaggle_CZIIコンペ振り返り_関西Kaggler会_交流会_in_Osaka_2025#1

下記イベントで登壇した内容です。
やむを得ず、発表用からおぱんちゅうさぎの画像を抜いています。
https://kansaikaggler.connpass.com/event/336893/

suguuuuuすぐー

March 06, 2025
Tweet

Transcript

  1. 2025/03/07 関西kaggler会 2 自己紹介:すぐー / 小林 秀(こばやし すぐる) ◆ AI/組み込みソフトウェアエンジニア

    @エンタメ事業に力入れてる家電メーカー ➢ 1眼カメラ向けのAI開発や、AIを使った応用技術の開発 ◆ Kaggle Master ➢ https://www.kaggle.com/sugupoko ➢ 金3枚 (入賞2回) ⚫ コンペ始めて3年半、最近金取れるようになって来た ◆ 専門は画像だけど、興味のあるコンペはなんでも出ちゃう ➢ LLMコンペ、とかとか。 ◆ 参加スタンス:社内結成チーム、おしゃべり好きなので。 普段のアイコンは コレ⇒
  2. 2025/03/07 関西kaggler会 3 題材とするコンペティション ◆ CZII - CryoET Object Identification

    ◆ 開催期間:2024/12 -2024/2 ◆ トモグラフィー画像における微小生物学的構造を検出するタスク 検出 ~頑張って金を狙っていたが全く届かなかったため、コンペ内容と反省内容を共有~
  3. 2025/03/07 関西kaggler会 4 タスクについて ◆ データ ➢ 学習データ:7件(+合成データ27件も必要に応じて利用可能) ⚫ 加えて、ノイズ除去されていない近いデータも配布。

    ➢ 非公開の評価データ:485件 ⚫ 評価はノイズ除去されたデータのみ配布 ◆ 検出対象 ➢ 5種類のたんぱく質が評価対象 ⚫ Virus-like Particles ⚫ Thyroglobulin ⚫ Beta-galactosidase ⚫ Apo-ferritin ⚫ ribosome トモグラフィ 対象となるたんぱく質 ポイント①: 学習可能な配布データが非常に少ない。複数のたんぱく質を個別に検出する必要あり!
  4. 2025/03/07 関西kaggler会 5 評価指標は? • 指標について – 概要:各たんぱく質の重みづけ平均 – 計算式

    • Fβ-score (β=4) – 重み • 簡単:1 • 難しい:2 • 不可能:0 Apo-ferritin (easy, weight1) Beta-galactosidase (hard, weight2) ポイント②:何故この評価指標なのか? 配布データに、ラベルの見逃し(FN)が多く、誤ラベル(FP)は無いためRecallを重視
  5. 2025/03/07 関西kaggler会 6 基本的なアプローチは?(ベースライン解説) ◆ 概要:トモグラフィーを分割して学習 & 認識 ➢ 3軸でスライディングウィンドウ

    ➢ 後処理を行い提出情報の形式へ ◆ 学習方法:各たんぱく質の座標系を「ヒートマップ」 or 「セグメンテーション」として予測 ➢ 2.5Dや3DのUnetを利用して学習 Sliding window 貼り付け 後処理 座標情報 XYZ 2.5D or 3D
  6. 2025/03/07 関西kaggler会 7 金圏ソリューションサマリ ※文字小さいですが、これからフォーカスして説明していきます。 Rank Link Architecture (3D/2.5D/2D) task

    Loss Train/Inference Resolution Pretraining With simulated Extra Data (e.g., WBP) 学習安定性 EMA/SWA Ensemble / TTA 1st Seg: kaggle.com Det:Kaggle 3D MONAIs FlexibleUnet 3D Yolo Seg & det Seg : weighted CrossEntropy(pos256 : neg 1) Det :PP-Yolo loss function with a few modifications inference is lager no no no merge of different types with scaling of conf 2nd Kaggle 3D Various Encoder seg 1. Dice Loss ,Tversky Loss and Cross- Entropy Loss 2. Tversky Loss and Cross-Entropy Loss inference is lager no no no 10 models 7TTA 3rd kaggle.com 3D Unet Resnet101 seg Cross Entropy loss Train : 64, 128, 128 Inference : 64, 256, 256 no yes EMA 4 model (7fold中の) flip x, y, z rot90 for x, y 4th Kaggle 2.5D Enc - 3D dec heatmap Weighted MSE Train 32×128×128 Inference 32×128×128 no no EMA/SWA 7models(4+3) TTA : yes 5th kaggle.com 3D DeepFinder like seg Label smoothing cross-entropy Train :(128, 128, 128) Inference no no no 4seed TTA :flip 3、rot 3 6th カグル 2.5 model & 3D model Various encoder seg FocalTversky++ Train : 64×128×128 Inference: 64×128×128 Yes Created by myself using Polnet. no no 10 models 7th kaggle.com 3DUnet resnet50d, resnet50d, efficientnetv2-m heatmap weighted BCE (heavy pos weight) Train : not mentioned Inference:192, 128, 128 Yes yes ModelEMA 0.995 3model, model soup Average at logits 4x Flip TTA 8th Kaggle 3D Unet seg DiceCELoss Train :(128, 128, 128) Inference:(160, 384, 384) Yes Only 6 tomography Yes (Used or not used) EMA used (decay 0.99) (Used or not used) 4model, model soup Average at logits 9th kaggle.com 2D to 3D Unet ConvNeXt-like seg BCE Train (32, 256, 256) inference (32, 320, 320) no no no Many models TTA Rot90, 180, 270 10th Kaggle 3D Unet monai seg Tversky loss and multiclass crossentropy Train : not mentioned Inference : not mentioned Yes (include implementation bug) no no 9model ensemble Average at logits 11th Kaggle 3D Unet Resnet arch seg Loss: weighted combination of cross- entropy and Tversky loss (alpha=0.5, beta=8). Train : 128x256x256? Inference : 128x256x256 no no no 32models Seed ensemble Average at logits NoTTA
  7. 2025/03/07 関西kaggler会 8 Rank Link Architecture (3D/2.5D/2D) task Loss Train/Inference

    Resolution Pretraining With simulated Extra Data (e.g., WBP) 学習安定性 EMA/SWA Ensemble / TTA 1st Seg: kaggle.com Det:Kaggle 3D MONAIs FlexibleUnet 3D Yolo Seg & det Seg : weighted CrossEntropy(pos256 : neg 1) Det :PP-Yolo loss function with a few modifications inference is lager no no no merge of different types with scaling of conf 2nd Kaggle 3D Various Encoder seg 1. Dice Loss ,Tversky Loss and Cross- Entropy Loss 2. Tversky Loss and Cross-Entropy Loss inference is lager no no no 10 models 7TTA 3rd kaggle.com 3D Unet Resnet101 seg Cross Entropy loss Train : 64, 128, 128 Inference : 64, 256, 256 no yes EMA 4 model (7fold中の) flip x, y, z rot90 for x, y 4th Kaggle 2.5D Enc - 3D dec heatmap Weighted MSE Train 32×128×128 Inference 32×128×128 no no EMA/SWA 7models(4+3) TTA : yes 5th kaggle.com 3D DeepFinder like seg Label smoothing cross-entropy Train :(128, 128, 128) Inference no no no 4seed TTA :flip 3、rot 3 6th カグル 2.5 model & 3D model Various encoder seg FocalTversky++ Train : 64×128×128 Inference: 64×128×128 Yes Created by myself using Polnet. no no 10 models 7th kaggle.com 3DUnet resnet50d, resnet50d, efficientnetv2-m heatmap weighted BCE (heavy pos weight) Train : not mentioned Inference:192, 128, 128 Yes yes ModelEMA 0.995 3model, model soup Average at logits 4x Flip TTA 8th Kaggle 3D Unet seg DiceCELoss Train :(128, 128, 128) Inference:(160, 384, 384) Yes Only 6 tomography Yes (Used or not used) EMA used (decay 0.99) (Used or not used) 4model, model soup Average at logits 9th kaggle.com 2D to 3D Unet ConvNeXt-like seg BCE Train (32, 256, 256) inference (32, 320, 320) no no no Many models TTA Rot90, 180, 270 10th Kaggle 3D Unet monai seg Tversky loss and multiclass crossentropy Train : not mentioned Inference : not mentioned Yes (include implementation bug) no no 9model ensemble Average at logits 11th Kaggle 3D Unet Resnet arch seg Loss: weighted combination of cross- entropy and Tversky loss (alpha=0.5, beta=8). Train : 128x256x256? Inference : 128x256x256 no no no 32models Seed ensemble Average at logits NoTTA 金圏ソリューションサマリ ※文字小さいですが、これからフォーカスして説明していきます。 ベースラインと共通する部分 「ベースアーキテクチャ」、「学習の形式」、「合成画像などの他データ利用」に関して違いは少ない(一部除き)
  8. 2025/03/07 関西kaggler会 9 Rank Link Architecture (3D/2.5D/2D) task Loss Train/Inference

    Resolution Pretraining With simulated Extra Data (e.g., WBP) 学習安定性 EMA/SWA Ensemble / TTA 1st Seg: kaggle.com Det:Kaggle 3D MONAIs FlexibleUnet 3D Yolo Seg & det Seg : weighted CrossEntropy(pos256 : neg 1) Det :PP-Yolo loss function with a few modifications inference is lager no no no merge of different types with scaling of conf 2nd Kaggle 3D Various Encoder seg 1. Dice Loss ,Tversky Loss and Cross- Entropy Loss 2. Tversky Loss and Cross-Entropy Loss inference is lager no no no 10 models 7TTA 3rd kaggle.com 3D Unet Resnet101 seg Cross Entropy loss Train : 64, 128, 128 Inference : 64, 256, 256 no yes EMA 4 model (7fold中の) flip x, y, z rot90 for x, y 4th Kaggle 2.5D Enc - 3D dec heatmap Weighted MSE Train 32×128×128 Inference 32×128×128 no no EMA/SWA 7models(4+3) TTA : yes 5th kaggle.com 3D DeepFinder like seg Label smoothing cross-entropy Train :(128, 128, 128) Inference no no no 4seed TTA :flip 3、rot 3 6th カグル 2.5 model & 3D model Various encoder seg FocalTversky++ Train : 64×128×128 Inference: 64×128×128 Yes Created by myself using Polnet. no no 10 models 7th kaggle.com 3DUnet resnet50d, resnet50d, efficientnetv2-m heatmap weighted BCE (heavy pos weight) Train : not mentioned Inference:192, 128, 128 Yes yes ModelEMA 0.995 3model, model soup Average at logits 4x Flip TTA 8th Kaggle 3D Unet seg DiceCELoss Train :(128, 128, 128) Inference:(160, 384, 384) Yes Only 6 tomography Yes (Used or not used) EMA used (decay 0.99) (Used or not used) 4model, model soup Average at logits 9th kaggle.com 2D to 3D Unet ConvNeXt-like seg BCE Train (32, 256, 256) inference (32, 320, 320) no no no Many models TTA Rot90, 180, 270 10th Kaggle 3D Unet monai seg Tversky loss and multiclass crossentropy Train : not mentioned Inference : not mentioned Yes (include implementation bug) no no 9model ensemble Average at logits 11th Kaggle 3D Unet Resnet arch seg Loss: weighted combination of cross- entropy and Tversky loss (alpha=0.5, beta=8). Train : 128x256x256? Inference : 128x256x256 no no no 32models Seed ensemble Average at logits NoTTA 金圏ソリューションサマリ ※文字小さいですが、これからフォーカスして説明していきます。 「ラベルノイズ/評価を考慮したLoss」、「推論時の画像サイズを大きくする」、「高速化を行いアンサンブル」が共通 上位で共通する工夫
  9. 2025/03/07 関西kaggler会 10 上位の工夫 ◆ Loss:ラベルノイズ/評価を考慮したLoss ➢ 理由:評価が過検出気味を期待していたから ➢ 上位:

    ⚫ セグ:CEに加えて、Dice Loss, Tversky Losなどを追加 ⚫ ヒートマップ:Pos Weight付のBCE or MSE ◆ Train/Inference Resolution:推論時の画像サイズを大きくする ➢ 理由:高速化をさせるため ⚫ 学習:32x128x128、推論:32x320x320 ⚫ 備考:FCN構造、かつスライディングウィンドウで切り出すため被写体のスケールは変化しないため可能 ◆ Ensemble / TTA:高速化を行いアンサンブル ➢ 理由:学習時のラベルノイズ(見逃し)の影響を打ち消すため ⚫ 今回は、多様性があればあるだけよかった ⚫ 基本TensorRT化まで実施 上位で共通する工夫 評価関数
  10. 2025/03/07 関西kaggler会 11 Rank Link Architecture (3D/2.5D/2D) task Loss Train/Inference

    Resolution Pretraining With simulated Extra Data (e.g., WBP) 学習安定性 EMA/SWA Ensemble / TTA 1st Seg: kaggle.com Det:Kaggle 3D MONAIs FlexibleUnet 3D Yolo Seg & det Seg : weighted CrossEntropy(pos256 : neg 1) Det :PP-Yolo loss function with a few modifications inference is lager no no no merge of different types with scaling of conf 2nd Kaggle 3D Various Encoder seg 1. Dice Loss ,Tversky Loss and Cross- Entropy Loss 2. Tversky Loss and Cross-Entropy Loss inference is lager no no no 10 models 7TTA 3rd kaggle.com 3D Unet Resnet101 seg Cross Entropy loss Train : 64, 128, 128 Inference : 64, 256, 256 no yes EMA 4 model (7fold中の) flip x, y, z rot90 for x, y 4th Kaggle 2.5D Enc - 3D dec heatmap Weighted MSE Train 32×128×128 Inference 32×128×128 no no EMA/SWA 7models(4+3) TTA : yes 5th kaggle.com 3D DeepFinder like seg Label smoothing cross-entropy Train :(128, 128, 128) Inference no no no 4seed TTA :flip 3、rot 3 6th カグル 2.5 model & 3D model Various encoder seg FocalTversky++ Train : 64×128×128 Inference: 64×128×128 Yes Created by myself using Polnet. no no 10 models 7th kaggle.com 3DUnet resnet50d, resnet50d, efficientnetv2-m heatmap weighted BCE (heavy pos weight) Train : not mentioned Inference:192, 128, 128 Yes yes ModelEMA 0.995 3model, model soup Average at logits 4x Flip TTA 8th Kaggle 3D Unet seg DiceCELoss Train :(128, 128, 128) Inference:(160, 384, 384) Yes Only 6 tomography Yes (Used or not used) EMA used (decay 0.99) (Used or not used) 4model, model soup Average at logits 9th kaggle.com 2D to 3D Unet ConvNeXt-like seg BCE Train (32, 256, 256) inference (32, 320, 320) no no no Many models TTA Rot90, 180, 270 10th Kaggle 3D Unet monai seg Tversky loss and multiclass crossentropy Train : not mentioned Inference : not mentioned Yes (include implementation bug) no no 9model ensemble Average at logits 11th Kaggle 3D Unet Resnet arch seg Loss: weighted combination of cross- entropy and Tversky loss (alpha=0.5, beta=8). Train : 128x256x256? Inference : 128x256x256 no no no 32models Seed ensemble Average at logits NoTTA 金圏ソリューションサマリ ※文字小さいですが、これからフォーカスして説明していきます。 大きく異なるのは「学習の多様性」、上位は非常に多様性が出るよう学習させているのが特徴 金圏上位と下位の違い 単一のアーキテクチャ まさかのSegとDetの結合 学習パターンが幅広い 異なる処理のデータを利用
  11. 2025/03/07 関西kaggler会 12 上位ソリューション紹介 金圏上位と下位の違い 1位ソリューション概要 2位ソリューション概要 3Dで Yoloライクに検出 Sliding

    window 3Dで Segで検出 ランキングを付けて 値を入れ替え スケール調整 アンサンブル - アーキテクチャ・損失関数の異なる2モデルを組み合わせ - 課題:強いアンサンブルが期待できるが、予測分布の違う - 策:モデルBの予測値を「モデルAと同じ順位分布」にマッピング ※モデルBの上位N番目の値は、モデルAの上位N番目の値と対応しててもよいよね~ってコト - 異なる12のモデルの組み合わせ - 開発者ごとにモデルのパラメータが異なる - LBで組み合わせ/閾値を探索 No Developer Mask radius Train size Architecture Parameters Valid ID Normalization Activation 1 Lion x 0.4 [128, 256, 256] or [128, 384, 384] UNet3D 1.1M TS_86_3 InstanceNorm3d PReLU 2 ↑ ↑ ↑ UNet3D 1.1M TS_6_4 InstanceNorm3d PReLU 3 ↑ ↑ ↑ UNet3D 1.6M TS_69_2 InstanceNorm3d PReLU 4 ↑ ↑ ↑ UNet3D 1.1M TS_69_2 InstanceNorm3d PReLU 5 ↑ ↑ ↑ UNet3D 1.1M TS_73_6 InstanceNorm3d PReLU 6 ↑ ↑ ↑ DenseVNet 873K TS_6_6 InstanceNorm3d PReLU 7 ↑ ↑ ↑ VoxResNet 7.0M TS_6_6 InstanceNorm3d PReLU 8 ↑ ↑ ↑ VoxHRNet 1.4M TS_73_6 InstanceNorm3d PReLU 9 ↑ ↑ ↑ VoxHRNet 1.4M TS_73_6 InstanceNorm3d PReLU 10 Luoziqian x 0.5 [128, 200, 200]or [128, 256, 256] UNet3D 1.1M TS_6_4 BatchNorm3d PReLU 11 ↑ ↑ ↑ SegResNet 1.2M TS_6_4 GroupNorm ReLU 12 ↑ ↑ ↑ UNet2E3D 14.2M TS_6_4 BatchNorm3d ReLU
  12. 2025/03/07 関西kaggler会 14 ダメポイント④:データのバリエーションが偏った 合成データで事前学習は当たり前、テストデータに合ってないデータは意味がない。と思い込んでいた 多様性が出やすいのは、確かにPretrain無しな感じはする。 ダメポイント③:推論時の解像度を大きくしてない 「これがうまく行く」というのが理解できておらず利用しなかった。ただの勉強不足 ダメポイント②:ただのBCE 誤ラベルやposのバランスを考慮できていない。シンプル知識不足

    実験後半で見直そうとしたが、パラメータが多くなり実験が多くなるため未実施 自分の解法とダメポイント、罵ってください(※チームだと少しLossの工夫があった) Rank Link Architecture (3D/2.5D/2D) task Loss Train/Inference Resolution Pretraining With simulated Extra Data (e.g., WBP) 学習安定性 EMA/SWA Ensemble / TTA Only Me Private about 30th Not Team --- 3D Unet Resnext101 & effnetb4 & b5 heatmap BCE 128x128x128 Yes no no 10 models Flip TTA ダメポイント①:モデルが大きい 大きい方が各foldの結果が改善したため採用 学習時間が12時間を超えるため、他の施行実験が全然できず。。。
  13. 2025/03/07 関西kaggler会 15 我々のコンペの進め方 ◆ 1. ベースライン構築 ➢ 最初からHeatmap形式で学習。普通に性能は出るのでモチベが上がる。 ➢

    大きいモデルで性能上がったので大きいのに変更。 ⇐ これが終わりの始まり ◆ 2. 合成データで事前学習 ➢ 学習の安定性が上がったので利用。CVも爆上げした。LBも追従して改善。 ◆ 3. モデル量産 ➢ しかし、1モデルが大きくアンサンブルできず・・・ ⚫ さらに、LBで最高性能出てただけに捨てきれず・・・ ➢ 手当たり次第にいろんな実験をするようになり、この辺りでの思考停止に陥る・・・ ◆ ~Fin~ ➢ 上位の解法を確認してみると、細かいところの甘さに気付く・・・
  14. 2025/03/07 関西kaggler会 20 紹介:神資料 ◆ Tattakaさん ➢ CZII - CryoET

    Object Identification 参加振り返り・解法共有 - Speaker Deck ◆ 508shutoさん ➢ Kaggle CZII コンペ上位解法まとめ