SDFstudio复现

1、简介

SDFStudio 是一个表面重建的统一模块化框架,用于神经隐式表面重建,建立在令人敬畏的 nerfstudio 项目之上。

SDFStudio提供了三种主要隐式表面重建方法的统一实现:UniSurf、VolSDF 和 NeuS。

SDFStudio 还支持各种场景表示,例如 MLP、三平面和多分辨率、特征网格和多点采样策略,例如 UniSurf 中的表面引导采样和 NeuralReconW 中的体素表面引导采样。

SDFStudio进一步整合了该领域的最新进展,例如单目线索的利用 (MonoSDF)、几何正则化 (UniSurf) 和多视图一致性 (Geo-NeuS)。由于采用了统一和模块化的实现,SDFStudio 可以轻松地将想法从一种方法转移到另一种方法。例如,Mono-NeuS 将 MonoSDF 的思想应用于 NeuS,而 Geo-VolSDF 将 Geo-NeuS 的思想应用于 VolSDF。

支持的表面重建方法:UniSurf、VolSDF 、 NeuS、bakedangeloBakedSDFNeuralangeloneus-facto-angeloneus-factoNeuralangelo、 Neuralangelo、BakedSDF、Neural RGB-D Surface Reconstruction。

2、配置环境

操作系统上必须安装CUDA,我的配置是ubuntu20.04系统,RTX4060,CUDA11.3。

上次配置Nerfstudio在autodl上进行,不能连接到web页面查看可视化渲染过程,所以这次复现SDFstudio在VMware上配置的ubuntu系统上进行复现,看能否成功连接上web页面查看可视化渲染过程。

2.1 在Autodl上配置环境

操作系统上必须安装CUDA,我的配置是ubuntu20.04,RTX3090,CUDA11.3。

首先创建环境,使用miniconda配置sdfstudio的环境,所需python版本要大于等于3.7,具体步骤参考如下:

 conda create --name sdfstudio -y python=3.8
 conda activate sdfstudio
 python -m pip install --upgrade pip

然后安装依赖项(pytorch):

 pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html

然后安装依赖项(tiny-cuda-nn),执行如下命令:

 #下载tiny-cuda-nn项目
 cd autodl-tmp
 git clone https://github.com/NVlabs/tiny-cuda-nn.git
 #执行如下命令安装tiny-cuda-nn
 cd autodl-tmp/tiny-cuda-nn
 mkdir build
 cd build
 cmake ../
 cmake --version
 cd autodl-tmp/tiny-cuda-nn/bindings/torch
 pip install ninja
 python setup.py install
 #上述命令运行的结果好像会报错,不过不要紧,继续执行以下命令安装tiny-cuda-nn
 pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
 #通过运行如下命令查看tiny-cuda-nn库安装成功没有(包含tiny-cuda-nn就说明安装好了)
 pip list

最后安装SDFStudio:

 cd autodl-tmp
 git clone https://github.com/autonomousvision/sdfstudio.git
 cd autodl-tmp/sdfstudio
 pip install --upgrade pip setuptools
 pip install -e .
 # install tab completion
 ns-install-cli

3、测试数据集上进行训练(Neus-facto模型)

首先下载测试数据集,有8个测试数据集,以下是这些测试数据集的链接,根据自己的需求进行下载sdfstudio-demo-data.tar、DTU.tar、Replica.tar、scannet.tar、tnt_advanced.tar、highresTNT.tar、Heritage-Recon.tar、neural_rgbd_data.zip。

我这里下载的是SDFstudio格式sdfstudio-demo-data数据集,在目录autodl-tmp/sdfstudio下新创建一个文件夹data,然后把tar数据集上传至data文件夹:

用以下命令解压该tar数据集:

 cd autodl-tmp/sdfstudio/data
 tar -xf sdfstudio-demo-data.tar

sdfstudio-demo-data数据集里面只装了sdfstudio格式的DTU数据集的65号场景和副本数据集room0:

以下是DTU65号场景数据集的sdfstudio格式:

