前言
- 论文: https://arxiv.org/pdf/2005.04259
- 代码: https://github.com/xk-huang/yet-another-vectornet
- 年份: 2020.05
- 数据: argoverse + in-house behavior prediction dataset
(vectornet算法流程)
-
读取轨迹和地图数据,将其转换为向量化表示
-
对每个向量化的polyline实体,使用子图网络(MLP+GNN)进行局部子图编码,并输出局部特征
-
以每个实体的局部子图输出特征作为节点,节点间基于自注意力机制的相似度作为边构建全局图(GNN+self-attention)
-
对所有向量化的polyline实体,使用GNN进行全局交互建模,输出每个实体的隐状态
-
对每个agent,使用一个MLP解码器生成多个可能得未来轨迹,并估计他们的概率
-
计算损失函数,使用ADE和FDE作为评价指标
-
GNN:
- GNN先聚合轨迹和地图polyline的局部信息,再全局聚合所有polyline之间的特征,然后可以将该图用于行为预测
- GNN聚合polyline局部信息时候通过多层GNN操作来找到polyline内部向量之间的关系,在聚合全局信息时通过self-attention自注意力机制来找到各个polyline之间的联系
(向量表示)
-
地图向量构建
- 选定起点和方向,从相同空间距离的样条中均匀采样关键点,并将相邻关键点顺序连接成向量
-
轨迹向量构建
- 从t=0开始,以固定时间间隔0.1s采样,并将他们连成向量
不管是地图还是轨迹,只要空间或时间间隔合适,生成的折线polyline就可以作为原始元素的近似
(图构建)
-
我们在向量集之上能够形成一个图形表示
-
将polyline的一个向量视为节点, 每个节点特征如下 v i = [ d i s , d i e , a i , j ] v_{i} =[d_{i}^{s}, d_{i}^{e}, a_{i}, j] vi=[dis,die,ai,j]
- 前两个是start和end点坐标, 可以是(x,y)也可以是(x,y,z)
- 第三个是属性特征, 比如目标类型, 时间戳, 道路特征, 道路限速和其他目标特征
- 第四个是polyline的整数id,表示节点属于polyline, polyline内部相同
-
以agent为中心,所有向量的坐标归一化;最后还需要共享所有交互agent的坐标中心以便能并行预测它们的轨迹
(子图构建)
-
在向量级别构建子图, 以利用节点的空间和语义局部性, 属于同一polyline的所有节点相互连接, 即每个节点和polyline其余所有节点连接
-
对于一个polyline, P的节点有 v 1 , v 2 , . . . , v p {v_1, v_2, ..., v_p} v1,v2,...,vp
-
可以定义子图网络如下 v i l + 1 = ϕ r e l ( g e n c ( v i l ) , φ a g g ( v j l ) ) v_{i}^{l+1} = \phi _{rel}(genc(v_{i}^{l}), \varphi _{agg}(v_{j}^{l}) ) vil+1=ϕrel(genc(vil),φagg(vjl))
v i l v_{i}^{l} vil:表示第i个节点L层的节点特征
g e n c genc genc:表示节点的变换,实践中采用MLP来实现
φ a g g \varphi _{agg} φagg:表示节点聚合,用来从相邻的节点获取信息,实践中采用的是max_pooling
ϕ r e l \phi _{rel} ϕrel:表示 v i v_i vi与周围节点的关系,实践中采用的是concatenate操作如下图所示
-
经过多层的堆叠,来获取整个polyline级别的特征 P = φ a g g ( v i L p ) P = \varphi _{agg}(v_{i}^{L_{p} }) P=φagg(viLp)
φ a g g \varphi _{agg} φagg也是max_pooling操作 -
结合上图来理解,总结来说: g e n c o d e r g_encoder gencoder转换单个节点的特征, φ a g g \varphi _{agg} φagg聚合左右相邻节点的信息,而 ϕ r e l \phi _{rel} ϕrel是节点与相邻节点之间的关系算子,可以简单拼接
- m a x p o o l i n g max_pooling maxpooling最大池化:获取相邻节点最为明显的行为特征,如突然加速等
- 上图是一个多层感知机MLP,其权重所有节点共享,MLP包含全连接层,然后进行层归一化,再经过ReLU引入非线性
- 如上图的网络进行堆叠,每个子图网络的 g e n c o d e r g_encoder gencoder权重不同,经过如下处理,得到折线级特征,即再次池化找出一个polyline最需要重点关注的信息 P = φ a g g ( v i L p ) P = \varphi _{agg}(v_{i}^{L_{p} }) P=φagg(viLp)
(全局图构建)
- 全局图的节点就是每个polyline编码的结果, 边就是自注意力机制计算的相似度
- 对折线节点特征{ p 1 , p 2 , . . . , p P {p_1, p_2, ..., p_P} p1,p2,...,pP}上的高阶交互进行建模 { p i l + 1 } = G N N ( p i l , A ) \left \{ p_{i}^{l+1} \right \} =GNN\left ( p_{i}^{l}, A \right ) {pil+1}=GNN(pil,A)
- 从自注意力机制的角度来理解。 A A A是对折线节点集的,假设 A A A是一个全连接图,那么这个图网络被实现为self-attention自注意力操作 G N N ( P ) = s o f t m a x ( P Q P K T ) P V GNN\left ( P \right ) =softmax(P_{Q}P_{K}^{T} )P_{V} GNN(P)=softmax(PQPKT)PV
- P P P是节点特征矩阵, P Q , P K , P V P_{Q},P_{K},P_{V} PQ,PK,PV是其线性投影
- 文章中只使用了单层GNN,也可以使用多层GNN来模拟高阶交互
(解码器: 轨迹预测)
- 推理过程对于移动agent节点解码未来轨迹: v i f u t u r e = φ t r a j ( p i L t ) v_{i}^{future} = \varphi _{traj}(p_{i}^{L_{t} } ) vifuture=φtraj(piLt)
- 其中, L t L_t Lt是GNN总层数, φ t r a j \varphi _{traj} φtraj是轨迹解码器,文章中采用了简单的MLP作为解码器,还可以使用其他类型的解码器
- MLP: 多个全连接层和ReLU激活函数组成, 提取特征并映射到输出向量
- 输入: 局部/全局特征图
- 输出: 二维坐标向量
(辅助研究)
- 文章中为了更好地捕捉不同polyline之间的交互, 在训练期间, 随机屏蔽掉polyline子集特征,如屏蔽 p i p_i pi,然后尝试将其掩盖的特征恢复 p i ^ = φ n o d e ( p i L t ) \hat{p_{i} } =\varphi _{node}(p_{i}^{L_t} ) pi^=φnode(piLt)
- 其中 φ n o d e \varphi _{node} φnode是MLP节点特征解码器,在推理过程中不使用这些解码器
- p i ^ \hat{p_{i} } pi^是全连接无序图中的一个节点,文章中通过计算相对的 p i d p_{id} pid来识别单个 p i p_{i} pi
(损失函数)
L = L t r a j + α L n o d e L=L_{traj}+\alpha L_{node} L=Ltraj+αLnode
- L t r a j L_{traj} Ltraj是预测轨迹与GT轨迹的的交叉熵 -> 负高斯对数似然
- L n o d e L_{node} Lnode是预测节点与掩码节点之间的Huber损失(综合MSE和MAE优点的指标)
- 使用minADE和minFDE作为评价指标
(实验)
- 基线: 使用ConvNet对光栅图像进行编码
- 参数: 使用了3层MLP表示polyline子图,使用1层MLP表示全局交互图,所有MLP中hidden_size = 64
- 向量坐标归一化,使用最后观察点的目标车辆位置为中心
- 消融实验得到的几个结论:
- ConvNet感受野: 精心设计的栅格图裁剪策略能带来性能提升, 但是以增加计算成本为代价
- 渲染分辨率: 随着栅格图渲染分辨率的提高, 性能普遍提高
- 地图信息: 添加地图信息能显著提高预测轨迹性能
- 轨迹信息: 结合他车轨迹信息也能进一步提高性能
- 辅助研究: 添加节点掩码机制有助于提高性能, 尤其是在较长时间范围内
- 图层: 对于折线子图,3层MLP提供了最佳性能,对于全局图,只需要1层 ; 使用更深的MLP不会带来更好的性能
- 注意力机制: 注意力机制可视化,注意力机制是agent能够专注于正确的选择
(问题厘清)
-
问题1:怎么理解子图构建过程中的的MLP, 网络怎么针对所有节点运作的, 是单个polyline的所有节点作为输入?
- 这里的节点node是polyline内每一个vector node;
- 是一个多层MLP, polyline的所有vector nodes features作为输入,文章中是3层MLP,每层的参数不同,但是针对所有节点的(所有节点共享)
-
问题2:文章开头所述, 聚合局部信息的时候使用GNN还是MLP,还是GNN使用MLP实现?
- 子图构建阶段:MLP主要用于vector node节点级别的特征提取,将原始的输入数据转换为有用的特征表示;然后使用GNN进行vector nodes节点间的信息聚合和交互建模。通过这种方式,vectornet能充分利用节点的特征信息,并捕获子图内复杂的交互关系
- 全局图构建阶段:使用自注意力机制的GNN来捕获polyline之间的交互关系,提取每个polyline特征都会根据其他polyline特征进行更新;提取了全局特征后,使用MLP作为解码器生成最终的预测结果,MLP根据全局特征图生成每个agent未来可能的轨迹,并评估这些轨迹的概率,实现从特征空间到输出空间的映射
-
问题3:vectornet是交互式模型, 支持多智能体同时预测吗?
- 可以?
- vectornet是一种交互式模型,通过全局图构建和自注意力机制的应用,使得vectornet能够同时处理多个智能体的预测任务?
-
问题4:vectornet输出一个目标的一条还是多条轨迹, vectornet输出除了未来3s轨迹还包括每条轨迹的概率吗(softmax层得到)
- vectornet预测得到的轨迹是相对于最后一个观测点的坐标偏移coordinate offset
- vectornet生成的是单目标多轨迹,除了给出未来3s轨迹,还会通过内部softmax层给出每条轨迹的概率
- vectornet轨迹偏移通过minADE/minFDE等回归,概率值通过交叉熵损失评估
[参考文章]
[1]. vectornet阅读笔记
[2]. vectotnet论文翻译和学习笔记
[3]. vectornet vs hivt
[4]. TNT论文
[5]. TNT论文笔记
[6]. denseTNT论文笔记
created by shuaixio, 2024.07.04