Waymo开放数据集Sim Agents挑战赛提交问题解析
概述
Waymo开放数据集Sim Agents挑战赛是自动驾驶领域的重要竞赛,要求参赛者模拟交通参与者的未来行为。本文深入分析提交过程中常见的错误和问题,帮助开发者避免常见陷阱,确保提交文件符合规范要求。
提交文件结构要求
核心Proto消息结构
message SimulatedTrajectory {
repeated float center_x = 2 [packed = true];
repeated float center_y = 3 [packed = true];
repeated float center_z = 4 [packed = true];
repeated float heading = 5 [packed = true];
optional int32 object_id = 6;
}
message JointScene {
repeated SimulatedTrajectory simulated_trajectories = 1;
}
message ScenarioRollouts {
optional string scenario_id = 1;
repeated JointScene joint_scenes = 2;
}
message SimAgentsChallengeSubmission {
repeated ScenarioRollouts scenario_rollouts = 1;
optional SubmissionType submission_type = 2;
optional string account_name = 3;
optional string unique_method_name = 4;
// ... 其他必填字段
}
常见提交错误分类
1. 轨迹长度错误
问题描述:模拟轨迹长度不符合80步要求
# 错误示例:轨迹长度不正确
trajectory = SimulatedTrajectory(
center_x=[1.0, 2.0, 3.0], # 只有3步,应为80步
center_y=[1.0, 2.0, 3.0],
center_z=[0.0, 0.0, 0.0],
heading=[0.1, 0.2, 0.3],
object_id=123
)
解决方案:
# 正确示例:确保80步模拟
assert len(trajectory.center_x) == 80
assert len(trajectory.center_y) == 80
assert len(trajectory.center_z) == 80
assert len(trajectory.heading) == 80
2. 模拟对象缺失
问题描述:未包含所有在current_time_index有效的对象
验证代码:
def validate_sim_agents(scenario, joint_scene):
sim_agent_ids = submission_specs.get_sim_agent_ids(scenario, challenge_type)
simulated_ids = [t.object_id for t in joint_scene.simulated_trajectories]
missing_agents = set(sim_agent_ids) - set(simulated_ids)
if missing_agents:
raise ValueError(f"缺失模拟对象: {missing_agents}")
3. 并行模拟数量错误
问题描述:每个Scenario的并行模拟数量不是32个
# 错误:只有16个并行模拟
scenario_rollouts = ScenarioRollouts(
scenario_id="test_scenario",
joint_scenes=[joint_scene] * 16 # 应为32个
)
正确要求:
- 每个Scenario必须包含32个并行模拟
- 每个JointScene代表一个完整的场景模拟
- 所有模拟必须基于相同的初始条件
4. 元数据字段缺失
问题描述:提交文件的元信息不完整
| 字段 | 是否必需 | 说明 |
|---|---|---|
submission_type | ✅ | 必须设置为SIM_AGENTS_SUBMISSION |
account_name | ✅ | 注册Waymo开放数据集时使用的邮箱 |
unique_method_name | ✅ | 简短、描述性且唯一的方法名称 |
uses_lidar_data | ✅ | 是否使用激光雷达数据 |
uses_camera_data | ✅ | 是否使用相机数据 |
num_model_parameters | ✅ | 模型参数量估计 |
5. 文件格式和命名问题
文件命名规范:
submission.binproto-00001-of-00150
submission.binproto-00002-of-00150
...
submission.binproto-00150-of-00150
正则表达式验证:
import re
def validate_filename(filename):
pattern = r".*\.binproto(-\d{5}-of-\d{5})?"
return bool(re.match(pattern, filename))
验证工具使用指南
使用内置验证函数
from waymo_open_dataset.utils.sim_agents import submission_specs
# 验证单个JointScene
submission_specs.validate_joint_scene(
joint_scene, original_scenario, challenge_type
)
# 验证ScenarioRollouts
submission_specs.validate_scenario_rollouts(
scenario_rollouts, original_scenario, challenge_type
)
常见验证错误及解决方法
| 错误类型 | 错误消息 | 解决方法 |
|---|---|---|
| 长度错误 | Invalid center_x tensor length | 检查所有轨迹字段都是80步 |
| 对象缺失 | Sim agents [X] are missing | 确保所有有效对象都被模拟 |
| 数量错误 | Incorrect number of parallel simulations | 确保每个Scenario有32个模拟 |
| ID缺失 | Missing scenario_id field | 为每个ScenarioRollouts设置scenario_id |
性能优化建议
内存管理
# 使用分片处理大型数据集
def process_in_shards(scenarios, shard_size=100):
for i in range(0, len(scenarios), shard_size):
shard = scenarios[i:i+shard_size]
process_shard(shard)
# 及时释放内存
del shard
文件压缩
# 创建提交压缩包
tar -czvf submission.tar.gz *.binproto
调试和测试策略
本地验证流程
测试用例覆盖
import unittest
class TestSubmissionValidation(unittest.TestCase):
def test_trajectory_length(self):
"""测试轨迹长度验证"""
with self.assertRaises(ValueError):
create_invalid_trajectory(length=79) # 应为80
def test_object_completeness(self):
"""测试对象完整性"""
scenario = create_test_scenario()
joint_scene = create_joint_scene_missing_objects(scenario)
with self.assertRaises(ValueError):
submission_specs.validate_joint_scene(joint_scene, scenario)
总结
Waymo Sim Agents挑战赛提交过程中常见问题主要集中在以下几个方面:
- 轨迹长度:必须严格保持80步模拟
- 对象完整性:所有在
current_time_index有效的对象都必须被模拟 - 并行模拟:每个Scenario需要32个并行模拟
- 元数据完整:所有必填字段都必须正确设置
- 文件格式:符合命名规范和压缩要求
通过使用内置的验证工具和遵循本文提供的指南,开发者可以显著提高提交成功率,避免常见的错误和问题。
重要提醒:在正式提交前,务必使用submission_specs.validate_*函数进行本地验证,确保所有要求都得到满足。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



