前言
- 论文: https://arxiv.org/pdf/2005.04259
- 代码: https://github.com/xk-huang/yet-another-vectornet
- 年份: 2020.05
- 数据: argoverse + in-house behavior prediction dataset
vectornetfont_20">(vectornet算法流程)
-
读取轨迹和地图数据,将其转换为向量化表示
-
以每个实体的局部子图输出特征作为节点,节点间基于自注意力机制的相似度作为边构建全局图(GNN+self-attention)
-
对所有向量化的polyline实体,使用GNN进行全局交互建模,输出每个实体的隐状态
-
对每个agent,使用一个MLP解码器生成多个可能得未来轨迹,并估计他们的概率
-
计算损失函数,使用ADE和FDE作为评价指标
-
GNN:
(向量表示)
-
地图向量构建
- 选定起点和方向,从相同空间距离的样条中均匀采样关键点,并将相邻关键点顺序连接成向量
-
轨迹向量构建
- 从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
- 向量坐标归一化,使用最后观察点的目标车辆位置为中心
- 消融实验得到的几个结论:
(问题厘清)
-
问题3:vectornet是交互式模型, 支持多智能体同时预测吗?
-
问题4:vectornet输出一个目标的一条还是多条轨迹, vectornet输出除了未来3s轨迹还包括每条轨迹的概率吗(softmax层得到)
[参考文章]
[1]. vectornet阅读笔记
[2]. vectotnet论文翻译和学习笔记
[3]. vectornet vs hivt
[4]. TNT论文
[5]. TNT论文笔记
[6]. denseTNT论文笔记
created by shuaixio, 2024.07.04