计算机视觉算法——基于深度学习的高精地图算法(HDMapNet / VectorMapNet / MapTR / VectorNet)

news2024/11/14 15:41:23

计算机视觉算法——基于深度学习的高精地图算法(HDMapNet / VectorMapNet / MapTR / VectorNet)

  • 计算机视觉算法——基于深度学习的高精地图算法(HDMapNet / VectorMapNet / MapTR / VectorNet)
    • 1. HDMapNet
      • 1.1 网络结构及特点
        • 1.1.1 Image and Point Cloud Encoder
        • 1.1.3 Bird's-eye View Decoder
      • 1.2 实验结果
    • 2. VectorMapNet
      • 2.1 网络结构及特点
        • 2.1.1 Map Element Detector
        • 2.1.2 Polyline Generator
        • 2.1.3 Training Loss
      • 2.2 实验结果
    • 3. MapTR
      • 3.1 网络结构及特点
        • 3.1.1 Map Decoder
        • 3.1.2 Permutation-Based Modeling and Matching
      • 3.2 实验结果
    • 4. VectorNet
      • 4.1 网络结构及特点
        • 4.1.1 Graph Node Encoder
        • 4.1.2 Graph Node Interaction
        • 4.1.3 Graph Node Decoder
        • 4.1.4 Training Loss
      • 4.2 实验结果

计算机视觉算法——基于深度学习的高精地图算法(HDMapNet / VectorMapNet / MapTR / VectorNet)

高精地图广泛应用于自动驾驶领域,传统的高精地图构建和使用算法通常是基于SLAM实现的,但是最近两年出现了很多基于深度学习的方法,例如HDMapNet、VectorMapNet和MapTR就介绍了如何通过NN直接利用感知信息构建矢量化的高精地图,而VectorNet介绍了如何使用NN直接对矢量化的高精地图信息进行编码,从而能高效地作为一路输入被系统所利用。下面

1. HDMapNet

HDMapNet为2021年发表的文章,原论文名为《HDMapNet: An Online HD Map Construction and Evaluation Framework》,该论文的主要目的是利用自动驾驶车辆上的环视相机和激光雷达对BEV视角下的地图元素进行矢量化。

1.1 网络结构及特点

网络结构如下图所示:
在这里插入图片描述
整个网络结构主要有Image and Point Cloud Encoder和Bird’s-eye View Decoder构成,输出分割结构后通过后处理输出结构化地图元素。

1.1.1 Image and Point Cloud Encoder

相机输入图片通过一个权重共享的特征提取网络编码为特征图 F I i p v ⊆ R H p v × W p v × K \mathcal{F}_{\mathcal{I}_i}^{\mathrm{pv}} \subseteq \mathbb{R}^{H_{\mathrm{pv}} \times W_{\mathrm{pv}} \times K} FIipvRHpv×Wpv×K,然后通过MLP将特征图映射到BEV下,方法类似VPN,不同的是在本论文中显示地使用了相机的外参: F I i c [ h ] [ w ] = ϕ V i h w ( F I i p v [ 1 ] [ 1 ] , … , F I i p v [ H p v ] [ W p v ] ) \mathcal{F}_{\mathcal{I}_i}^c[h][w]=\phi_{\mathcal{V}_i}^{h w}\left(\mathcal{F}_{\mathcal{I}_i}^{\mathrm{pv}}[1][1], \ldots, \mathcal{F}_{\mathcal{I}_i}^{\mathrm{pv}}\left[H_{\mathrm{pv}}\right]\left[W_{\mathrm{pv}}\right]\right) FIic[h][w]=ϕVihw(FIipv[1][1],,FIipv[Hpv][Wpv])其中 ϕ V i h w \phi_{\mathcal{V}_i}^{h w} ϕVihw建立了从前视图特征到BEV特征的映射关系,最后在BEV下通过相机的外参将各个相机的特征进行加权平均。

激光的编码使用的PointPillar的方法,首先将三维空间划分为多个Pillar,使用PointNet将同一个Pillar中的激光点处理成特征: f j pillar  = PN ⁡ ( { f p ∣ ∀ p ∈ P j } ) f_j^{\text {pillar }}=\operatorname{PN}\left(\left\{f_p \mid \forall p \in P_j\right\}\right) fjpillar =PN({fppPj})最后通过卷积网络 ϕ pillar  \phi_{\text {pillar }} ϕpillar 在BEV下对Pillar进行进一步特征提取得到 F P b e v \mathcal{F}_P^{\mathrm{bev}} FPbev

1.1.3 Bird’s-eye View Decoder

解码部分使用的Backbone是FCN,然后接三个输出头,其中第一个输出头进行车道语义分割;第二个输出头进行车道实例分割;第三输出头进行车道方向预测,这里我们详细介绍下车道实例分割和车道方向预测的设计:
车道实例分割是基于Instance Embedding实现,即同一个车道实例网络应该输出相同或接近的Instance Embedding,Instance Embedding的Loss定义如下: L v a r = 1 C ∑ c = 1 C 1 N c ∑ j = 1 N c [ ∥ μ c − f j i n s t a n c e ∥ − δ v ] + 2 L_{v a r}=\frac{1}{C} \sum_{c =1}^C \frac{1}{N_c} \sum_{j=1}^{N_c}\left[\left\|\mu_c-f_j^{\mathrm{instance}}\right\|-\delta_v\right]_{+}^2 Lvar=C1c=1CNc1j=1Nc[ μcfjinstance δv]+2 L d i s t = 1 C ( C − 1 ) ∑ c A ≠ c B ∈ C [ 2 δ d − ∥ μ c A − μ c B ∥ ] + 2 , L_{d i s t}=\frac{1}{C(C-1)} \sum_{c_A \neq c_B \in C}\left[2 \delta_d-\left\|\mu_{c_A}-\mu_{c_B}\right\|\right]_{+}^2, Ldist=C(C1)1cA=cBC[2δdμcAμcB]+2, L = α L v a r + β L dist  . L=\alpha L_{v a r}+\beta L_{\text {dist }} . L=αLvar+βLdist .其中 L v a r L_{v a r} Lvar为方差损失, L d i s t L_{d i s t} Ldist为距离损失。 C C C为真值中车道实例的个数, f j i n s t a n c e f_j^{\mathrm{instance}} fjinstance为第 j j j个预测为实例 c c c的Instance Embedding, N c N_c Nc为预测为第c个车道实例中的像素个数, μ c \mu_c μc为预测为第c个车道实例中像素的均值, ∥ ⋅ ∥ \|\cdot\| L 2 L2 L2归一化, [ x ] + = max ⁡ ( 0 , x ) [x]_{+}=\max (0, \mathrm{x}) [x]+=max(0,x) δ v \delta_v δv δ d \delta_d δd分别为方差损失和距离损失的裕度。方差损失损失函数的大概含义就是使得同一个车道实例的Instance Embedding尽可能接近,而距离损失则是使得不同车道实例的尽可能不同

