3D 高斯泼溅 (3DGS) 入门:用 Python + CUDA 渲染你的房间,速度比 NeRF 快 100 倍

3D 高斯泼溅 (3DGS) 入门:用 Python + CUDA 渲染你的房间,速度比 NeRF 快 100 倍

标签: #3DGS #ComputerVision #CUDA #Python #VirtualReality #Rendering


📉 前言:为什么 NeRF 会“死”?

NeRF 的本质是在“猜”。
它通过发射无数条光线,去问神经网络:“这个点的颜色是什么?密度是多少?”
这种基于 Ray Marching(光线步进) 的机制,注定了它的计算量是巨大的。

3DGS 的本质是在“画”。
它把场景表示为成千上万个 3D 高斯球(椭球体)。渲染时,直接把这些球“泼(Splat)”到屏幕上,利用 GPU 的排序和 Alpha 混合,瞬间成像。

原理对比 (Mermaid):

3DGS (快: 光栅化)

优化

投影

排序 & Alpha混合

点云初始化

3D 高斯球集合

屏幕分块 (Tiles)

像素 (并行计算)

NeRF (慢: 光线步进)

发射光线

输入

计算

积分

相机

采样点 (x,y,z)

神经网络 (MLP)

颜色 & 密度

像素


🛠️ 一、 核心数据结构:什么是“高斯球”?

在代码中,一个 3DGS 场景本质上就是一个巨大的 Python List,里面存了数百万个“点”。
但这个点不是普通的点,它带有 4 类关键属性。

我们定义一个 GaussianModel 类:

import torch classGaussianModel:def__init__(self, num_points):# 1. 位置 (XYZ) - 决定球在哪 self._xyz = torch.nn.Parameter(torch.zeros(num_points,3))# 2. 不透明度 (Opacity) - 决定球有多实 self._opacity = torch.nn.Parameter(torch.zeros(num_points,1))# 3. 几何形态 (Covariance) - 决定球是扁的还是圆的# 为了优化方便,拆分为 缩放(Scale) 和 旋转(Rotation) self._scaling = torch.nn.Parameter(torch.zeros(num_points,3)) self._rotation = torch.nn.Parameter(torch.zeros(num_points,4))# 四元数# 4. 颜色 (Spherical Harmonics) - 决定不同角度看是什么颜色# 这是一个拟合系数,不是固定的 RGB self._features_dc = torch.nn.Parameter(torch.zeros(num_points,1,3)) self._features_rest = torch.nn.Parameter(torch.zeros(num_points,15,3))

理解关键: 3DGS 的训练过程,其实就是用 梯度下降 (Gradient Descent) 不断调整这几百万个球的参数,让它们“泼”在屏幕上的样子,和你的照片一模一样。


🚀 二、 渲染流程:CUDA 里的魔法

Python 负责管理参数,CUDA 负责拼命干活。
3DGS 的核心黑科技在于 diff-gaussian-rasterization 这个库(由 Inria 团队开源)。

渲染一帧画面的逻辑如下:

  1. 视锥裁剪 (Culling):把摄像机看不到的球扔掉。
  2. 投影 (Projection):把 3D 椭球投影成 2D 平面上的椭圆。
  3. 排序 (Sorting)这是最耗时的。 利用 Radix Sort(基数排序)根据深度(Z轴)对所有高斯球排序。
  4. 光栅化 (Rasterization):从后往前,叠加颜色。

(注:这部分代码通常是编译好的 CUDA 核函数,Python 只需要调用 .apply())


📸 三、 实战:把你的房间搬进电脑

1. 环境准备

你需要一块 NVIDIA 显卡(推荐 RTX 3060 以上),安装好 CUDA Toolkit 11.8+。

git clone --recursive https://github.com/graphdeco-inria/gaussian-splatting cd gaussian-splatting pip install -r requirements.txt 
2. 数据采集 (COLMAP)

拿出手机,围绕你的房间拍一段视频(慢一点,不要有动态模糊)。
然后使用 ffmpeg 抽帧,并用 colmap 计算相机位姿。

# 这一步建议使用自动化脚本 convert.py python convert.py -s data/my_room 

Colmap 会生成稀疏点云,作为高斯球的初始位置。

3. 开始训练

这是见证奇迹的时刻。

python train.py -s data/my_room -m output/my_room 

你会看到终端里的 Loss 飞速下降。

  • 7000 次迭代:大概能看清轮廓。
  • 30000 次迭代(约 20-40 分钟):连桌子上的纹理、显示器的反光都清晰可见。
4. 核心优化逻辑 (Adaptive Density Control)

为什么 3DGS 能把细节还原得这么好?因为它支持自适应分裂

