🤖

CMI - Detect Behavior with Sensor Data 上位解法MEMO

に公開

※ 個人用メモです。が間違っていたらご指摘ください🙏

コンペの概要

  • CMI - Detect Behavior with Sensor Data
  • 期間: 2025/05/30 ~ 2025/09/03
  • 主催: Child Mind Institute
  • 目的: 手首装着型デバイス「Helios」で取得したセンサーデータを用い、BFRB(Body-Focused Repetitive Behaviors) の動作を日常動作から高精度に識別するモデルを開発する。

(割と)共通している手法

  • 各被験者が特定のgestureを1orientationにつき1回しか行っていないことを利用する。
  • 特定のorientationでは、特定のgestureが出現しないことを利用する。
  • SUBJ_019262 と SUBJ_045235は正しくデバイスを装着していないためデータを変換、もしくは削除
  • IMUとTHM/TOFの右手系と一致するように左手系を変換する
  • augmentation
    • mixup
    • cutmix
    • timeshift/stretch
    • 回転

各解法の特徴的な手法

1st Place Solution

  • Devin's part
    • TODは2x2の正方形を9つとり、それぞれの平均を計算する
    • TOF-onlyのデータもアンサンブルに使うことで精度UP
  • Ogurtsov's part
    • いくつかのsampleを削除(gestureのないsequenceなど)
    • scalerは使用しない
    • accからgravityを除いたデータを使用して、35の特徴量を作成
    • LSTMベース、attentionベース、CNNベースのモデルを使用
    • timeshift, timistretchのaugmentationを使用
    • 各FOLDで3runのうち、最も結果の良かった結果を採用する
    • 推論時のシーケンスを少し伸ばすことで、モデルごとの相関を下げアンサンブルの効果大きくなる
  • zyz part
    • RNN, CNN1Dの組み合わせ

2nd Place Solution

  • 4つのmodelを作成
    • IMU rotationの欠損有無 x THM/TOFの欠損有無
  • quaternionは6D表現を使用 (to avoid discontinuities)
  • model: Residual SE-CNN Block + Attention model
  • そこで各時刻で 3クラスのフェーズ確率(移動中・ターゲット位置・ジェスチャー実行中)を予測し、フェーズごとにアテンションを分けて、確率で重み付けする。
    • これによって各フェーズに特化した特徴を抽出し、長いフェーズにattentionが集中するのを防ぐ。
  • TODには2D-CNNを使用してavgpoolingで特徴量を抽出
  • mixupを工夫
    • 各シーケンスを上記の 3 つのフェーズに分割し、同じフェーズ内でのみミックス
    • 特に「moves to target」では、ターゲットへの到着が同期するようにフェーズの終了を合わせる
  • テストデータを使用してpseudo-labelを生成し、学習に使用
    • LR(5e-5)で1stepだけfine-tuning
  • orientation x gesture x initial behaviorsの組み合わせの102クラスを予測
  • 後処理(ラベルの割り当て)
    • 被験者ごとの全シーケンスに対し、ラベル重複禁止の制約を入れてjoint log-probabilityを最大化するラベル割当をまとめて最適化する
    • 各シーケンスを独立にargmaxせず、ハンガリー法で全体最適なラベル割当を求めます。

3rd Place Solution

  • ハンガリー法で全体最適なラベル割当を求めます(2nd placeと同様?)
  • クォータニオンの不連続性に対応するために、平滑化したり、クオータに符号反転拡張や対象ブロックを追加
  • poolingにも使用される BCE を備えたgesture/transition mask headを追加しました。
    • 信号のほとんどは遷移後に発生するため、
  • 適当な画像サイズにリサイズしてmaxvit, convnext-v2, EfficientNetB5などで予測
  • augmentatioon
    • world座標系の Z 軸を中心にクォータニオンをランダムな角度 (-60 度から 60 度) で回転させる。
      (被験者が向いているさまざまな方向に対する堅牢性を高めるため)
    • 加速度計と四元数データの両方を、ローカル座標系の y 軸を中心に小さなランダム角度 (-7 度から 7 度) で回転させる。
      (デバイスの装着方法のわずかな変化に対する堅牢性を高めます)

