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、bakedangelo、BakedSDF、Neuralangelo、neus-facto-angelo、neus-facto、Neuralangelo、 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
网格模型:


















暂无评论内容