车道方向预测定义如下:
方向的预测的目标是预测车道线上每一个像素 C C C的方向,实际上是定义了一系列用于描述方向的节点,每个节点将方向划分为 N d N_d Nd个类别,假定当前节点的方向为 C n o w C_{now} Cnow,那么下一个节点的方向为 C n e x t = C n o w + Δ s t e p ⋅ D C_{n e x t}=C_{n o w}+\Delta_{s t e p} \cdot D Cnext=Cnow+ΔstepD,其中 Δ s t e p \Delta_{s t e p} Δstep为预先定义好的步长。由于我们在预测的时候并不知道当前节点方向,因此我们需要同时预测前向和后向节点的方向,因此每个节点方向的真值是一个长为 N d N_d Nd的向量,向量中只有两个值为1,其他的均为0,最后车道方向计算的是一个分类损失。(这一部分通过论文解释其实理解得不是很透彻,实践的时候还是要结合代码具体看下)

在HDMapNet中最后是通过一系列后处理来讲分割结果进行矢量化的,首先使用DBSCAN算法对Instant Embedding进行聚类,然后通过NMS算法减少冗余,最后通过方向使用贪婪算法进行连通域搜寻输出矢量化结果。(这一部分也需要结合代码才能了解到细节)

1.2 实验结果

论文中对IPM,Lift-Splat-Shoot,VPN经典算法进行了可对比,同时对激光和视觉输入进行了Ablation Study,可以看到,激光和视觉融合的HDMapNet效果是最好的。
在这里插入图片描述
以上是可视化结果,其中IPM是直接将PV的分割结果通过逆透视变换投影到BEV下;IPM(B)是先将PV图投影到BEV下,然后在BEV下进行分割;IPM(CB)是在PV进行特征提取,将提取的特征图投影到BEV下进行解码;Lift-Splat-Shoot是通过预测的深度显示地将2D图片转化为3D点云特征,并最终映射到BEV下;VPN是通过MLP将PV上的特征映射到BEV下;定量结果如下:
在这里插入图片描述

2. VectorMapNet

VecotrNetMap发表于2022年,原论文名为《VectorMapNet: End-to-End Vectoried HD Map Learning》,该论文的主要贡献是实现了一个端到端输出矢量化地图元素的网络。

2.1 网络结构及特点

网络结构如下图所示:
在这里插入图片描述
VectorMapNet对激光输入和视觉输入的编码和HDMapNet类似,在此就不再赘述,这里主要介绍下上图中展示的Map Element Detector以及Polyline Generator这两部分。

2.1.1 Map Element Detector

在VectorNetMap中所有地图元素都通过Polyline进行表达。Map Element Detector的作用主要是在BEV feature中检测出关键点 A i = { a j ∈ R 2 ∣ j = 1 , … , k } A_i=\left\{a_j \in \mathbb{R}^2 \mid j=1, \ldots, k\right\} Ai={ajR2j=1,,k},这些关键点并不是网络最后输出的Polyline的采样点,而仅仅是对地图元素轮廓的一种描述。这些关键点输入Polyline Generator进一步Decoder最后才得到的Polyline上的采样点。

具体而言,论文中使用的是一种类似DETR的方式,通过Element Queries { q i elem  ∈ R k × d ∣ i = 1 , … , N max ⁡ } \left\{q_i^{\text {elem }} \in \mathbb{R}^{k \times d} \mid i=\right.\left.1, \ldots, N_{\max }\right\} {qielem Rk×di=1,,Nmax}与BEV Feature进行一系列Cross Attention和Self Attention。其中,每个Element Query由 k k k个可学习的Query Embedding组成,即 q k p : q i elem  = { q i , j k p ∈ R d ∣ j = 1 , … , k } q^{\mathrm{kp}}: q_i^{\text {elem }}=\left\{q_{i, j}^{\mathrm{kp}} \in \mathbb{R}^d \mid j=1, \ldots, k\right\} qkp:qielem ={qi,jkpRdj=1,,k}。为了节省计算量,作者这里采用的Deformable Attention Module,关于Deformable Attention Module的相关知识可以参考计算机视觉算法——基于Transformer的目标检测(DETR / Deformable DETR / DETR 3D)。Query Embedding最后通过两个MLP分别回归出关键点坐标 a i , j = MLP ⁡ k p ( q i , j k p ) a_{i,j} = \operatorname{MLP}_{\mathrm{kp}}\left(q_{i, j}^{\mathrm{kp}}\right) ai,j=MLPkp(qi,jkp)和类别 l i = MLP ⁡ c l s ( [ q i , 1 k p , … , q i , k k p ] ) l_i=\operatorname{MLP}_{\mathrm{cls}}\left(\left[q_{i, 1}^{\mathrm{kp}}, \ldots, q_{i, k}^{\mathrm{kp}}\right]\right) li=MLPcls([qi,1kp,,qi,kkp]),其中 [ ⋅ ] [\cdot] []表示Concatenate操作。

