返回列表

9th place solution

405. Lyft Motion Prediction for Autonomous Vehicles | lyft-motion-prediction-autonomous-vehicles

开始: 2020-08-24 结束: 2020-11-25 自动驾驶决策规划 数据算法赛
第9名解决方案

第9名解决方案

作者:nosound (Kaggle Grandmaster)
比赛:Lyft Motion Prediction for Autonomous Vehicles
排名:9th Place

首先,这是一次组织得非常好的比赛。论坛上 @lucabergamini@iglovikov 的参与堪称典范,可以看出 @iglovikov 在这次比赛中纠正了他自己作为参赛者时可能遇到的问题,做得很好。其次,我认为 Lyft 投资并组织 Kaggle 竞赛并不是一件理所当然的事情。他们不仅提供了数据和大量的时间,还向参赛者公开了他们专有的 l5kit 库。我希望这能通过 Kagglers 产生的想法得到一定程度的回报,无论如何感谢 Lyft 所做的一切,请继续加油。

最终我的解决方案出奇地简单,因为那些花哨的想法效果都不好。然而,有几件事帮到了我,我在下面描述了一切。对我来说,这再次是一个坚持扎实基础的教训。我记得3个月前我开始时,我很兴奋尝试 GANs,因为它似乎是最先进的技术。结果我却离它越来越远。

数据

样本选择

数据集参数是 min_history_steps = 0min_future_steps = 10,这是标准的,可能也是用于切割测试数据的参数。我还添加了另一层过滤——基于状态索引。状态索引是场景内帧的计数,范围从0到250。在测试中,状态索引总是99。如果决定在切割后的数据集上训练,基本上就把自己限制在了状态索引99。但这会削减太多数据,所以我建立了一个类似于现有掩码的掩码,并要求 min_state_history = 30min_state_future = 50。我相信这个改变提高了我的分数。如果没有它,我会得到状态索引从0开始的样本,这并不好。

zarr 文件

从一开始我就使用了完整的训练 zarr,在结束前两周我添加了切割后的验证集和测试集 zarr。最后这部分起初听起来可能令人惊讶。基本上我们在测试和验证中有100帧,通过我的状态索引过滤,我只看第30到50帧进行训练。这是合法的训练数据,我的动机是让模型接触测试数据集的任何特性,比如雨天。经过所有过滤后,我有这么多数据用于训练:

  • 1.4亿 完整训练集
  • 140万 测试集,第30-50帧
  • 190万 验证集,第30-50帧

栅格化

  • 过去12帧 [0,1,2,3,4,5,8,10,13,16,20,30]
  • 3通道语义地图
  • 历史第30帧的另外3通道语义地图,提供过去3秒的交通灯信息
  • 未来帧(如果适用,大约占 87% 的时间)。在此讨论
  • AV 车辆用黑点标记(示例见上面链接)
  • 栅格尺寸 [256,192],其余参数为默认值

上述所有修改都有助于提高分数。

采样

我们有大量的训练数据,所以我有幸确保在整个训练过程中没有重复访问同一个样本。基本上我在训练前生成了顺序,并从中按顺序选取索引。

模型

集成3个模型,来自 timm package

模型 训练集得分 验证集得分 LB 公开榜
mixnet_m, 3 条轨迹 12.10 12.62 12.976
mixnet_l, 3 条轨迹 11.48 12.02 12.285
mixnet_l, 6 条轨迹 6.88