但是,什么是Gaussian Splatting?

作者 | yhc 编辑 | 自动驾驶之心

 原文链接:https://zhuanlan.zhihu.com/p/687549139

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

>>点击进入→自动驾驶之心『3DGS』技术交流群

本文只做学术分享,如有侵权,联系删文

关注计算机视觉/图形学的朋友肯定早就听过Gaussian Splatting的大名,本文旨在分享笔者对Gaussian Splatting的理解。和大部分同类文章相比,本文

  1. 不会涉及任何(难以理解的)数学

  2. 从可微渲染(Differentiable Rendering)的角度进行思考,这也是笔者认为最能领会3DGS之优雅的切入点

  3. 从geometry的角度“抨击”3DGS,聊一聊在什么意义下3DGS是不好的

下面开始~

0. Gaussian Splatting是干啥的

一言以蔽之:Gaussian Splatting提出了一种三维表达(3D Gaussian)和配套的渲染方式(Splatting),能够1)迅速地重建现实世界中的场景 2)用重建的场景渲染新视角图片,速度特别快(实时渲染) 3)用重建的场景渲染新视角图片,看起来特别真实

对原文的teaser进行解释:

Gaussian Splatting Teaser. 给定一个公园自行车场景的多视角图片,用不同的方法重建该场景,并实时渲染一段视频。其中135 fps代表3DGS单次渲染很快,Train: 6min代表根据输入图片重建场景的过程很快,PSNR:23.6代表重建精度(真实感)很高

在这三个功能中,实时渲染的能力来自于对渲染过程的优化,本文不会过多深入;而“快速精准重建”的能力,来自于可微渲染——3DGS是一套高效的渲染框架,更是一套高效的可微渲染框架。

让我们先用一小节,理解一下可微渲染在解决什么样的问题。

1.高观点可微渲染:逆渲染和不连续

考虑一个通用的渲染过程:我们有一堆原料——物体(形状、材质、位置)和光照,将它们统一写作x;还有一个渲染器,它写作一个从“原料空间”到“图片空间”的函数f。那么任何一个正向渲染过程,就是根据原料,使用渲染器,求得一张图片(写作y)的过程,即y=f(x)。

逆渲染是这个过程的逆过程,给定一张图片 ,逆渲染希望通过某种手段,求出其对应的“原料”,这个目标可以写作  =  ( )。

图片来源:Shuang Zhao, WENZEL JAKOB, TZU-MAO LI, Siggraph 2020 PBDR Course

现实中,渲染过程的“逆过程”非常难以表达,如何想象光栅化的逆过程?但好在我们的目的并不是求出逆过程的表达式,而是用某种手段推测出 ,这只需要一个更松弛的条件—— ,有了它,我们就能用梯度下降等方式,不求逆过程表达式,一样能推测出正确的

到这里,相信读者也明白这里的某种手段是什么了,就是可微渲染!所谓可微渲染,指的就是这样一类正向渲染方法:其产生的图片对产生它的“原料”是可微的。更具体一点,就是指当某个“原料”的值(物体或光照)变化一点点时,能够知道图片上任何一个像素的颜色变化了多少,朝什么颜色变化。

可微渲染是通往逆渲染的可能途径,但这是条很不简单的途径,下面来介绍一下可微渲染的核心问题:不连续(后文会涉及3D Gaussian是怎么解决这个问题的)

想象一个简单的场景:两个三角形被渲染到了一张图片上,不考虑光照/shading,每个像素简单获得其对应的三角面颜色,那么这张图会像这样:

图片来源:Shuang Zhao, WENZEL JAKOB, TZU-MAO LI, Siggraph 2020 PBDR Course

对于其中的每一个像素颜色,显然它与三角面颜色的映射关系不难建立:当三角面颜色变化一点时,与之对应的像素颜色都会发生对应的变化,在这个例子里,因为每个像素直接获取了三角面上的颜色,所以二者是相等的关系。我们当然可以通过梯度下降优化三角面颜色, 如果我们加入材质贴图,就能获得更强的表达能力,可以优化出各种图案。

一切似乎很简单,但是如果我们考虑优化这两个三角面的位置呢?

那我们需要知道,当三角形的位置移动一点时,每个像素的颜色应该怎么变,变多少。

这真的可能吗?我的意思是,导数真的存在吗?当三角形的位置移动一点时,像素的变化真的是连续的吗?

在这张图上,并不是!

考察三角形的边缘,我们放大一点来看,只看两个像素:

图片修改自:Shuang Zhao, WENZEL JAKOB, TZU-MAO LI, Siggraph 2020 PBDR Course

当红色三角形向右移动一个极小量时,有两种可能:

当边界本来就离右边像素比较远的时候,颜色不变,当边界恰好离右边像素很近时,变成红色

也就是说,对于右边这个像素来说,三角形向右的移动量-颜色的函数是这样:

图片取自前文Siggraph课程。这里我们用横轴代表向右移动量,p代表临界位置,在p前颜色是白色,在p后突变为红色

这个函数的导数在大部分位置是0,在其他所有位置上都不存在!