2.1.2 Polyline Generator

Polyline Generator的目标是生成地图元素轮廓的细节,Polyline Generator是对Polyline生成一个坐标分布 p ( V i p o l y ∣ a i , l i , F B E V f ) p\left(V_i^{\mathrm{poly}} \mid a_i, l_i, \mathcal{F}_{\mathrm{BEV}}^f\right) p(Vipolyai,li,FBEVf),即在知道关键点 a i a_i ai,类别 l i l_i li和BEV特征 F B E V \mathcal{F}_{\mathrm{BEV}} FBEV的先验下估计出Polyline的坐标分布 p ( V i p o l y ) p(V_i^{\mathrm{poly}}) p(Vipoly),而Polyline的坐标分布可以由一系列采样点的坐标分布点乘获得: p ( V i p o l y ∣ a i , l i , F B E V ; θ ) = ∏ n = 1 2 N v p ( v i , n f ∣ v i , < n f , a i , l i , F B E V ) p\left(V_i^{\mathrm{poly}} \mid a_i, l_i, \mathcal{F}_{\mathrm{BEV}} ; \theta\right)=\prod_{n=1}^{2 N_v} p\left(v_{i, n}^f \mid v_{i,<n}^f, a_i, l_i, \mathcal{F}_{\mathrm{BEV}}\right) p(Vipolyai,li,FBEV;θ)=n=12Nvp(vi,nfvi,<nf,ai,li,FBEV)作者在论文做了这样一堆解释其实就是为了说明其Polyline Generator模块的合理性,正是上述分布的点乘特性,因此Polyline Generator可以设计为自回归网络,逐个输入Query并逐个输出采样点的坐标值直到序列结束标记EOS。

Polyline Generator的输入三种Query:第一种和第二种分别是由Map Element Detector输出的KeyPoint和Label通过Tokenized得到Embedding;第三种则是可学习的Polyline Embedding,由Coordinate Embedding、Position Embedding和Value Embedding构成,Coordinate Embedding代表这个坐标是x还是y,Position Embedding代表这个向量属于哪个Token,Value Embedding代表这个Token的量化坐标值。Polyline Embedding逐个输入到Polyline Generator模块,逐个输出的Embedding通过MLP后解析出对应的坐标,直到输出坐标值直到序列结束标记EOS。如下图所示:
输入前两种Query:
在这里插入图片描述
输入第一个Query:
在这里插入图片描述
输入第二个Query:
在这里插入图片描述
输入第三个Query:
在这里插入图片描述
依次类推,这样输出的Polyline的长度理论上是没有限制的。

2.1.3 Training Loss

VectorMapNet Loss一共由Map Element Detector和Polyline Generator两部分构成,其中Map Element Detector的损失使用的是参考DETR的Bipartite Matching Loss。Polyline Generator Loss目标是最大化Polyline的对数分布概率,因此使用的负的对数似然,即 L g e n = − 1 2 N v ∑ n = 1 2 N v log ⁡ p ^ ( v i , n f ∣ v i , < n f , a i , l i , F B E V f ) \mathcal{L}_{g e n}=-\frac{1}{2 N_v} \sum_{n=1}^{2 N_v} \log \hat{p}\left(v_{i, n}^f \mid v_{i,<n}^f, a_i, l_i, \mathcal{F}_{\mathrm{BEV}}^f\right) Lgen=2Nv1n=12Nvlogp^(vi,nfvi,<nf,ai,li,FBEVf)其中, p ^ ( v i , n f ∣ … ) \hat{p}\left(v_{i, n}^f \mid \ldots\right) p^(vi,nf)为坐标值的条件概率, v i , < n f v_{i,<n}^f vi,<nf指的是index小于 n n n的离散坐标值真值。对于Polyline Generator的训练策略是先用真值坐标作为输入进行训练,然后再使用预测的坐标点进行finetune。

2.2 实验结果

作者对HDMapNet和VectorMapNet的结果进行了可视化对比如下:
在这里插入图片描述
可以看到VectorMapNet的输出在拐角处更加锐利,对于普通的车道线输出则更加平滑,这正是Polyline输出带来的收益。;同时从第三行的对比结果也可以看出,VectorNetMap可以对更加细节的轮廓进行表达,作者认为这是将地图元素通过检测的方法输出带来的收益。以上方法定量的对比结果如下:
在这里插入图片描述

3. MapTR

MapTR是2022年发表的论文,原论文名为《MapTR: Structed Modeling And Learning for Online Vectorized HD Map Construction》,是在VectorNetMap基础上做了进一步改进,论文上来就先指出了VectorMapNet的问题,一共由如下三点:
(1)VectorMapNet中是通过Polyline表征地图元素,对于Polyline的方向或者说起止点的定义在某些场景下是不明确的,例如斑马线,如果用Polyline进行表征,其起止点可以有多种定义,这对于网络学习的真值来说是一个很难定义成一个通用标准。
(2)VectorMapNet虽然可以并行输出所有的Polyline,但是是通过循环的方式逐个预测出Polyline上的采样点,这样使得推理时间变长。
(3)VectorMapNet使用的是自回归的解码器,这使得预测的过程存在累计误差,同时使得网络更难收敛,需要更长的训练时间

3.1 网络结构及特点

