Lyft 自动驾驶数据集及运动预测建模教程。
作者: Lyft Self-Driving Team 编译: McGL
要实现完全自动驾驶,尚未解决的关键问题之一是预测自动驾驶汽车附近物体的行为。使用我们的 Prediction 数据集和 L5Kit 工具包,即使你之前没有自动驾驶相关经验,也可以在一个空闲的下午或周末开始构建运动预测模型。如果成功的话,你可以帮助推动自动驾驶行业作为一个整体向前发展,如果你的解决方案在 Kaggle 竞赛中名列前茅,你甚至可以获得我们3万美元奖金池的一部分。
什么是运动预测,为什么它很重要?
自动驾驶汽车栈的三个主要组成部分: 感知(汽车周围是什么?),预测(接下来会发生什么?),规划(汽车应该做什么?)
让我们从自动驾驶汽车的工作原理开始。在自动驾驶汽车栈中,建立自动驾驶系统的第一步是感知(识别我们周围的事物)。接下来的两个任务是预测(判断接下来会发生什么)和规划(决定 自动驾驶汽车即将做什么)。我们正专注于第二个任务。
自动驾驶汽车需要能够对未来做出预测 —— 这是司机们一直在潜意识里做的事情。设想一辆自动驾驶汽车试图左转,而另一辆车正从相反的方向驶来。为了使自动驾驶汽车安全地执行这一操作,它需要确定另一辆车是右转还是继续直行并干扰左转。这正是运动预测的意义所在。
举个例子: 对于自动驾驶汽车执行无保护的左转,它需要知道迎面而来的车辆是右转还是直行并干扰自动驾驶汽车的左转。
虽然业界认为感知可用于生产了,但预测和计划仍然需要继续改进。为什么自动驾驶汽车栈后面后两部分仍然没有解决呢?
目前,运动预测和规划模型主要采用基于规则的系统。然而,未来是不确定的,规则在不确定的情况下不一定能很好地扩展。当你把其他代理(agents)加入到这个混合体中,规则的数量和成本就会呈指数增长。一个深度监督式学习方法可以解决这个问题,但是你需要大量的数据来正确捕捉路面上罕见的和意想不到的行为。好消息: 我们的 Prediction 数据集是同类中最大的,包括了这些罕见的行为。
训练你的模型
要训练模型,你需要:
- 下载 Lyft Level 5 Prediction Dataset 数据集
- 获取任务的输入和输出
- 定义模型
- 训练模型
为了使这些步骤变得简单,我们准备了一个Jupyter notebook:https://github.com/lyft/l5kit/blob/master/examples/agent_motion_prediction/agent_motion_prediction.ipynb。
1. 下载 Level 5 Prediction 数据集
访问我们的 Prediction 数据集网页来注册和下载数据集。这个数据集包括超过1000小时的驾驶数据,超过16000英里,由我们在加州 Palo Alto 的自动驾驶车队采集。我们已经在我们的内部生产感知栈运行了数据集,因为直接用原始数据建立预测模型效率不高。这意味着你可以在我们的感知输出的识别到的交通代理上,立即开始建立运动预测模型,并和 ground truth 比较结果。
除了这些数据,我们还包括一个航空地图和由 Level 5 研究人员注释的高清晰语义图。想了解更多可以看这篇论文:https://arxiv.org/abs/2006.14480
L5 Prediction 数据集的快照,它包含了我们在加州 Palo Alto 的自动驾驶车队采集的1000小时的驾驶记录
2. 获取任务的输入和输出
Prediction 数据集以不同的时间戳记录自动驾驶汽车周围的世界。每个时间戳包括:
- 一帧(frame) 帧是自动驾驶汽车本身的记录。包含它的位置和旋转,以及在那一瞬间检测到的所有代理和交通信号灯的列表。
- 代理(Agents) 代理是世界上可移动的实体。代理有类别(汽车、行人等)和位置信息。代理还有唯一的 ID,可以在连续帧之间跟踪。
获取帧和代理的信息只需简单的运行下面这段代码:
代码语言:javascript复制zarr_dt = ChunkedDataset("PATH")
zarr_dt.open()
for frame in zarr_dt.frames:
print(frame["ego_translation"], frame["ego_rotation"])
for agent in zarr_dt.agents:
print(agent["centroid"], agent["yaw"])
在处理自动驾驶汽车数据时,一个常见的选择是使用鸟瞰图(Bird’s-Eye View/BEV)光栅化(rasterization)作为系统的输入,其中包括场景的自顶向下视图。这简化了模型的构建,因为输入和输出的坐标空间相同。
为 DCNN 的训练准备好鸟瞰图和输出轨迹只需要几行代码:
代码语言:javascript复制cfg = load_config_data("CONFIG PATH")
rast = build_rasterizer(cfg, LocalDataManager("DATASET PATH"))
dataset = AgentDataset(cfg, zarr_dt, rast)
agent_idxs = range(0, len(dataset))
for agent_idx in tqdm(agent_idxs):
data = dataset[agent_idx]
img = data["image"] # BEV input
translations = data["target_positions"] # future translations for the agent
在我们的高清语义地图上覆盖的输入鸟瞰图看起来像这样:
数据集驾驶场景的例子,拍摄到自动驾驶汽车周围其他代理的位置。
3. 定义模型
定义一个使用你的输入和输出进行训练的模型。你可以通过调整标准的 CNN 结构(例如 ResNet50)来创建一个简单的基准。你可以保留网络的中心部分,但是需要更改其输入和输出层以匹配你的设置。
要做到这一点,先匹配第一个卷积层的通道数和鸟瞰图的通道数。一个3通道的卷积层不足以栅格化不同层的不同语义信息。接下来,确保输出的数量与你未来的预测平面乘以每个时间戳元素相匹配(下面的例子中的 XY 位移)。比如平面50步,你需要在我们网络的最后一层总共有100个神经元。
一个简单的神经网络接受围绕代理的鸟瞰光栅输入和预测其未来的轨迹。
在 PyTorch 中,代码像这样:
代码语言:javascript复制model = resnet50(pretrained=True)
# change input channels number to match the rasterizer's output
model.conv1 = nn.Conv2d(
num_in_channels,
model.conv1.out_channels,
kernel_size=model.conv1.kernel_size,
stride=model.conv1.stride,
padding=model.conv1.padding,
bias=False,
)
# change output size to (X, Y) * number of future states
model.fc = nn.Linear(in_features=2048, out_features=num_targets)
4. 训练模型
现在,你已经准备好用数据训练基线模型。该模型将输入鸟瞰图并被要求预测未来的轨迹。你可以设置一个均方差(MSE)标准 ,并使用 ADAM 优化器优化网络。PyTorch 代码如下:
代码语言:javascript复制optimizer = optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.MSELoss(reduction="none")
outputs = model(torch.from_numpy(img)).reshape(translations.shape)
loss = criterion(outputs, translations)
optimizer.zero_grad()
loss.backward()
optimizer.step()
几次迭代后,我们还可以在以自动驾驶汽车为中心的鸟瞰图光栅上绘制预测轨迹。
如果你想深入了解我们的代码库和数据集,请观看我们专门做的 demo (跳到20:19):https://vimeo.com/451293003
让你的模型更进一步
这里有一些想法和技巧可以用来改进和实验你的模型:
- 如果你想提高速度并使用更轻量级的 EfficientNet 来替换 ResNet,只需简单地替换第一层和最后一层。
- 想知道一个代理的历史记录是否可以提高性能?更改配置值就可以了,开箱即用。
- 你可以增加光栅的分辨率,甚至改变它的长宽比,如果它看起来太粗糙的话。
- 每个代理一个轨迹不足以捕捉不确定性吗?我们已经提供了评分多模态预测的指标,因此你可以直接知道你的模型是否有所改进。
参加 Kaggle 竞赛
现在你已经准备好模型了,那准备好迎接挑战了吗?我们的 Kaggle 比赛正在进行,参赛者已经打破了排行榜上的记录。参赛作品的数量正在迅速增加,但仍有两个月的时间来竞争3万美元的奖金。
如果你从来没有向 Kaggle 提交过,以下是一些建议:
- 如果你还没有在 Kaggle 上注册过,可以添加你的电话号码来解锁 GPU 训练。
- 我们的 L5Kit 已经包含在 Kaggle 环境中,因此你仍然可以使用本地工作流。
- 如果你对得分榜前列的解决方案感兴趣,作者很可能已经在 notebooks 栏目上分享过了。如果你正在寻找一些灵感,这是一个很好的起点。
- 如果你很了解 TPU的话,我们还有一个特定的 TPU 工作流。
我们很高兴能够鼓励研究社区的创新,阐明自动驾驶领域尚未解决的重要挑战,并推动整个自动驾驶行业向前发展。祝你在竞赛中好运,非常期待看到你建模的成果!
原文: https://medium.com/lyftself-driving/how-to-build-a-motion-prediction-model-for-autonomous-vehicles-29f7f81f1580