返回列表

6th Place Solution

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

开始: 2025-05-30 结束: 2025-09-02 健康管理与公共卫生 数据算法赛
第六名解决方案 - CMI 行为检测

第六名解决方案

作者: Jack (Japan) | 排名: 第 6 名 | 比赛: CMI Detect Behavior with Sensor Data

首先,我要感谢比赛主办方和所有参赛者的努力与贡献。看到如此多的创意和奉献精神令人鼓舞。我也很激动能进入获奖范围。下面,我想分享一下我的解决方案概述。


简要总结

我的解决方案主要 points 如下:

  • 使用了自定义神经网络,每个传感器模态有一个独立的 1D-CNN 分支
  • 提取每个序列的最后 75 帧作为 NN 输入
  • 使用简单的 U-Net 估计手势片段并将其作为额外输入添加
  • 转换左手数据以与右手数据对齐
  • 识别佩戴设备倒置(绕 z 轴旋转 180°)的受试者并校正其数据
  • 在完整数据集上用不同的随机种子训练了两个几乎相同的 NN(仅在输入块上有所不同)各 50 次,然后平均所有 100 个 NN 的输出
  • 未应用任何后处理

以下是交叉验证 (CV) 和排行榜 (LB) 分数。交叉验证使用 10 折 StratifiedGroupKFold 进行。

模型 CV 或全量训练 处理测试集中的
倒置设备
CV
(单种子)
CV
(5 种子平均)
Public LB Private LB
1 CV False 0.864
(0.894, 0.834)
0.874
(0.905, 0.843)
0.869 0.860
2 CV False 0.862
(0.892, 0.833)
0.875
(0.904, 0.846)
0.874 0.856
1 + 2 CV False - 0.877
(0.906, 0.849)
0.873 0.858
1 + 2 全量训练 False - - 0.871 0.860
1 + 2 全量训练 True - - 0.871 0.873

表中模型 1 的 Notebook 链接如下:
https://www.kaggle.com/code/rsakata/cmi3-6th-place-solution-partial

神经网络架构

两个手势分类神经网络中,其中一个的结构如下所示。另一个仅在输入特征块上略有不同。

神经网络架构图

每个输入特征块(左侧所示)都经过 1D-CNN 和 MLP 层处理。重要的是,每个 1D-CNN 块中的第一个卷积是按通道进行的分组卷积。

在 MLP 层之前,1D-CNN 的输出沿时间轴进行池化。不是简单的全局平均池化,而是分别在手势和非手势片段上进行池化,并将结果连接起来作为 MLP 的输入。为了实现这一点,使用 U-Net 预先估计了手势片段并将其作为输入添加。(U-Net 结构相当简单,没有特殊技巧,因此此处省略细节。)

最终预测是通过组合所有块的输出获得的。按照问题设置,模型使用所有输入和仅 IMU 输入产生预测。此外,还为每个块生成单独的预测。

对所有预测计算交叉熵损失并用于反向传播。损失权重为:所有输入和仅 IMU 预测各占 1/4,六个特定块预测各占 1/12。

除了预测手势(18 类)外,网络还预测方向(4 类),作为辅助损失添加,相对于手势损失的权重为 0.5。非目标手势未被压缩;模型作为 18 类分类任务进行训练,因为早期实验显示这表现略好。

在测试集上进行推理时,如果超过 50% 的 TOF 值缺失,则使用仅 IMU 预测;否则,使用所有输入预测。

我将对图中的几个特征块进行解释。

derived_acc

该块由 linear_acc 的三个分量和 global_acc 的三个分量组成。linear_acc 是去除重力后的加速度,计算方式与许多公开 Notebook 相同。global_acc 是在全局(世界)坐标系中表示的加速度;请参阅下方链接中的讨论。
https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/583080

rotvec_diff

这本质上等同于公开 Notebook 中计算为 angular_vel 的内容。(由于值稍后会标准化,因此省略了除以时间的步骤。)

tof

在时间卷积之前,五个 TOF 传感器中的每一个的值都在 8×8 网格上进行空间卷积。经过三轮步长为 2 的最大池化后,空间维度完全折叠,每个传感器产生 32 个通道(总共 160 个)。然后将生成的特征图以与其他块相同的方式通过时间卷积进行处理。


