第二名解决方案 - MABe 鼠标行为检测
竞赛: MABe - 鼠标行为检测 (MABe - Mouse Behavior Detection)
排名: 第 2 名
作者: tenten (takatoyoshikawa), Fishmans (oygdri)
发布日期: 2025-12-16
第二名解决方案
我们想真诚地感谢组织者和 Kaggle 团队举办了如此引人入胜且愉快的竞赛。
概述
我们为单独行动和配对行动训练了独立的模型。
- 输入:形状为 (T = 512, num_features) 的时间序列
- 损失函数:二元交叉熵 (Binary Cross Entropy)
- 最终预测使用实验室 × 动作特定的阈值获得
数据预处理
- 所有跟踪数据均转换为 30 FPS
- 距离/速度/加速度使用预计算统计数据进行标准化
- 缺失值通过线性插值填充
- 缺失的身体部位特征被替换为同一帧中现有身体部位特征的平均值。
处理 AdaptableSnail 的 25 FPS 跟踪数据
参考链接:https://www.kaggle.com/competitions/MABe-mouse-behavior-detection/discussion/612531#3305943
问题:
修复:
- 标签帧率相应调整
- 通过目视检查跟踪可视化视频手动纠正鼠标 ID
输入特征
元特征(跨帧共享)
| 特征 |
通道数 |
| 性别 (Sex) |
单独=1, 配对=2 |
| 帧率缩放 (Frame-rate scale) |
1 |
| 实验室 ID (通过嵌入层) |
16 |
| 候选动作标签 |
类别数(单独=11, 配对=26) |
每帧特征
单独行动 (Solo)
| 特征 |
通道数 |
| 身体部位距离 |
num_bodyparts² |
| 速度 |
num_bodyparts |
| 加速度 |
num_bodyparts |
配对行动 (Pair)
| 特征 |
通道数 |
| 跨鼠标身体部位距离 |
num_bodyparts² |
| 速度 |
2 × num_bodyparts |
| 加速度 |
2 × num_bodyparts |
模型架构
我们使用了两个架构家族。
CNN + RNN / Transformer
输入
→ 多尺度卷积 (k =3,5,7,9)
→ 卷积融合
→ 双向 GRU 或 Transformer
→ 线性层
→ 输出
SqueezeFormer
输入
→ SqueezeFormer
→ 输出
我们训练了 5 个变体,具有不同的深度和超参数。
训练
- 5 折分层交叉验证
- 折仅使用测试集中出现的实验室 ID 数据创建
- 实验室 ID 被分层,以便它们的分布在各折中保持一致
- 来自 CalMS21* 和 CRIM13 的实验室始终包含在训练集中
- 每个动作使用 BCE 进行一对多 (One-vs-rest) 训练
- EMA 衰减 = 0.999
- 带 warmup 的余弦学习率调度
- 在每个 epoch,在验证集上优化每个实验室 - 动作对的阈值,并根据 resulting score 应用早停。
数据增强
- 高斯噪声
- 时间拉伸
- 帧偏移(仅 shift 特征;标签不变)
- 左右身体部位翻转
- Mixup
推理
- 滑动窗口推理,步长 = 128
- 我们丢弃两个窗口边界处的 32 帧,并平均剩余预测。
- 翻转测试时增强 (TTA)
后处理
阈值处理
- 最佳阈值独立计算于每个折和每个实验室 × 动作对,最终阈值通过平均特定于折的阈值获得。
- 对于每一帧,在超过阈值的动作中,选择得分最高的动作
AdaptableSnail 25 FPS 调整
start_frame 和 stop_frame 乘以 30 / 25
- 当跟踪数据中存在鼠标 ID 交换时,此调整没有意义
- 私有数据集似乎包含没有鼠标 ID 交换的跟踪序列
- 对于这些序列,预测与 30 FPS 标签对齐
- 这导致私榜分数提高了 +0.009
结果
| 模型 |
交叉验证 (单独) |
交叉验证 (配对) |
公榜 |
私榜 |
| 集成模型 |
0.069 |
0.499 |
0.542 |
0.521 |
| + AdaptableSnail 后处理 |
— |
— |
0.542 |
0.530 |