【共创稿事节】基于公开资料的3DGS技术原理分析

【共创稿事节】基于公开资料的3DGS技术原理分析 文章目录每日一句正能量摘要一、引言为什么3DGS值得被认真对待二、3DGS算法核心流程2.1 五步走策略2.2 算法伪代码三、3D高斯参数化场景到底被表示成了什么3.1 四个参数3.2 协方差矩阵的巧妙参数化3.3 颜色为什么用球谐SH四、可微分渲染3DGS的秘密武器4.1 为什么可微分如此重要4.2 Splatting从3D高斯到2D像素五、自适应密度控制高斯的优胜劣汰5.1 分裂与剪枝5.2 为什么密度控制如此重要六、端侧性能猜想3DGS在移动端跑得动吗6.1 三大性能瓶颈6.2 端侧优化方向6.3 性能目标猜想七、结语3DGS的简洁之美每日一句正能量把每一个如果都活成幸好。不是否认过去而是选择从任何经历中提炼出对当下有益的部分。清醒而温柔坚韧而诗意在守护自我的同时与世界进行创造性的互动。摘要摘要3D Gaussian Splatting3DGS自2023年8月发表以来以训练快、渲染快、视觉好三大特性迅速席卷三维视觉领域。本文基于论文公开资料与社区开源实现系统解读3DGS的算法原理——从高斯参数化、可微分渲染到自适应密度控制并结合移动端硬件特性对其端侧部署的性能瓶颈与优化方向做出技术猜想。一、引言为什么3DGS值得被认真对待2023年8月INRIA和马克斯·普朗克研究所的研究团队发表了一篇题为《3D Gaussian Splatting for Real-Time Radiance Field Rendering》的论文。这篇论文没有提出新的网络结构也没有使用Transformer——它提出的方法如此简洁以至于很多人第一次读完后会觉得就这但这个就这的方法在NeRF神经辐射场统治了三维重建领域三年后实现了三个突破训练速度从NeRF的数小时缩短到数分钟渲染速度从NeRF的10fps提升到60fps实时渲染视觉质量在多个数据集上达到或超越NeRF的PSNR指标作为一名校企合作讲师我关注的不仅是论文里的公式更是这项技术从实验室走向课堂、走向产业的路径。本文试图回答两个问题3DGS为什么这么快它在端侧部署会遇到什么瓶颈二、3DGS算法核心流程2.1 五步走策略图13DGS算法核心流程——初始化 → 渲染 → 损失 → 优化 → 密度控制循环迭代3DGS的算法流程可以概括为五个步骤的闭环迭代SfM点云初始化 → 高斯参数初始化 → 可微分渲染 → 光度损失计算 → 自适应密度控制 ↑___________________________________________|第一步SfM点云初始化使用COLMAPStructure from Motion从输入的多视角照片中估计相机位姿并稀疏重建出初始点云。通常得到约10,000个点。这些点是后续高斯分布的种子。第二步高斯参数初始化每个SfM点被转换为一个3D高斯椭球位置点的坐标协方差各向同性球形颜色该点邻域像素的均值透明度0.5。第三步可微分渲染将3D高斯投影到2D屏幕空间按深度排序后进行alpha混合生成渲染图像。第四步光度损失计算比较渲染图像与真实照片的像素差异计算L1损失 SSIM损失。第五步自适应密度控制根据梯度信息对高斯进行分裂densification或剪枝pruning。每100次迭代执行一次。2.2 算法伪代码// 3DGS核心算法伪代码functiontrain3DGS(images,poses){// 1. SfM初始化pointCloudCOLMAP(images,poses);gaussiansinitGaussians(pointCloud);// 2. 迭代优化for(iteration0;iteration30000;iteration){// 2.1 随机采样一个视角camerasampleCamera(poses);// 2.2 可微分渲染renderedImagedifferentiableRender(gaussians,camera);// 2.3 计算损失lossL1Loss(renderedImage,groundTruth)λ*SSIMLoss(renderedImage,groundTruth);// 2.4 反向传播loss.backward();// 2.5 优化器更新optimizer.step();// 2.6 自适应密度控制每100次if(iteration%1000){gaussiansadaptiveDensityControl(gaussians);}}returngaussians;}三、3D高斯参数化场景到底被表示成了什么3.1 四个参数图23D高斯参数化——位置 · 协方差 · 颜色 · 透明度3DGS用数百万个3D高斯椭球表示场景。每个高斯由四个参数定义参数维度含义存储位置 x3高斯中心坐标 (x, y, z)Float32 × 3协方差 Σ63×3协方差矩阵对称只存6个独立元素Float32 × 6颜色 c12球谐系数 SH3 bandsRGB各4个系数Float32 × 12透明度 α1不透明度经Sigmoid映射到[0,1]Float32 × 1总参数量3 6 12 1 22个Float/高斯100万个高斯 ≈ 22M floats ≈84MBFloat323.2 协方差矩阵的巧妙参数化协方差矩阵必须是半正定的直接优化矩阵元素很难保证这一约束。3DGS的解决方案非常巧妙Σ RSS^TR^T (RS)(RS)^T其中R是旋转矩阵由四元数 q 参数化4个参数S是缩放矩阵对角阵3个参数这样协方差矩阵可以分解为旋转 缩放的组合既保证了半正定性又只需7个参数43但论文实际存储6个参数通过Cholesky分解的变体。3.3 颜色为什么用球谐SH传统纹理颜色是固定的但真实世界的颜色会随视角变化如金属反光、绸缎光泽。球谐函数Spherical Harmonics是一种定义在球面上的正交基函数可以用少量系数近似视角相关的颜色c(v) Σ SH_coeff[i] * SH_basis[i](v)其中 v 是视角方向。3DGS默认使用3阶SH12个系数足以捕捉大部分视角相关效果。四、可微分渲染3DGS的秘密武器4.1 为什么可微分如此重要图3可微分渲染 vs 传统渲染——3DGS通过梯度反向传播直接优化3D参数传统光栅化渲染如OpenGL/DirectX的过程是不可微分的离散化操作如深度测试、三角形裁剪没有明确定义的梯度无法直接通过渲染图像与真实照片的误差来反向优化3D场景参数NeRF的解决方案是用MLP多层感知机隐式表示场景渲染过程是MLP的前向传播天然可微分。但代价是渲染慢——每条光线需要数百次MLP前向传播。3DGS的解决方案更优雅让渲染过程本身可微分。4.2 Splatting从3D高斯到2D像素// 可微分渲染核心逻辑functiondifferentiableRender(gaussians,camera){// 1. 3D高斯投影到2DprojectedGaussians[];for(gofgaussians){// 世界坐标 → 相机坐标g_cameracamera.worldToCamera(g.position);// 相机坐标 → 屏幕坐标投影变换g_screencamera.project(g_camera);// 3D协方差 → 2D协方差Jacobian变换g_cov2DprojectCovariance(g.covariance,camera,g.position);projectedGaussians.push({position:g_screen,covariance:g_cov2D,color:evaluateSH(g.color,camera.viewDir),alpha:g.alpha});}// 2. 按深度排序projectedGaussians.sort((a,b)a.depth-b.depth);// 3. Alpha混合从前到后imagezeros(camera.width,camera.height);for(gofprojectedGaussians){// 计算每个像素受到的高斯影响for(pixeling.boundingBox){// 2D高斯概率密度weightgaussian2D(pixel,g.position,g.covariance);// Alpha混合alphag.alpha*weight;image[pixel]image[pixel]alpha*g.color*(1-image[pixel].alpha);}}returnimage;}关键洞察上述所有操作投影、排序、alpha混合都是可微分的。这意味着可以通过自动微分autograd直接计算渲染图像对每个高斯参数的梯度。五、自适应密度控制高斯的优胜劣汰5.1 分裂与剪枝图4自适应密度控制——高斯的分裂densification与剪枝pruning3DGS训练过程中高斯数量不是固定的而是通过自适应密度控制动态调整分裂Densification触发条件某个高斯的视图空间位置梯度 τ_pos阈值默认0.0002且该高斯的尺度大于场景尺度的1.5%操作将该高斯分裂为两个较小的高斯沿梯度最大的方向分离目的在需要更多细节的区域自动增加高斯密度剪枝Pruning触发条件某个高斯的透明度 α ε_α阈值默认0.005操作直接移除该高斯目的清除对场景贡献微弱的噪声高斯// 自适应密度控制伪代码functionadaptiveDensityControl(gaussians){constnewGaussians[];for(gofgaussians){// 检查是否需要分裂if(g.viewSpaceGradientTAU_POSg.scaleSCENE_SCALE*0.015){// 分裂为两个高斯const[g1,g2]splitGaussian(g);newGaussians.push(g1,g2);}// 检查是否需要剪枝elseif(g.alphaEPSILON_ALPHA){// 直接丢弃continue;}else{newGaussians.push(g);}}returnnewGaussians;}5.2 为什么密度控制如此重要场景无密度控制有密度控制平坦墙面过度建模浪费高斯少量大高斯即可覆盖复杂纹理高斯不足细节模糊自动分裂增加密度透明/空洞残留高斯产生雾状伪影低透明度高斯被剪枝六、端侧性能猜想3DGS在移动端跑得动吗6.1 三大性能瓶颈图5端侧3DGS性能猜想——排序瓶颈、内存瓶颈、带宽瓶颈基于公开资料与移动端GPU特性我对3DGS端侧部署的三大瓶颈做出技术猜想瓶颈一排序每帧渲染前需要将所有高斯按深度排序。排序复杂度为 O(n log n)100万个高斯在移动端GPU上约需10ms。这意味着仅排序就消耗了60fps目标16.6ms/帧的大部分时间。猜想使用GPU RadixSort替代传统排序可将排序时间降至2-3ms。更进一步如果相邻帧的相机移动较小可以重用上一帧的排序结果仅在局部调整。瓶颈二内存100万个高斯需要约84MB显存Float32。加上渲染缓冲区、中间结果总显存占用可能超过200MB。对于中端手机4-6GB RAM共享显存这是一个不小的负担。猜想Float32 → Float16可将内存减半至42MB。进一步对SH系数进行量化如8-bit可将总模型压缩到20-30MB。瓶颈三带宽Splatting渲染需要频繁读写显存——读取高斯参数、写入像素颜色。移动端LPDDR的带宽远低于桌面GDDR这会成为渲染帧率的瓶颈。猜想采用Tile-based渲染策略将屏幕划分为16×16的瓦片每个瓦片独立处理减少全局显存访问。配合Early-Z测试可大幅减少overdraw。6.2 端侧优化方向优化方向具体策略预期收益排序优化GPU RadixSort 帧间排序重用排序时间 -70%内存优化Float16 SH量化 参数共享模型大小 -75%渲染优化Tile-based Early-Z 视锥剔除渲染时间 -60%模型优化LOD分级 远距离降采样有效高斯数 -80%硬件优化NPU推理 GPU并行整体吞吐量 50%6.3 性能目标猜想综合上述优化我对移动端3DGS实时渲染的性能目标做出如下猜想指标当前无优化目标优化后渲染帧率15-25 fps60 fps模型大小100-200 MB30 MB加载时间5-10 s2 s内存占用300-500 MB150 MB分辨率720p1080p七、结语3DGS的简洁之美3DGS之所以引人入胜不在于它的复杂性而在于它的简洁性。它没有使用神经网络没有复杂的训练策略没有庞大的模型权重。它只是用最基础的数学工具——高斯分布——来表达三维场景然后用最基础的可微分渲染来优化这些分布。但正是这种简洁带来了惊人的效率训练快、渲染快、效果好。这提醒我们一个常被遗忘的工程原则简单的方法如果设计得当往往比复杂的方法更有效。作为一名讲师我希望学生在学习3DGS时不仅记住公式和参数更理解背后的设计思想如何用可学习的基元primitives 可微分的渲染differentiable rendering 自适应的密度控制adaptive density control构建一个端到端优化的三维表示系统。这个思想可能会影响未来十年的三维视觉技术发展。转载自https://blog.csdn.net/u014727709/article/details/164403521欢迎 点赞✍评论⭐收藏欢迎指正