# 伪代码逻辑:每隔 100 次迭代执行一次defdensify_and_prune(self, grads, threshold):# 1. 克隆 (Clone):# 如果一个高斯球梯度很大,但本身很小 -> 说明这里细节不够 -> 复制一个球填补 self.clone_gaussians(grads > threshold)# 2. 分裂 (Split):# 如果一个高斯球梯度很大,且本身很大 -> 说明这个球太粗糙了 -> 把它劈成两个小球 self.split_gaussians(grads > threshold)# 3. 移除 (Prune):# 把不透明度几乎为 0 的透明球删掉,节省显存 self.prune_gaussians(self.opacity <0.005)

🎮 四、 效果展示与查看

训练完成后,使用配套的 SIBR_viewer 查看。
你会发现:

  • 帧率:轻松达到 140+ FPS。
  • 质量:比 iPhone 拍的照片还清晰,支持任意角度漫游。
  • 大小:虽然显存占用大,但导出的模型文件通常只有几百 MB。

🎯 总结

3DGS 彻底改变了三维重建的游戏规则。
它告诉我们:显式表达(Explicit Representation)+ 可微渲染(Differentiable Rendering) 才是实时图形学的未来。

2026 趋势预测:
现在我们还在用 Python 跑 Demo,未来 3DGS 将被集成进 UnityUnreal Engine,甚至直接作为一种视频格式(.splat)在浏览器中流式播放。

Next Step:
别光看。去 GitHub 下载 gaussian-splatting 源码,拍摄一段 30 秒的视频,今晚就拥有一个属于你自己的“数字孪生”房间。

Read more

【Java 开发日记】我们来说说 Redis 中 Zset 的底层实现

【Java 开发日记】我们来说说 Redis 中 Zset 的底层实现

目录 核心概括 一、两种编码方式 1. ziplist / listpack 编码 2. skiplist 编码 为什么需要两种结构? 二、核心数据结构剖析 1. 跳跃表(Skip List)详解 2. 字典(Dict) 三、操作流程示例 四、ZSET ZRANGE 操作序列图 五、总结与要点 面试回答 核心概括 Redis 的 Zset 同时具备两个核心特性: 1. 有序性:元素按分值(score) 从小到大排列。 2. 唯一性:集合中的成员(member) 是唯一的,但分值可以相同(分值相同时,按成员字典序排列)。 为了实现这种高效的、

By Ne0inhk
Java 注解与反射实战:手把手实现自定义日志与参数校验注解

Java 注解与反射实战:手把手实现自定义日志与参数校验注解

前言:为什么需要自定义注解? 在日常开发中,我们经常遇到两类重复工作: 日志记录:每个重要方法都要写 "开始执行"、"参数是 xxx"、"执行结束" 的代码;参数校验:判断输入是否为 null、年龄是否在合理范围、手机号格式是否正确等。 这些工作机械且冗余,而注解 + 反射正是解决这类问题的 "银弹"—— 用注解标记需要处理的地方,用反射自动执行逻辑,实现 "一次定义,多处复用"。 本文将带你从零实现两个实用案例: 1. 自定义日志注解@Log:自动记录方法调用细节; 2. 自定义参数校验注解@NotNull、@Range:自动校验方法参数合法性。 全程实战,代码可直接运行,搭配图解帮你吃透底层逻辑。 案例一:自定义日志注解@

By Ne0inhk
【Java String】类深度解析:从原理到高效使用技巧

【Java String】类深度解析:从原理到高效使用技巧

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:【Java】内容概括 【前言】 在 Java 编程中,String 类是使用频率最高的类之一,也是初学者接触最早的引用类型之一。但正是因为其基础且常用,很多开发者往往忽略了它的底层原理和高级特性。本文将从 String 类的底层实现、核心方法到性能优化、常见误区,全方位解析 Java String 类,帮你彻底搞懂这一基础却关键的类。 文章目录: * 一、String类本质特征 * 1.String类定义 * 2.字符串创建及内存机制 * 3.字符串常量池(StringTable) * 二、String 类核心方法 * 1.字符串方法比较 * 1.1“==”比较是否引用同一个对象 * 1.2 equals

By Ne0inhk

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=GBK 新版IDEA编码格式GBK问题 maven命令Picked up JAVA_TOOL_OPTION

📋 问题概述 问题现象 在使用新版IDEA执行 Maven 构建项目时,控制台输出警告信息: Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=GBK 🔍 问题排查过程 第一阶段:初步判断与假设 初始假设:系统环境变量设置了 Java 编码为 GBK 第二阶段:环境变量验证 cmd # 检查环境变量 echo %JAVA_TOOL_OPTIONS% # 输出:%JAVA_TOOL_OPTIONS%(表示变量未显式设置) 排查结果:系统环境中并未手动设置 JAVA_TOOL_OPTIONS 变量 第三阶段:深入排查IDEA配置 怀疑方向:IDEA内部设置或配置文件指定了GBK编码 检查项包括: 1. IDEA VM Options:

By Ne0inhk