3D Gaussian splatting论文阅读笔记

作者 | 海边的卡冈图雅  编辑 | 汽车人

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

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

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【NeRF】技术交流群

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

目前辐射场一类场景表示方法已经在新视角渲染任务上得到了革命性的进展,但是在高分辨率图片上由于需要使用神经网络,导致训练和渲染都需要十分昂贵的代价,因此最近那些速度比较快的方法都不可避免地需要通过损失质量来提高速度。而在Unbounded and Complete scene and 1080p数据下,没有方法能够达到实时渲染。3D Gaussian Splatting的pipeline分为3个步骤:1、从相机配准过程中得到的稀疏点云开始,使用3D Gaussian表示场景2、对3D Gaussians进行交叉优化和密度控制3、使用快速可视感知渲染算法来进行快速的训练和渲染

1e0c83ef605911ff79870062175a7112.png

Meshes和Points是最常用的三维场景表达方式,因为这两种数据格式是显式的可以直接访问内存得到数据并且非常适合于基于CUDA/GPU的光栅化。当前NeRF中最高效的方法也是通过对显式存储在voxels/hash grids/points中的数据进行插值得到结果。虽然连续的特性帮助了NeRF的优化,但是随机采样的代价仍然是非常昂贵的。

3D Gaussian Splatting通过以下三个组件达到了高效训练、快速渲染、较高质量:

  1. 引入各向异性3D Gaussian来表达辐射场

  2. 通过交叉优化以及自适应性调整Gaussian密度,来从输入图片中进行训练

  3. 快速可微的GPU渲染方法,运行各向异性splatting和快速反向传播

Related Works

传统的场景重建和渲染的方法,如SfM、MVS,核心思路是根据几何来指导输入图像到摄像机的重投影和融合,在这个过程中来重建场景。一般来说这些方法能得到较好的结果,但当MVS产生不存在的几何时很难从未重建区域或过度重建区域中恢复,并且将所有输入图片存储在GPU上的花费太大。

神经渲染和辐射场主要的方法是volumetric ray-marching,如NeRF取得了巨大的成功,但是训练很慢。目前加速的方法主要利用三点:1.利用空间数据结构存储volumetric ray-marching过程中使用到的feature,并利用插值的方法得到不位于顶点的feature;2.不同的编码;3.MLP capacity。如NGP、Plenoxels得到了很好的效果,但却仍然较难以高效表示空白区域,并且较为依赖场景和捕捉图像的形式。

point-based rendering能够利用光栅化管线实现高效地渲染,但对于底层数据来说,点的采样会面临空洞、混叠的问题,并且是不连续的。而将point primitives "splatting" 到大于一个像素的范围,例如圆形、椭圆形、椭球,的方法解决了这些问题,实现了高质量的point-based rendering。而目前一些基于differentiable point-based rendering的方法能够达到real-time,但仍依赖MVS来初始化几何,并且继承了其在欠/过重建区域的artifacts。

Point-based -blending rendering和NeRF-style volumetric rendering都使用了同一个关键的体渲染公式:

471d07944ee3b4d7b71fd932af8d0b7b.png d74cdd5df91ce2af34a1b5c6f341fd91.png

其中

0806d126fdc8cd37b2e9b0d0dd27b90d.png

比较经典的neural point-based方法是通过混合重叠在一个像素上的点的颜色来计算像素最终的颜色:

0f60030ac875620b32791774c31f8f4f.png fab85393b6d5674d562ef2237d6c30f3.png

可以发现point-based rendering和NeRFs rendering得到图片的模型是一样的,但是在渲染的过程中却有很大的不同。NeRFs是一种连续的表达方式,需要通过昂贵的随机采样来得到采样点,计算花费大并且还存在噪声。而point-based则可以灵活地生成、销毁采样点来得到和NeRF差不多的几何分布,同时可以避免无法高效表达空白区域的缺点。

Overview

bec6fd3e877c5fa0ca4a92c5c7415f87.png

3D Gaussian Splatting的输入为一系列图片以及SfM生成的稀疏点云,根据稀疏点云初始化3D Gaussians的位置、协方差矩形、opacity。方向相关的表面使用球谐系数(SH)进行编码。在算法流程中通过交叉优化position、covariance matrix、opacity和SH系数,同时调整Gaussian的density,来构建辐射场表达。该算法高效的关键在于tile-based rasterizer其中还包括一个高效的反向传播,通过追踪opacity的积累,并且不限制接收梯度的Gaussian的数量。

DIFFERENTIABLE 3D GAUSSIAN SPLATTING

