graphdeco-inria / gaussian-splatting

Original reference implementation of "3D Gaussian Splatting for Real-Time Radiance Field Rendering"
https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
Other
13.62k stars 1.75k forks source link

How to output the dense point cloud or high quality mesh #418

Open junhua-l opened 10 months ago

junhua-l commented 10 months ago

Hi, I want to export the dense point cloud or high-quality mesh.

I tried to export mesh, but the accuracy is very poor.

Point cloud I started directly from the output point cloud, and then SH2RGBto the normal point cloud. However, I found that the point cloud derived in this way is far inferior to traditional 3D reconstruction methods, such as dense reconstruction colmap. (1) I increased the number of Gaussian during training by changing densify_from_iter, but the resulting point cloud quality was still not good (in the case that the number of point clouds was much larger than the point clouds generated by dense reconstruction), I think simply increasing the number of Gaussian is not a good method. (2) I replaced the initial random points3D.ply with the point cloud generated by my dense reconstruction. I found that because of the nature of Gaussian, the number of meaningful points has been decreasing, and then a lot of noise points are added, so the point cloud obtained after training is still not as dense reconstruction.

I would like to know if there is any idea to export a high-quality point cloud or mesh. This may not be the focus of this paper, but it could also be important.

yuedajiong commented 10 months ago

好像是个华人大神,我就中文了。

我看完了他的论文,代码,还有网上的一些分析,结合我个人做这个的一些经验和理解,说说我的看法。

一句话: 高斯溅射出来的2D可能看起来很像本来那个3D的东西向那个观察点投影所看到的,但是,“也仅仅是看起来像,和那个物理实在,可能有比较远的差距”; 当你需要更接近物理实际的点云和表面mesh的时候,问题挑战不仅在于充分利用高斯点的全部信息(不仅mean, covar等直接的位置中心和点形状信息,还包括sh feature,还可能需要考虑周边点,因为渲染的的时候有个融合过程),更在于GS的输出GaussPointCloud本身的质量就没有那么好(相对于物理实际)

到目前看,这个方向: 1)保证不错的质量,训练和推理渲染,快是最有优势的; 弄mesh我感觉目前还没有优势。 如果对于已知是非透明的对象,增加约束/正则等比如让点向物理实际的表面靠拢; 如果就需要表面mesh,在训练好后,修改算法减少大高斯,密集小高斯,让那个位置均值不断逼近真实表面; 提取的算法部分也得细化。 2)这个方向继续发展成熟,其实很对对象比如在游戏里面,没有必要一定就是一个显示的mesh,反正这个渲染也很快了。 以前的粒子,水,毛发等,在游戏里也有特殊处理。 感觉现在UE中做插件的人,就应该是这个想法。

DreamGaussian中,有个代码提取mesh。 我尝试过,效果不好; 我逐步分析,然后也修改过,效果好了些,但还是不理想。 我觉得在优化好的那个GS表示中,已经就有缺陷了,得继续往前修改GS训练的部分。

junhua-l commented 10 months ago

@yuedajiong Thank you I understand what you mean, and your understanding is OK. Mainly, my own scene needs high-quality mesh or point cloud. The current Gaussian point cloud conversion method is only SH2RGB, I think there may be some other ways to convert a series of point clouds according to other parameters of 3D Gaussian.

For point cloud export, I found that there were too many noise point clouds in the periphery, and the density of the central point cloud was not high enough. I tried post-processing, and the effect was mediocre. I want to know how to adjust hyperparameters to enhanced the density of point cloud output. Any possible advice or practice would be very helpful to me :)

Also, an interesting point is that a dense initialization point cloud does not seem to improve the quality of the final Gaussian, I am not sure if it is because my implementation is wrong. Has anyone else found this?

kong-johnny commented 10 months ago

Your points are a burst of insight, and I think 3D AI has now fallen into the Gaussian‘s trap

clement-chupin commented 10 months ago

I'm currently working on a way to convert a Gaussian splatting into a mesh. We have to do it in 2 step :

I'm focus on the first step : https://github.com/clement-chupin/gaussian-splatting with python gs_to_pointcloud_poc.py -s ./output/YOUR_GAUSSIAN_SPLATTING

For the second step, it simplier to find ready to use methods, like this : https://github.com/mrakotosaon/dse-meshing or Surface reconstruction from meshlab : https://github.com/cnr-isti-vclab/meshlab