MapTR的网络结构如下图所示:
在这里插入图片描述
整个论文是基于DETR开发的,Encoder和2D to BEV的部分就不再赘述,作者在论文中一共对比了IPM、LSS、Deformable Attention、GTK四种2D to BEV的方法。下面主要介绍Map Decoder和类似于DETR种的二分匹配过程的设计。

3.1.1 Map Decoder

与DETR不同的是,在MapTR中使用的是Hierachical Query从BEV Feature中获取地图元素,所谓Hierachical Query指的是作者分别定义了Instance-Level Query { q i ( i n s ) } i = 0 N − 1 \left\{q_i^{(\mathrm{ins})}\right\}_{i=0}^{N-1} {qi(ins)}i=0N1和Point-Level Qurey { q j ( p t ) } j = 0 N v − 1 \left\{q_j^{(\mathrm{pt})}\right\}_{j=0}^{N_v-1} {qj(pt)}j=0Nv1,然后每一个地图元素的Hierachical Query { q i j (hie)  } j = 0 N v − 1 \left\{q_{i j}^{\text {(hie) }}\right\}_{j=0}^{N_v-1} {qij(hie) }j=0Nv1有这两种Query组成,即第 i i i个Instant Query和第 j j j个Point Query: q i j ( h i e ) = q i ( i n s ) + q j ( p t ) q_{i j}^{(\mathrm{hie})}=q_i^{(\mathrm{ins})}+q_j^{(\mathrm{pt})} qij(hie)=qi(ins)+qj(pt)MapTR最后预测头很简单,包括一个分类分支和一个坐标点回归分支,分类分支用于判定该输出属于哪个实例,回归分支用于预测具体的点坐标位置

3.1.2 Permutation-Based Modeling and Matching

