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

#22 CA × atmaCup 3rd 1st Place Solution

Avatar for yumizu yumizu
January 09, 2026

#22 CA × atmaCup 3rd 1st Place Solution

#22 CA x atmaCup 3rd 振り返り会の登壇資料
https://atma.connpass.com/event/380482/

コンペURLはこちら
https://www.guruguru.science/competitions/30/

Avatar for yumizu

yumizu

January 09, 2026
Tweet

Other Decks in Technology

Transcript

  1. ©Commune Inc. | 1 #22 CA × atmaCup 3rd :||

    1st Place Solution 2026/1/9 Yuki Mizuta / yumizu
  2. ©Commune Inc. | 2 Yuki Mizuta / yumizu 経歴 •

    ~2024:鉄道会社 Data Scientist • 2025~:Commune.inc Data Scientist SNS • X:@yumizzzz Favorite • 関西 / オカメインコ / コーヒー / 阪神タイガース 
  3. ©Commune Inc. | 3 #22 CA × atmaCup 3rd :||

    引用:https://www.guruguru.science/competitions/30/data-sources
  4. ©Commune Inc. | 4 trainデータとtestデータで大きな違いがあった • ラベルが付与された選手(label_id = 0~10) •

    バスケットコート全体の背景 • Ground TruthなBBox座標 • ラベル付与された選手 + 学習データに存在しない選手 • BBox領域が切り抜かれた画像 • 正確ではないBBox(選手が写っていない可能性有り) train test #22 CA × atmaCup 3rd :||
  5. ©Commune Inc. | 8 1st Stage:ArcFaceによる人物判定 ArcFaceにて11クラス分類 (label_id=0~10)を実施 • StratifiedGroupKFold

    5Fold • top / side でモデルを分割 • ArcFace ◦ backbone:Swin Transformer small, convnext small, efficientnetv2 small ◦ loss:Dynamic Margin • Dataset ◦ Augmentation:BBoxをx/y方向のシフト & height/widthの拡大縮小 • logits(= 各ラベルの代表ベクトルとのcosine類似度)を後続の予測に使用 backbone (Stage1) Public LB Private LB swin_small_patch4_window7_224 0.8191 0.8283 convnext_small.in12k_ft_in1k 0.8145 0.8194 tf_efficientnetv2_s 0.8064 0.8144 ※ この時点では予測値に label_id=-1が存在しないためスコアは低い
  6. ©Commune Inc. | 9 1st Stage:ArcFaceによる人物判定 top / sideでモデルを分割した理由 •

    top / side を分離せず1つのラベルで学習し、 embeddingを可視化すると、1つのラベル内で 2つのクラスタに分離された • 学習やconsine類似度の取得に悪影響が及ぼ す気がしたので、別のモデルに分離した そこまで気にする必要はなかったかも ...
  7. ©Commune Inc. | 10 1st Stage:ArcFaceによる人物判定 BBoxのxy方向シフト & 拡大縮小を行い、テストデータの BBoxを疑似的に再現

    1. BBoxをランダムにシフト・拡大縮小 2. 以下の条件を全て満たす場合は採用。1つでも満たさない場合は1に戻って作り直し a. 元のbboxとのIoUが0.5以上 b. 元bboxとのIoU > max(他bboxとIoU) 生成されるbboxと元のbboxのIoU値分布(シミュレーション結果)
  8. ©Commune Inc. | 11 2nd Stage:IoU回帰予測モデル 与えられたBBox画像に対して、GroundTruthのBBoxとのIoUを予測する回帰モデルを作成 • top /

    side でモデルを分割 • IoU値回帰予測モデル (0~1) ◦ Backbone:efficientnetv2 small • Dataset ◦ Augmentation:BBoxをx/y方向のシフト & height/widthの拡大縮小
  9. ©Commune Inc. | 12 2nd Stage:IoU回帰予測モデル BBoxのxy方向シフト & 拡大縮小を行い、テストデータの BBoxを疑似的に再現

    1. BBoxをランダムにシフト・拡大縮小 2. 元のbboxとのIoUを計算 a. IoU 0.5 以上: 採用 b. IoU 0.5 未満: 同一フレームの他BBoxとのIoUを全て0.5未満なら採用 生成されるbboxと元のbboxのIoU値分布(シミュレーション結果)
  10. ©Commune Inc. | 13 2nd Stage:IoU回帰予測モデル unknown判定するためのIoU閾値を調整することで大幅にスコアが向上した • IoU回帰モデル作成時のBBox変更方法やIoU予測精度に問題があり、テストデータのIoUを正確に予測できていなかった可 能性...

    ◦ IoUの大小関係は学習できていたので、閾値調整で精度が向上した • IoU閾値0.3がPubilc/Privateともベストスコアとなった ◦ テストデータのちょうど10%をunknownに補正していた backbone (Stage1) IoU閾値 Public LB Private LB swin_small_patch4_window7_224 0.5 0.8514 0.8527 swin_small_patch4_window7_224 0.4 0.9049 0.9046 swin_small_patch4_window7_224 0.3 0.9149 0.9122
  11. ©Commune Inc. | 14 3rd Stage:最適化 [0.8570] ⇒ [0.9549] かなり精度が上がるかもしれない個数制約付き最大化による後処理

    とほぼ同じ 以下の2条件のみ追加 • 1フレーム内において各label_idの割当は基本1回までだが、IoU > 0 の BBox ペアに限り同一ラベル付与可 • label_id=0, 8 と判定されたbboxは最後に全てlabel_id=-1に置換 backbone (Stage1) IoU閾値(Stage2) Public LB Private LB swin_small_patch4_window7_224 0.3 0.9511 0.9561 convnext_small.in12k_ft_in1k 0.3 0.9498 0.9528 tf_efficientnetv2_s 0.3 0.9462 0.9500
  12. ©Commune Inc. | 20 3. テストデータに対する予測において、 label=0, 8 の予測頻度は圧倒的に少ない ◦

    テストデータには、label=0, 8 の選手は出場していない? 1. DiscussionのBaselineから仮説を立て、早期にコンペの特徴を把握できた 引用:RedBullさんの[0.8448]baseline notebookより
  13. ©Commune Inc. | 21 3つの気付きをもとに、早々に高スコアを獲得することができた ※ Restart前 1. RedBullさんの[0.8448]baseline notebook同様にモデルを学習

    2. 個数制約付き最大化による後処理を行う 3. label=0, 8 と予測した画像はunknown(label_id=-1に置換) 1. Discussionのbaselineを見て仮説を立てる
  14. ©Commune Inc. | 23 2. 問題や課題を整理・分解し、モデル構造や検証計画に上手く落とし込めた 一度冷静にコンペのタスクを整理・分解し、各タスクの予測精度と工数を整理してみた タスク 予測精度 学習・推論時間

    備考 1.  学習データに存在する選手を当てる ◎ ✕ ・Restart前LBやCVより予測は簡単 ・簡単なタスクだが、学習時間はかかる 2.  BBox内に選手がいないことを当てる △ ✕ ・画像からIoUを正確に予測するのは難しい ・BBoxのシフトがtestデータを再現できているか不明 3. 学習データに存在しない選手を当てる ◎ ◎ ・Restart前LBやCVより予測は簡単 ・label_id=0, 8を-1に置換 4. バスケットボール特有の制約を適用する 〇 〇 ・伸びしろ大。繰り返し実装 →検証が可能 ・あくまで後処理。1~3の精度が良い必要が前提。
  15. ©Commune Inc. | 24 タスク 予測精度 学習・推論時間 備考 1.  学習データに存在する選手を当てる

    ◎ ✕ ・Restart前LBやCVより予測は簡単 ・簡単なタスクだが、学習時間はかかる 2.  BBox内に選手がいないことを当てる △ ✕ ・画像からIoUを正確に予測するのは難しい ・BBoxのシフトがtestデータを再現できているか不明 3. 学習データに存在しない選手を当てる ◎ ◎ ・Restart前LBやCVより予測は簡単 ・label_id=0, 8を-1に置換 4. バスケットボール特有の制約を適用する 〇 〇 ・伸びしろ大。繰り返し実装 →検証が可能 ・あくまで後処理。1~3の精度が良い必要が前提。 2. 問題を上手く因数分解して実装に落とし込めた 一度冷静にコンペのタスクを分解し、各タスクの予測精度と工数を整理してみた 3つはRestart前から存在する条件 → そこまで難易度は高くない 2を改善すればRestart前の高スコア を再現できるかも?
  16. ©Commune Inc. | 25 タスク 予測精度 学習・推論時間 備考 1.  学習データに存在する選手を当てる

    ◎ ✕ ・Restart前LBやCVより予測は簡単 ・簡単なタスクだが、学習時間はかかる 2.  BBox内に選手がいないことを当てる △ ✕ ・画像からIoUを正確に予測するのは難しい ・BBoxのシフトがtestデータを再現できているか不明 3. 学習データに存在しない選手を当てる ◎ ◎ ・Restart前LBやCVより予測は簡単 ・label_id=0, 8を-1に置換 4. バスケットボール特有の制約を適用する 〇 〇 ・伸びしろ大。繰り返し実装 →検証が可能 ・あくまで後処理。1~3の精度が良い必要が前提。 2. 問題を上手く因数分解して実装に落とし込めた 一度冷静にコンペのタスクを分解し、各タスクの予測精度と工数を整理してみた ここをなんとか精度上げたい。 モデル学習が必要だったり、後処理にも影響するので早めに固めたい
  17. ©Commune Inc. | 26 タスク 予測精度 学習・推論時間 備考 1.  学習データに存在する選手を当てる

    ◎ ✕ ・Restart前LBやCVより予測は簡単 ・簡単なタスクだが、学習時間はかかる 2.  BBox内に選手がいないことを当てる △ ✕ ・画像からIoUを正確に予測するのは難しい ・BBoxのシフトがtestデータを再現できているか不明 3. 学習データに存在しない選手を当てる ◎ ◎ ・Restart前LBやCVより予測は簡単 ・label_id=0, 8を-1に置換 4. バスケットボール特有の制約を適用する 〇 〇 ・伸びしろ大。繰り返し実装 →検証が可能 ・あくまで後処理。1~3の精度が良い必要が前提。 2. 問題を上手く因数分解して実装に落とし込めた 一度冷静にコンペのタスクを分解し、各タスクの予測精度と工数を整理してみた 当時1つのモデルで両方を予測していた → 2の精度向上を目的に、予測精度が良い 1を学習するのは時間が勿体ない → モデルを分割して2の改善に注力することに
  18. ©Commune Inc. | 27 タスク 予測精度 学習・推論時間 備考 1.  学習データに存在する選手を当てる

    ◎ ✕ ・Restart前LBやCVより予測は簡単 ・簡単なタスクだが、学習時間はかかる 2.  BBox内に選手がいないことを当てる △ ✕ ・画像からIoUを正確に予測するのは難しい ・BBoxのシフトがtestデータを再現できているか不明 3. 学習データに存在しない選手を当てる ◎ ◎ ・Restart前LBやCVより予測は簡単 ・label_id=0, 8を-1に置換 4. バスケットボール特有の制約を適用する 〇 〇 ・伸びしろ大。繰り返し実装 →検証が可能 ・あくまで後処理。1~3の精度が良い必要が前提。 2. 問題を上手く因数分解して実装に落とし込めた 一度冷静にコンペのタスクを分解し、各タスクの予測精度と工数を整理してみた ・最適化に要する時間は数分~数十分程度。コンペ終了最終日でも改善可能 ・画像分類モデルの精度や傾向次第なところもある → 後回しでよさそう
  19. ©Commune Inc. | 30 • 運が良かったです ◦ たまたま早期にコンペを理解でき、シンプルなアプローチでも上位に入れた • label_id

    = 0, 8の置換はできればやりたくなかった ◦ ただ強力すぎたので使用させてもらった • 完全 Vibe Codingでした ◦ Cursor Pro プラン ▪ メイン:Claude Opus 4.5 ▪ サブ:GPT-5.2, Composer1 ◦ 指示を出すと、ほぼ100%完璧に実装してくれ、爆速で 仮説検証のサイクルを回せた ▪ 人にとっては、今一番コンペが楽しいかもしれません ◦ 本コンペ時点では、人間のアイデアや指示無しで上位に入るのはまだ難しいかも ▪ 私のVibe Codingの環境がイケていないだけかも ... まとめ