之前博客进行了COLMAP在服务器下的测试
实验笔记之——Linux实现COLMAP-CSDN博客文章浏览阅读794次,点赞24次,收藏6次。学习笔记之——NeRF SLAM(基于神经辐射场的SLAM)-CSDN博客NeRF 所做的任务是 Novel View Synthesis(新视角合成),即在若干已知视角下对场景进行一系列的观测(相机内外参、图像、Pose 等),合成任意新视角下的图像。传统方法中,通常这一任务采用三维重建再渲染的方式实现,NeRF 希望不进行显式的三维重建过程,仅根据内外参直接得到新视角渲染的图像。之前博客跑instant-NGP的时候,除了用官方的数据集,用自己的数据则是通过手机采集,同时获得pose与image。https://blog.csdn.net/gwplovekimi/article/details/135389922?spm=1001.2014.3001.5501而下面两个博客则分别实现了NGP与3DGS
实验笔记之——基于Linux服务器复现Instant-NGP及常用的tmux指令-CSDN博客文章浏览阅读255次,点赞7次,收藏6次。学习笔记之——NeRF SLAM(基于神经辐射场的SLAM)-CSDN博客NeRF 所做的任务是 Novel View Synthesis(新视角合成),即在若干已知视角下对场景进行一系列的观测(相机内外参、图像、Pose 等),合成任意新视角下的图像。传统方法中,通常这一任务采用三维重建再渲染的方式实现,NeRF 希望不进行显式的三维重建过程,仅根据内外参直接得到新视角渲染的图像。配置好后,通过./instant-ngp或者scripts/run.py就可以运行了。这个编译好像比较耗费时间~https://blog.csdn.net/gwplovekimi/article/details/135365847?spm=1001.2014.3001.5501实验笔记之——Gaussian Splatting-CSDN博客文章浏览阅读691次,点赞23次,收藏8次。之前博客对NeRF-SLAM进行了调研学习笔记之——NeRF SLAM(基于神经辐射场的SLAM)-CSDN博客NeRF 所做的任务是 Novel View Synthesis(新视角合成),即在若干已知视角下对场景进行一系列的观测(相机内外参、图像、Pose 等),合成任意新视角下的图像。传统方法中,通常这一任务采用三维重建再渲染的方式实现,NeRF 希望不进行显式的三维重建过程,仅根据内外参直接得到新视角渲染的图像。https://blog.csdn.net/gwplovekimi/article/details/135349210?spm=1001.2014.3001.5501这两篇博客中,测试public的数据集效果都不错,但是用iphone的record3D录制的要么不能用要么效果很差,为此统一采用COLMAP来计算pose,再次进行测试以及对比两个方法
目录
基于COLMAP的3DGS
基于COLMAP的NGP
3DGS训练好的模型加载进行可视化
基于COLMAP的3DGS
GitHub - graphdeco-inria/gaussian-splatting: Original reference implementation of "3D Gaussian Splatting for Real-Time Radiance Field Rendering"
首先分别运行下面的命令来启动3DGS并可视化其在线训练的过程
conda activate 3DGScd gaussian-splatting/python train.py -s /home/gwp/dataset/30fps下面在MobaXterm下运行conda activate 3DGScd gaussian-splatting/./SIBR_viewers/install/bin/SIBR_remoteGaussian_app
训练5分钟左右的结果
训练过程的各种视角请见下视频
基于COLMAP测试3D Gaussian Splatting(训练过程可视化)
基于COLMAP的NGP
GitHub - NVlabs/instant-ngp: Instant neural graphics primitives: lightning fast NeRF and more
https://github.com/NVlabs/instant-ngp/blob/master/docs/nerf_dataset_tips.md
由于NGP支持的数据格式跟3DGS稍有不同,为此需要进行处理
对于参数“aabb_scale
”,如说明文档所言:
“The aabb_scale
parameter is the most important instant-ngp specific parameter. It specifies the extent of the scene, defaulting to 1; that is, the scene is scaled such that the camera positions are at an average distance of 1 unit from the origin. For small synthetic scenes such as the original NeRF dataset, the default aabb_scale
of 1 is ideal and leads to fastest training. The NeRF model makes the assumption that the training images can entirely be explained by a scene contained within this bounding box. However, for natural scenes where there is a background that extends beyond this bounding box, the NeRF model will struggle and may hallucinate "floaters" at the boundaries of the box. By setting aabb_scale
to a larger power of 2 (up to a maximum of 128), the NeRF model will extend rays to a much larger bounding box. Note that this can impact training speed slightly. If in doubt, for natural scenes, start with an aabb_scale
of 128, and subsequently reduce it if possible. The value can be directly edited in the transforms.json
output file, without re-running the scripts/colmap2nerf.py script.”
aabb_scale 参数是最重要的 instant-ngp 特定参数。指定场景的范围,默认为1;也就是说,场景被缩放,使得摄像机位置距原点的平均距离为 1 个单位。对于小型合成场景(例如原始 NeRF 数据集),默认的 aabb_scale 1 是理想的,并且可以实现最快的训练。 NeRF 模型假设训练图像可以完全由该边界框内包含的场景来解释。然而,对于背景超出此边界框的自然场景,NeRF 模型将陷入困境,并可能在框的边界处产生“漂浮物”的幻觉。通过将 aabb_scale 设置为更大的 2 次方(最大可达 128),NeRF 模型会将光线扩展到更大的边界框。请注意,这可能会稍微影响训练速度。如果有疑问,对于自然场景,请从 128 的 aabb_scale 开始,然后在可能的情况下减小它。该值可以直接在transforms.json输出文件中编辑,无需重新运行scripts/colmap2nerf.py脚本。
那么此处就先设置为128吧~
data-folder$ python ~/instant-ngp/scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 128
注意图片的文件名字需要是images(当然也可以通过输入参数修改了)
过程感觉跟3DGS中的差不多~也是一样的耗时hhh(记得要开tmux),只是数据格式支持不一样~
不知道为啥生成的transform.json只有2个camera~
改为下面的命令测试则可以了!(添加了--colmap_camera_model SIMPLE_PINHOLE)
data-folder$ python ~/instant-ngp/scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 32 --colmap_camera_model SIMPLE_PINHOLE
同时用colmap gui也试试
NGP的运行代码如下:
conda activate nerf-ngpcd instant-ngp/./instant-ngp /home/gwp/dataset/30fps_for_ngp/
结果如下图所示
虽然渲染久一些效果会有点提升
但是这个效果应该是不如3DGS的~(这可能也跟上面提到的aabb_scale有关)
把值从32改为1的效果如下:
好像更差~那改为128呢?
好像有点提升,但是比起3DGS还是差一些~
渲染的过程可视化如下
基于COLMAP测试Instant-NGP(训练过程可视化)
3DGS训练好的模型加载进行可视化
上面的测试中都是边训练边看效果,此处看看直接训练好开奖的结果吧哈~
如下图所示,大概半个小时左右,训练好了一个3DGS,看着PSNR还挺高的,打算加载看看效果~
平时边训练边看结果的代码如下:
conda activate 3DGScd gaussian-splatting/./SIBR_viewers/install/bin/SIBR_remoteGaussian_app
但如果当前没有训练会看到加载的空空如也~
细看gaussian-splatting/的文件组成会发现,它会把训练的结果保存在output中
这个就是当前训练好的模型了。如果要指向某个训练好的模型,应该是
./<SIBR install dir>/bin/SIBR_gaussianViewer_app -m <path to trained model>./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m "/home/gwp/gaussian-splatting/output/1f6d93f1-5/"
效果如下视频所示
基于COLMAP测试3D Gaussian Splatting(训练好的模型)