运行以下命令进行训练,对DTU数据集的第65号场景进行训练:

 cd autodl-tmp/sdfstudio
 ​
 # 在dtu数据集scan65上训练模型
 ns-train neus-facto --pipeline.model.sdf-field.inside-outside False --vis viewer --experiment-name neus-facto-dtu65 sdfstudio-data --data data/sdfstudio-demo-data/dtu-scan65
  
 #或者也可以使用单目先验在副本数据集room0上训练模型
 ns-train neus-facto --pipeline.model.sdf-field.inside-outside True --pipeline.model.mono-depth-loss-mult 0.1 --pipeline.model.mono-normal-loss-mult 0.05 --vis viewer --experiment-name neus-facto-replica1 sdfstudio-data --data data/sdfstudio-demo-data/replica-room0 --include_mono_prior True

如果上述步骤都安装正确的话,在终端会显示如下界面:

训练两万次大概需要15分钟,但是在web界面观察渲染出来的结果不是很理想(这一步还是没弄出来)。

然后提取网格:

 cd autodl-tmp/sdfstudio
 ns-extract-mesh --load-config outputs/neus-facto-dtu65/neus-facto/2024-06-19_193812/config.yml --output-path meshes/neus-facto-dtu65.ply

mesh模型:

还可以渲染视频(这一步暂时没做出来,因为这一步默认是有图形化界面,调用了open3D中图形化界面的模块,但是Autodl是没有提供图形化界面的,所以跟这些模块产生了冲突,通过修改代码依旧没有解决):

 cd autodl-tmp/sdfstudio
 ns-render-mesh --meshfile meshes/neus-facto-dtu65.ply --traj interpolate  --output-path renders/neus-facto-dtu65.mp4 sdfstudio-data --data data/sdfstudio-demo-data/dtu-scan65

4、植物数据集上进行训练(Neus-facto模型)

4.1 安装Colmap

到网站COLMAP — COLMAP 3.9-dev documentation中下载colmap项目:

输入上述命令,下载colmap项目:

 cd autodl-tmp
 git clone https://github.com/colmap/colmap

接下来执行以下命令利用cmake编译colmap:

 cd autodl-tmp/colmap
 mkdir build
 cd build
 cmake ../

输入以下命令查看操作系统的版本信息(/etc/os-release文件就是记录的操作系统的版本信息):

 cat /etc/os-release

本操作系统的版本信息如下:

执行如下命令,安装colmap在ubuntu系统中的依赖项(这些命令分开执行,因为每一条命令都可能报错):

 cd autodl-tmp/colmap/build
 ​
 apt update
 ​
 apt upgrade -y
 ​
 apt --fix-broken install
 ​
 apt upgrade -y
 ​
 apt-get install 
     git 
     cmake 
     ninja-build 
     build-essential 
     libboost-program-options-dev 
     libboost-filesystem-dev 
     libboost-graph-dev 
     libboost-system-dev 
     libeigen3-dev 
     libflann-dev 
     libfreeimage-dev 
     libmetis-dev 
     libgoogle-glog-dev 
     libgtest-dev 
     libsqlite3-dev 
     libglew-dev 
 ​
 apt install qtbase5-dev 
     libqt5opengl5-dev 
     libcgal-dev 
     libceres-dev