yuedajiong commented 10 months ago

@JunhuaLiu0 我折腾了大量mesh/sdf|udf/nerf相关的算法,GS这里,你看issue中大量我发的各种折腾,我对这个的做法和优势劣势,我大概理解。

假设你要高质量的密集点云或suface/mesh,如果是我做,基于我现在的理解,我可能这么做:

  1. 分析你的场景: 是那种一个固体的对象为中心的,还是复杂的场景的,还是可能本来就是类似有云朵(半透明粒子漂浮,或者类似特性影响深度估计的)。 我假设你是重构手办这种明确的独立的对象,而且背景可以分割;其他的可以类推。
  2. 分析你的需求: 你对点云内部要不要要求空而更接近于suface表示,你对点云的数量有上限吗(算力),你能接受一定的冗余吗,你就要求近似于suface的表示吗(就是suface附近点的半径足够薄等价于知道normal),如果是最终想侧重去构建suface那么你是水密的对象吗? 等等等。
  3. 来看如何修改GS这里的算法,来满足上面的1,2: 1) 修改代码,控制最大的高斯点的大小,不让xyz三个方向的轴太长,就是倾向于去拆分和移动,不要倾向于去合并。 这个马上就让你的点很密集。修改代码的位置,就在它按照条件操纵点的那两三个地方。 2)我看这个算法的论文和代码,并没有把mask给带上或者给random化增强, 如果增加这种机制,可以保证对于知道前景对象和背景的,那么重构后,可以更好重构焦点对象,边界清晰。 3)后处理,用硬算法或者优化算法,把非焦点对象的点,给去掉。 对于要抠掉的高斯点,我理解要filter出来后,去调整那三个轴的长度到很小,然后拟合下,如果直接删除,可能导致2D对象上损失很高,3D shape上可能坑洞。现在渲染算法,也没有插值和反走样。 当然也可以把插值逻辑做到提取部分,不过我感觉还是做到训练的流程中,让产生的GS point-cloud质量更好,这样更合适。 4)增加各种正则,如果你需要suface/mesh,增加正则,作用到它的半透明参数(从相机观察过去的,要尽快变得不透明),作用到法线方向上高斯点的个数和厚度(虽然这里没有明确的法线,但单本质上可以类似SDF要去往0-level-set靠),....各种类似的折腾。 5) .... 总之一句话,我觉得还有太多的搞法,可以让那些高斯点,更准确的聚集在表面附近,而且沿(隐含的)法线方向的xyz分量更小,当沿表面足够薄,那个位置均值点就几乎在靠经表面的内侧一点点。我有个idea,就是拟合好以后,其实对高斯点,xyz三个方向,ax+by+cz,去最小化a,b,c中1~2个,然后损失变化小,基本就估计出了normal,这个方向就让高斯很扁,最后surface就很准。 大神们数学好,一分钟就能想个正则,去实现这个意思。

不过,多视图拟合,就算做到90分,要想走到95,可能还是需要但是图生成的来引入先验,把训练集中缺失的视角部分做提高。

Non-Chinese friends, if interested, please use ChatGPT to translate into English.

yuedajiong commented 10 months ago

@JunhuaLiu0 你提到: Also, an interesting point is that a dense initialization point cloud does not seem to improve the quality of the final Gaussian, I am not sure if it is because my implementation is wrong. Has anyone else found this?

我的理解: 1)我在做的是unfied stereo vision,camere-pose是在算法内部,而且是单图片作为条件更侧重一个生成问题,所以,我这边折腾GS的时候,一直没有用colmap或者其他算法得到的SfM的稀疏点云。 如何初始化?随机,均匀,或者沿圆球表面密集其他地方稀疏,等等。

2)即便你初始化的很密,GS算法在运行一轮就给你删减增加移动,不仅位置,点数也会变化。 所以,你想最后通过这种离散的表示,增加密度,来得到更好的效果,那还得修改代码参数和逻辑,让GS最后留下的多才可以。 它那个调整的策略,其实会影响最后得到的高斯点,论文现在给的调整策略,未必是对大多数最优化的。 我觉得单个点的最大值应该控制,我现在经常学到一些高斯点,长轴贯穿半个对象。

3)越密集,总体来说肯定更好。 如果不是这样,得检查看看得到的是不是我们想要的。

kong-johnny commented 10 months ago