预处理

处理左撇子受试者

最重要的预处理步骤之一是处理左撇子受试者。

对于 acc 特征,修复很简单。因为这些特征是左右对称的,翻转 x 分量的符号就足以将左手数据转换为右手数据。这在下面的 acc 直方图中清晰可见。

Acc 直方图

对于 rot 特征,情况更复杂,所以我将从 rotvec_diff 开始。请注意,绕 x 轴的旋转对于左撇子和右撇子受试者是相同的(就像扭动摩托车油门一样)。相比之下,y 和 z 分量必须翻转符号——这一步被证明对于提高左撇子受试者的准确性至关重要。

乍一看,似乎翻转 y 和 z 也足以处理 rot 值。然而,绕 z 轴的旋转取决于受试者的朝向(除非所有受试者都面向正北进行手势)。所以我首先消除了相对于正北的角度,然后翻转了 rot_y 和 rot_z。在对齐左右手直方图后,估计受试者的朝向大约为北偏 130°(可能是西南方向)。
下面的前后直方图证实了经过此变换后分布匹配。

Rot 直方图 1 Rot 直方图 2

然而,这种预处理只有在数据采集期间所有受试者都面向同一方向时才可能。对于现实世界的使用,模型不应依赖于绝对方向,因此完全排除 rot(和 global_acc)值可能是更好的方法。

对于传感器放置,我还镜像了一些值:thm_3/tof_3 与 thm_5/tof_5 交换,并且每个 TOF 传感器的 v0–63 值左右翻转。

这些步骤使得左撇子受试者在 CV 中使用 IMU+THM+TOF 的手势分类准确率达到了约 85%。

处理倒置设备

另一个关键发现是,有两名受试者佩戴的设备绕 z 轴旋转了 180°——具体是 SUBJ_019262 和 SUBJ_045235。下面的直方图将这些受试者与其余受试者进行了比较。

倒置设备直方图

acc_x 和 acc_y 分布似乎翻转的事实强烈表明设备是倒置佩戴的。我校正了传感器值,就像设备是正常佩戴的一样:

  • 对于 acc:翻转 x 和 y 分量的符号
  • 对于 rotvec_diff:翻转 x 和 y 分量的符号(z 在两次翻转后恢复原状)
  • 对于 rot:添加绕 z 轴 180° 的旋转,并翻转 x 和 y 分量的符号
  • 交换 thm_2 与 thm_4,以及 tof_2 与 tof_4
  • 交换 thm_3 与 thm_5,以及 tof_3 与 tof_5
  • 旋转 TOF 传感器的 v0–63 值

这些校正不仅极大地提高了两名受影响受试者的准确性(在 CV 中使用 IMU+THM+TOF 准确率超过 90%),而且还略微提高了其他受试者的准确性。

为了准备测试集中出现类似情况,我还训练了一个模型来检测序列是否是在设备旋转 180° 的情况下记录的。该模型架构与手势分类网络完全相同,仅输出类别的数量不同。

由于这并没有提高 Public Score,我不确定是否要包含它。最后,我将其添加到了其中一个最终提交中,而没有添加到另一个中。结果证明它对 Private Score 产生了巨大影响(+0.013),这显著提高了我的 Private Leaderboard 排名。

其他简单预处理

此外,还应用了一些其他简单的预处理步骤:

  • 对于 thm:低于 20 °C 的值被视为异常值并替换为 null(标准化后填充为 0)
  • 对于 tof:-1 的值替换为 255

其他

  • 优化器:我使用了 RAdamScheduleFree。在最后阶段,我尝试切换到 AdamW 并进行调整,虽然能够达到类似的性能,但并没有明显超过之前的结果,所以我一直使用 RAdamScheduleFree 直到最后。
  • 数据增强和 mix-up:我无法让它们有效工作,所以没有采用。
  • EMA:我也尝试使用 EMA,它提高了单次 CV 结果,但其效果在与种子平均结合时消失了,所以我最终决定不使用它。

感谢阅读!

同比赛其他方案