重新使用cmake编译colmap:

 cd autodl-tmp/colmap/build
 ls#查看build目录下cmake的编译文件,如下:

 rm -rf ./*
 cmake ../
 make -j 6
 make install -j

运行上述命令可能报错,如果报错可能是因为没有安装Boost库,通过下述命令安装Boost库(没有报错就不管,直接运行colmap这条命令,有相对应的显示信息说明colmap就安装成功了):

 sudo apt-get install libboost-all-dev

安装Boost库后运行上述的四条cmake编译命令还是可能报错,可能是因为CMake没有更新其模块路径来找到新安装的库,执行下述命令手动设置Boost的路径(前提是Boost的头文件安装在/usr/include/boost,如果不是就要修改路径):

 cmake -DBoost_INCLUDE_DIR=/usr/include/boost ../

执行上述命令时会报很多错,显示很多的库没安装,依次按照错误信息进行安装:

  sudo apt-get install 要安装的库的名字
  rm -rf CMakeFiles CMakeCache.txt#清理 CMake 缓存
  cmake -DBoost_INCLUDE_DIR=/usr/include/boost ..#清理缓存后,重新运行 CMake 配置命令

这些库都安装得差不多了之后,在执行这四条cmake编译命令:

 rm -rf ./*
 cmake ../
 make -j 6
 make install -j

输入以下命令检查colmap是否安装成功(没有报错直接运行这一步):

 colmap

有如下信息则说明colmap安装成功:

至此colmap安装完毕。

4.2 自制SDFstudio格式的植物数据集

新创建名为N3的文件夹至目录autodl-tmp/data/N3,上传N3数据集的zip压缩包至目录autodl-tmp/data/N3/.

利用下述命令对N3植物数据集解压:

 cd autodl-tmp/sdfstudio/data/N3
 unzip pre_N3.zip

删除压缩包pre_N3.zip。

运行下述命令,先将N3数据集整理为nerfstudio格式:

 cd autodl-tmp/sdfstudio
 ns-process-data images --data data/N3 --output-dir data/nerfstudio_N3

运行上述命令时报错:

 (sdfstudio) root@autodl-container-a3601189e8-35f796a7:~/autodl-tmp/sdfstudio# ns-process-data images --data data/N3 --output-dir data/nerfstudio_N3
 ( ● ) Copying images...[16:08:20] 🎉 Done copying images. process_data_utils.py:151
 [16:08:25] 🎉 Done downscaling images. process_data_utils.py:209
 Traceback (most recent call last):
 File "/root/miniconda3/envs/sdfstudio/bin/ns-process-data", line 8, in <module>
 sys.exit(entrypoint())
 File "/root/autodl-tmp/sdfstudio/scripts/process_data.py", line 726, in entrypoint
 tyro.cli(Commands).main()
 File "/root/autodl-tmp/sdfstudio/scripts/process_data.py", line 111, in main
 colmap_utils.run_colmap(
 File "/root/autodl-tmp/sdfstudio/nerfstudio/process_data/colmap_utils.py", line 510, in run_colmap
 colmap_version = get_colmap_version(colmap_cmd)
 File "/root/autodl-tmp/sdfstudio/nerfstudio/process_data/colmap_utils.py", line 157, in get_colmap_version
 return float(line.split(" ")[1])
 ValueError: could not convert string to float: '3.10-dev'

应该是colmap的版本问题,这里运行colmap命令,可以看出colmap的版本是3.10:

修改autodl-tmp/sdfstudio/nerfstudio/process_data/colmap_utils.py中的get_colmap_version 函数为以下代码:

 def get_colmap_version(colmap_cmd: str, default_version=3.10) -> float:
     """获取COLMAP的版本号。
     假定COLMAP返回的版本字符串形式为"COLMAP 3.10 ...",但并非所有版本的COLMAP都一定如此。
 ​
     Args:
         colmap_cmd: 获取COLMAP版本号的命令。
         default_version: 如果无法确定COLMAP版本号,则返回的默认版本号。
 ​
     Returns:
         COLMAP的版本号(浮点数),保留两位小数。
     """
     output = run_command(colmap_cmd, verbose=False)
     assert output is not None
     for line in output.split("
"):
         if line.startswith("COLMAP"):
             words = line.split()
             for word in words:
                 try:
                     version_number = float(word.split(" ")[1])
                     # 格式化版本号并返回
                     return float(f"{version_number:.2f}")
                 except (IndexError, ValueError):
                     continue
     
     CONSOLE.print(f"[bold red]找不到COLMAP版本号。使用默认版本{default_version:.2f}")
     return float(f"{default_version:.2f}")

重新运行下述命令:

 cd autodl-tmp/sdfstudio
 ns-process-data images --data data/N3 --output-dir data/nerfstudio_N3

成功对N3植物数据集进行预处理的话,会输出以下提示信息(对所有的图片都成功匹配到了相机位姿):

N3数据集整理为nerfstudio格式之后存于目录autodl-tmp/sdfstudio/data/nerfstudio_N3:

然后需要把nerfstudio数据格式转为sdfstudio数据格式(它提供了如图所示的方法,包括rgbd2sdfsutdio):

运行以下命令将nerfstudio数据格式转为sdfstudio数据格式:

 cd autodl-tmp/sdfstudio
 python scripts/datasets/process_nerfstudio_to_sdfstudio.py --data data/nerfstudio_N3 --output-dir data/sdfstudio_N3 --data-type colmap --scene-type object

运行成功输出以下信息,得到meta_data.json:

到这一步其实就可以了,但为了精细模型,可以选择继续去生成depth和normal文件,使得模型更好。

这就需要配置omnidata,这里运行下述命令先退出sdfdtudio环境:

 conda deactivate

然后运行下述命令,下载omnidata项目:

 cd autodl-tmp
 git clone https://github.com/EPFL-VILAB/omnidata.git

然后运行以下命令用conda新建一个环境,并激活环境,进入torch文件,按照requirements.txt下载相应的库

 conda create -n testenv -y python=3.8
 ​
 conda activate testenv
 ​
 cd autodl-tmp/omnidata/omnidata_tools/torch
 ​
 pip install -r requirements.txt

运行下述两条命令下载预训练模型,预训练模型最后存于目录autodl-tmpomnidataomnidata_tools orchpretrained_models中:

 #depth的下载
 sh ./tools/download_depth_models.sh
 #normal的下载
 sh ./tools/download_surface_normal_models.sh

现在再来生成图片depth和normal文件,先进入 sdfstudio的目录(还是在omnidata的testenv环境):

 cd autodl-tmp
 ​
 python sdfstudio/scripts/datasets/extract_monocular_cues.py --task normal --img_path sdfstudio/data/sdfstudio_N3 --output_path sdfstudio/data/pre_sdfstudio_N3 --omnidata_path omnidata/omnidata_tools/torch --pretrained_models omnidata/omnidata_tools/torch/pretrained_models
 ​
 python sdfstudio/scripts/datasets/extract_monocular_cues.py --task depth --img_path sdfstudio/data/sdfstudio_N3 --output_path sdfstudio/data/pre_sdfstudio_N3 --omnidata_path omnidata/omnidata_tools/torch --pretrained_models omnidata/omnidata_tools/torch/pretrained_models

运行上述命令时报错因为图像大小不相等,我们这里改一下源码,因为它后面处理也resize成384了

注释掉以下这两个assert,然后重新运行上述命令就会忽略这个报错了:

运行一下就是结果:

接下来把autodl-tmp/sdfstudio/data/sdfstudio_N3中的所有文件都粘贴进文件夹autodl-tmp/sdfstudio/data/pre_sdfstudio_N3(或者是运行生成pre_sdfstudio_N时,名字就不额外取,就取sdfstudio_N3,会自动覆盖掉重复文件):

至此sdfstudio格式的N3植物数据集就制作好了。

4.3 训练N3植物数据集的Neus-facto模型

最后退出omnidata的testenv环境,进入sdfstudio环境,开始训练N3植物数据集:

 conda deactivate
 ​
 conda activate sdfstudio
 ​
 cd autodl-tmp/sdfstudio
 ​
 #不需要法线和深度图的命令
 ns-train neus-facto --pipeline.model.sdf-field.inside-outside False --vis viewer --experiment-name N3 sdfstudio-data --data data/sdfstudio_N3
 ​
 #需要法线和深度图的命令
 ns-train neus-facto --pipeline.model.sdf-field.inside-outside True --pipeline.model.mono-depth-loss-mult 0.1 --pipeline.model.mono-normal-loss-mult 0.05 --vis viewer --experiment-name N3 sdfstudio-data --data data/sdfstudio_N3 --include_mono_prior True

运行成功输出如下图的信息:

训练两万次大概需要15分钟,但是在web界面观察渲染出来的结果不是很理想(这一步还是没弄出来)。

然后提取网格:

 cd autodl-tmp/sdfstudio
 ns-extract-mesh --load-config outputs/N3/neus-facto/2024-06-20_204711/config.yml --output-path meshes/neus-facto-N3.ply

mesh模型:

还可以渲染视频(这一步暂时没做出来,因为这一步默认是有图形化界面,调用了open3D中图形化界面的模块,但是Autodl是没有提供图形化界面的,所以跟这些模块产生了冲突,通过修改代码依旧没有解决):

 cd autodl-tmp/sdfstudio
 ns-render-mesh --meshfile meshes/neus-facto-N3.ply --traj interpolate  --output-path renders/neus-facto-N3.mp4 sdfstudio-data --data data/sdfstudio_N3

5、在植物数据集上训练除Neus-facto以外的其他神经隐式表面重建模型

SDF Studio 在一个通用框架中实现了多种神经隐式表面重建方法。更具体地说,SDF Studio 基于 UniSurf、VolSDF 和 NeuS 构建。这些方法的主要区别在于如何对光线沿线的点进行采样,以及如何在体积渲染期间使用 SDF。

除了 NeuS-facto,SDFStudio还提供许多其他模型,可以运行下述命令得到SDFstudio包含的模型的完整列表,但如果要知道每一种模型的详细信息,可以参阅文档。

 ns-train --help

并且SDFstudio每个模型的训练命令可以更改的参数太多了,可以通过运行以下命令查看每个模型可以修改的参数(请注意,参数的顺序很重要!例如,不能在 --data 参数后设置 --machine.num-gpus):

 ns-train <模型名字> --help

接下来我将在SDFstudio所提供的所有模型上跑N3植物数据集:

①Neus:使用具有多个步骤的分层采样,并根据 sigmoid 函数将 SDF 值转换为 alpha 值 [详见论文]。若要训练 NeuS 模型,请运行以下命令:

 cd autodl-tmp/sdfstudio
 ns-train neus --pipeline.model.sdf-field.inside-outside False sdfstudio-data --data data/sdfstudio_N3

提取网格:

 ns-extract-mesh --load-config outputs/data-sdfstudio_N3/neus/2024-06-21_212627/config.yml --output-path meshes/neus-N3.ply

网格模型:

②Unisurf:UniSurf 首先找到表面和表面周围采样点的交点。采样范围从大范围开始,在训练过程中逐渐减小到小范围。当没有找到射线的表面时,UniSurf 会根据射线的近值和远距离值均匀采样。若要训练 UniSurf 模型,请运行以下命令:

 ns-train unisurf --pipeline.model.sdf-field.inside-outside False sdfstudio-data --data data/sdfstudio_N3

提取网格:

 ns-extract-mesh --load-config outputs/data-sdfstudio_N3/unisurf/2024-06-22_125842/config.yml --output-path meshes/unisurf-N3.ply

网格模型:

③Volsdf:VolSDF 使用有误差的采样器 [详见论文] 并将 SDF 值转换为密度值,然后像 NeRF 一样使用常规体积渲染。要训练 VolSDF 模型,请运行以下命令:

 ns-train volsdf --pipeline.model.sdf-field.inside-outside False sdfstudio-data --data data/sdfstudio_N3

提取网格:

 ns-extract-mesh --load-config outputs/data-sdfstudio_N3/volsdf/2024-06-22_172418/config.yml --output-path meshes/volsdf-N3.ply

网格模型:

④MLPS :3D 位置使用 NeRF 中的位置编码进行编码,并传递到多层感知器 (MLP) 网络以预测 SDF 值、法线和几何特征。要使用具有 8 层和 512 个隐藏维度的 MLP 训练 VolSDF,请运行以下命令:

 ns-train volsdf --pipeline.model.sdf-field.use-grid-feature False sdfstudio-data --data data/sdfstudio_N3

提取网格:

 ns-extract-mesh --load-config outputs/data-sdfstudio_N3/volsdf/2024-06-23_172914/config.yml --output-path meshes/MLPS-N3.ply

网格模型:

⑤Multi-res Feature Grids:首先将 3D 位置映射到多分辨率特征网格,使用三线性插值来检索相应的特征向量。然后,该特征向量用作 MLP 的输入,以预测 SDF、法线和几何特征。要使用具有 2 个图层和 256 个隐藏尺寸的多分辨率要素网格表示来训练 VolSDF 模型,请运行以下命令:

 ns-train volsdf --pipeline.model.sdf-field.use-grid-feature True --pipeline.model.sdf-field.encoding-type hash sdfstudio-data --data data/sdfstudio_N3

提取网格:

 ns-extract-mesh --load-config outputs/data-sdfstudio_N3/volsdf/2024-06-25_125344/config.yml --output-path meshes/Multi-res-N3.ply

网格模型:

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容