三维重建(点云)

gaussian-splatting

GitHub - graphdeco-inria/gaussian-splatting: Original reference implementation of "3D Gaussian Splatting for Real-Time Radiance Field Rendering" · GitHub链接

摘要:3D高斯 splatting(GS)已成为显式辐射场和计算机图形学领域的一种变革性技术。这种创新方法的特点是使用数百万个可学习的3D高斯,它与主流神经辐射场方法有显著区别------后者主要使用基于坐标的隐式模型将空间坐标映射到像素值。3D GS凭借其显式场景表示和可微渲染算法 ,不仅有望实现实时渲染能力,还引入了前所未有的可编辑性水平。这使得3D GS成为下一代3D重建和表示领域的潜在游戏规则改变者。在本文中,我们首次系统概述了3D GS领域的最新发展和关键贡献。我们首先详细探讨3D GS的基本原理及其兴起的驱动力,为理解其重要性奠定基础。我们讨论的一个重点是3D GS的实际适用性。通过实现前所未有的渲染速度,3D GS开辟了从虚拟现实到互动媒体等众多应用场景。此外,我们还对领先的3D GS模型进行了对比分析,通过各种基准任务对其进行评估,以突出它们的性能和实用价值。本综述最后指出了当前面临的挑战,并提出了未来研究的潜在方向。通过本次综述,我们旨在为新手和资深研究人员提供有价值的资源,以促进显式辐射场领域的进一步探索和发展。

关键词:3D高斯 splatting、显式辐射场、实时渲染、场景理解
[2401.03890] A Survey on 3D Gaussian Splatting(原文)

arxiv.org/pdf/2401.03890

机器学习+CG+线性代数+GPU性能编程

splatting:

体素:

体素:体素是三维空间中的体积像素的简称。它类似于二维图像中的像素,但在三维空间中表示立体体素单元。体素可以被看作是一个立方体,具有一定的体积、位置和属性。

(a)点云(Point clouds);

(b) 体素网格(Voxel grids);

(c) 多边形网格(Polygon meshes);

(d) 多视图表示(Multi-view representations)

a. 点云是三维空间(xyz坐标)点的集合。

b. 体素是3D空间的像素。量化的,大小固定的点云。每个单元都是固定大小和离散坐标。

c. mesh是面片的集合。

d. 多视图表示是从不同模拟视点渲染的2D图像集合。

体素网格是用固定大小的立方块作为最小单元,来表示三维物体的一种数据结构。

体素可以看成粗略版的点云。
Splatting抛雪球法------学习笔记-CSDN博客

3Dgaussion分布:【较真系列】讲人话-3d gaussian splatting全解(原理+代码+公式)【1】 捏雪球_哔哩哔哩_bilibili

选择点云->进行膨胀(高斯膨胀)->高斯小球填充得出模型

3Dsplatting算法:

3D Splatting算法是一种用于场景重建和渲染的技术。该算法优化从稀疏SfM点云开始,会创建一组三维高斯分布,可通过colmap先创建出一个初始化点云,且仅通过一组照片就能进行估算。它能保持连续体积辐射场的理想特性,用于场景优化,同时避免了空白空间中不必要的计算。

在训练过程中,每经过一定的轮数(densification_interval),会进行一系列操作。包括点的修剪,即移除不透明度极低的点以减少计算量;高斯的分裂和克隆,根据梯度范数和高斯范数,对满足条件的高斯进行分裂和克隆操作,以此提高模型的表达能力;参数更新,使用优化器(如Adam)更新权重张量W;中间结果展示与保存,每100个轮次显示生成的图像,并保存当前的训练结果

python 复制代码
# 以下为简单示意代码,并非完整实现
import torch
import torch.optim as optim

# 假设这些是高斯点云的参数
points = torch.randn(100, 3)  # 点的位置
opacity = torch.rand(100)  # 不透明度
weights = torch.randn(100)  # 权重

# 定义优化器
optimizer = optim.Adam([weights], lr=0.001)

# 模拟训练轮次
densification_interval = 10
for epoch in range(100):
    if epoch % densification_interval == 0:
        # 点的修剪
        low_opacity_indices = opacity < 0.1
        points = points[~low_opacity_indices]
        opacity = opacity[~low_opacity_indices]
        weights = weights[~low_opacity_indices]

        # 高斯的分裂和克隆(此处简单示意,实际复杂)
        # 假设根据某种条件选择部分高斯进行操作
        split_indices = torch.randint(0, len(points), (10,))
        # 分裂和克隆操作...

    # 前向传播和损失计算(此处省略)
    loss = torch.sum(weights)  # 简单示例

    # 参数更新
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch % 100 == 0:
        # 中间结果展示与保存
        print(f"Epoch {epoch}: Loss = {loss.item()}")
        # 保存当前训练结果
        torch.save({
            'points': points,
            'opacity': opacity,
            'weights': weights
        }, f'training_result_epoch_{epoch}.pt')