4th place solution

  • gesture, orientation, initial stateの 18 x 4 x 2のターゲットを設定し、それぞれが1回以上出現しないことを利用
  • augmentation
    • 同じtargetを持つレコードのtransisionとgesture部分をmixupする

5th place solution

(あまり理解できてない)

  • 同一被験者の複数シーケンス情報をまとめて活用
    • CNN / RNN / Transformer で時系列特徴を抽出し、さらに被験者次元の Transformerでシーケンス間関係を学習。
  • test時は1シーケンス単位かつ順序ランダムでデータが来るため不安定になるので、シーケンス情報を逐次蓄積し、順序のばらつきに対応した。

6th place solution

  • 後処理は行ってない
  • ジェスチャーが行われている時間区間を U-Net で推定し、その情報を追加特徴としてモデルに与えた
    • gesture segmentとnon-gesture segmentそれぞれでavgpoolingを実施
  • デバイスを装着していないため被験者を検出モデルを使用し、データを変換

7th place solution

  • 時系列データを画像に変換し、EfficientNet または ConvNeXt を使用して2D-CNNで分類
  • augmentation
    • time warping: 時間軸を非線形に伸び縮みさせる
    • magnitude warping: 信号の大きさ(振幅)を時間とともに滑らかに変化させる

8th place solution

  • 特になし(?)

9th place solution

  • 正規化はせずに、BatchNormを使用
  • 各modelについて、通常バージョンと逆バージョンの両方をトレーニング
    • 正規モデル: 51 個のターゲットのうち 50 個が 0、1 個が 1 (標準分類)
    • 逆モデル: 51 個のターゲットのうち 50 個が 1 個、1 個が 0 個 (逆分類)

10th place solution

  • StratifiedGroupKFoldでseedは3つ分試す
  • augmetaton
    • time stratchによって不連続な点が出ないように色々と変換を工夫
      (クオータにオンに不連続な点が生まれないようにしたり、開始・終了座標が変化しないようにaccを調整)
  • Mixupを他段階で行うMixup(Mixup(Mixup(x)))

11th place solution

  • optimizer: AdamW、MuonWithAuxAdam

12th place solution

  • 投稿なし

13th place solution

  • 双方向のMamba blockを使用して、各センサー モダリティの長期的な時間的依存関係を学習
  • IMU-onlyデータでは、SE-Transformer blockに基づくモデルを使用
  • Hard Margin Lossを導入
    • 区別が難しいサンプル (「まつげ」と「眉毛」など) の決定境界を押し上げるため
  • Hard Mining
    • トレーニングの第二段階では、分類困難なサンプルのサンプリングレートを上げた
  • CVスコアを最大化するようにhill climbアンサンブルを実施

14th place solution

  • Wavenetなども利用

15th place solution

  • 1Dのアプローチに加えて、2パターンの2D-CNNを使用
    • 生の波形を使用
    • imuはplotしたものを画像として使用

MEMO

学び

  • 違和感のあるデータがある場合は深掘りし、原因を特定することが重要
    • データを除去するべきか、補正するべきか考える
    • testデータも同様の傾向があるか推測する
  • train dataの分布、test dataの分布を把握する
    • 今回はtrain dataのラベルの分布がやたらキレイな点に着目するべきだった
  • センサーデータは時系列ではなく、画像として解けないかも検討するのが良い
  • EMAは基本的に使用した方がいいのかもしれない

Tipsまとめ

  • 各FOLDで3runのうち、最も結果の良かった結果を採用する
  • 推論時のシーケンスを少し伸ばすことで、モデルごとの相関を下げ、アンサンブルの効果が出やすくなるらしい
  • ニューラルネットでquaternionを扱うときは6D表現を使うと良い(不連続性を避けられるため)
  • testデータを使用して、pseudo-labelを生成しfine-tuningに使用する (LRを小さくして1stepだけ)

関連書籍

以上

Discussion