基于NeRF的路面重建算法——RoME / EMIE-MAP / RoGS
- 1. RoMe
- 1.1 Mesh Initialization / Waypoint Sampling
- 1.2 Optimization
- 1.3 Experiments
- 2. EMIE-MAP
- 2.1 Road Surface Representation based on Explicit mesh and Implicit Encoding
- 2.2 Optimizing Strategies
- 2.3 Experiments
- 3. RoGS
- 3.1 Road Surface Representation Based on Guassian Surfels
- 3.2 Optimization
- 3.3 Experiments
使用NeRF进行路面重建的思路要从Tesla AI Day的下面这页PPT说起:
地面重建的目的主要用于BEV框架下的道路结构的真值标注或者网络训练,好处主要是可以基于MLP进行颜色、语义等信息的融合并保持光滑,三年过去了有几篇和该方法相关的论文,本文进行一个简单的总结
1. RoMe
RoMe是地平线2023年发布的一篇Paper,原论文为《RoMe: Towards Large Scale Road Surface Reconstruction via Mesh Representation》,该论文将路面分解为三角形网格,通过隐式建模来恢复路面的高程信息以及Pytorch3D来进行颜色和语义渲染,基于Waypoint采样进行分块渲染来实现对大规模场景的重建,算法流程图如下图所示:
1.1 Mesh Initialization / Waypoint Sampling
RoMe算法的基本数据结构是三角形网格,每个三角网格的顶点上存储着位置 ( x , y , z ) (x, y, z) (x,y,z),颜色 ( r , g , b ) (r, g, b) (r,g,b)和语义等信息,三角形网格初始化是在自车位姿附近采样一系列的半稠密点 ( x , y ) (x, y) (x,y)作为顶点,这些顶点的高度 z z z初始化为自车位姿高度减去自车高度,后续优化过程中高度 z z z通过一个Elevation MLP输出,如上图(b)所示,作者在Ablation Study中提到,如果将高度 z z z直接作为一个优化变量会导致地面不够平滑,增加一个Elevation MLP主要是为了保持地面的平滑性,如下图所示:
为了实现对大规模场景进行渲染,作者使用了Waypoinnt Sampling的策略来提高效率,其核心思想就是分而治之,具体算法流程如下
简而言之就是先通过随机选取一个位姿点构建一个子区域进行训练优化,该子区域会覆盖一部分位姿,然后迭代贪婪地选取未被覆盖的位姿点中最远的一个构建子区域进行训练优化,直到左右位姿点被覆盖到,如下是示意图:
1.2 Optimization
RoMe的优化主要分为两部分:
第一部分是相机位姿的优化,相机位姿优化的主要是相机到车体的标定;
第二部分网格的优化,这部分优化的主要是三角形网格节点中存储的RGB、语义以及Elevation MLP,作者使用先Pytorch3D完成渲染,然后再图片上构建损失函数,渲染部分为: [ C j , S j , D j , Mask j ] = MeshRender ( π j , M ) \left[C_j, S_j, D_j, \text { Mask }_j\right]=\operatorname{MeshRender}\left(\pi_j, M\right) [Cj,Sj,Dj, Mask j]=MeshRender(πj,M)其中 C j , S j C_j, S_j Cj,Sj和 D j D_j Dj分别代表第 j j j帧的RGB、语义和深度图, Mask j \text { Mask }_j Mask j指定了图片上需要监督的部分,具体的渲染过程作者也没有在论文里详述,只是介绍了下是如何定义Pytorch3D模型中pixel-to-faces、z-buffers等输入变量,因为笔者对这部分也不是很了解因此不再深入展开,渲染后构建的损失主要包括RGB损失和语义损失两部分: L color = 1 N ∗ sum ( Mask j ) ∑ j = 1 N Mask j ∗ ∣ C j − C ˉ j ∣ L_{\text {color }}=\frac{1}{N * \operatorname{sum}\left(\operatorname{Mask}_j\right)} \sum_{j=1}^N \operatorname{Mask}_j *\left|C_j-\bar{C}_j\right| Lcolor =N∗sum(Maskj)1j=1∑NMaskj∗ Cj−Cˉj L sem = 1 N ∗ sum ( Mask j ) ∑ j = 1 N Mask j ∗ C E ( S j , S ˉ j ) L_{\text {sem }}=\frac{1}{N * \operatorname{sum}\left(\text { Mask }_j\right)} \sum_{j=1}^N \operatorname{Mask}_j * C E\left(S_j, \bar{S}_j\right) Lsem =N∗sum( Mask j)1j=1∑NMaskj∗CE(Sj,Sˉj)
1.3 Experiments
RoMe在效果上做到了SOTA,其的训练速度如下(感觉还是比较慢的):
此外论文中提到如果光照变化强烈时RoMe的算法效果会变差
2. EMIE-MAP
EMIE-MAP发表于2024年CVPR,原论文为《EMIE-MAP: Large-Scale Road Surface Reconstruction Based on Explicit Mesh and Implicit Encoding》,RoMe在光照变化强烈时效果较差,本文就是旨在解决这个问题,算法流程如下:
2.1 Road Surface Representation based on Explicit mesh and Implicit Encoding
EMIE-MAP的基本数据结构和RoMe基本上是一致的,通过构建三角形网格,每个顶点上保存着位置信息、颜色和语义信息,下面我们来看下EMIE-MAP和RoME的主要区别,,
对于高度信息,RoMe是直接通过一个MLP输出实际地面高度,EMIE-MAP则是通过轨迹初始化一个地面高度,然后通过MLP输出实际地面高度与初始化地面高度的差值: z r = M L P h r ( P E ( x , y ) ) , z f = z 0 + z r z_r=M L P_{h r}(P E(x, y)), z_f=z_0+z_r zr=MLPhr(PE(x,y)),zf=z0+zr作者认为这样可减小拟合难度。
对于颜色信息,颜色信息EMIE-Map在顶点上记录的不是RGB,而是颜色的编码,然后不同相机使用不同的MLP对颜色编码进行解码才或者最终的RGB: r g b i = M L P r g b − i ( l c ) r g b_i=M L P_{r g b_{-} i}\left(l_c\right) rgbi=MLPrgb−i(lc)颜色编码代码场景的物理属性,而MLP解码器则学习了不同相机的属性,因此可以解决不同相机曝光不同而导致渲染效果差的问题。
2.2 Optimizing Strategies
在数据采样策略上,作者使用了基于轨迹的采样策略来提高训练效率,具体来说就是将距离相近的轨迹点放入同一个Batch进行训练,因为训练过程会提取每个轨迹点前后80米的路面进行训练,相近的轨迹点在同一个Batch可以使得每次训练迭代都发生在一个小范围区域从而加收敛;
在渲染策略上,作者没有使用原始NeRF基于Volume的渲染策略,而是根据相机投影矩阵将顶点直接投影回图像进行渲染然后建立监督,这种方式可以进一步减少计算量。
在训练损失上,作者构建了如下训练损失: L total = λ r g b L r g b + λ sem L sem + λ z L z + λ smooth L smooth L_{\text {total }}=\lambda_{r g b} L_{r g b}+\lambda_{\text {sem }} L_{\text {sem }}+\lambda_z L_z+\lambda_{\text {smooth }} L_{\text {smooth }} Ltotal =λrgbLrgb+λsem Lsem +λzLz+λsmooth Lsmooth 其中颜色和语义损失如下: L r g b = 1 ∣ M ∣ ∑ M ∣ C − C g t ∣ , L_{r g b}=\frac{1}{|M|} \sum M\left|C-C_{g t}\right|, Lrgb=∣M∣1∑M∣C−Cgt∣, L sem = 1 ∣ M ∣ ∑ M ⋅ C E ( S , S g t ) , L_{\text {sem }}=\frac{1}{|M|} \sum M \cdot C E\left(S, S_{g t}\right) \text {, } Lsem =∣M∣1∑M⋅CE(S,Sgt), 如果有激光存在的话可以使用激光监督高度: L z = 1 ∣ M ∣ ∑ M ∣ z − z g t ∣ . L_z=\frac{1}{|M|} \sum M\left|z-z_{g t}\right| . Lz=∣M∣1∑M∣z−zgt∣.同时加上一个高度的平滑损失: L smooth = ∑ i = 1 N ∑ j ∈ N ( i ) ∣ z i − z j ∣ 2 , L_{\text {smooth }}=\sum_{i=1}^N \sum_{j \in N(i)}\left|z_i-z_j\right|^2 \text {, } Lsmooth =i=1∑Nj∈N(i)∑∣zi−zj∣2,
2.3 Experiments
在PSNR上EMIE-MAP要全面超越RoMe:
从Ablation Study上我们可以看到,RGM MLP和颜色编码骑着至关重要的作用:
从下图可以看到不同相机使用不同MLP训练渲染的地图颜色会不相同:
3. RoGS
RoGS发表于2024年,原论文名为《RoGS: Large Scale Road Surface Reconstruction based on 2D Gaussian Splatting》,这篇论文主要是受3D Gaussian Splatting的启发,通过2D Gaussian Spaltting的加速了道路重建的渲染效率和质量。算法流程如下:
3.1 Road Surface Representation Based on Guassian Surfels
在3D Gaussian Spaltting中我们将3D Gassian建模为: G ( p ) = e − 1 2 p T Σ − 1 p G(p)=e^{-\frac{1}{2} p^T \Sigma^{-1} p} G(p)=e−21pTΣ−1p其中 Σ \Sigma Σ为3D协方差, p p p为中心坐标,为了方便进行优化,将协方差定义为: Σ = R S S T R T \Sigma=R S S^T R^T Σ=RSSTRT其中 S = Diag ( s x , s y , s z ) S=\operatorname{Diag}\left(s_x, s_y, s_z\right) S=Diag(sx,sy,sz),当我们将 s z s_z sz设置为 0 0 0时就得到一个2D Gaussian Surfel,每个2D Gaussian Surfel村出的信息包括: Θ = { ( x , y , z ) , ( r , g , b ) , ( s x , s y ) , α , R , Sem } \Theta=\left\{(x, y, z),(r, g, b),\left(s_x, s_y\right), \alpha, R, \text { Sem }\right\} Θ={(x,y,z),(r,g,b),(sx,sy),α,R, Sem }其中 ( r , g , b ) (r, g, b) (r,g,b)表示颜色, α \alpha α表示透明度,在初始化阶段,高度 z z z和协方差的旋转矩阵 R R R都和轨迹点的高度以及位姿保持一致。
3.2 Optimization
2D Gaussian Surfel的渲染方式和3D Gasussian Splatting保持一致,即通过世界到相机的变换矩阵 W W W以及投影矩阵的仿射近似 J J J对协方差进行投影 Σ ′ = J W Σ W T J T \Sigma^{\prime}=J W \Sigma W^T J^T Σ′=JWΣWTJT然后对深度排序进行渲染: c ( p ) = ∑ k = 1 K c k α k g k ( p ) ∏ i = 1 k − 1 ( 1 − α i g i ( p ) ) \mathbf{c}(p)=\sum_{k=1}^K \mathbf{c}_k \alpha_k g_k(p) \prod_{i=1}^{k-1}\left(1-\alpha_i g_i(p)\right) c(p)=k=1∑Kckαkgk(p)i=1∏k−1(1−αigi(p))由于我们有可能通过不同的相机进行渲染,因为还针对不同相机的曝光参数映入了两个可学习参数 α \alpha α和 b b b做最后的输出: c ′ ( p ) = e a ⋅ c ( p ) + b \mathbf{c}^{\prime}(p)=e^a \cdot \mathbf{c}(p)+b c′(p)=ea⋅c(p)+b损失函数和EMIE-MAP是保持一致的,即 L total = λ color L color + λ sem L sem + λ smooth L smooth + λ z L z L_{\text {total }}=\lambda_{\text {color }} L_{\text {color }}+\lambda_{\text {sem }} L_{\text {sem }}+\lambda_{\text {smooth }} L_{\text {smooth }}+\lambda_z L_z Ltotal =λcolor Lcolor +λsem Lsem +λsmooth Lsmooth +λzLz
3.3 Experiments
如下是RoMe和RoGS的结果对比:
可以看到RoGS有15倍的速度提升,同时在渲染效果上也有变好,如下是结果对比图:
在论文中作者并没有展示多相机渲染的效果
以上就是最近看的三篇使用NeRF对路面进行重建的算法,在实际的工程应用中,其实用传统算法就能达到一个不错的基本面,NeRF Like的方法或者之后在纯视觉方案或者多相机重建这种更难的任务上能发挥作用吧