也就是说,当这个三角形移动一点时,我们不知道它的边缘上像素的颜色变化应该是多少,因为这个数字要么是0,要么不存在!

到这里,相信读者也明白了可微渲染的核心问题:位置“不可微”。

当然,这个问题实际上并非无解,因为位置并不是真的“不可微“。这里就不介绍其他可微渲染的解决方法了(如果大家想看请在评论区留言,可以开个新坑。

带着可微渲染的核心问题,下一章我们将进入Gaussian Splatting的世界

自动驾驶之心

论文辅导来啦

知识星球交流社区

近4000人的交流社区,近300+自动驾驶公司与科研结构加入!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知(大模型、端到端自动驾驶、世界模型、仿真闭环、3D检测、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、大模型,更有行业动态和岗位发布!欢迎加入。

独家专业课程

端到端自动驾驶大模型、VLA、仿真测试、自动驾驶C++、BEV感知、BEV模型部署、BEV目标跟踪、毫米波雷达视觉融合、多传感器标定、多传感器融合、多模态3D目标检测、车道线检测、轨迹预测、在线高精地图、世界模型、点云3D目标检测、目标跟踪、Occupancy、CUDA与TensorRT模型部署、大模型与自动驾驶、NeRF、语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频

学习官网:www.zdjszx.com

### 环境配置与依赖安装 3D Gaussian Splatting 的训练环境搭建需要满足一定的硬件和软件条件,主要依赖于 CUDA 和 CUDANN 的支持,以充分发挥 GPU 的计算能力。以下是详细的配置步骤: #### 1. 硬件要求 - **GPU**: 需要支持 CUDA 的 NVIDIA GPU,推荐使用具有较高算力的显卡,如 RTX 30 系列或更高。 - **内存**: 至少 16GB RAM,建议 32GB 或更高,以支持大规模数据集的训练。 - **存储**: SSD 硬盘,建议至少 500GB 可用空间,用于存储训练数据和模型文件。 #### 2. 软件依赖 - **操作系统**: 推荐使用 Ubuntu 20.04 或更高版本,或 Windows 10/11。 - **CUDA Toolkit**: 安装与 GPU 驱动版本匹配的 CUDA Toolkit,推荐使用 CUDA 11.7 或更高版本。 - **CUDANN**: 安装与 CUDA 版本匹配的 cuDNN 库。 - **Python**: 推荐使用 Python 3.8 或更高版本,建议通过 Anaconda 管理虚拟环境。 - **PyTorch**: 安装支持 CUDA 的 PyTorch 版本,确保与 CUDA Toolkit 兼容。 - **其他依赖库**: 包括 `numpy`, `matplotlib`, `opencv-python`, `tqdm` 等,可通过 `pip` 安装。 #### 3. 环境搭建步骤 1. **安装 CUDA 和 cuDNN**: - 下载并安装与 GPU 驱动匹配的 CUDA Toolkit。 - 安装 cuDNN,并将其路径添加到系统环境变量中。 2. **创建 Python 虚拟环境**: ```bash conda create -n gaussian_splatting python=3.8 conda activate gaussian_splatting ``` 3. **安装 PyTorch 和其他依赖**: ```bash pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117 pip install numpy matplotlib opencv-python tqdm ``` 4. **克隆项目仓库**: - 从 GitHub 上克隆 3D Gaussian Splatting 的官方实现仓库,例如: ```bash git clone https://github.com/your-repo/3d-gaussian-splatting.git cd 3d-gaussian-splatting ``` 5. **安装项目依赖**: - 根据项目文档安装其他必要的依赖库,通常包括一些自定义的 CUDA 扩展模块。 6. **编译 CUDA 扩展**: - 进入项目目录,运行以下命令编译 CUDA 扩展: ```bash python setup.py build_ext --inplace ``` 7. **验证安装**: - 运行项目中的示例脚本,验证环境是否配置成功: ```bash python examples/train.py ``` ### 数据准备与训练 #### 1. 数据集准备 - **输入数据**: 需要一组从不同角度拍摄的场景图像,可以是视频或一组照片。 - **数据预处理**: 使用 COLMAP 或其他 SfM 工具进行稀疏重建,生成相机参数和点云数据。 #### 2. 训练过程 - **配置文件**: 修改训练配置文件,指定数据集路径、输出目录、训练参数等。 - **启动训练**: ```bash python train.py --config configs/your_config.yaml ``` ### 可视化与渲染 - **可视化工具**: 使用项目提供的可视化工具查看训练过程中的点云和渲染结果。 - **实时渲染**: 训练完成后,使用渲染脚本生成新视角的图像: ```bash python render.py --model_path output/your_model ``` ### 相关问题 1. 3D Gaussian Splatting 与 NeRF 在训练和渲染效率上有何区别? 2. 如何使用 COLMAP 进行稀疏重建并生成 3D Gaussian Splatting 所需的输入数据? 3. 在配置 3D Gaussian Splatting 环境时,如何解决 CUDA 和 cuDNN 版本不兼容的问题? 4. 3D Gaussian Splatting 的训练过程中,如何调整超参数以提高渲染质量? 5. 如何在 Windows 系统上配置 3D Gaussian Splatting 的训练环境?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值