HiVT代码数据处理部分笔记

一、从整体看

数据预处理部分服务于建模,HiVT模型的关键点在于矢量化车道和智能体轨迹实现局部范围内的交互特征提取和整个场景内的全局特征提取,局部特征提取实际上可以理解为是提取一个固定的交互范围内智能体的交互策略(包括时间轨迹特征和空间交互特征);全局特征为了弥补局部特征的不全面,解决一些潜在的观测不到的智能体对于所预测车辆的轨迹的影响。因此,网络需要轨迹信息、车道信息以及变化的智能体之间的相对关系特征。

二、从训练过程看模型输入

针对训练过程,一个Batch(原模型默认大小为32),也就是32个ArgoverseScenario场景一起并行计算(这里的场景和我们汽车领域的场景种类不一样,而是一个小单位,也就是任何5s的片段都是一个场景,下文对于这样一个片段统称为一个场景);对于一个Batch中的一个小batch就是一个场景,输入是一个batch对象,将它转化为list对象看里面内容:

(Pdb) print(data_list[0])
TemporalData(agent_index=[1], av_index=[1], bos_mask=[41, 20], city="MIA", edge_index=[2, 1640], is_intersections=[1215], lane_actor_index=[2, 9471], lane_actor_vectors=[9471, 2], lane_vectors=[1215, 2], origin=[1, 2], padding_mask=[41, 50], positions=[41, 50, 2], rotate_angles=[41], seq_id=[1], theta=1.5785776376724243, traffic_controls=[1215], turn_directions=[1215], x=[41, 20, 2], y=[41, 30, 2])
(Pdb) print(data_list[1])
TemporalData(agent_index=[1], av_index=[1], bos_mask=[35, 20], city="MIA", edge_index=[2, 1190], is_intersections=[1107], lane_actor_index=[2, 10845], lane_actor_vectors=[10845, 2], lane_vectors=[1107, 2], origin=[1, 2], padding_mask=[35, 50], positions=[35, 50, 2], rotate_angles=[35], seq_id=[1], theta=0.0, traffic_controls=[1107], turn_directions=[1107], x=[35, 20, 2], y=[35, 30, 2])
(Pdb) print(data_list[2])
TemporalData(agent_index=[1], av_index=[1], bos_mask=[49, 20], city="PIT", edge_index=[2, 2352], is_intersections=[873], lane_actor_index=[2, 6414], lane_actor_vectors=[6414, 2], lane_vectors=[873, 2], origin=[1, 2], padding_mask=[49, 50], positions=[49, 50, 2], rotate_angles=[49], seq_id=[1], theta=-2.4966700077056885, traffic_controls=[873], turn_directions=[873], x=[49, 20, 2], y=[49, 30, 2])

实际上HiVT源代码在utils.py中已经定义了这样的一个TemporalData对象,该对象输入为通过argoverse_v1_dataset.py中构建的ArgoverseV1Dataset对象,而不是在argoverse_v1_datamodule.py中,后者只是一个接口作用,载入文件夹的数据文件,调用前者进行对象构建以及划分train,test和val。

Argoverse数据集中对于每一个场景,有一个自动驾驶车辆AV,一个需要预测的车辆Agent,许多其他智能体Others(可能是车辆、行人或障碍物),因此agent_idx和av_index都是一维向量,具体的信息可以在源代码中找到:

 return {
        'x': x[:, : 20],  # [N, 20, 2]
        'positions': positions,  # [N, 50, 2]
        'edge_index': edge_index,  # [2, N x N - 1]
        'y': y,  # [N, 30, 2]
        'num_nodes': num_nodes,
        'padding_mask': padding_mask,  # [N, 50]
        'bos_mask': bos_mask,  # [N, 20]
        'rotate_angles': rotate_angles,  # [N]
        'lane_vectors': lane_vectors,  # [L, 2]
        'is_intersections': is_intersections,  # [L]
        'turn_directions': turn_directions,  # [L]
        'traffic_controls': traffic_controls,  # [L]
        'lane_actor_index': lane_actor_index,  # [2, E_{A-L}]
        'lane_actor_vectors': lane_actor_vectors,  # [E_{A-L}, 2]
        'seq_id': int(seq_id),
        'av_index': av_index,
        'agent_index': agent_index,
        'city': city,
        'origin': origin.unsqueeze(0),
        'theta': theta,
    }

结合上面调试的结果,就可以知道N为一个场景内智能体的数量,key为bos_mask表示每个智能体开始出现的时刻,用布尔值体现(可以用来判断某些突然出现的东西)形如:

