665. CMI - Detect Behavior with Sensor Data | cmi-detect-behavior-with-sensor-data
首先,我要感谢比赛主办方和所有参赛者的努力与贡献。看到如此多的创意和奉献精神令人鼓舞。我也很激动能进入获奖范围。下面,我想分享一下我的解决方案概述。
我的解决方案主要 points 如下:
以下是交叉验证 (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 预测;否则,使用所有输入预测。
我将对图中的几个特征块进行解释。
该块由 linear_acc 的三个分量和 global_acc 的三个分量组成。linear_acc 是去除重力后的加速度,计算方式与许多公开 Notebook 相同。global_acc 是在全局(世界)坐标系中表示的加速度;请参阅下方链接中的讨论。
https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/583080
这本质上等同于公开 Notebook 中计算为 angular_vel 的内容。(由于值稍后会标准化,因此省略了除以时间的步骤。)
在时间卷积之前,五个 TOF 传感器中的每一个的值都在 8×8 网格上进行空间卷积。经过三轮步长为 2 的最大池化后,空间维度完全折叠,每个传感器产生 32 个通道(总共 160 个)。然后将生成的特征图以与其他块相同的方式通过时间卷积进行处理。
最重要的预处理步骤之一是处理左撇子受试者。
对于 acc 特征,修复很简单。因为这些特征是左右对称的,翻转 x 分量的符号就足以将左手数据转换为右手数据。这在下面的 acc 直方图中清晰可见。
对于 rot 特征,情况更复杂,所以我将从 rotvec_diff 开始。请注意,绕 x 轴的旋转对于左撇子和右撇子受试者是相同的(就像扭动摩托车油门一样)。相比之下,y 和 z 分量必须翻转符号——这一步被证明对于提高左撇子受试者的准确性至关重要。
乍一看,似乎翻转 y 和 z 也足以处理 rot 值。然而,绕 z 轴的旋转取决于受试者的朝向(除非所有受试者都面向正北进行手势)。所以我首先消除了相对于正北的角度,然后翻转了 rot_y 和 rot_z。在对齐左右手直方图后,估计受试者的朝向大约为北偏 130°(可能是西南方向)。
下面的前后直方图证实了经过此变换后分布匹配。
然而,这种预处理只有在数据采集期间所有受试者都面向同一方向时才可能。对于现实世界的使用,模型不应依赖于绝对方向,因此完全排除 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 分布似乎翻转的事实强烈表明设备是倒置佩戴的。我校正了传感器值,就像设备是正常佩戴的一样:
这些校正不仅极大地提高了两名受影响受试者的准确性(在 CV 中使用 IMU+THM+TOF 准确率超过 90%),而且还略微提高了其他受试者的准确性。
为了准备测试集中出现类似情况,我还训练了一个模型来检测序列是否是在设备旋转 180° 的情况下记录的。该模型架构与手势分类网络完全相同,仅输出类别的数量不同。
由于这并没有提高 Public Score,我不确定是否要包含它。最后,我将其添加到了其中一个最终提交中,而没有添加到另一个中。结果证明它对 Private Score 产生了巨大影响(+0.013),这显著提高了我的 Private Leaderboard 排名。
此外,还应用了一些其他简单的预处理步骤:
感谢阅读!