当前位置: 首页 > article >正文

[论文解析]OmniRe: Omni Urban Scene Reconstruction

OmniRe: Omni Urban Scene Reconstruction

论文地址:https://arxiv.org/abs/2408.16760

代码地址:https://github.com/ziyc/drivestudio

项目地址:https://ziyc.github.io/omnire/


论文解读

在这里插入图片描述

总结

  1. 这篇论文代表了一种重建的方向,就是对场景内的物体进行细致分类,通过单独的优化提高重建效果,这对于动态场景重建是一条正确的道路,因为在动态场景尤其是自动驾驶的场景中,很多动态物体或者静态背景都是一闪而过的,提高次数但是不区分类别对于最后的效果没有正向收益的。而且通过这种方法可以积累动态或者静态资产,有利于资源重复利用,对于可编辑场景仿真有较大收益
  2. 神经场景图,对所有的动态物体进行了显式区分表示,为每个障碍物单独建模并选择合适的表示方式,然后结合背景以及天空节点进行重建;
  3. 车辆使用静态高斯重建,并使用刚体变换表示随时间的运动,而且对于所有的刚体节点,优化他们每一帧的位姿;
  4. 用SMPL模型来对人体进行重建,通过人体关节和姿态进行建模,相当于在训练过程中增加了更多的优化参数。但是在整体前景部分没有考虑光影变化,没有引入shadow的模型,所以在项目页面可以看到,人跳舞的场景是没有光影变化的,不过这个也是比较困难的点,对于自动驾驶场景来说人体光影不是高优任务;
  5. 在代码实现上面,这是一篇全面的工作,仓库中集成了几篇非常优秀的工作的手动实现,包括DeformableGS,PVG等,兼容性和扩展性都比较强;
    1. 渲染器采用了gsplat库,没有用原版的diff-gaussian-rasterization库,gsplat对于很多GS方向的新工作支持和更新都是比较快的,很多开源方案都会给gsplat提PR,这个对于特性对比试验是很有好处的;
    2. 当然代码中也存在一些小问题,这些等到读者自己运用的时候再探索吧;

数据集初始化

  1. 根据不同数据集读取数据(Waymo, NuScenes, ArgoVerse, PandaSet, KITTI, NuPlan),正如之前提到的代码写的条分缕析,因此对各个数据集的处理也比较详细,适配自己的数据集也比较方便;
  2. NuScenes为例,整体读取流程如下图,如果你要适配自己的数据集,我建议先仿照preprocess部分,将你的数据处理为dataloader的读取形式,这样是最快的方法,修改dataloader不是good idea。

在这里插入图片描述

