返回列表

11th Place Solution

665. CMI - Detect Behavior with Sensor Data | cmi-detect-behavior-with-sensor-data

开始: 2025-05-30 结束: 2025-09-02 健康管理与公共卫生 数据算法赛
第 11 名解决方案 - Lightsource+Ryan 建模 + 后处理

标题:第 11 名解决方案

副标题:Lightsource+Ryan 建模 + 后处理

作者:ryches (Grandmaster), lightsource<3 (Master)

发布日期:2025-09-03

竞赛排名:第 11 名

非常幸运能与 lightsource 组队。我的解决方案还不错,但我的 IMU 建模能力严重不足,而他的非常强。我们组队比较晚,所以幸运的是,当我们向彼此展示我们的方案时,我们拥有很好的互补部分。我们解决方案的主要主题是优化的建模,然后在顶部稍加后处理以获得不错的提升。主要的后处理见解在这里。我们的集成保持相对简单, just 50/50 平均 between 我们的方法。我们组队足够晚,以至于我们使用了完全不同的代码库,只是分别运行它们然后平均结果。

分析后处理如何与每个受试者朝向最多 2 个手势限制的不同放松一起工作的图表

分析后处理如何与每个受试者朝向最多 2 个手势限制的不同放松一起工作的图表

lightsource 部分

完整代码:github 链接

特征

使用:

  • IMU: 基础 (acc_x/y/z, rot_w/x/y/z)
  • 来自公开解决方案:acc_mag, rot_angle, acc_mag_jerk, rot_angle_vel, linear_acc_x/y/z, linear_acc_mag, linear_acc_mag_jerk, angular_vel_x/y/z, angular_distance
  • TOF: 原始 320 个特征
  • THM: 原始 5 个特征

