基于NeRF的路面重建算法——RoME / EMIE-MAP / RoGS

news2024/9/22 19:25:49

基于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 =Nsum(Maskj)1j=1NMaskj CjCˉ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 =Nsum( Mask j)1j=1NMaskjCE(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=MLPrgbi(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=M1MCCgt, 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 =M1MCE(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=M1Mzzgt.同时加上一个高度的平滑损失: 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=1NjN(i)zizj2

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)=e21pTΣ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=1Kckαkgk(p)i=1k1(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)=eac(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的方法或者之后在纯视觉方案或者多相机重建这种更难的任务上能发挥作用吧

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

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

相关文章

基于面向对象和递归的拦截器设计模式

1 定义 拦截器模式(Interceptor Pattern),是指提供一种通用的扩展机制,可以在业务操作前后提供一些切面的(Cross-Cutting)的操作。这些切面操作通常是和业务无关的,比如日志记录、性能统计、安…

SciPy版本与Python和NumPy各个版本的兼容性

但是现在我用Scipy1.13.1,Python3.10,NumPy2.0.0,使用Scipy时会报错,将NumPy 版本降低为1.26.4以后,就没有报错了。

C++ | Leetcode C++题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; class Solution { public:int missingNumber(vector<int>& nums) {int n nums.size();int total n * (n 1) / 2;int arrSum 0;for (int i 0; i < n; i) {arrSum nums[i];}return total - arrSum;} };

【MySQL】一些业务场景常见的查询,比如实现多表字段同步,递归查询等

目录 快速加注释多表关联查询更新多个字段循环查询子级方法1&#xff1a;递归查询方法2&#xff1a;循环查询 快速加注释 使用ALTER TABLE语句可以修改表结构&#xff0c;包括添加注释。以下是添加注释的语法&#xff1a; ALTER TABLE 表名 MODIFY COLUMN 列名 列类型 COMMEN…

【开源库学习】libodb库学习(三)

4 查询数据库 如果我们不知道我们正在寻找的对象的标识符&#xff0c;我们可以使用查询在数据库中搜索符合特定条件的对象。ODB查询功能是可选的&#xff0c;我们需要使用--generate-query ODB编译器选项显式请求生成必要的数据库支持代码。 ODB提供了一个灵活的查询API&#x…

LeetCode 热题 HOT 100 (001/100)【宇宙最简单版】

【链表】 No. 0160 相交链表 【简单】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; ⭐题目描述&#xff1a;两个单链表的头节点 headA 和 …

51单片机嵌入式开发:13、STC89C52RC 之 RS232与电脑通讯

STC89C52RC 之 RS232与电脑通讯 第十三节课&#xff0c;RS232与电脑通讯1 概述2 Uart介绍2.1 概述2.2 STC89C52UART介绍2.3 STC89C52 UART寄存器介绍2.4 STC89C52 UART操作 3 C51 UART总结 第十三节课&#xff0c;RS232与电脑通讯 1 概述 RS232&#xff08;Recommended Stand…

huawei USG6001v1学习----NAT和智能选路

目录 1.NAT的分类 2.智能选路 1.就近选路 2.策略路由 3.智能选路 NAT:&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09; 指网络地址转换&#xff0c;1994年提出的。NAT是用于在本地网络中使用私有地址&#xff0c;在连接互联网时转而使用全局…

Java | Leetcode Java题解之第263题丑数

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isUgly(int n) {if (n < 0) {return false;}int[] factors {2, 3, 5};for (int factor : factors) {while (n % factor 0) {n / factor;}}return n 1;} }

数学建模--优劣解距离法TOPSIS

目录 简介 TOPSIS法的基本步骤 延伸 优劣解距离法&#xff08;TOPSIS&#xff09;的历史发展和应用领域有哪些&#xff1f; 历史发展 应用领域 如何准确计算TOPSIS中的理想解&#xff08;PIS&#xff09;和负理想解&#xff08;NIS&#xff09;&#xff1f; TOPSIS方法在…

<数据集>手势识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2400张 标注数量(xml文件个数)&#xff1a;2400 标注数量(txt文件个数)&#xff1a;2400 标注类别数&#xff1a;5 标注类别名称&#xff1a;[fist, no_gesture, like, ok, palm] 序号类别名称图片数框数1fist597…

Qt中在pro中实现一些宏定义

在pro文件中利用 DEFINES 定义一些宏定义供工程整体使用。&#xff08;和在cpp/h文件文件中定义使用有点类似&#xff09;可以利用pro的中的宏定义实现一些全局的判断 pro中实现 #自定义一个变量 DEFINES "PI\"3.1415926\"" #自定义宏 DEFINES "T…

XLua原理(一)

项目中活动都是用xlua开发的&#xff0c;项目周更热修也是用xlua的hotfix特性来做的。现研究底层原理&#xff0c;对于项目性能有个更好的把控。 本文认为看到该文章的人已具备使用xlua开发的能力&#xff0c;只研究介绍下xlua的底层实现原理。 一.lua和c#交互原理 概括&…

香橙派AIpro部署边缘端夜莺监控

文章目录 硬件信息硬件简介技术路线硬件参数到手实拍接口详情图应用场景相关资源香橙派官方昇腾论坛 开箱使用准备工作上电准备启动设备开发板状态 连接设备方式一、显示器直连方式二、Micro Usb 数据线串口连接方式三、Micro Usb 数据线方式网络直连方式四、Micro Usb数据线方…

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图(二D)

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图&#xff08;二D&#xff09; 散点图示例解析效果 饼图示例解析效果 折线图示例解析效果 柱状图示例解析效果 箱线图示例解析效果 直方图示例解析效果 等高线图使用filled.contour函数示例…

Pixel6 GKI 内核编译

前言 前段时间写了一篇关于pixel4 Android内核编译编译内核的流程。 但是随着Android版本的提升Google开始推崇GKI方式发内核模式,这种模式可以方便供应商剥离内核和驱动的捆绑性&#xff0c;官方抽象出一部分接口(GKI)提供给产生使用极大便利和解耦开发复杂性。 在pixel4 And…

python-爬虫实例(1):获取京东商品评论

目录 前言 道路千万条&#xff0c;安全第一条 爬虫不谨慎&#xff0c;亲人两行泪 获取京东商品评论信息 一、实例示范 二、爬虫四步走 1.UA伪装 2.获取Url 3.发送请求 4获取响应数据进行解析并保存 总结 前言 道路千万条&#xff0c;安全第一条 爬虫不谨慎&#xff0c;亲…

【BUG】已解决:AttributeError: ‘str‘ object has no attribute ‘get‘

已解决&#xff1a;AttributeError: ‘str‘ object has no attribute ‘get‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c…

JVM中的GC流程与对象晋升机制

JVM中的GC流程与对象晋升机制 1、JVM堆内存结构2、Minor GC流程3、Full GC流程4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾回收&#xff08;GC&#xff09;是自动管…

Let’s Encrypt申请证书流程(附带问题解决方式)

文章目录 前言Let’s Encrypt 和 OpenSSL的区别文章相关 正文1、安装snapd2. 使用snapd安装certbot3. 生成证书&#xff08;需要指定nginx&#xff09;5. Nginx.conf的配置 问题1、error: system does not fully support snapd原因解决方式 2、The error was: PluginError(‘Ng…