@JunhuaLiu0 我折腾了大量mesh/sdf|udf/nerf相关的算法,GS这里,你看issue中大量我发的各种折腾,我对这个的做法和优势劣势,我大概理解。

假设你要高质量的密集点云或suface/mesh,如果是我做,基于我现在的理解,我可能这么做:

  1. 分析你的场景: 是那种一个固体的对象为中心的,还是复杂的场景的,还是可能本来就是类似有云朵(半透明粒子漂浮,或者类似特性影响深度估计的)。 我假设你是重构手办这种明确的独立的对象,而且背景可以分割;其他的可以类推。

  2. 分析你的需求: 你对点云内部要不要要求空而更接近于suface表示,你对点云的数量有上限吗(算力),你能接受一定的冗余吗,你就要求近似于suface的表示吗(就是suface附近点的半径足够薄等价于知道normal),如果是最终想侧重去构建suface那么你是水密的对象吗? 等等等。

  3. 来看如何修改GS这里的算法,来满足上面的1,2:

    1. 修改代码,控制最大的高斯点的大小,不让xyz三个方向的轴太长,就是倾向于去拆分和移动,不要倾向于去合并。 这个马上就让你的点很密集。修改代码的位置,就在它按照条件操纵点的那两三个地方。 2)我看这个算法的论文和代码,并没有把mask给带上或者给random化增强, 如果增加这种机制,可以保证对于知道前景对象和背景的,那么重构后,可以更好重构焦点对象,边界清晰。 3)后处理,用硬算法或者优化算法,把非焦点对象的点,给去掉。 对于要抠掉的高斯点,我理解要filter出来后,去调整那三个轴的长度到很小,然后拟合下,如果直接删除,可能导致2D对象上损失很高,3D shape上可能坑洞。现在渲染算法,也没有插值和反走样。 当然也可以把插值逻辑做到提取部分,不过我感觉还是做到训练的流程中,让产生的GS point-cloud质量更好,这样更合适。 4)增加各种正则,如果你需要suface/mesh,增加正则,作用到它的半透明参数(从相机观察过去的,要尽快变得不透明),作用到法线方向上高斯点的个数和厚度(虽然这里没有明确的法线,但单本质上可以类似SDF要去往0-level-set靠),....各种类似的折腾。
  4. .... 总之一句话,我觉得还有太多的搞法,可以让那些高斯点,更准确的聚集在表面附近,而且沿(隐含的)法线方向的xyz分量更小,当沿表面足够薄,那个位置均值点就几乎在靠经表面的内侧一点点。我有个idea,就是拟合好以后,其实对高斯点,xyz三个方向,ax+by+cz,去最小化a,b,c中1~2个,然后损失变化小,基本就估计出了normal,这个方向就让高斯很扁,最后surface就很准。 大神们数学好,一分钟就能想个正则,去实现这个意思。

不过,多视图拟合,就算做到90分,要想走到95,可能还是需要但是图生成的来引入先验,把训练集中缺失的视角部分做提高。

Non-Chinese friends, if interested, please use ChatGPT to translate into English.

大神!问问做大场景的GS有什么好的建议吗阿斯顿😫

yuedajiong commented 10 months ago

@kong-johnny 兄弟,我本来想在这里,借宝地一用,来抛砖探讨GS牛逼和离完美的AI时代立体重构的表示应该什么样,但在这么牛逼的文章这里讨论下一代应该什么样子,有点不合适,怕被怼。 我这里简单的说几句我的看法:

  1. 一个准完美的统一立体视觉,我理解关键字主要有: 立体 交互 逼真 影级 世界
  2. 按照这个目标,技术上除了现在偏重构大家在攻关的:快,(视觉效果)质量好;其实还需要重点包含: 相机位姿估计而且不要求太精准;先验引入单图生成;(被动)动态的对象; (主动)可驱动的对象(参考smpl);可交互的对象;可放入物理引擎计算;.....
  3. GS明显在有明确边界的物理的表达上,为了快,在质量上做了牺牲,更准确的说,质量只是照顾了2D看到的效果,并没有真的关注3D对象要很准。除了3D错位2D很像的问题,就单个点可以存在一个高斯点(几个轴很长)那个mean和gauss-surface都不能准确代表物理的表面,这就导致做交互很难办。 将来就算有人做一些改进,如果不是根本性重定义,那么牺牲mesh表示的点间关系自由度约束带来的拟合速度是保证了,但这些根本限制还是存在。
  4. 我个人的来理解,最终未来完美的,大家还是希望得到准确的而且明确的3D结构和纹理。比如人体,比如精确的机械结构(走动的瑞士钟表)
  5. GS就算在未来,在一个牛逼的游戏或者元宇宙中,作为大场景不要太准,比如电影的中远距离的表示,我觉得就完全可以。 如果你做大场景,只是大,那么将超级大的点云,划分为立体grid,注意grid交错的地方的一致性,反而不是什么大的挑战。