MapTR将地图元素分为Closed Shape和Open Shape,Closed Shape可以用Polygon表达,Open Shape可以用Polyline表达。Polygon和Polyline又都可以通过一系列有顺序的点集表达 V F = [ v 0 , v 1 , … , v N v − 1 ] V^F= \left[v_0, v_1, \ldots, v_{N_v-1}\right] VF=[v0,v1,,vNv1],其中 N v N_v Nv是点集的数量。然后点集的排列顺序确实不确定的,MapTR中映入了排列顺序 Γ = { γ k } \Gamma=\left\{\gamma_k\right\} Γ={γk}这一变量来消除这一不确定性,其中 γ k \gamma_k γk为第 k k k种排列可能。
在这里插入图片描述
对于Polyline,一共又两种排列顺序,即一个超前一个朝后: Γ polyline  = { γ 0 , γ 1 } { γ 0 ( j ) = j   m o d   N v γ 1 ( j ) = ( N v − 1 ) − j   m o d   N v \Gamma_{\text {polyline }}=\left\{\gamma_0, \gamma_1\right\}\left\{\begin{array}{l} \gamma_0(j)=j \bmod N_v \\ \gamma_1(j)=\left(N_v-1\right)-j \quad \bmod N_v \end{array}\right. Γpolyline ={γ0,γ1}{γ0(j)=jmodNvγ1(j)=(Nv1)jmodNv对于Polygan,一共有 2 × N v 2 \times N_v 2×Nv种排列顺序: Γ polygon  = { γ 0 , … , γ 2 × N v − 1 } { γ 0 ( j ) = j   m o d   N v , γ 1 ( j ) = ( N v − 1 ) − j   m o d   N v γ 2 ( j ) = ( j + 1 )   m o d   N v , γ 3 ( j ) = ( N v − 1 ) − ( j + 1 )   m o d   N v , … γ 2 × N v − 2 ( j ) = ( j + N v − 1 )   m o d   N v , γ 2 × N v − 1 ( j ) = ( N v − 1 ) − ( j + N v − 1 )   m o d   N v \Gamma_{\text {polygon }}=\left\{\gamma_0, \ldots, \gamma_{2 \times N_v-1}\right\}\left\{\begin{array}{l} \gamma_0(j)=j \bmod N_v, \\ \gamma_1(j)=\left(N_v-1\right)-j \bmod N_v \\ \gamma_2(j)=(j+1) \bmod N_v, \\ \gamma_3(j)=\left(N_v-1\right)-(j+1) \bmod N_v, \\ \ldots \\ \gamma_{2 \times N_v-2}(j)=\left(j+N_v-1\right) \bmod N_v, \\ \gamma_{2 \times N_v-1}(j)=\left(N_v-1\right)-\left(j+N_v-1\right) \bmod N_v \end{array}\right. Γpolygon ={γ0,,γ2×Nv1} γ0(j)=jmodNv,γ1(j)=(Nv1)jmodNvγ2(j)=(j+1)modNv,γ3(j)=(Nv1)(j+1)modNv,γ2×Nv2(j)=(j+Nv1)modNv,γ2×Nv1(j)=(Nv1)(j+Nv1)modNv基于这种定义,MapTR使用Hierarchical Bipartite Matching来进行结果匹配和损失计算。

Hierarchical Bipartite Matching一共分为两部分,分别是Instance-Level Matching和Point-Level Matching:
Instance-Level Matching指的是将预测的地图元素类别 { y ^ i } \left\{\hat{y}_i\right\} {y^i}和真值的地图元素类别 { y i } \left\{y_i\right\} {yi}进行最优匹配,假设预测的地图元素数量为 N N N,那么匹配结果就是一个长为 N N N的排列结果,定义Instance-Level Matching的损失函数如下: π ^ = arg ⁡ min ⁡ π ∈ Π N ∑ i = 0 N − 1 L insmatch  ( y ^ π ( i ) , y i ) \hat{\pi}=\underset{\pi \in \Pi_N}{\arg \min } \sum_{i=0}^{N-1} \mathcal{L}_{\text {insmatch }}\left(\hat{y}_{\pi(i)}, y_i\right) π^=πΠNargmini=0N1Linsmatch (y^π(i),yi) L insmatch  ( y ^ π ( i ) , y i ) = L Focal  ( p ^ π ( i ) , c i ) + L position  ( V ^ π ( i ) , V i ) .  \mathcal{L}_{\text {insmatch }}\left(\hat{y}_{\pi(i)}, y_i\right)=\mathcal{L}_{\text {Focal }}\left(\hat{p}_{\pi(i)}, c_i\right)+\mathcal{L}_{\text {position }}\left(\hat{V}_{\pi(i)}, V_i\right) \text {. } Linsmatch (y^π(i),yi)=LFocal (p^π(i),ci)+Lposition (V^π(i),Vi)其中 L Focal  ( p ^ π ( i ) , c i ) \mathcal{L}_{\text {Focal }}\left(\hat{p}_{\pi(i)}, c_i\right) LFocal (p^π(i),ci)是类别损失函数,使用的是Focal Loss。 L position  ( V ^ π ( i ) , V i ) \mathcal{L}_{\text {position }}\left(\hat{V}_{\pi(i)}, V_i\right) Lposition (V^π(i),Vi)是位置损失函数,反映的是点集之间的距离,MapTR一共尝试了两种损失函数,分别是Chamfer Distance和Point2Point距离。Point2Point距离和Point-Level Matching Cost很接近,即先寻找最优的点到点的匹配,然后计算所有匹配点的曼哈顿距离。在实验种Point2Point距离要更好。

Point-Level Matching指的是对匹配好的地图元素种的每个点进行匹配,目标是找到一个排列 γ ^ ∈ Γ \hat{\gamma} \in \Gamma γ^Γ使得对应的点之间的曼哈顿距离之和最小: γ ^ = arg ⁡ min ⁡ γ ∈ Γ ∑ j = 0 N v − 1 D Manhattan  ( v ^ j , v γ ( j ) ) . \hat{\gamma}=\underset{\gamma \in \Gamma}{\arg \min } \sum_{j=0}^{N_v-1} D_{\text {Manhattan }}\left(\hat{v}_j, v_{\gamma(j)}\right) . γ^=γΓargminj=0Nv1DManhattan (v^j,vγ(j)).

在找到Instant-Level和Point-Level的最优匹配之后,最后就是根据最优匹配的结果进行损失计算,损失计算公式如下: L = λ L c l s + α L p 2 p + β L d i r \mathcal{L}=\lambda \mathcal{L}_{\mathrm{cls}}+\alpha \mathcal{L}_{\mathrm{p} 2 \mathrm{p}}+\beta \mathcal{L}_{\mathrm{dir}} L=λLcls+αLp2p+βLdir其中 L c l s \mathcal{L}_{\mathrm{cls}} Lcls为分类损失,和DETR一样,分类类别中除了正常的真值类别外还会添加一种no object类别,使用的Focal Loss: L c l s = ∑ i = 0 N − 1 L Focal  ( p ^ π ^ ( i ) , c i ) \mathcal{L}_{\mathrm{cls}}=\sum_{i=0}^{N-1} \mathcal{L}_{\text {Focal }}\left(\hat{p}_{\hat{\pi}(i)}, c_i\right) Lcls=i=0N1LFocal (p^π^(i),ci) L p 2 p \mathcal{L}_{\mathrm{p} 2 \mathrm{p}} Lp2p为距离损失,使用的曼哈顿距离: L p 2 p = ∑ i = 0 N − 1 1 { c i ≠ ∅ } ∑ j = 0 N v − 1 D Manhattan  ( v ^ π ^ ( i ) , j , v i , γ ^ i ( j ) ) \mathcal{L}_{\mathrm{p} 2 \mathrm{p}}=\sum_{i=0}^{N-1} \mathbb{1}_{\left\{c_i \neq \varnothing\right\}} \sum_{j=0}^{N_v-1} D_{\text {Manhattan }}\left(\hat{v}_{\hat{\pi}(i), j}, v_{i, \hat{\gamma}_i(j)}\right) Lp2p=i=0N11{ci=}j=0Nv1DManhattan (v^π^(i),j,vi,γ^i(j)) L d i r \mathcal{L}_{\mathrm{dir}} Ldir为方向距离,使用是余弦相似度: L d i r = − ∑ i = 0 N − 1 1 { c i ≠ ∅ } ∑ j = 0 N v − 1 cosine ⁡ S − similarity ⁡ ( e ^ π ^ ( i ) , j , e i , γ ^ i ( j ) ) \mathcal{L}_{\mathrm{dir}}=-\sum_{i=0}^{N-1} \mathbb{1}_{\left\{c_i \neq \varnothing\right\}} \sum_{j=0}^{N_v-1} \operatorname{cosine} \mathrm{S}_{-} \operatorname{similarity}\left(\hat{\boldsymbol{e}}_{\hat{\pi}(i), j}, \boldsymbol{e}_{\boldsymbol{i}, \hat{\gamma}_i(j)}\right) Ldir=i=0N11{ci=}j=0Nv1cosineSsimilarity(e^π^(i),j,ei,γ^i(j)) e ^ π ^ ( i ) , j = v ^ π ^ ( i ) , j − v ^ π ^ ( i ) , ( j + 1 ) modN ⁡ v \hat{\boldsymbol{e}}_{\hat{\pi}(i), j}=\hat{v}_{\hat{\pi}(i), j}-\hat{v}_{\hat{\pi}(i),(j+1) \operatorname{modN}_{\mathrm{v}}} e^π^(i),j=v^π^(i),jv^π^(i),(j+1)modNv e i , γ ^ i ( j ) = v i , γ ^ i ( j ) − v i , γ ^ i ( j + 1 ) modN ⁡ v \boldsymbol{e}_{\boldsymbol{i}, \hat{\gamma}_i(j)}=v_{i, \hat{\gamma}_i(j)}-v_{i, \hat{\gamma}_i(j+1) \operatorname{modN}_{\mathrm{v}}} ei,γ^i(j)=vi,γ^i(j)vi,γ^i(j+1)modNv

3.2 实验结果

作者首先对比和HDMapNet以及VectorMapNet的结果如下:
在这里插入图片描述
可以看到MapTR在速度和精度上都有明显提升,可视化结果如下,看上去还是非常惊艳的:
在这里插入图片描述

4. VectorNet

VectorNet为Waymo在20202年发表的论文,原论文名为《VectorNet: Encoding HD Maps and Agent Dynamics from Vectorized Representation》,这是一篇做预测的工作,前面介绍的都是如果通过感知构建高精地图,重点在于“建”,而这篇文章重点在于“用”,
在这里插入图片描述
在车辆行驶过程中,其未来轨迹主要是受到周围静态环境以及其他行驶车辆的影响。因此在预测任务中,我们通常需要同时对局部的高精地图以及周围的其他车辆轨迹进行编码。本文核心贡献是则是提出了一种对高精地图进行矢量化编码的方法(如上图右所示),相对于传统的渲染图+卷积的编码方式(如果上图左所示)效率更好,效果也更好。

4.1 网络结构及特点

我将论文中介绍的方法抽象为三步,第一步是将图节点的特征提取出来(Graph Node Encoder),第二步对图中节点的特征进行交互(Graph Node Interaction),第三步是对交互的特征进行解码获得最后的输出(Graph Node Decoder):

4.1.1 Graph Node Encoder

对于高精地图,其元素通常由多段线(车道线)、闭包(人行道)以及点(交通灯)构成,这些元素通常都会带有语义和状态这样的附属信息。对于这些元素,我们选取一个起始点以及一个方向,然后再曲线上进行等间距采样,采样点按顺序相连就得到向量,而向量就是论文中用于编码的最小单位,被称为节点
对于车辆轨迹,其元素组成主要就是多段线。我们可以以时刻为0的位置为起点,然后等时间间隔进行采样,将相邻采样点构成的向量同样作为节点输入后续网络进行编码。
因此我们可以统一使用如下的公式对节点进行描述: v i = [ d i s , d i e , a i , j ] \mathbf{v}_i=\left[\mathbf{d}_i^s, \mathbf{d}_i^e, \mathbf{a}_i, j\right] vi=[dis,die,ai,j]其中 d i s \mathbf{d}_i^s dis d i e \mathbf{d}_i^e die分别是该节点的起点和终点坐标 ( x , y , z ) (x, y, z) (x,y,z),为了使得节点的特征和位置无关,还需要对节点的坐标以自车坐标进行归一化操作。 a i \mathbf{a}_i ai为该节点的附属信息,例如车道线的类别,轨迹的时间戳等。 j j j指的是该节点属于第 j j j条曲线。

为了充分利用多段线的语义和空间特征,对于具备 p p p个节点 { v 1 , v 2 , … , v P } \left\{\mathbf{v}_1, \mathbf{v}_2, \ldots, \mathbf{v}_P\right\} {v1,v2,,vP}的多段线 P \mathcal{P} P,我们设计如下操作进行特征提取: v i ( l + 1 ) = φ r e l ( g e n c ( v i ( l ) ) , φ a g g ( { g e n c ( v j ( l ) ) } ) ) \mathbf{v}_i^{(l+1)}=\varphi_{\mathrm{rel}}\left(g_{\mathrm{enc}}\left(\mathbf{v}_i^{(l)}\right), \varphi_{\mathrm{agg}}\left(\left\{g_{\mathrm{enc}}\left(\mathbf{v}_j^{(l)}\right)\right\}\right)\right) vi(l+1)=φrel(genc(vi(l)),φagg({genc(vj(l))}))其中 v i ( l ) \mathbf{v}_i^{(l)} vi(l)为第 l l l层节点特征, g e n c ( ⋅ ) g_{\mathrm{enc}}(\cdot) genc()为对所有节点权重共享的多层感知机,具体为一个全连接层、一个Layer Normalization层和ReLU非线性激活层。 φ agg  ( ⋅ ) \varphi_{\text {agg }}(\cdot) φagg ()为Max Pooling操作。 φ r e l ( ⋅ ) \varphi_{\mathrm{rel}}(\cdot) φrel()为Concatenate操作,完成的流程图如下图所示:
在这里插入图片描述
我们将以上结构叠加多层得到各个节点的特征,最后为了得到多段线节点的特征,我们通过Max Pooling对各个节点进行提取: p = φ a g g ( { v i ( L p ) } ) \mathbf{p}=\varphi_{\mathrm{agg}}\left(\left\{\mathbf{v}_i^{\left(L_p\right)}\right\}\right) p=φagg({vi(Lp)})以上我们就得到各个多段线的特征。

4.1.2 Graph Node Interaction

接下来我们需要通过一个全局GNN网络对各个多段线之间的特征 { p 1 , p 2 , … , p P } \left\{\mathbf{p}_1, \mathbf{p}_2, \ldots, \mathbf{p}_P\right\} {p1,p2,,pP}进行交互: { p i ( l + 1 ) } = GNN ⁡ ( { p i ( l ) } , A ) \left\{\mathbf{p}_i^{(l+1)}\right\}=\operatorname{GNN}\left(\left\{\mathbf{p}_i^{(l)}\right\}, \mathcal{A}\right) {pi(l+1)}=GNN({pi(l)},A)其中 A \mathcal{A} A是各个多段线之间的邻接矩阵,可以设置为各个多段线之间的距离。在论文中,为了简化计算,直接将 A \mathcal{A} A设置为全连接矩阵,GNN网络通过Self-Attention代替 GNN ⁡ ( P ) = softmax ⁡ ( P Q P K T ) P V \operatorname{GNN}(\mathbf{P})=\operatorname{softmax}\left(\mathbf{P}_Q \mathbf{P}_K^T\right) \mathbf{P}_V GNN(P)=softmax(PQPKT)PV其中 P Q , P K \mathbf{P}_Q, \mathbf{P}_K PQ,PK P V \mathbf{P}_V PV为特征 P \mathbf{P} P的特征映射。

4.1.3 Graph Node Decoder

经过GNN后,最后通过Decoder对未来轨迹进行预测: v i future  = φ traj  ( p i ( L t ) ) \mathbf{v}_i^{\text {future }}=\varphi_{\text {traj }}\left(\mathbf{p}_i^{\left(L_t\right)}\right) vifuture =φtraj (pi(Lt))其中 p i ( L t ) p_i^{\left(L_t\right)} pi(Lt)为GNN网络的第 L t L_t Lt层输出, φ traj  \varphi_{\text {traj }} φtraj 为MLP。为了使得GNN网络能够更好地学习到各个模块之间的关系,论文中还使用了类似于自然语言处理模型BERT中的掩码机制辅助训练,具体操作是在训练过程中给随机Mask掉一些节点,然后通过Decoder对该节点进行恢复: p ^ i = φ node  ( p i ( L t ) ) \hat{\mathbf{p}}_i=\varphi_{\text {node }}\left(\mathbf{p}_i^{\left(L_t\right)}\right) p^i=φnode (pi(Lt))其中 φ node  \varphi_{\text {node }} φnode 同样是MLP。在推理过程中该Decoder是不使用的。

4.1.4 Training Loss

VectorNet的Loss由两部分构成: L = L traj  + α L node  \mathcal{L}=\mathcal{L}_{\text {traj }}+\alpha \mathcal{L}_{\text {node }} L=Ltraj +αLnode 其中 L traj  \mathcal{L}_{\text {traj }} Ltraj 为预测轨迹真值Loss,具体为负高斯对数似然损失; L node  \mathcal{L}_{\text {node }} Lnode 为预测节点和真值之间的Huber Loss。在节点特征进入节点交互流程之前,会使用 L 2 L2 L2归一化处理一遍来限制 L node  \mathcal{L}_{\text {node }} Lnode 的幅值大小。

4.2 实验结果

在论文中,作者除了介绍了上述基于矢量编码和GNN的方法,还介绍了一种基于渲染编码的基线方法。基于基线的方法就是将临近的10帧结果渲染成 S × S × 3 S\times S\times3 S×S×3大小的图片,在将其叠加在一起得到 S × S × 3 N S\times S\times3N S×S×3N的输入。是然后使用ResNet去提取特征,通过全连接层输出。作者在论文中将VectorNet和这种基线方法对比结果如下:
在这里插入图片描述
对比的指标为Average Displacement Error,计算整条轨迹在 3 3 3秒时刻的距离误差。可以看到VectorNet在计算量和精度上都远由于基线版本。实际输出结果如下:
在这里插入图片描述
其中上左图紫红色线为历史车流结果,而蓝色点为预测车流结果,紫红色点真是车流结果。蓝色点基于将紫红色点覆盖,说明这个案例下模型预测成功。上右图中越红是区域说明模型注意力越高,可视化结果也说明模型将注意力的确集中到了两条正确的右转车道上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP SD 自定义销售订单审批状态

自定义销售订单审批状态 销售订单可以在其抬头或者项目中定义审批状态&#xff0c;一般在抬头定义的话就相当于针对整单的审批&#xff0c;可以实现多级审批&#xff0c;每级审批设置能进行何种操作&#xff0c;这里就需要在IMG中定义审批状态参数文件。 一、定义状态参数文件…

[精] MySQL和Oracle下Mybatis批量操作示例和获取影响行数介绍

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;https://zhangxiaofan.blog.csdn.net/article/details/117933877 目录 前言 Mybatis 执行器 表结构定义 Mybatis批量新增 批量新增——Mysql写法 批量新增——Oracle写法 Mybatis批…

【甄选靶场】Vulnhub百个项目渗透——项目五十四:jarbas-1(类git反弹shell,计划任务提权)

Vulnhub百个项目渗透 Vulnhub百个项目渗透——项目五十四&#xff1a;jarbas-1&#xff08;类git反弹shell,计划任务提权&#xff09; &#x1f525;系列专栏&#xff1a;Vulnhub百个项目渗透 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; …

SpringMvc源码分析(四) 请求执行过程之执行MethodHandler

在上文SpringMvc源码分析&#xff08;三&#xff09;中我们分析了DispatcherServlet类中的doDispatcher方法&#xff0c; 并通过分析方法1和方法2了解了请求执行时是怎么获取MethodHandler链的&#xff0c;本文接上文继续分析方法3、方法4和方法5了解MethodHandler是如何执行的…

springboot rabbitmq 非阻塞重试机制实现

重试的应用场景 比如&#xff0c;系统之间同步数据&#xff0c;A系统发送数据给B系统&#xff0c;因为网络原因或者B系统正在重启&#xff0c;可能收不到信息&#xff0c;为了确保B能收到消息就得重试几次&#xff1b;经典的比如&#xff0c;微信支付回调 对后台通知交互时&am…

VScode远程连接Linux

文章目录一、下载安装二、使用三、连接四、基本操作五、VScode内置命令行六、推荐插件一、下载安装 下载的问题就不用多说了把&#xff0c;可能存在的问题就是下载的速度比较慢 前往官网进行下载&#xff1a;前往官网找到适合自己的版本&#xff1a; 但是由于官网是国外的&am…

DT-6_TTL-WiFi透传模块介绍

DT-6_TTL-WiFi透传模块简介TTL-WiFi模块基于ESP-M2WiFi 模块研发&#xff0c;引出串口TTL、EN、STATE等引脚。产品内置我司最新版本的串口透传固件可完成设备TTL 端口到WiFi/云的数据实时透传&#xff0c;具备低功耗控制&#xff0c;状态指示等功能。本模块可直接取代原有的有线…

【手写 Vue2.x 源码】第三十二篇 - diff算法-乱序比对

一&#xff0c;前言 上篇&#xff0c;diff算法-比对优化&#xff08;下&#xff09;&#xff0c;主要涉及以下几个点&#xff1a; 介绍了儿子节点比较的流程介绍并实现了头头、尾尾、头尾、尾头4种特殊情况比对 本篇&#xff0c;继续介绍 diff算法-乱序比对 二&#xff0c;乱…

MATLAB | 全网最全边际图绘制模板(直方图、小提琴图、箱线图、雨云图、散点图... ...)

如标题所言&#xff0c;这应该是全网最全的边际图绘制模板&#xff0c;中心图有8种格式&#xff0c;边际图有11种格式&#xff0c;共计88种组合&#xff0c;另外模板中给了8款配色&#xff0c;我愿称其为888组合&#xff0c;只需要更换一下数据就能绘制出各种类型的边际图: 甚至…

中国机器视觉市场研究报告

目录 机器视觉行业概述机器视觉行业发展现状机器视觉行业典型企业分析机器视觉行业未来发展趋势 机器视觉行业概述 机器视觉定义 机器视觉&#xff08;Machine Vision&#xff0c;MV&#xff09;是人工智能正在快速发展的一个分支。根据美国制造工程师协会&#xff08;SME&…

数字孪生虚拟电厂负荷控制系统可视化

随着国家“双碳”及“构建以新能源为主体的新型电力系统”等目标的提出&#xff0c;清洁化、数字化越来越成为电力系统面临的迫切需求&#xff0c;负控系统的发展对电力营销现代化建设具有重要的意义。负控管理系统是一个着眼于全面加强电力信息管理的&#xff0c;集负荷控制、…

Tips for Confluence Administrators: Part 2

Part 1中&#xff0c;我们谈到了 Confluence 自定义配置的案例&#xff0c;例如&#xff1a;如何禁用附件下载&#xff1f;如何将iFrame放入Confluence&#xff1f;如何使我的页面完全私有&#xff1f;如何防止空间管理员删除他们的空间&#xff1f;任何软件都有bug&#xff0c…

Minecraft 1.19.2 Forge模组开发 11.Mixin

我们本次使用Mixin在1.19.2中制作一个属于自己的不死图腾。 演示效果演示效果演示效果 什么是Mixin&#xff1f; 简单来说是通过注入一些我们的代码&#xff0c;达到对MC原版内容的修改。 详细内容可以参考Minecraft 17.1 Mixin 1.首先我们需要在开发包中引入mixin的依赖&a…

深度学习——双向循环神经网络(笔记)

双向循环神经网络&#xff1a; ①对于序列来讲&#xff0c;假设的目标是&#xff1a;给定观测的情况下&#xff08;在时间序列的上下文或语言模型的上下文&#xff09;&#xff0c;对于下一个输出进行建模 ②对于序列模型来讲&#xff0c;可以从前往后看&#xff0c;也可以从…

Servlet基础

Servlet1. Servlet概述2. 快速入门3. 执行原理4. 生命周期方法5. Servlet3.06. 体系结构7. 相关配置8. HTTP8.1 概念8.2 Request8.3 Response8.4 ServletContext综合案例:文件下载&#xff1a;1. Servlet概述 Servlet是JavaEE规范(接口)之一Servlet是JavaWeb三大组件之一&…

使用sdk-npi-enablement-tool生成SVD文件和芯片头文件

使用sdk-npi-enablement-tool生成SVD文件和芯片头文件 文章目录使用sdk-npi-enablement-tool生成SVD文件和芯片头文件IntroductionOverviewOperation Steps创建芯片配置文件yaml填充外设模块的寄存器映射描述文件xlsx验证生成芯片头文件ConclusionIntroduction 芯片验证与测试…

【Linux杂篇】Linux系统终端常用配置文件更改

目录列表&#xff1a; 1.alias别名永久保存 2.解决vim文件没有颜色的问题 3.vim插件supertap插件安装&#xff08;可支持自动补全&#xff0c;非函数代码补全&#xff0c;仅支持在当前编辑文档内补全&#xff09; 4.vim插件管理 5.YCM下载 6.解决vim中使用backspace无法删…

windows安装npm和cnpm

npm: 代码的包管理器&#xff0c;但是服服器在国外&#xff0c;每一次启动项目都要下载一些依赖&#xff0c;耗时之久&#xff0c;官网下载链接戳 npm。 cnpm&#xff1a;这是淘宝团队出的npm的镜像&#xff0c;可用此代替官方的只读版本&#xff0c;官网链接 cnpm。 先安装np…

Redis6学习笔记【part3】配置文件与订阅/发布

一.Redis配置文件 1.Units单位 配置大小单位,开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit。其中 GB、Gb 大小写不敏感。 2.Include包含 类似 jsp 中的 include 引入公共页面 &#xff0c;redis 在多实例的情况也可以把公用的配置文件提取出来…

9 大指标分析 Solana 的熊市危机

Daniel, 2023 年 1 月Solana 是一个去中心化的区块链网络&#xff0c;由 Solana 实验室设计并在2020年推出&#xff0c;具有快速、可扩展和安全的特点。由于其快速的交易速度和低交易费用&#xff0c;Solana 在 2020 年和 2021 年获得了极大的关注&#xff0c;这使得它对去中心…