(Pdb) print(data_list[0].bos_mask)
tensor([[ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [ True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [False,  True, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [False,  True, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [False, False,  True, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [False, False, False, False,  True, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [False, False, False, False, False, False, False,  True, False, False,
         False, False, False, False, False, False, False, False, False, False],
        [False, False, False, False, False, False, False, False,  True, False,
         False, False, False, False, False, False, False, False, False, False],
        [False, False, False, False, False, False, False, False, False, False,
          True, False, False, False, False, False, False, False, False, False],
        [False, False, False, False, False, False, False, False, False, False,
         False,  True, False, False, False, False, False, False, False, False],
        [False, False, False, False, False, False, False, False, False, False,
         False, False, False,  True, False, False, False, False, False, False],
        [False, False, False, False, False, False, False, False, False, False,
         False, False, False, False,  True, False, False, False, False, False],
        [False, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False,  True, False, False, False, False],
        [False, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False,  True, False, False, False],
        [False, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False,  True, False],
        [False, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False,  True, False],
        [False, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False,  True, False],
        [False, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False,  True, False],
        [False, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False,  True, False]])

city为城市信息,edge_index表示哪两个智能体之间存在交互关系,用来形成图结构的边;is_intersections判断该道路片段是否在十字路口范围内,调用的是官方API的lane_is_in_intersection函数;traffic_controls判断道路片段是否存在限速,调用的是官方API的lane_has_traffic_control_measure函数,判断该道路片段是否存在限速,存在则为1;lane_actor_index含义为:将每一个道路片段向量看成一个节点,节点之间存在的联系,即为道路节点的边是否存在的定义矩阵;lane_actor_vectors表示在所计算的智能体50m圆形范围内,可以与之存在交互的车道向量集合,lane_actor_vectors左乘lane_actor_index得到道路的特征矩阵,体现了车道的相互连通关系、车道位置和车道的行驶方向lane_vectors为车道中心线(t+1)-t时刻计算得到的向量,一个向量为一个节点信息,即为一个车道向量;

origin表示自动驾驶自车在预测时刻的坐标;padding_mask作为一个flag,当该智能体在该时刻为false则需要在预测中考虑,如果为True,则为当前时刻不可见智能体,不需要添加到考虑范畴。positions,rotate_angles分别为,智能体在5s内以0.1s为分隔的x,y坐标以及在预测时刻各个智能体的航向角;seq_id表示场景片段编号;theta为自车在预测时刻的航向角相邻时刻的相对值;turn_directions表示车道中心线为直行车道、左转或右转的编码(0,1,2);x,y便为所有智能体在5s内的具体坐标(添加了mask处理的,也就是去除了不需要考虑预测的片段,x为历史坐标,y为未来的真实坐标,值得注意的是positions是x+y克隆)

三、总结HiVT模型的数据预处理部分

从第二部分的分析,可以发现模型的输入是一个包含智能体的属性(agent_index,av_index, edge_index),智能体的运动特征(origin,positions,rotate_angles,theta,x,y),智能体交互特征(edge_index:哪些智能体有联系;bos_mask和padding_mask:哪些智能体的哪些时刻不与考虑或未来哪些时刻不用预测),道路信息(lane_actor_index,lane_actor_vectors,lane_vectors,traffic_controls,turn_directions)和其他关于地点的信息,因此模型输入考虑的因素有智能体的轨迹和空间交互、道路连通关系、限速、行驶方向、道路拓扑结构和是否为十字路口的编码信息。

针对模型输入推测预处理过程:

1. 获取需要预测或需要考虑的智能体,去除某时刻不可见智能体或突然出现或消失的东西(不做预测)

2. 将历史轨迹存入x,未来轨迹存入y(为了test时候,因为测试的时候y为None)

3. 将车道片段和中心线片段转化为这一时刻到下一时刻的相对矢量为一个对象,对于每一个对象调用API中的函数获取上述车道特征。

4. 综合上述特征为一个字典形式返回。

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。这些代码不仅能帮助你理解数据结构的基本概念,而且能让你明白如何在实际情况中应用这些数据结构。 笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和参考书籍。这些书籍将帮助你建立完整的数据结构知识体系。 适用人群: 这份学习资料适用于所有大学计算机相关专业的学生,无论你是初学者还是已经有一定的数据结构基础。同时,对于对数据结构感兴趣的非专业人士,这份资料也是一个很好的起点。 使用建议: 结合理论和实践:在学习的过程中,请结合算法代码和理论知识。尝试自己编写代码实现数据结构,并在遇到问题时参考提供的代码。 由浅入深:建议先从基础的数据结构开始学习,如数组和链表,然后再学习更复杂的数据结构如树和图。 多做练习:数据结构是实践性很强的学科。通过多做练习,你可以更好地理解数据结构的基本概念和原理,并提高编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值