一、引言
3D高斯泼溅(3DGS)是一种新兴的三维场景表示方法,可以生成高质量的场景重建结果。然而,要查看这些重建场景,需要特殊的高斯渲染器。大多数3D处理软件并不兼容3D高斯分布模型,但它们通常都兼容点云文件。
3DGS-to-PC项目提供了一种方法,将3DGS场景转换为高密度点云,以便在常用的3D软件中查看和编辑。该项目还提供了生成网格模型的功能,方便进一步处理和应用。
二、环境配置
2.1 前提条件
- Ubuntu 20.04
- CUDA 11.8
- Python 3.x (建议3.8或更高版本)
- 已安装好的3D Gaussian Splatting环境
2.2 配置3DGS-TO-PC
首先,克隆仓库到本地:
git clone https://github.com/Lewis-Stuart-11/3DGS-to-PC
cd 3DGS-to-PC
确保原始 3D Gaussian Splatting 存储库已正确安装,因为它包含所有必需的模块/包。
然后,安装CUDA高斯点云光栅化扩展:
pip install ./gaussian-pointcloud-rasterization
如果上述安装失败,不要担心,项目还提供了纯Python渲染器作为备选方案。
为了使用网格生成功能,需要安装Open3D:
pip install open3d
2.3 依赖关系检查
确保以下Python包已正确安装:
pip install numpy torch tqdm configargparse imageio matplotlib open3d
三、基本使用流程
3.1 准备3DGS模型+colmap相机参数(相机内参+相机位姿)
首先,你需要拥有一个已训练好的3D高斯分布模型。这通常是一个.ply或.splat文件。如果你还没有训练好的模型,可以使用原始的3D Gaussian Splatting仓库来从图像数据集训练一个模型。
colmap相机参数也是必要的 为了生成 transforms.json 以支持 3DGS-to-PC 在采样点云时进行颜色渲染和 mesh 重建。
sparse/0/
├── cameras.txt ✅ 相机内参
├── images.txt ✅ 相机位姿(四元数 + 平移)
├── points3D.txt ⛔ 不需要,用不到
或者:
sparse/0/
├── cameras.bin ✅
├── images.bin ✅
├── points3D.bin ⛔
准备好的 准备3DGS模型+colmap相机参数结构目录如下所示:
3.2 colmap相机参数转化生成 transforms.json
可以创建脚本进行转化处理transform_dataloader.py:
部分代码如下:
import os
import numpy as np
import torch
import cv2
import struct
import json
def convert_sfm_pose_to_nerf(transform):
"""
Convert camera pose from COLMAP to a transform for rendering
"""
c2w = np.linalg.inv(transform)
flip_mat = np.array([
[1, 0, 0, 0],
[0, -1, 0, 0],
[0, 0, -1, 0],
[0, 0, 0, 1]
])
return np.matmul(c2w, flip_mat)
........................................
........................................
然后可以运行代码:
python transform_dataloader.py --input_path data/z1/col/bond/sparse/0/ --output data/z1/tran_z1.json
执行结果如下:
即可得到标准 transforms_fixed.json,然后用它作为:
--transform_path transforms_fixed.json
3.3 基本转换命令
最基本的点云生成命令如下:
python gauss_to_pc.py --input_path "path//to//gaussian_splat"
但这只会生成一个基本的点云,颜色可能与原始3DGS场景不匹配。为了生成带有真实颜色的点云,你需要提供相机变换文件路径:
python gauss_to_pc.py --input_path "path/to/gaussian_splat.ply" --transform_path "path/to/transforms.json"
transform_path可以指向transforms.json文件或COLMAP输出文件夹。
比如:
python gauss_to_pc.py --input_path data/z1/data/point_cloud/iteration_30000/point_cloud.ply --transform_path data/z1/tran_z1.json --output_path data/z1z1.ply
3.4 生成网格(Mesh)文件
要生成网格,可以使用以下命令:
python gauss_to_pc.py --input_path “path/to/gaussian_splat.ply” --transform_path “path/to/transforms.json” --generate_mesh
比如:
python gauss_to_pc.py --input_path data/z1/data/point_cloud/iteration_30000/point_cloud.ply --transform_path data/z1/tran_z1.json --generate_mesh --mesh_output_path data/z1/mash_z1.ply
3.5 如果想同时生成点云和Mesh
需要执行以下命令:
python gauss_to_pc.py \
--input_path data/z1/data/point_cloud/iteration_30000/point_cloud.ply \
--transform_path data/z1/tran_z1.json \
--output_path output/fed0e33a-9/pointcloud.ply \
--generate_mesh \
--mesh_output_path output/fed0e33a-9/mesh.ply \
--num_points 10000000 \
--colour_quality high
3.5 关键参数说明
参数 | 含义 | 建议值 |
---|---|---|
--input_path |
3DGS 输出的 point_cloud.ply |
point_cloud.ply |
--transform_path |
相机姿态文件 | data/z1/tran_z1.json |
--num_points |
生成点数(越多越细) | 10000000 |
--colour_quality |
渲染图像的分辨率 | high / ultra |
--generate_mesh |
是否生成网格 | ✅ 添加此参数 |
--mesh_output_path |
网格保存路径 | mesh.ply |
四、参数详解与优化建议
4.1 核心参数解析
4.2 高级参数优化
1、点云质量优化
高质量点云生成命令示例
python gauss_to_pc.py --input_path "path/to/model.ply" \
--transform_path "path/to/transforms" \
--num_points 20000000 \
--visibility_threshold 0.08 \
--std_distance 1.5 \
--colour_quality high \
--clean_pointcloud
参数解释:
- –num_points: 增加点数以获得更精细的点云
- –visibility_threshold: 适当提高可以减少噪点
- –std_distance: 控制点与高斯中心的最大距离,降低可以使点分布更紧凑
- –colour_quality: 设置为high或ultra可提高渲染质量
- –clean_pointcloud: 启用异常点过滤
2、网格质量优化
# 高质量网格生成命令示例
python gauss_to_pc.py --input_path "path/to/model.ply" \
--transform_path "path/to/transforms" \
--generate_mesh \
--poisson_depth 12 \
--laplacian_iterations 15 \
--visibility_threshold 0.1
参数解释:
- –poisson_depth: 提高至12可以获得更精细的网格(不建议超过12,会导致计算量过大)
- –laplacian_iterations: 增加至15可以获得更平滑的网格
- –visibility_threshold: 提高至0.1可以减少网格中的噪点
处理大场景的优化:
# 处理大场景的命令示例
python gauss_to_pc.py --input_path "path/to/model.ply" \
--transform_path "path/to/transforms" \
--camera_skip_rate 4 \
--colour_quality medium \
--bounding_box_min -10 -10 -10 \
--bounding_box_max 10 10 10
参数解释:
- –camera_skip_rate: 跳过一定比例的相机以加快渲染速度
- –colour_quality: 降低至medium可以加快渲染速度
- –bounding_box_min/max: 限定模型的边界框,只处理特定范围内的高斯分布
五、代码核心原理解析
5.1 高斯分布到点云的转换过程
gauss_to_pc.py中的convert_3dgs_to_pc函数是整个转换过程的核心。以下是详细解析:
1、加载高斯模型和相机参数:
首先,程序会加载高斯分布模型和相机参数,这是点云生成和渲染颜色的基础。
# 加载相机变换数据
transforms, intrinsics = load_transform_data(transform_path, skip_rate=pointcloud_settings.camera_skip_rate)
# 加载高斯分布数据
xyz, scales, rots, colours, opacities = load_gaussians(input_path, max_sh_degree=pointcloud_settings.max_sh_degree)
# 创建高斯对象
gaussians = Gaussians(xyz, scales, rots, colours, opacities)
2、高斯预处理:
然后,程序会对高斯进行预处理,包括计算法向量、应用透明度阈值、边界框和裁剪大型高斯等。
# 计算高斯法向量
if pointcloud_settings.calculate_normals:
gaussians.calculate_normals()
# 应用透明度阈值
gaussians.apply_min_opacity(pointcloud_settings.min_opacity)
# 应用边界框限制
gaussians.apply_bounding_box(pointcloud_settings.bounding_box_min, pointcloud_settings.bounding_box_max)
# 裁剪大型高斯
gaussians.cull_large_gaussians(pointcloud_settings.cull_large_percentage)
3、渲染颜色:
如果启用了颜色渲染,程序会使用给定的相机参数渲染高斯分布的颜色
# 初始化高斯渲染器
gaussian_renderer = get_renderer(pointcloud_settings.renderer_type, gaussians.xyz,
torch.unsqueeze(torch.clone(gaussians.opacities), 1),
gaussians.colours, gaussians.covariances,
visible_gaussian_threshold=pointcloud_settings.visibility_threshold)
# 对每个相机位置进行渲染
for i in range(len(transforms)):
img_name, transform = list(transforms.items())[i]
transform = torch.tensor(list(transform), device=pointcloud_settings.device)
cam_intrinsic = intrinsics[img_name]
camera = get_camera(pointcloud_settings.renderer_type, transform, cam_intrinsic,
colour_resolution=pointcloud_settings.colour_resolution)
render, _, _ = gaussian_renderer(camera)
# 获取渲染后的高斯颜色
gaussians.colours = gaussian_renderer.get_gaussian_colours()
4、点云生成:
接下来是点云生成的核心部分,通过generate_pointcloud函数实现:
# 生成点云
points, colours, normals = generate_pointcloud(gaussians, pointcloud_settings.num_points,
exact_num_points=pointcloud_settings.exact_num_points,
std_distance=pointcloud_settings.std_distance,
device=pointcloud_settings.device,
calculate_normals=pointcloud_settings.calculate_normals,
num_sample_attempts=num_sample_attempts,
quiet=pointcloud_settings.quiet)
5、网格生成(如果启用):
如果启用了网格生成,程序会根据表面高斯分布生成一个单独的点云,然后用于网格重建:
if pointcloud_settings.generate_mesh and pointcloud_settings.render_colours:
# 确保只包含表面高斯
gaussians.filter_gaussians(surface_gaussian_idxs)
# 设置网格点数
total_mesh_points = min(pointcloud_settings.num_points//2,
int(gaussians.xyz.shape[0]*avg_points_per_gauss_for_mesh))
# 生成用于网格重建的点云
points, colours, normals = generate_pointcloud(gaussians, total_mesh_points,
exact_num_points=pointcloud_settings.exact_num_points,
num_sample_attempts=num_sample_attempts,
device=pointcloud_settings.device,
quiet=pointcloud_settings.quiet)
六、针对不同数据集的优化策略
6.1 室内场景
室内场景通常包含较多复杂的几何结构和纹理细节:
python gauss_to_pc.py --input_path "indoor_scene.ply" \
--transform_path "indoor_transforms" \
--num_points 15000000 \
--visibility_threshold 0.06 \
--std_distance 1.8 \
--colour_quality high \
--generate_mesh \
--poisson_depth 11
优化理由:
- 增加点数以捕获细节
- 适中的可见性阈值以平衡细节和噪点
- 较高的std_distance以确保结构完整性
- 高色彩质量以还原真实纹理
- 适中的泊松深度以平衡细节和计算效率
6.2 户外场景优化
户外场景通常更加开阔,可能包含更多远处的物体:
python gauss_to_pc.py --input_path "outdoor_scene.ply" \
--transform_path "outdoor_transforms" \
--num_points 20000000 \
--visibility_threshold 0.08 \
--std_distance 1.6 \
--colour_quality high \
--clean_pointcloud \
--generate_mesh \
--poisson_depth 10 \
--laplacian_iterations 12
优化理由:
- 更多的点数以覆盖大范围场景
- 更高的可见性阈值以减少远处的噪点
- 启用点云清理以去除异常点
- 适中的泊松深度和较高的平滑迭代次数以生成更平滑的远景
6.3 物体扫描优化
单个物体的扫描通常需要更精细的细节:
python gauss_to_pc.py --input_path "object_scan.ply" \
--transform_path "object_transforms" \
--num_points 8000000 \
--visibility_threshold 0.04 \
--std_distance 1.4 \
--colour_quality ultra \
--generate_mesh \
--poisson_depth 12 \
--laplacian_iterations 8
优化理由:
- 适当的点数(单个物体不需要太多点)
- 较低的可见性阈值以保留细节
- 较小的std_distance以确保点分布紧密
- 超高色彩质量以还原精细纹理
- 高泊松深度以捕获细节,较少的平滑迭代以保留锐边
七、常见问题和解决方案
7.1 点云噪点过多
如果生成的点云包含太多噪点,可以尝试以下方法:
1、增加可见性阈值
--visibility_threshold 0.1
2、启用点云清理
--clean_pointcloud
3、减小std_distance参数
--std_distance 1.2
7.2 网格质量不佳
如果生成的网格质量不理想,可以尝试:
1、增加泊松深度参数(最大推荐值为12)
--poisson_depth 12
2、调整拉普拉斯平滑迭代次数
--laplacian_iterations 15 # 更平滑的表面
--laplacian_iterations 5 # 保留更多细节
3、使用边界框限制只处理模型的重要部分
--bounding_box_min -5 -5 -5 --bounding_box_max 5 5 5
7.3 处理速度过慢
如果处理速度太慢,可以考虑以下优化:
1、减少相机数量
--camera_skip_rate 4
2、降低渲染质量
--colour_quality medium
3、减少总点数
--num_points 5000000
八、性能与质量的平衡技巧
要在性能和质量之间取得平衡,可以考虑以下策略:
8.1 两阶段转换流程:
- 首先使用较低的参数进行快速预览
- 确定最佳参数后,再使用高质量设置进行最终转换
8.2 选择性处理:
使用边界框只处理场景中最重要的部分
--bounding_box_min -3 -3 -3 --bounding_box_max 3 3 3
8.3 混合渲染优化:
- 对于大场景,可以使用较低的colour_quality和较高的camera_skip_rate
- 但保持较高的num_points以保证几何精度
8.4 分块处理:
对于超大场景,可以考虑将场景分割为多个部分,分别处理后再合并
九、高级应用场景
9.1 超大规模场景处理
对于城市级别的大场景,可以采用分块处理策略:
# 处理第一部分
python gauss_to_pc.py --input_path "large_scene.ply" \
--transform_path "transforms" \
--bounding_box_min -100 -100 -100 \
--bounding_box_max 0 0 0 \
--output_path "part1.ply"
# 处理第二部分
python gauss_to_pc.py --input_path "large_scene.ply" \
--transform_path "transforms" \
--bounding_box_min 0 -100 -100 \
--bounding_box_max 100 0 0 \
--output_path "part2.ply"
# 使用外部工具如CloudCompare或MeshLab合并点云
9.2 在视频数据集上的应用
对于从视频序列中获取的3DGS模型,可以尝试以下策略:
1、提高camera_skip_rate参数,因为视频中相邻帧的相机位置通常非常接近:
--camera_skip_rate 10
2、根据视频质量调整colour_quality:
高清视频:--colour_quality high
普通视频:--colour_quality medium
3、对于具有运动模糊的视频数据集,可能需要更高的visibility_threshold:
--visibility_threshold 0.12
9.3 点云后处理
生成点云后,还可以使用外部工具进行后处理:
- CloudCompare:用于点云编辑、滤波和网格生成
- MeshLab:用于点云处理和高级网格生成
- Blender:用于艺术化编辑和渲染
9.4 参数总结
1、点云数量 (num_points):
- 小场景/物体:5-10百万
- 中等场景:10-15百万
- 大场景:15-30百万
2、可见性阈值 (visibility_threshold):
- 保留细节:0.03-0.05
- 平衡设置:0.05-0.08
- 减少噪点:0.08-0.12
3、标准距离 (std_distance):
- 紧密分布:1.2-1.5
- 标准分布:1.5-2.0
- 松散分布:2.0-2.5
4、色彩质量 (colour_quality):
- 快速预览:low
- 标准质量:medium
- 高质量渲染:high
- 展示级别:ultra
十、总结
10.1 常见问题排查:
- CUDA错误: 确保您的PyTorch版本与CUDA版本兼容。
- 内存不足: 减少–num_points和–colour_quality。
- 网格质量差: 增加–poisson_depth和–visibility_threshold,并考虑使用–clean_pointcloud。
- 处理速度慢: 使用–camera_skip_rate和降低–colour_quality,确保使用CUDA渲染器。
- 颜色不正确: 确保提供了正确的–transform_path。
10.2 项目原理解释
3DGS-to-PC项目的工作原理是将3D高斯分布(一种新型的场景表示方法)转换为更通用的点云或网格格式。
1、高斯分布表示: 3D高斯分布通过均值(位置)、协方差(形状和方向)以及颜色来表示3D空间中的体素。
2、点云生成过程:
- 计算每个高斯体的大小
- 按比例分配点数
- 从每个高斯分布中采样点
- 使用相机视角渲染颜色
- 应用过滤器去除噪点
3、网格生成:
- 识别表面高斯体
- 生成更密集的表面点云
- 使用泊松表面重建算法生成网格
- 应用拉普拉斯平滑