ShuRaymond commented 8 months ago

@kong-johnny 兄弟,我本来想在这里,借宝地一用,来抛砖探讨GS牛逼和离完美的AI时代立体重构的表示应该什么样,但在这么牛逼的文章这里讨论下一代应该什么样子,有点不合适,怕被怼。 我这里简单的说几句我的看法:

  1. 一个准完美的统一立体视觉,我理解关键字主要有: 立体 交互 逼真 影级 世界
  2. 按照这个目标,技术上除了现在偏重构大家在攻关的:快,(视觉效果)质量好;其实还需要重点包含: 相机位姿估计而且不要求太精准;先验引入单图生成;(被动)动态的对象; (主动)可驱动的对象(参考smpl);可交互的对象;可放入物理引擎计算;.....
  3. GS明显在有明确边界的物理的表达上,为了快,在质量上做了牺牲,更准确的说,质量只是照顾了2D看到的效果,并没有真的关注3D对象要很准。除了3D错位2D很像的问题,就单个点可以存在一个高斯点(几个轴很长)那个mean和gauss-surface都不能准确代表物理的表面,这就导致做交互很难办。 将来就算有人做一些改进,如果不是根本性重定义,那么牺牲mesh表示的点间关系自由度约束带来的拟合速度是保证了,但这些根本限制还是存在。
  4. 我个人的来理解,最终未来完美的,大家还是希望得到准确的而且明确的3D结构和纹理。比如人体,比如精确的机械结构(走动的瑞士钟表)
  5. GS就算在未来,在一个牛逼的游戏或者元宇宙中,作为大场景不要太准,比如电影的中远距离的表示,我觉得就完全可以。 如果你做大场景,只是大,那么将超级大的点云,划分为立体grid,注意grid交错的地方的一致性,反而不是什么大的挑战。

想问下,大佬。如果想获取准确的有颜色点云或者mesh,是不是3dgs还不如nerf。

yuedajiong commented 8 months ago

SuGaR可以去试一试了,我觉得对产生表面很有用。 虽然还不是那么完美: 速度,噪音高斯点。

elenacliu commented 8 months ago

@ShuRaymond shu Recently my point cloud results on vanilla 3DGS are not satisfying. But NeRF-based functions can give me very precise results.

ShuRaymond commented 8 months ago

@ShuRaymond shu Recently my point cloud results on vanilla 3DGS are not satisfying. But NeRF-based functions can give me very precise results.

Thanks for the heads up, I'll give it a try!

kong-johnny commented 8 months ago

@JunhuaLiu0 你提到: Also, an interesting point is that a dense initialization point cloud does not seem to improve the quality of the final Gaussian, I am not sure if it is because my implementation is wrong. Has anyone else found this?

我的理解: 1)我在做的是unfied stereo vision,camere-pose是在算法内部,而且是单图片作为条件更侧重一个生成问题,所以,我这边折腾GS的时候,一直没有用colmap或者其他算法得到的SfM的稀疏点云。 如何初始化?随机,均匀,或者沿圆球表面密集其他地方稀疏,等等。

2)即便你初始化的很密,GS算法在运行一轮就给你删减增加移动,不仅位置,点数也会变化。 所以,你想最后通过这种离散的表示,增加密度,来得到更好的效果,那还得修改代码参数和逻辑,让GS最后留下的多才可以。 它那个调整的策略,其实会影响最后得到的高斯点,论文现在给的调整策略,未必是对大多数最优化的。 我觉得单个点的最大值应该控制,我现在经常学到一些高斯点,长轴贯穿半个对象。

3)越密集,总体来说肯定更好。 如果不是这样,得检查看看得到的是不是我们想要的。

3D GS不会删除高斯点,只会增加,这是很有问题的一个机制

Lizhinwafu commented 6 months ago

gs_to_pointcloud_poc.py -s ./output/YOUR_GAUSSIAN_SPLATTING

Can you share it again? I can't open the file.