当前位置: 首页 > news >正文

3DGS-to-PC:3DGS模型一键丝滑转 点云 or Mesh 【Ubuntu 20.04】【2025最新版!!】

一、引言

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 jsondef 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_path3DGS 输出的 point_cloud.plypoint_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、网格生成:

  • 识别表面高斯体
  • 生成更密集的表面点云
  • 使用泊松表面重建算法生成网格
  • 应用拉普拉斯平滑

相关文章:

  • STM32 变量存储
  • window 显示驱动开发-指定 DMA 缓冲区的段
  • 2.3 定积分
  • 恰到好处TDR
  • #在 CentOS 7 中手动编译安装软件操作及原理
  • c#修改ComboBox当前选中项的文本
  • ExcelJS库的使用
  • vue2/3 中使用 @vue-office/docx 在网页中预览(docx、excel、pdf)文件
  • 关于nextjs中next-sitemap插件生成文件样式丢失问题及自定义样式处理
  • vue的table表格选择回显不显示
  • vue H5解决安卓手机软键盘弹出,页面高度被顶起
  • 网卡网孔速率的协商是如何进行的?
  • 【小记】word批量生成准考证
  • element中表格文字剧中可以使用的属性
  • 初识 Pandas:Python 数据分析的利器
  • 七、MyBatis-Plus高级用法:最优化持久层开发
  • 力扣2094题解
  • Stream Deck纯软件实现高性价比平替
  • HTML5 定位详解:相对定位、绝对定位和固定定位
  • 《Python星球日记》 第63天:文本方向综合项目(新闻分类)
  • 香港暂停进口美国北达科他州一地区禽肉及禽类产品
  • 美元指数上涨超1%重返101上方,创1个月新高
  • 宁德时代港股募资预计最高至50亿美元:90%将投向匈牙利项目
  • 德国将不再公布对乌克兰军事支持的细节
  • 重庆大学通报本科生发14篇SCI论文处理结果
  • 印度一战机在巴基斯坦旁遮普省被击落,飞行员被俘