【PR】3D Gaussian Splatting for Real-Time Radiance Field Rendering
最近开始接触基于深度学习的渲染,记录下阅读过的论文。欢迎交流。
【简介】
这篇论文的主要作者来自法国Inria(国家信息与自动化研究所)。发表在ACM Transactions on Graphics。
本文主要介绍了一种使用辐射场(Radiance Field methods)进行新视角合成的方法:Gaussian splatting(也有描述说这种方法已经很早就有,只是2023年有了加速以及效果好才火起来,我们暂且留坑,以后再关注历史),可以进行快速(30fps)且高质量(1080p)的场景重建。解决了神经辐射场(NeRF)技术在实时渲染高分辨率场景时面临的挑战。NeRF是一种通过使用深度学习优化连续场景的技术,可以实现复杂场景的新视角图像。尽管NeRF提供了优异的视觉质量,但其训练和渲染通常耗时且计算量巨大,难以实现实时渲染。
【创新点】
本文的创新点:
1. 使用3D高斯表达场景,以优化空间使用和计算效率;
2. 通过交错优化和密度控制,尤其是各向异性协方差,以精确描述场景;
3. 开发了快速的渲染算法,支持加速训练和实时渲染。
【review】
重建方法review:
【方法】
本方法从sfm稀疏点出发进行初始化高斯球,然后通过投影和自适应密度控制不断优化高斯球的参数:位置,协方差,alpha和球谐系数,其中,投影主要是通过可微光栅实现的。梯度信息通过可微光栅化投影的图像反向传播到高斯球上。
主要可以分为3部分:
1. 可微的3D gaussian splatting
3D高斯体可微分,可以很容易投影到2D平面,允许快速的alpha混合渲染。
之前使用2D点的方法假设每个点是带有法线的小平面圆,但是,从稀疏的sfm点估计法线非常困难。我们将集合形状建模为不需要法线的3D高斯体,在混合过程中,每个高斯体乘以alpha。
由于协方差矩阵在梯度下降时不容易保证半正定,因此使用缩放矩阵和旋转矩阵来定义椭球体形状的协方差矩阵。独立存储缩放向量和四元数,可以适应不同形状的几何结构。
为了减少自动求导带来的计算开销,本文明确推导了所有参数的梯度。
2. 交错优化和密度控制
参数的优化与密度控制的步骤交织在一起,以更好的表示场景。不可避免的,由于是将3D投影到2D,几何位置可能被放置得不正确。因此,我们需要能创建几何形状,也能销毁或移动几何形状。3D高斯体的协方差参数的质量对于表示的紧凑性至关重要,大的均匀区域可以用少量的大各向异性高斯体来捕获。
对于alpha使用sigmoid激活函数以将其限制在[0,1)的范围内并获得平滑的渐变,并对协方差的尺度使用指数激活函数。我们估计初始协方差矩阵为等轴的各向同性高斯体,其轴等于到最近3个点距离的平均值。我们使用类似于Plenoxels的标准指数衰减位置的学习率。
经过优化热身之后,我们每100次迭代会密化一次,并移除那些几乎完全透明的高斯体,即alpha值小于一定阈值的高斯体。我们对高斯体的自适应控制需要填充空白区域。它关注于缺少几何特征的区域(未充足重建),也关注于高斯体覆盖大面积的场景区域(过度重建)。这两种情况都有较大的空间位置梯度。原因可能是对应于尚未很好重建的区域,优化在尝试移动高斯体来纠正。这两种情况都是密化的候选者。我们密化空间位置梯度高于一定阈值(0.0002)的高斯体。如下图。
对于未足够重建区域的高斯体,我们需要覆盖必须创建新的几何形状,因此,我们进行了clone,创建了一个同样大小的副本,并沿着位置梯度方向移动它。对于大高斯体需要split成更小的高斯体,我们使用2个新的高斯体来替换,以尺度因子(1.6)来分割尺度。第一种情况我们增加了系统总体积和高斯体的数量,第二种情况则保持总体积不变但增加了高斯体的数量。优化的过程中可能在靠近摄像机的地方出现floaters,这会导致高斯体密度的不合理。控制高斯体数量增加的有效方法是在每N(3000)次迭代时将alpha值重置为0。然后,优化会增加那些有用的高斯体的alpha,同时允许我们淘汰将近透明的高斯体。这一策略总体上对控制高斯体数量是有效的。
3. 快速可微光栅化
我们的目标是进行快速的整体渲染和排序,以允许近似的alpha混合,包括对各向异性斑点的处理,并避免以往工作中存在的对可接收梯度的斑点数量的硬限制。为了实现这些目标,我们设计了一种基于瓦片的高斯斑点光栅化,可以一次为整个图像预排序,避免了以往alpha混合解决方案中每个像素都需要排序的大开销。我们的快速光栅化可以有效进行反向传播,用于任意数量的混合高斯体,且额外内存消耗低,每个像素只需恒定的额外开销,且完全可微分。
首先将屏幕分割为16*16的瓦片,然后对3D高斯体进行提出,与视图视椎体和每个瓦片相比较,保留与视图视椎体相交的99%置信区间的高斯体。我们可以轻松剔除极端位置的高斯体,即平均值靠近近平面并远在视图视椎体之外的,因为他们的投影2D协方差将不稳定。然后根据高斯体重叠的瓦片数量实例化每个高斯体,并为每个实例分配一个将视图空间深度和瓦片ID结合的秘钥。我们使用快速的GPU基数排序,基于这些秘钥对高斯体进行排序。这里没有额外的像素点排序,基于初始排序进行混合。因此,我们的alpha混合在某些配置中可能是近似的。当斑点接近单个像素的大小时,这些近似性可以忽略不计。我们发现,这个选择在没有产生明显瑕疵的情况下大大提升了训练和渲染的性能。排序高斯体后,我们通过识别每个瓦片的首尾深度排序条目生成了一个列表。
对于光栅化,我们为每个瓦片启动一个线程块。每个块先协作加载高斯体包到共享内存中,然后给定的像素,通过从前到后遍历列表来累计颜色和alpha值,从而最大化并行性。当我们达到像素中的alpha的目标饱和度时,相应的线程就会停止。定期查询瓦片中的线程,当所有像素饱和时,整个瓦片的处理就终止了。在光栅化过程中,alpha饱和度是唯一的停止标注。与以往工作不同,我们不限制接收高斯更新的混合图元的数量。
在反向传递过程中,我们必须恢复前向传递中每个像素点的完整序列。一种解决方案是在全局内存中为每个像素存储任意长度的混合点列表。为了避免隐含的动态内存管理开销,我们选择再次遍历每个瓦片列表,重用前向传递中的高斯体排序和瓦片范围。为了便于梯度计算,我们从后到前遍历。每个像素只会在它们的深度小于或等于前向传递期间最后一个为其颜色做出贡献的点的深度时,开始进行重叠测试和处理。每个点在前置过程中存储了最终累积的不透明度,我们通过将这个值除以每个点在从后到前遍历过程中的alpha,来获得用于梯度计算的所需系数。
【结论】
结果自然不用说,非常惊人。分辨率很高,且渲染速度极快。代码也开源了:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
最后总结和展望
个人觉得效果很惊艳。属于基于点的渲染方式,所以结构信息也可以从点中恢复。如果再引入位姿优化,以及结构优化,可能会出来更好的效果。毕竟,现在完全依赖于colmap计算的位姿和稀疏sfm点。
对于观测不足的区域,不管怎样的重建方法都会有瑕疵。一些改进:较大的gaussian可以加一些剔除规则,以及通过抗锯齿来缓解一些伪影。或者使用正则化优化。以及在大场景中,可能需要降低位置的学习率。优化CPU和GPU存储消耗,比如使用点云压缩技术。
【参考】
Kerbl B, Kopanas G, Leimkühler T, et al. 3d gaussian splatting for real-time radiance field rendering[J]. ACM Transactions on Graphics, 2023, 42(4): 1-14.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)