未成功的实验:

  • IMU: 6d 四元数表示 (https://arxiv.org/pdf/1812.07035), 滑动窗口统计,积分 (线性速度除外), 欧拉角,基于重力的特征,位置特征
  • TOF/THM: 传感器间差异,统计,质心,梯度
  • 人口统计信息:由于受试者数量有限而失败

预处理

使用:

  • 无归一化 (优于每序列缩放和 StandardScaler)
  • TOF: 将 -1 替换为 255,然后除以 255

未成功的实验:

  • 滤波方法 (firwin, wavelet, savgol, butterworth, median) 降低了性能
  • 卡尔曼滤波效果中性
  • 左右手变换没有用处 (没有增加 cv 和 lb,虽然对于私有数据集可能很重要)

建模

两个模型:

  • 仅 IMU
  • IMU + TOF + THM (推理时根据 TOF 可用性选择模型)

分支:

  • acc: acc_x/y/z
  • rot: rot_w/x/y/z
  • fe1: 手工特征 (加加速度、速度、角度、距离等)
  • fe2: 滞后/超前差分、累积和
  • full: 所有 IMU 特征
  • thm: 所有 THM 特征 (仅在 IMU+TOF+THM 模型中)
  • tof1--tof5: 来自单个传感器的 TOF 特征 (仅在 IMU+TOF+THM 模型中)

提取器:

聚合:

  • 分支级别:拼接 (concat) (优于 MHA,与 GAT 相当,GCN 较差)
  • 提取器级别:多头注意力

输出头:

  • 手势
  • 序列类型
  • 朝向
  • 直接在提取器上的额外手势头

未成功的实验:

  • 架构:inceptiontime, efficientnet, harmamba, transformers (husformer, medformer, squeezeformer, timemil, 等), moderntcn, wavenet, TOF 的 2D/3D 提取器
  • 使用频谱图、尺度图、线性图
  • 头:手势开始预测、完整行为掩码、人口统计特征

数据增强

使用:

  • mixup 及其变体 (cutmix, channelmix, zebra)
  • 通道掩码
  • 抖动

未成功的实验:

  • 时间平移、拉伸、扭曲
  • 旋转、左右反射
  • 低通滤波增强

训练

使用:

  • 优化器:AdamW, MuonWithAuxAdam (在某些情况下稍好)

未成功的实验:

  • 用于多任务学习的 TorchJD
  • 度量学习组件以改善相似类别的分离,也没有提供增益 (arcface, tripletloss, ...)
  • EMA
按人口统计信息的性能

Ryan 部分

完整代码:github

特征

与 lightsource 几乎相同,主要是来自公开内核的内容。我尝试了许多不同的特征处理。尝试将它们制成频谱图,变成随机曲线图,像这篇论文中那样,但去除重力后的常规特征及其导数似乎最有用。我尝试将事物转换到世界坐标系或起始方向始终一致的表示,但没有发现成功。

预处理

  • 与 lightsource 相似,仅在第一层使用 batchnorm 归一化
  • TOF: 将 -1 替换为 300,然后除以 255。相似,除了我将 -1 标记为更远,因为我不想让它混淆远处的物体和完全视野外的物体。认为这其实没什么影响

建模

我的模型有许多不同的变体。有些是仅 IMU 和仅全传感器,但大多数它们在两种场景下都能工作。使用重度传感器 Dropout 训练它们,以便对许多传感器被置空或仅作为 IMU 具有鲁棒性。

我在建模方面的主要结论是,我们真的不需要深度和高特征交互,我们也不需要鼓励全局模式的方法。一个早期的实验对我来说非常具有启发性,即训练一个模型,该模型在应用任何卷积之前有一个学习特征交互的线性层。这拟合得太快并立即过拟合。我们真的想要简单的方法,分别从每个通道和通道组中最好地学习。

这让我找到了一个与 lightsource 和公开内核相似的解决方案,即有多个不同的分支,后期融合。我最好的模型是一个有很多分支但深度很浅的模型。它有一个不同的分支,具有内核大小为 3、5、9 的两个 conv1d 层。同样对于分组卷积,所以只有特征组之间获得交互。然后它还有 lstm、gru 和两层 transformer 的分支。所有这些都输入到一个 conv1d 层,最终合并并交互这些特征。我在每一层之间使用了某种形式的分支 Dropout 以及一些时间和通道 Dropout。真的试图鼓励它不被任何单一分支主导,不从特定时间步或特征学习。

数据增强

我尝试了大量选项,但除了 mixup 外没发现真正有用的。我最终使用了非常高比例的 mixup。alpha 为 0.4 和 0.8 之间的差异在损失和验证 F1 方面都相当大。

我尝试了各种形式的扭曲、旋转、缩放、噪声、传感器漂移、手部翻转,但我似乎没有找到任何能提升效果的东西。

集成和后处理

我认为我对团队的主要贡献是我的后处理。我的建模还可以,但 lightsource 的在 IMU 上显著更好,我的整个集成接近相似的全性能,但这是通过暴力集成和许多模型一起集成实现的。当我们合并我们的解决方案之间的简单平均时,给了我们巨大的提升,但当我将我的后处理移植到我们的组合解决方案时,那是我们能够暂时取得第一名的时候。最大的事情只是利用受试者手势朝向约束之间的关系。我们从训练数据中看到,每个朝向最多只做两个手势,锁定这一点显著帮助了我们的分数。在此基础上的第二件事是确保从不预测非法组合。21 种朝向手势组合在我们的数据中从未做过,所以关闭这些没有巨大影响,但参考 leaderboard 的接近程度,这仍然是一个不错的增益。

当我们将之前平均的概率转换为排名时,我们获得了另一个巨大的提升。这相当简单。只是将 18/18 分配给置信度最高的类别,17/18 给下一个,16/18 给第三个,依此类推。令我惊讶的是,这比给模型一些表达能力(给每个类别概率)更好,但也许这有助于校准每个模型的预测。我注意到 lightsource 的预测自信得多。我的通常极其模糊的决策边界,可能是因为极高的 mixup。

耳朵上方___拉头发_SEQ_002046_97 时间步
同比赛其他方案