单张图片训练3d高斯模型:

使用单张图片训练3D高斯模型可以采用以下方法:

  1. **利用图像生成RGB和深度图**:从单张图像生成RGB和深度图,然后将像素反投影到3D空间,创建密集的表面对齐高斯点云。之后通过Poisson表面重建提取高质量的纹理网格,同时利用高斯投影进行新视角合成(Novel View Synthesis) 。

  2. **借助已有代码框架进行处理**:可以参考相关博客中提供的`train_video.py`代码。不过单张图片需要先模拟类似视频帧处理的流程,例如可以将单张图片复制多次模拟视频帧,然后通过ffmpeg截取(这里单张图片虽无需截取,但可模拟流程),再放到colmap中进行稀疏重建,最后把点云和相机位姿图片放到3D高斯中训练,得到训练结果 。

  3. **遵循3D高斯应用实践流程**:

  • **特征提取与匹配**:对单张输入图像提取SIFT/SURF等特征点,虽然单张图片难以建立传统意义上图像间的对应关系,但可以通过一些先验知识或模型来模拟特征对应,构建图像间几何约束,为后续相机位姿计算提供依据 。

  • **相机位姿估计 (SfM)**:计算该单张图像的拍摄位置、方向(外参)和内部参数(内参),这是3D高斯模型训练的必要前提 。

  • **稀疏点云重建**:生成场景的稀疏三维点云,作为3D高斯模型的初始化位置,每个点对应一个初始高斯分布 。

  • **稠密点云生成 (MVS)**:这是可选步骤,对稀疏点云补充细节,生成更密集的三维点云,以提供更丰富的几何信息,提升3D高斯模型细节表现 。

  • **格式转换**:输出3D高斯模型可识别的相机参数和点云文件,建立从传统摄影测量到神经渲染的桥梁 。

colmap:

在训练 3D Gaussian Splatting 之前,COLMAP 的作用可以概括为:从一组无序/有序的二维图像中,自动重建出场景的相机参数和稀疏点云,为后续的高斯泼溅训练提供必要的几何与相机信息。

具体来说,COLMAP 会做以下几件事:

  1. 相机标定

    估计每张图片的相机内参(焦距、主点、畸变系数等)和外参(相机在世界坐标系中的位置和朝向)。

  2. 运动恢复结构(SfM)

    通过特征匹配、三角测量、光束法平差(Bundle Adjustment),生成一个稀疏的 3D 点云(每个点对应图像中匹配的特征点)。

  3. 输出标准格式

    将结果保存在 sparse/0/ 目录下,包含:

    • cameras.bin:相机内参

    • images.bin:每张图片的位姿

    • points3D.bin:稀疏点云

训练参数:

参数 说明 默认值 建议/备注
-s, --source_path 数据集路径 ,包含COLMAP生成的sparse目录和images目录。 必填 训练前必须指定。
-m, --model_path 训练模型和日志的保存路径。 output/<随机名> 用于指定存放模型和日志的目录。
--iterations 训练总迭代次数 30_000 可减少以缩短训练时间或测试流程。
-r, --resolution 图像加载分辨率。 自动缩放 (宽度>1600) 可降低分辨率以节省显存。
-w, --white_background 使用白色背景代替黑色。 False 若数据集背景为白色,建议开启。
--data_device 图像数据加载到的设备。 cuda 显存不足时可设为cpu(训练会变慢)。
--sh_degree 球谐函数阶数,影响视角相关效果。 3 测试时可设为0加速。
python 复制代码
#!/usr/bin/env python3
"""
Gaussian-Splatting 训练启动脚本
用法: python run_train.py
"""

import subprocess
import sys
import os
from pathlib import Path

# ==================== 配置参数(请根据需要修改) ====================

# 数据集路径(必须包含 images/ 和 sparse/0/ 子目录)
DATA_PATH = "data"                     # 相对路径或绝对路径

# 输出模型保存路径(None 表示自动生成)
MODEL_PATH = None                      # 例如 "output/my_scene"

# 训练迭代次数
ITERATIONS = 30_000                    # 30k 是默认值,测试时可减少到 5_000

# 图像加载分辨率(-r 参数,1=原图,2=半分辨率,4=1/4 分辨率)
RESOLUTION = 1                         # 显存不足时增大数值

