感谢所有参与者,这是一场非常有趣且具有挑战性的比赛。我们对获得第 3 名感到非常高兴 :)
我们的工作得益于团队成员之间的出色合作与协同 - @minerppdy, @nazarov, @ren4yu & @theoviel - 每个人都为获得第 3 名做出了贡献。
概述
我们的解决方案是一个由团队成员精心调整的管道集成。原样集成 achieves 公有榜 0.882 - 私有榜 0.864。
我们通过限制每个 subject 每对 (gesture, orientation) 仅进行 2 次预测,提升到了 公有榜 0.897 - 私有榜 0.878 (第 3 名)。我们将在本节末尾解释此后处理步骤。
团队管道包含一个仅 IMU 序列的分支,和一个全数据序列的分支(复用了一些仅 IMU 模型),如下所示。
后处理
如上所述,我们应用了一个后处理步骤,限制每个 subject 每对 (gesture, orientation) 仅进行两次预测。此优化是在线完成的,并使用匈牙利算法 (Hungarian method)。
我们在 predict 函数中为每个 (subject, orientation) 桶保留模型预测的缓存。对于每个要分类的新样本,我们将其追加到该桶的列表中;设列表长度为 N。在这种情况下,我们有一个 (N, num_classes) 预测矩阵,并创建一个 (N, num_classes * 2) 成本矩阵,然后运行 linear_sum_assignment。这里的 * 2 意味着我们允许每个类被分配两次。然后我们返回分配给最后一行(新样本)的类。
重要的一点是,我们为每个样本到达从头优化,忽略之前返回给 API 的结果。我们也知道某些 (gesture, orientation) 对不存在,但没有将其包含在算法中(我们想到这点时太晚了)。
后处理结果根据序列顺序变化很大,导致我们最差 finishing 在第 6 名 - 虽然运气好一点的选择可能会让我们获得第 2 名。
总体思路
以下是我们管道中共享的一些关键事项。虽然实现可能略有不同,但它们为所有模型提供了关键提升。
- 惯用手归一化 (Handedness normalization):对于 handedness = 1 的样本,我们将特征规范化到共同的一侧。
- IMU:首先使用 z 轴 -110° 的四元数旋转进行左右翻转,或简单地交换符号。
- THM:交换第 3 和第 5 通道
- ToF:交换第 3 和第 5 通道。我们也翻转了一些 8×8 图像,虽然这不太重要
- 左侧填充和截断更有意义。
- 四元数的约定是使 rot_w 为正。这会导致序列不连续。我们中的一些人平滑了数据以使训练更容易。为了使其真正改进模型,我们添加了符号翻转增强或四元数的对称块:
rot_block(quat) + rot_block(-quat) - 用户
SUBJ_019262和SUBJ_045235没有正确佩戴设备,导致 y_acc 和 x_acc 反转,以及 quat 和 tof 数据旋转了 180 度。它们在训练期间被修复。虽然我们训练了一个异常检测模型来探测 LB 中类似的异常值,但没有发现任何东西。这可能是我们这边的疏忽,因为 @rsakata 报告类似策略有 +0.01 的提升。 - 数据增强很重要,我们发现最有用的包括:
- Mixup
- Tof dropout
- 拉伸和移位序列 (Stretch & shift the sequence)
- 使用四元数表示进行旋转
- 序列的 Cutmix
- 公开共享的特征非常强,所以我们原样使用它们或使用了一些变体。很难找到新的东西。
Theo 的管道
作者:@theoviel
Transformers
我最初致力于基于 transformer 的模型,从 这个非常强的基线 开始。
在修复左/右手问题后,我重新制作了增强功能,调整了架构,添加了辅助头以及我能找到的所有有助于 CV 的东西。我分别针对仅 IMU 和全数据调整了架构。
虽然我能想出有用的特征(例如使用频谱图、高通滤波),但基于 transformer 的模型融合效果很差,我认为它们有点过度工程化了。
一些想法
- 特征是在应用增强后计算的,从物理角度来看这更有意义
Tof 特征(主要是区域聚合特征)是在模型内部计算的以加速 GPU,我也使用了 3D-CNN - 我稍微调整了公开 kernel 中的 SE-1D-CNN 块,但我不确定它是否真的有帮助。一些模型使用池化来减少步长,而另一些则没有。一些还使用了具有不同 kernel 大小的并行 1D-CNN 块。
- 我还调整了不同的 transformers / RNN 层以增加多样性(GRU, Deberta, squeezeformer, skip-connections)
- 我添加了一个带有 BCE 的手势/转换掩码头 (gesture/transition mask head),它也用于池化,因为大部分信号发生在转换之后。
CNNs
@nazarov 在将原始输入馈送到 2D CNNs 方面取得了很大成功。虽然这对我来说真的没有意义,因为这意味着特征交互将在模型后期发生。
它在我的管道中几乎开箱即用,只需简单调整大小到所需的图像尺寸。关键是要更加小心特征选择(使用更少的特征),并以不同的顺序使用(大多数)特征两次,以缓解特征交互问题。
我去掉了手势掩码头,使用了方向头 (orientation head),它被重用于后处理。我最终发现 maxvit 和 convnext-v2 骨干网络的结果最好。
结果
CNN 的 CV 与 transformers 相似,但它们在团队集成中融合得更好,并且在 LB 上更强。最终,使用了以下模型:
- IMU - CV 0.844
- IMU + TOF + THM - CV 0.897
- 公有榜 0.868 和 私有榜 0.852
Yu4u 的管道
作者:@ren4yu
概述
模型
我使用了两个模型:一个带有 IMU+THM+ToF,另一个仅 IMU。
两个模型都有一个 efficientnet-like 1D CNN 骨干网络。
对于仅 IMU 模型,我还使用了 ModernBERT 骨干网络。
特征与团队的相似
增强
时间缩放,mixup,tof 的 2d blockdrop,随机丢弃 thm 和 tof 的第 3 或第 5 通道,imu 特征的高斯噪声
辅助任务
训练带有辅助头来预测行为和方向。
训练
AdamW 优化器配合余弦退火,128 个 epoch,batch size = 32,learning rate = 2e-3,weight decay = 0.2,以及 0.9995 的指数移动平均 (EMA) 衰减。
结果
- 仅 IMU 模型 - CV: 0.8423
- IMU+THM+ToF 模型 - CV: 0.8857
- 公有榜 LB: 0.862, 私有榜 LB: 0.847
Leonid 的管道
作者:@nazarov
总结
这是我第一次体验图像处理,方法的某些方面可能看起来有些 naive,但它有效。核心思想很简单:如果我可以在特征图上 visually 区分手势,为什么预训练的图像分类模型不能做到同样的事情呢?
我咨询了 Qwen-coder 以获得 suitable 模型和预处理技术的建议。 resulting 管道很简单。
输入数据,形状为 (n_timestamps, n_features),首先调整大小为 (image_size, image_size)。为了使其兼容期望三通道图像的模型,单通道输入被重复三次, resulting 最终形状为 (3, image_size, image_size)。然后将此处理后的输入馈送到具有修改后的最后一层以适应分类任务的模型中。
我尝试了所有低于 200 MB 的流行模型,EfficientNet 系列似乎是最有效的。
我在集成中使用了 EfficientNetB0, B3, B5, V2_S 和 V2_M。所有模型都在全数据上重新训练。
其他有效的东西
- 通过零数组分离特征组。
- 损失函数,是 3 个损失的加权和:18 类的 CE,9 类的 CE(非目标手势合并为一个类)和 2 类的 CE(目标/非目标)。
结果
EfficientNetB5 在仅 imu 上 CV 为 0.8310,在所有传感器数据上为 0.8868,是最强的。完整集成得分为 CV / 公有榜 / 私有榜 = 0.8636 / 0.863 / 0.859。
它的一个子集被包含在团队集成中,以最大化多样性并优化团队 CV。
Minerppdy 的管道
作者:@minerppdy
关键想法
- 特征
- 基于局部坐标系的下一步相对四元数。
- 角加加速度/加加加速度 (Angular jerk/snap)
- 加速度加加速度/加加加速度 (Acc jerk/snap)
- 线性加速度
- 增强
- 围绕世界坐标系的 z 轴随机角度(从 -60 到 60 度)旋转四元数,以增加 against 试验 subject 面对不同方向的鲁棒性。
- 围绕局部坐标系的 y 轴小随机角度(从 -7 到 7 度)旋转加速度计和四元数数据,以增加 against 设备佩戴方式细微变化的鲁棒性。
模型
架构如下所示,关键思想是使用多个分支来处理不同的输入通道。
结果
- 仅 IMU 模型 - CV: 0.8283
- IMU+THM+ToF 模型 - CV: 0.8850
- 公有榜 LB: 0.859, 私有榜 LB: 0.848
--
感谢阅读!