为了继承可微体积表达方式的特性又利用非结构化的和显式的表达方式的快速渲染的优点,本文选择采用3D Gaussian来作为场景表达的原型。这个选择还有一个原因是3D Gaussian不需要计算其法线,使得只使用稀疏点云成为可能。3D Gaussian的定义如下:

8ff697df339d10f9998e2336f20a14ba.png

3D Gaussian实际是被一个满秩的3D协方差矩阵定义,其中心(均值)为μ。

在算法流程中3D Gaussian会乘上一个,为了将3D Gaussian投影到图像空间上,可以通过下面的办法来完成。

32de17efbbfba6c9e7392a10b28b7289.png 7f0ed6ce85023f8321db1603fa71bfec.png

其中J是投影变换的仿射近似雅各布矩阵。

由于只有当协方差是正定的时候才有物理意义,而在优化的过程中使用梯度下降方法时,步骤和梯度更新过程中很容易产生没有意义的协方差矩阵。

因此3D Gaussian Splatting采取了一种更加符合直觉的等价表示方法:

给定一个Scaling矩阵S 以及旋转矩阵R,对应的协方差矩阵为

445b5764ef29daf702e542baae0a5e85.png

为了独立优化两个参数,使用一个三维向量s表示scaling,使用四元数来表示旋转。为了避免自动微分的巨大开销,3D Gaussian Splatting推导了各个参数的导数方便计算。

OPTIMIZATION WITH ADAPTIVE DENSITY

CONTROL OF 3D GAUSSIANS

由于3D到2D的投影存在信息损失,因此重建过程中可能会存在一些错误的几何,这种情况下能够灵活地添加点和删除点就是非常重要的,即在正确的位置添加点,把错误位置上的点去除。3D Gaussian的协方差参数对于紧凑的场景表达十分重要,因为一个较大的齐次场景可以通过较少的各向异性Gaussians表示。

3D Gaussian Splatting使用的Loss函数为:

51b82118c7202ef8c03ade86073bb841.png

作者使用的λ=0.2。

70327a2be5111ee2367d08135654090c.png ea6bad63617f0d8fead29ddc8dabd327.png 4cb7098f8fb338e04b0cfed6392618c3.png

对于摄像机附近出现的artifacts,可能是不合理的增加Gaussians导致的,于是3D Gaussians Splatting采取的方法是每3000次迭代将Gaussian的α置为0,后续的优化则又会将必要的Gaussian的α增大而帮助算法删除那些artifacts。Gaussian可能会缩小或增大导致互相遮挡,算法中会周期性地删除在世界空间中很大或在视图空间中footprint很大的Gaussian。

FAST DIFFERENTIABLE RASTERIZER FOR GAUSSIANS

为了实现快速渲染和快速的排序(方便实现α-blending),3D Gaussian Splatting设计了一个tile-based rasterizer,对整个图像进行预排序。这一方法首先将屏幕切分为16×16的块。然后逐块地剔除Gaussians,只保留那些与视锥相交有99%置信度的Gaussians。接下来设置一个过滤带,去除那些离near plane过近或离视锥很远的Gaussians,因为计算起来会不稳定。

随后根据Gaussians覆盖的tiles来进行实例化,每个示例会被指定一个key,key由视图空间深度和tile ID组成。再根据这些keys来对Gaussian进行排序。

完成排序后,根据视图空间深度由近到远为每个tile生成一个Gaussians的列表。每个tile会启动一个线程块,每个进程块之间首先会协作地将Gaussians导入共享的内存中,然后每个像素从列表中由前往后对color和α进行累加。当一个像素的达到1时,对应的进程就会终止,每个tile中的进程隔一段时间就会被查询一次,当所有像素的都达到1时整个tile的进程块就会终止。

3D Gaussian Splatting没有限制可以接收梯度的primitive的数量,因此可以渲染任意的深度的场景。反向传播中需要恢复每个像素使用的混合点,一种方法是在全局存储空间中存储这些点,但为了避免大量的动态内存使用,可以复用前面的Gaussians列表,为了方便进行反向传播,此时由后向前遍历列表。

遍历会从影响tile中所有像素的最后一个点开始,而每个像素又是从深度小于或等于最后一个对颜色做贡献的点开始。梯度的计算需要每个点的积累opacity,每个点的opacity可以根据累积opacity计算得到(因为是累乘)。

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署协同感知语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

d872c01fb6b48a8a03ac793d3292024a.png 视频官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

53870239b33efd2c6fc335e9e5f39e3f.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、点云处理、端到端自动驾驶、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

f2c6aaffc38a16a0399217725e8cd24e.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

61220d12812b8d35067df29c45af498e.jpeg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值