# 背景色(True=白色,False=黑色)
WHITE_BACKGROUND = False

# 球谐函数阶数(3=全彩色,0=无视角相关颜色)
SH_DEGREE = 3

# 数据加载设备("cuda" 或 "cpu",显存不足时用 "cpu")
DATA_DEVICE = "cuda"

# 密度控制开始和结束的迭代步数
DENSIFY_FROM_ITER = 500
DENSIFY_UNTIL_ITER = 15_000

# 学习率(可选,一般保持默认)
POSITION_LR_INIT = 0.00016
POSITION_LR_FINAL = 0.0000016
FEATURE_LR = 0.0025
OPACITY_LR = 0.05
SCALING_LR = 0.005
ROTATION_LR = 0.001

# ==================== 参数检查 ====================

data_path = Path(DATA_PATH)
if not data_path.exists():
    print(f"❌ 错误:数据集路径不存在: {data_path.resolve()}")
    sys.exit(1)

if not (data_path / "images").exists():
    print(f"❌ 错误:缺少 images 目录: {data_path / 'images'}")
    sys.exit(1)

if not (data_path / "sparse").exists():
    print(f"❌ 错误:缺少 sparse 目录(请先运行 COLMAP): {data_path / 'sparse'}")
    sys.exit(1)

print("✅ 数据集检查通过")

# ==================== 构建命令行 ====================

cmd = [
    sys.executable, "train.py",          # 使用当前 Python 解释器
    "-s", str(data_path),
    "--iterations", str(ITERATIONS),
    "-r", str(RESOLUTION),
    "--sh_degree", str(SH_DEGREE),
    "--data_device", DATA_DEVICE,
    "--densify_from_iter", str(DENSIFY_FROM_ITER),
    "--densify_until_iter", str(DENSIFY_UNTIL_ITER),
    "--position_lr_init", str(POSITION_LR_INIT),
    "--position_lr_final", str(POSITION_LR_FINAL),
    "--feature_lr", str(FEATURE_LR),
    "--opacity_lr", str(OPACITY_LR),
    "--scaling_lr", str(SCALING_LR),
    "--rotation_lr", str(ROTATION_LR),
]

if WHITE_BACKGROUND:
    cmd.append("-w")

if MODEL_PATH:
    cmd.extend(["-m", MODEL_PATH])

# ==================== 执行训练 ====================

print("\n🚀 启动训练,命令如下:")
print(" ".join(cmd))
print("\n" + "=" * 80)

try:
    subprocess.run(cmd, check=True)
except subprocess.CalledProcessError as e:
    print(f"\n❌ 训练失败,错误码: {e.returncode}")
    sys.exit(e.returncode)
except KeyboardInterrupt:
    print("\n⏸️ 训练被用户中断")
    sys.exit(1)

print("\n🎉 训练完成!")

查看模型效果:

(gaussian_splatting) C:\Users\lenovo\Desktop\3Drebuild\gaussian-splatting>C:\Users\lenovo\Desktop\3Drebuild\gaussian-splatting\viewers\bin\SIBR_gaussianViewer_app.exe -m C:\Users\lenovo\Desktop\3Drebuild\gaussian-splatting\output\3e9615e1-9

用viewers

或者超级Splat编辑器拖拽ply文件进入网页

相关推荐
别或许2 小时前
线代中为什么左乘一个列满秩矩阵,不改变矩阵的秩?
人工智能·算法·矩阵
qiyongwork2 小时前
软件项目成本估算新模式探析
人工智能·项目管理·产品经理
Guheyunyi2 小时前
无人机巡检系统,高效精准守护全场景安全
大数据·人工智能·科技·安全·架构·无人机
前端摸鱼匠2 小时前
【AI大模型春招面试题20】大模型训练中优化器(AdamW、SGD、RMSProp)的选择依据?
人工智能·ai·语言模型·面试·大模型·求职招聘
快乐得小萝卜2 小时前
Xfeat部署系列-1-暴力匹配加速!
人工智能·深度学习
m0_475064502 小时前
Spring AI文档切片
java·人工智能·spring
lI-_-Il2 小时前
赤拳配音 v1.0.3 解锁VIP版:自媒体创作者的AI配音利器
人工智能·媒体
蓝耘智算2 小时前
Token经济学:读懂AI时代的“新石油”
大数据·人工智能·ai·token·蓝耘
蔡俊锋2 小时前
AI进化简史:从1956到AGI的奇妙旅程
人工智能·agi·ai进化简史·ai历史·agi历史