训练过程

  1. BasicTrainer的初始化,场景初始化,计算场景原点和半径:self._init_scene(scene_aabb=scene_aabb)

  2. loss计算函数初始化self._init_losses()

    1. depth的loss有两类三种,通过标志位控制,包括正常深度和逆深度两类,smooth_l1_lossl1_loss以及mse_loss以及三种loss方案
    2. 天空loss计算为二维交叉熵损失;这里作者实现了一个更安全的BCE算法,规避了Nan值以及梯度异常带来的训练停滞的问题;
  3. 图像指标评测计算(SSIM,PSNR,LPIPS)

  4. **init_gaussians_from_dataset()**每个节点相当于一个单独的GaussianModel,内部实现为GaussianSplating的表现形式,颜色通过球谐函数表示;

    1. 类的继承关系:VanillaGaussians(nn.Module) > RigidNodes > DeformableNodes / SMPLNodes
    2. 背景初始化为VanillaGaussians,也就是最基础的三维高斯模型,其他模型是在此基础上加入了对应的优化参数生成的;
  5. 优化器初始化:initialize_optimizer()

    1. Adam优化器
    2. 混合精度训练torch.cuda.amp.GradScaler
    3. 每个Node设置学习率变化函数,学习率更新函数如下,ramp可配置为sin函数,

    l r = { lr_pre_warmup + ( lr_init − lr_pre_warmup ) ⋅ r a m p ( s t e p warmup_steps ) , if  s t e p < warmup_steps exp ⁡ ( log ⁡ ( lr_init ) ⋅ ( 1 − t ) + log ⁡ ( lr_final ) ⋅ t ) , if  s t e p ≥ warmup_steps lr = \begin{cases}\text{lr\_pre\_warmup} + (\text{lr\_init} - \text{lr\_pre\_warmup}) \cdot ramp \left( \frac{step}{\text{warmup\_steps}} \right), & \text{if } step < \text{warmup\_steps} \\\exp \left( \log(\text{lr\_init}) \cdot (1 - t) + \log(\text{lr\_final}) \cdot t \right), & \text{if } step \ge \text{warmup\_steps} \end{cases} lr={lr_pre_warmup+(lr_initlr_pre_warmup)ramp(warmup_stepsstep),exp(log(lr_init)(1t)+log(lr_final)t),if step<warmup_stepsif stepwarmup_steps

  6. 训练前处理preprocess_per_train_step(),zero grad设置,step设置

  7. 训练函数forward()

    1. 根据时间计算帧数,作为rigidNode和deformableNode的输入,这两个节点的优化和时间戳相关
    2. 相机处理process_camera() ,调用CameraOptModule对相机位姿进行优化,embed和decoder的组合优化相机的delta pose
    3. gaussian生成collect_gaussians()
    4. 高斯渲染**render_gaussians()** :gsplat执行渲染,生成rgb,depth,opacity图像,用于loss计算
    5. affine_transformation来自于**AffineTransform**类,帧数通过embed和decoder输出仿射矩阵,对每一帧的颜色进行修正,避免不同相机曝光不一致导致的效果变差问题;类似于ScaffoldGS中的appearance embedding;
  8. 可见性更新update_visibility_filter(self) :根据node分类,更新当前模型的半径

  9. train_step_camera_downscale = trainer._get_downscale_factor() 添加了变分辨率训练,根据步数会下采样图像;

  10. loss计算compute_losses()

    1. L1,SSIM的loss计算
    2. sky节点的二维交叉熵损失
    3. depth的loss计算,针对lidar的深度加入了又步长计算的延迟因子;
    4. 对不透明度熵损失加入正则化,采用负对数熵正则化
    5. 逆深度平滑正则化,使得重建的深度更为合理;针对深度图的平滑性损失计算,使用了kornia.losses.inverse_depth_smoothness_loss
    6. 对模型中的仿射变换参数进行约束,使其接近于单位矩阵;
    7. 动态区域范围的L1Loss,在这里动态区域是根据不透明度计算的mask;
    8. RigidNodes正则化
    9. DeformableNodes正则化
    10. VanillaGaussians正则化
    11. SMPLNodes正则化
  11. backward()梯度回传,自动求导;获取混合精度训练的梯度缩放比例,如果梯度缩放比例没有被降低,意味着上一次的反向传播是稳定的,因此可以执行学习率调度器的更新。

  12. postprocess_per_train_step()后处理,这里相当于3DGS的densify_and_prune() 函数,具体实现在vanilla.py

    1. alpha重置间隔reset_alpha_interval=3000,致密化截止次数15000,prune间隔100;densify_and_prune执行条件:在重置间隔内且大于prune间隔,小于截止iteration;每100次执行一次
    2. split条件(1分2):平均梯度范数大于densify_grad_thresh=0.0005;高斯点的尺度大于阈值densify_size_thresh=0.002;如果步数小于 stop_screen_size_at=5000,且高斯点的2D半径大于split_screen_size=0.05
    3. clone条件:平均梯度范数大于densify_grad_thresh=0.0005;高斯点的尺度小于等于阈值densify_size_thresh
    4. cull条件:透明度小于cull_alpha_thresh=0.005 ;scale过大的超过场景尺度相乘系数cull_scale_thresh=0.5 ;2D半径大于阈值cull_screen_size: 0.15 ;(3个条件是or关系
    5. 每3000次重置不透明度;

一些问题

  1. affine_transformation部分是存在问题的,此处的问题可以参考官方仓库的一个issue
  2. 这个方案由于不是原版3DGS代码修改的,所以无法导出SIBR Viewer所需要的文件,如果有这方面需求可以参考这个PR,自己修改代码即可;笔者没有尝试nerfstudio的可视化方案,不过估计是差不多的自己动手即可:
  3. 代码存在同一个数据重复两次效果差异较大的问题,暂时没找到bug点,所以对于复现可能有些阻碍;

相关文章:

[论文解析]OmniRe: Omni Urban Scene Reconstruction

OmniRe: Omni Urban Scene Reconstruction 论文地址&#xff1a;https://arxiv.org/abs/2408.16760 代码地址&#xff1a;https://github.com/ziyc/drivestudio 项目地址&#xff1a;https://ziyc.github.io/omnire/ 论文解读 总结 这篇论文代表了一种重建的方向&#xff0…...

【微服务优化】ELK日志聚合与查询性能提升实战指南

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

Docker实战-使用docker compose搭建博客

docker run 部署 创建blog网络 [rootk8s-master ~]# docker network create blog 8f533a5a1ec65eae3f98c0ae5a76014a3ab1bf3c087ad952cdc100cc7a658948 [rootk8s-master ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 8f533a5a1ec6 blog bridge …...

python 虚拟机的使用方式

Python虚拟机&#xff08;PVM&#xff09;是Python语言的核心运行机制&#xff0c;它通过解释和执行字节码来运行Python代码。以下是关于Python虚拟机的详细使用方式&#xff1a; 1. Python虚拟机的基本概念 Python虚拟机&#xff08;PVM&#xff09;是一个抽象的计算机&…...

【JT/T 808协议】808 协议开发笔记 ② ( 终端注册 | 终端注册应答 | 字符编码转换网站 )

文章目录 一、消息头 数据1、消息头拼接2、消息 ID 字段3、消息体属性 字段4、终端手机号 字段5、终端流水号 字段 二、消息体 数据三、校验码计算四、最终计算结果五、终端注册应答1、分解终端应答数据2、终端应答 消息体 数据 六、字符编码转换网站 一、消息头 数据 1、消息头…...

番茄工作法html实现

对比了deepseek-r1-online和本地部署的14b的版本&#xff0c;输出的输出的html页面。 在线满血版的功能比较强大&#xff0c;可以一次完成所有要求。14b版本的功能有一些欠缺&#xff0c;但是基本功能也是写了出来了。 input write a html named Pomodoro-clock which “hel…...

抓包工具 wireshark

1.什么是抓包工具 抓包工具是什么&#xff1f;-CSDN博客 2.wireshark的安装 【抓包工具】win 10 / win 11&#xff1a;WireShark 下载、安装、使用_windows抓包工具-CSDN博客 3.wireshark的基础操作 Wireshark零基础使用教程&#xff08;超详细&#xff09; - 元宇宙-Meta…...

51单片机学习之旅——定时器

打开软件 1与其它等于其它&#xff0c;0与其它等于0 1或其它等于1&#xff0c;0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作&#xff0c;高四位保持&#xff0c;低四位清零&#xff0c;高四位定时器1&#xff0c;低四位定时器0 TMODTMOD|0x01;//0x010000 0…...

hot100_139. 单词拆分

hot100_139. 单词拆分 思路 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入:…...

Linux firewalld 常用命令

本文参考RedHat官网文章How to configure a firewall on Linux with firewalld。 Firewalld 是守护进程名&#xff0c;对应命令为firewall-cmd。帮助详见以下命令&#xff1a; $ firewall-cmd --helpUsage: firewall-cmd [OPTIONS...]General Options-h, --help Pr…...

《网络安全入门实战手册》

0经验转行网络安全&#xff0c;个人分享一下学习中总结的文档&#xff0c;以下为目录可以点击标题看对应文章&#xff0c;欢迎评论区讨论&#xff0c;后期会发更多安全相关的学习资料等。希望跟大家一起进步。 第1章&#xff1a;网络安全基础知识 1、什么是网络安全&#xff…...

SQLMesh 系列教程7- 详解 seed 模型

SQLMesh 是一个强大的数据建模和管道管理工具&#xff0c;允许用户通过 SQL 语句定义数据模型并进行版本控制。Seed 模型是 SQLMesh 中的一种特殊模型&#xff0c;主要用于初始化和填充基础数据集。它通常包含静态数据&#xff0c;如参考数据和配置数据&#xff0c;旨在为后续的…...

windows11那些事

一.windows11简介 Windows11是‌微软公司于2021年发布的桌面端操作系统&#xff0c;它带来了许多新的功能和改进&#xff0c;旨在提升用户体验和工作效率。以下是一些关于Windows 11的基础知识和使用技巧&#xff1a; ‌‌通用搜索&#xff1a;通过任务栏上的搜索或按Windows…...

VividTalk:南京大学、阿里巴巴等机构联合研发的开源3D说话人生成框架

目录 一、前言二、项目概述三、技术架构四、优势特点五、性能评估六、应用场景七、结论与展望 一、前言 在当今人工智能飞速发展的时代&#xff0c;人机交互的方式正不断创新和优化。VividTalk作为南京大学、阿里巴巴、字节跳动和南开大学联合开发的一项开创性技术&#xff0c…...

pyside6学习专栏(三):自定义QLabel标签扩展类QLabelEx

标签是界面设计中最常用的控件&#xff0c;本文演示了如何基于PySide6的QLabex控件类扩展定义QLabelEX类&#xff0c;以实现更少的编码完成各种图像、彩色文本、动画的加载和显示&#xff0c;丰富界面显示 本示例演示了QLabel和其扩展类QLabelEx分别显示文本、图像、动画的使用…...

后“智驾平权”时代,谁为安全冗余和体验升级“买单”

线控底盘&#xff0c;正在成为新势力争夺下一个技术普及红利的新赛点。 尤其是进入2025年&#xff0c;比亚迪、长安等一线传统自主品牌率先开启高阶智驾的普及战&#xff0c;加上此前已经普及的智能座舱&#xff0c;舱驾智能的「科技平权」进一步加速行业启动「线控底盘」上车窗…...

springboot408-基于Java的樱洵宾馆住宿管理系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…...

C语言中 %* 的用法总结

C语言中 %* 的用法总结 一、scanf 中的 %* 作用&#xff1a;跳过输入字段&#xff0c;读取数据但不存储到变量。语法&#xff1a;%*[格式] 示例格式&#xff1a;%*d&#xff08;跳过一个整数&#xff09;、%*s&#xff08;跳过一个字符串&#xff09;。 适用场景&#xff1a;…...

EasyRTC:基于WebRTC与P2P技术,开启智能硬件音视频交互的全新时代

在数字化浪潮的席卷下&#xff0c;智能硬件已成为我们日常生活的重要组成部分&#xff0c;从智能家居到智能穿戴&#xff0c;从工业物联网到远程协作&#xff0c;设备间的互联互通已成为不可或缺的趋势。然而&#xff0c;高效、低延迟且稳定的音视频交互一直是智能硬件领域亟待…...

鸿蒙NEXT应用App测试-通用测试

注意&#xff1a;大家记得学完通用测试记得再学鸿蒙专项测试 https://blog.csdn.net/weixin_51166786/article/details/145768653 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章…...

transfmer学习认识

整体架构 1.自注意机制 1.1.softmax 在机器学习和深度学习中&#xff0c;softmax 函数是一个常用的激活函数&#xff0c;用于将一个向量转换为一个概率分布。softmax 函数的公式如下&#xff1a; ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/35c158988402498ba6…...

ragflow-RAPTOR到底是什么?请通俗的解释!

RAPTOR有两种不同的含义&#xff0c;具体取决于上下文&#xff1a; RAPTOR作为一种信息检索技术 RAPTOR是一种基于树状结构的信息检索系统&#xff0c;全称为“Recursive Abstractive Processing for Tree-Organized Retrieval”&#xff08;递归抽象处理树组织检索&#xff09…...

人工智能(AI)的不同维度分类

人工智能(AI)的分类 对机器学习进行分类的方式多种多样&#xff0c;可以根据算法的特性、学习方式、任务类型等不同维度进行分类这些分类都不是互斥的&#xff1a; 1、按数据模态不同:图像&#xff0c;文本&#xff0c;语音&#xff0c;多态等 2、按目标函数不同:判别式模型…...

三、linux字符驱动详解

在上一节完成NFS开发环境的搭建后&#xff0c;本节将探讨Linux字符设备驱动的开发。字符设备驱动作为Linux内核的重要组成部分&#xff0c;主要负责管理与字符设备&#xff08;如串口、键盘等&#xff09;的交互&#xff0c;并为用户空间程序提供统一的读写操作接口。 驱动代码…...

谈谈 ES 6.8 到 7.10 的功能变迁(1)- 性能优化篇

前言 ES 7.10 可能是现在比较常见的 ES 版本。但是对于一些相迭代比较慢的早期业务系统来说&#xff0c;ES 6.8 是一个名副其实的“钉子户”。 借着工作内升级调研的任务东风&#xff0c;我整理从 ES 6.8 到 ES 7.10 ELastic 重点列出的新增功能和优化内容。将分为 6 个篇幅给…...

我用Ai学Android Jetpack Compose之LinearProgressIndicator

本篇&#xff0c;我们来学习LinearProgressIndicator&#xff0c;答案来自 通义千问 Q:我想学习LinearProgressIndicator&#xff0c;麻烦你介绍一下 当然可以&#xff01;LinearProgressIndicator 是 Jetpack Compose 中的一个组件&#xff0c;用于显示线性进度条。它非常适…...

代码随想录算法训练营day40(补0208)

买卖股票专栏 1.买卖股票最佳时机 贪心法&#xff0c;好想 题目 121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖…...

在群晖上使用Docker安装思源笔记

​​ 最近一段时间&#xff0c;docker的镜像地址都失效了&#xff0c;在群晖系统中&#xff0c;无论是早期版本的docker&#xff0c;还是最新版本中的Container Manager&#xff0c;注册表中都无法链接到docker的镜像&#xff0c;于是&#xff0c;就花了点时间查找资料&#x…...

【废物研究生刷算法】字符串

文章目录 1. 反转字符串2. 替换数字3. 反转字符串中的单词4. 右旋字符串总结1、字符串处理函数2、字符串切片 如果使用python处理字符串&#xff0c;有很多py内置的函数可以使用&#xff0c;主要还是记住这些处理方法。 1. 反转字符串 class Solution:def reverseStr(self, s, …...

断开ssh连接程序继续运行

在使用 SSH 远程连接服务器时&#xff0c;我们常希望在断开连接后仍然让程序继续运行&#xff0c;以下是几种常见的方法&#xff1a; 1. 使用 screen 或 tmux screen 和 tmux 是两款非常强大的终端复用工具&#xff0c;它们允许你在后台运行会话&#xff0c;即使断开 SSH 连接…...