最近因为项目需要,在尝试跑通这个nerf2mesh的开源代码,在这里记录一下过程。
代码的运行是在服务器上实现的,具体配置如下:
在服务器上下载相应的代码后,按照要求安装所需的包:
pip install -r requirements.txt
# tiny-cuda-nn
pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
# nvdiffrast
pip install git+https://github.com/NVlabs/nvdiffrast/
# pytorch3d
pip install git+https://github.com/facebookresearch/pytorch3d.git
注意安装的版本对应问题,requirements里面的包如下图所示:
torch-ema和torchmetrics没有说明支持的pytorch版本。
目前的torch-scatter支持的最高pytorch版本为2.1.X,手动安装的指令为:
pip install torch-scatter -f https://data.pyg.org/whl/torch-2.1.0+cu118.html
安装的pytorch3d是0.7.7,其官网文档中写明其支持的pytorch版本为2.0到2.3之间。注意检查pytorch版本和pytorch3d版本是否对应。如不对应可以通过下面的语句重新安装pytorch。
pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu118
安装所需的扩展包:
# install all extension modules
bash scripts/install_ext.sh
或者通过raymarching文件夹下面的setup.py进行安装:
# if you want to install manually, here is an example:
cd raymarching
python setup.py build_ext --inplace # build ext only, do not install (only can be used in the parent directory)
pip install . # install to python path (you still need the raymarching/ folder, since this only install the built extension.)
在用自己的数据集进行训练之前,需要先安装colmap用于后续对数据进行处理,具体的教程看这篇:ubuntu16安装colmap的问题及解决方案_cudasetupargument 未定义的引用-CSDN博客
跟着教程一步步走就行
安装好colmap以后运行你的colmap,注意单独建立一个data/custom文件夹用于存放你的数据(我拍摄了一段视频,文件名为input.mp4,存放于custom文件夹中),结构如下:
运行colmap的命令如下:
python scripts/colmap2nerf.py --video ./data/custom/video.mp4 --run_colmap # 对于视频
python scripts/colmap2nerf.py --images ./data/custom/images/ --run_colmap # 对于图像
运行后会对拍摄相机的位姿估计以及对视频画面的抽帧结果:
虽然是对单个物体360拍摄,但本次运行并没有按照GitHub项目中推荐的那样进行背景去除(要配置的包有一些版本不兼容的物体,在跑完全流程以后会尝试背景去除)
直接快进到下一步,开始第一阶段的训练:
python main.py data/custom/ --workspace trial_custom -O --data_format colmap --bound 1 --dt_gamma 0 --stage 0 --clean_min_f 16 --clean_min_d 10 --visibility_mask_dilation 50 --iters 10000 --decimate_target 1e5 --sdf
运行会需要较长时间,训练后会得到粗糙的重建成果,之后可以开启第二阶段的训练(btw上述第一阶段训练的指令是针对单个物体360度建模的指令,对室外场景的建模有其他的指令,具体可以参考项目的readme文件)
开启第二阶段的训练:
python main.py data/custom/ --workspace trial_custom -O --data_format colmap --bound 1 --dt_gamma 0 --stage 1 --iters 5000 --lambda_normal 1e-2 --refine_remesh_size 0.01 --sdf
报错:OSError: /environment/miniconda3/lib/python3.10/site-packages/torch_scatter/_scatter_cuda.so: undefined symbol: _ZN5torch8autograd13_wrap_outputsERKSt6vectorIN2at6TensorESaIS3_EERKSt13unordered_setIPN3c1010TensorImplESt4hashISB_ESt8equal_toISB_ESaISB_EESJ_NS9_8ArrayRefINS9_8optionalIS3_EEEERKSt10shared_ptrINS0_4NodeEESt8functionIFS5_S5_S5_EE
应该是scatter和torch或者cuda存在版本不兼容的问题,看来之前预防的pytorch和torchscatter不兼容的问题还是存在,尝试以下文章中提到的方法:(12月最新)完美兼容安装torch-geometric与torch-scatter torch-sparse torch-cluster、torch-spline-conv的方法及版本对应关系_geometric 和troch版本对应关系-CSDN博客
在https://pytorch-geometric.com/whl/网站中找到对应版本的torchscatter下载,然后用pip install+完整文件名进行重装,重装后再次运行上述训练第二阶段的指令不再报相同错误。
等待训练完成。
训练时出现报错:
查到pymeshlab在最新版本中移除了许多旧版本的属性,需要将pymeshlab的版本降低到适配当前项目的版本,但项目的GitHub文档里面并没有写明他们安装的是哪个版本,只能推测(是个低效率的办法,如果有更好的方法可以评论区交流)论文完稿于22年,所以使用的是22年之前的版本。
在pymeshlab的PyPi页面中找到官方的changelog(记录项目变更情况的文档)查到2021.10的版本中提到了AbsoluteValue,于是尝试将版本降级至2021.10
大量报错,2022.2的版本更改了所有函数的命名,于是尝试安装pymeshlab 2022.2的版本,刚刚报错的节点不再报错。
pip install pymeshlab==2022.2
看他跑一个小时,没什么问题我就去睡觉,有问题再更新。
跑完了,耗时比想象中少
输出的模型保存在了trial_custom/mesh_stage1里面,把他下载下来看看。
效果一般般,似乎是把背景当成了物体的主体来建模
明天运行一下去除背景的代码。然后再把stage0和stage1重新跑一遍(果然还是不应该跳步。。。)