NeuralRecon-W复现 swin transformer复现
1、配置环境
autodl选择镜像如下:
开机后执行 下面内容命令:
#进入数据盘 cd autodl-tmp #下载项目 git clone https://github.com/zju3dv/NeuralRecon-W.git #进入项目 cd NeuralRecon-W直接运行下述命令安装所有依赖项时,会报错,是 由于 Pip 在安装 sklearn 包时遇到 难题,这是 由于 sklearn 包已弃用。requirements.txt 文件中没有直接列出 sklearn 依赖,但 open3d==0.12.0 依赖了 sklearn,而 sklearn 已弃用,推荐使用 scikit-learn。
#安装所有依赖项 conda env create -f environment.yaml因此需要修改requirements.txt 文件中的内容如下:
# Machine Learning and PyTorch ecosystem pytorch-lightning==1.4.8 torchmetrics==0.7.0 einops==0.3.0 test-tube==0.7.5 kornia==0.4.1 torch_optimizer lpips==0.1.3 # Visualization and Data Handling opencv-python==4.5.1.48 tplotlib==3.3.3 plotly==4.14.3 i geio==2.9.0 i geio-ffmpeg==0.4.2 pandas==1.1.5 jupyter # General utilities loguru yacs h5py # Mesh Handling and Visualization PyMCubes==0.1.2 pycollada==0.7.1 trimesh==3.9.1 pyglet==1.5.10 networkx==2.5 scikit-i ge pyrender # Point Cloud Libraries plyfile==0.7.2 open3d==0.13.0 # Open3D compatible with Python 3.8 # mmsegmentation and dependencies mmcv-full==1.4.4 -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.2/index.html mmsegmentation==0.20.2 # Scikit-learn scikit-learn==0.24.2同时根据本机的cuda 11.3和pytorch 1.8.2版本的 难题还需要更新environment.yaml文件内容如下:
name: neuconw channels: - pytorch - nvidia - defaults dependencies: - python=3.8 - ipython - tqdm - pip - pip: - torch==1.8.2+cu111 -f https://download.pytorch.org/whl/torch_stable.html - torchvision==0.9.2+cu111 -f https://download.pytorch.org/whl/torch_stable.html - torchaudio==0.8.2 - -r requirements.txt - git+https://github.com/Burningdust21/kaolin.git接着在运行下述命令:
#安装所有依赖项 conda env create -f environment.yaml #激活环境 conda activate neuconw #下载一个预训练的语义分割模型权重文件 scripts/download_sem_model.sh2、数据集
这篇文章小编将采用的数据集是Heritage-Recon,该数据集的下载网址是 Heritage-Recon 。先通过网址将数据集下载到本地,该数据集里面有如下四个场景:
由于 时刻的关系(数据集过大上传至Autodl很费 时刻),我只下载了Heritage-Recon第一个场景brandenburg_gate(勃兰登堡门)的相关数据集。
#进入项目 cd autodl-tmp/NeuralRecon-W #创建数据集目录,并进入数据集目录 mkdir data && cd data mkdir heritage-recon && cd heritage-recon接着将下载到本地的brandenburg_gate(勃兰登堡门)数据集上传至Autodl的目录autodl-tmp/NeuralRecon-W/data/heritage-recon。
接着运行下述命令对数据集进行解压:
cd autodl-tmp/NeuralRecon-W/data/heritage-recon unzip brandenburg_gate.zip解压后的数据集存于autodl-tmp/NeuralRecon-W/data/heritage-recon/brandenburg_gate。
接下来为brandenburg_gate(勃兰登堡门)场景生成光线缓存:
cd autodl-tmp/NeuralRecon-W scripts/data_generation.sh data/heritage-recon/brandenburg_gate运行报错,遇到的 np.bool 错误,运行 下面内容命令更新 trimesh 和 numpy 到最新版本:
pip install --upgrade trimesh numpy继续运行下述命令:
scripts/data_generation.sh data/heritage-recon/brandenburg_gate会显示报错说GPU不可用(报错信息:RuntimeError: No CUDA GPUs are available), 缘故是 由于脚本data_generation.sh中有一行export CUDA_VISIBLE_DEVICES=5 指定了会使用 GPU 5, 然而我这里只有一个GPU,其GPU ID为0, 因此修改 data_generation.sh 脚本中的 CUDA_VISIBLE_DEVICES 行,使其指向正确的 GPU ID(通常是 0):
export CUDA_VISIBLE_DEVICES=0接着在运行下述命令,就可以成功为brandenburg_gate(勃兰登堡门)场景生成光线缓存:
scripts/data_generation.sh data/heritage-recon/brandenburg_gate在运行上述生成光线缓存的命令时没有任何报错, 然而生成的文件autodl-tmp/NeuralRecon-W/data/heritage-recon/brandenburg_gate/cache_sgs下为空,没有任何与光线缓存相关的文件。
3、训练模型
将 autodl-tmp/NeuralRecon-W/scripts/train.sh中的export CUDA_VISIBLE_DEVICES=5 改为export CUDA_VISIBLE_DEVICES=0。
要在Heritage-Recon 数据集中训练场景,需执行 下面内容操作:
# Subsutitude `SCENE_NAME` with the scene you want to reconstruct. scripts/train.sh brandenburg_gate_experiment config/train_brandenburg_gate.yaml 1 1运行上述训练命令时报 下面内容错误:
Traceback (most recent call last): File "train.py", line 72, in <module> in(hparams, config) File "train.py", line , in in trainer.fit(system, datamodule=data_module) File "/root/miniconda3/envs/neuconw/lib/python3.8/site-packages/pytorch_lightning/trainer/trainer.py", line 552, in fit self._run(model) File "/root/miniconda3/envs/neuconw/lib/python3.8/site-packages/pytorch_lightning/trainer/trainer.py", line 8 , in _run self._call_setup_hook(model) # allow user to setup lightning_module in accelerator environment File "/root/miniconda3/envs/neuconw/lib/python3.8/site-packages/pytorch_lightning/trainer/trainer.py", line 1168, in _call_setup_hook self.datamodule.setup(stage=fn) File "/root/miniconda3/envs/neuconw/lib/python3.8/site-packages/pytorch_lightning/core/datamodule.py", line 428, in wrapped_fn fn(*args, |kwargs) File "/root/autodl-tmp/NeuralRecon-W/datasets/data.py", line 68, in setup self.train_dataset = self._setup_dataset( File "/root/autodl-tmp/NeuralRecon-W/datasets/data.py", line 113, in _setup_dataset return dataset( File "/root/autodl-tmp/NeuralRecon-W/datasets/phototouri .py", line 123, in __init__ self.read_meta() File "/root/autodl-tmp/NeuralRecon-W/datasets/phototouri .py", line 478, in read_meta self.root_dir, self.split_path, self.cache_paths[0] IndexError: index 0 is out of bounds for axis 0 with size 0上述的错误也就是没有找到与光线缓存相关的文件,说明光线缓存部分就出错了,后来我在生成光线缓存的那一步做了很久的调试,分步执行生成光线缓存的命令,发现程序被kill了, 由于程序运行 经过中占用的内存过大, 接着我将数据分块,分成很小了还是不行,还是显示被kill了,这一步困扰了我几天, 接着我就去问师姐,师姐说 由于官方提供的测试数据集过大 缘故造成的,建议直接跑植物数据集。
4、训练N3植物数据集
由于官方提供的测试数据集过大,因此直接在NeuralRecon-W模型上跑植物数据集。
4.1 装col p
到网站COLMAP — COLMAP 3.9-dev documentation中下载col p项目:
输入上述命令,下载col p项目:
cd autodl-tmp git clone https://github.com/col p/col p接下来执行 下面内容命令利用c ke编译col p:
cd autodl-tmp/col p mkdir build cd build c ke ../输入 下面内容命令查看操作 体系的版本信息(/etc/os-release文件就是记录的操作 体系的版本信息):
cat /etc/os-release本操作 体系的版本信息如下:
执行如下命令,安装col p在ubuntu 体系中的依赖项(这些命令分开执行, 由于每一条命令都可能报错):
cd autodl-tmp/col p/build apt update apt upgrade -y apt --fix-broken install apt upgrade -y apt-get install git c ke ninja-build build-essential libboost-program-options-dev libboost-filesystem-dev libboost-graph-dev libboost-system-dev libeigen3-dev libflann-dev libfreei ge-dev libmetis-dev libgoogle-glog-dev libgtest-dev libsqlite3-dev libglew-dev apt install qtbase5-dev libqt5opengl5-dev libcgal-dev libceres-dev重新使用c ke编译col p:
cd autodl-tmp/col p/build ls#查看build目录下c ke的编译文件,如下: rm -rf ./* c ke ../ ke -j 6 ke install -j输入 下面内容命令检查col p是否安装成功:
col p有如下信息则说明col p安装成功:
4.2 预处理N3植物数据集
上传本机处理好的N3数据集的COLMAP 职业区文件夹压缩包至目录autodl-tmp/NeuralRecon-W/data/zhiwu,进入该目录后运行下述命令对于压缩包进行解压:
cd autodl-tmp/NeuralRecon-W/data/zhiwu unzip N3.zipNeuralRecon-W项目提供了一个脚本scripts/preprocess_data.sh用于自动将 col p 职业区转换为NeuralRecon-W的数据格式,该代码采用标准的 COLMAP 职业区格式作为输入, 下面内容是scripts/preprocess_data.sh脚本的原始内容:
#!/bin/bash set -x set -u set -e now=$(date +"%Y%m%d_%H%M%S") echo "working directory is $(pwd)" jobname="data-generation-$now" | | | | | | | | | | | | | | | | # Replace following variables # col p workspace should be in ${SRC_PATH}/${SCENE_NAME} # output is in ${DEST_PATH}/${SCENE_NAME} SRC_PATH='/data/phototouri /training_set' SCENE_NAME='brandenburg_gate' DEST_PATH='/data/recon_data' # col p sparse folder and i ge folder COLMAP_PATH='dense/sparse' IMG_PATH='dense/i ges' # If you have multiple sub i ges folder, change SPLIT_TYPE to "plain" to reconstruct them seperatly, # or group them as "folder1#folder2, folder3", folder1 and folder2 will results in one output, folder3 in another SPLIT_TYPE="none" | | | | | | | | | | | | | | | | python tools/pre_process.py --src ${SRC_PATH}/${SCENE_NAME} --dest ${DEST_PATH} --split ${SPLIT_TYPE} --img_dir ${IMG_PATH} --col p_dir ${COLMAP_PATH} # clear temp folder rm -rf ${DEST_PATH}/${SCENE_NAME}/undistort export CUDA_VISIBLE_DEVICES=0 for scene_name in ${DEST_PATH}/${SCENE_NAME}/* ; do root_dir=${scene_name} echo processing scene ${root_dir} python tools/prepare_data/prepare_se ntic_ ps.py --root_dir ${root_dir} 2>&1|tee log/${jobname}_preprocess.log min_observation=-1 python tools/prepare_data/prepare_data_split.py --root_dir ${root_dir} --num_test 10 --min_observation $min_observation --roi_threshold 0 --static_threshold 0 dataset_name="phototouri " cache_dir="cache_sgs" python tools/prepare_data/prepare_data_cache.py --root_dir ${root_dir} --dataset_name $dataset_name --cache_dir $cache_dir --img_downscale 1 --se ntic_ p_path se ntic_ ps --split_to_chunks 2>&1|tee log/${jobname}.log done其中需要修改的部分如下:
SRC_PATH: 修改为 COLMAP 职业区根目录。
SCENE_NAME: 自定义当前处理的场景名称(例如,N3)。
DEST_PATH: 数据转换后的输出路径。
COLMAP_PATH: 相对 SRC_PATH 的 COLMAP 稀疏点云文件夹路径。
IMG_PATH: 相对 SRC_PATH 的图像文件夹路径。
SPLIT_TYPE: 如果你有多个子图像文件夹,选择合适的分割类型。通常设置为 "none"。
修改后的scripts/preprocess_data.sh脚本内容为:
#!/bin/bash set -x set -u set -e now=$(date +"%Y%m%d_%H%M%S") echo "working directory is $(pwd)" jobname="data-generation-$now" | | | | | | | | | | | | | | | | # Replace following variables # col p workspace should be in ${SRC_PATH}/${SCENE_NAME} # output is in ${DEST_PATH}/${SCENE_NAME} SRC_PATH='data/zhiwu' SCENE_NAME='N3' DEST_PATH='data' # col p sparse folder and i ge folder COLMAP_PATH='sparse' IMG_PATH='i ges' # If you have multiple sub i ges folder, change SPLIT_TYPE to "plain" to reconstruct them seperatly, # or group them as "folder1#folder2, folder3", folder1 and folder2 will results in one output, folder3 in another SPLIT_TYPE="none" | | | | | | | | | | | | | | | | python tools/pre_process.py --src ${SRC_PATH}/${SCENE_NAME} --dest ${DEST_PATH} --split ${SPLIT_TYPE} --img_dir ${IMG_PATH} --col p_dir ${COLMAP_PATH} # clear temp folder rm -rf ${DEST_PATH}/${SCENE_NAME}/undistort export CUDA_VISIBLE_DEVICES=0 for scene_name in ${DEST_PATH}/${SCENE_NAME}/* ; do root_dir=${scene_name} echo processing scene ${root_dir} python tools/prepare_data/prepare_se ntic_ ps.py --root_dir ${root_dir} 2>&1|tee log/${jobname}_preprocess.log min_observation=-1 python tools/prepare_data/prepare_data_split.py --root_dir ${root_dir} --num_test 10 --min_observation $min_observation --roi_threshold 0 --static_threshold 0 dataset_name="phototouri " cache_dir="cache_sgs" python tools/prepare_data/prepare_data_cache.py --root_dir ${root_dir} --dataset_name $dataset_name --cache_dir $cache_dir --img_downscale 1 --se ntic_ p_path se ntic_ ps --split_to_chunks 2>&1|tee log/${jobname}.log donescripts/preprocess_data.sh脚本和col p 职业区都准备好之后,运行下述命令(注意autodl-tmp/NeuralRecon-W/data/zhiwu/N3/sparse目录下直接有所有的bin文件,不用单独创建一个0文件夹):
bash scripts/preprocess_data.sh命令运行会报错,显示没有log文件夹,即使用下述命令,创建日志文件夹:
cd autodl-tmp/NeuralRecon-W mkdir log创建了日志文件夹后,重新运行命令bash scripts/preprocess_data.sh报 下面内容错误,显示没有权重:
该权重文件 一个预训练的权重模型,需要自行到网址mmsegmentation/configs/deeplabv3/README.md at in · open-mmlab/mmsegmentation (github.com)进行下载(下载下图红框圈住,以及箭头指向的预训练权重模型model)
如下图下载下来的pth权重文件和缺少的权重文件一样:
A将下载下来的文件上传至autodl的autodl-tmp/NeuralRecon-W/weights目录下:
权重文件准备好之后重新运行 下面内容命令:
bash scripts/preprocess_data.sh本次运行命令没有报错,说明预处理数据成功,预处理数据成功之后,应该生成 下面内容格式的目录:
└── brandenburg_gate └── brandenburg_gate.tsv ├── cache_sgs └── splits ├── rays1_meta_info.json ├── rgbs1_meta_info.json ├── split_0 ├── rays1.h5 └── rgbs1.h5 ├── split_1 ├──..... ├── config.yaml ├── dense └── sparse ├── cameras.bin ├── i ges.bin ├── points3D.bin └── se ntic_ ps ├── 99119670_397881696.jpg ├── 99128562_ 34086 7.jpg ├── 99250931_9123849334.jpg ├── 99388860_2887395078.jpg ├──.....4.3 在NeuralRecon-W上训练N3植物数据集
如下图,在config/train.yaml 中更改DATASET.ROOT_DIR为 COLMAP 职业区路径/root/autodl-tmp/NeuralRecon-W/data/N3/split_0:
接着开始训练N3模型,在学姐指导下知道需要用两张卡跑, 因此需要修改autodl-tmp/NeuralRecon-W/scripts/train.sh的export CUDA_VISIBLE_DEVICES=0为正确的GPU的ID号,首先运行下述命令查看GPU的ID号:
nvidia- i得到 下面内容信息,说明GPU的ID号为0和1:
那么就将autodl-tmp/NeuralRecon-W/scripts/train.sh的export CUDA_VISIBLE_DEVICES=0修改为export CUDA_VISIBLE_DEVICES=0,1, 下面内容是修改了的train.sh脚本内容:
#!/bin/bash set -x set -u now=$(date +"%Y%m%d_%H%M%S") jobname="train-$1-$now" echo "job name is $jobname" config_file=$2 mkdir -p log mkdir -p logs/${jobname} cp ${config_file} logs/${jobname} export CUDA_VISIBLE_DEVICES=0,1 python train.py --cfg_path ${config_file} --num_gpus $3 --num_nodes $4 --num_epochs 20 --batch_size 2048 --test_batch_size 512 --num_workers 16 --exp_name ${jobname} 2>&1 | tee log/${jobname}.log接着运行 下面内容命令开始训练N3模型:
#$EXP_NAME为自定义实验名称;$NUM_GPU为GPU数量;$NUM_NODE为节点训练数量,通常为单节点训练设置为1 bashs cripts/train.sh $EXP_NAME config/train.yaml $NUM_GPU $NUM_NODE #命令示例 bash scripts/train.sh N3_experiment config/train.yaml 2 1 #如果训练室内场景,则应设置为yaml文件为config/train_indoor.yaml,另外还需要设置参数NEUCONW.SDF_CONFIG.inside_outside为True有 下面内容信息输出,说明训练模型成功!!
N3植物数据集训练成功之后运行 下面内容命令来提取网格,提取的网格(也需要两张卡)保存到路径autodl-tmp/NeuralRecon-W/results
#$EXP_NAME为自定义实验名称,建议与训练 经过中的目录名称一致;$CKPT_PATH为训练生成的模型检查点文件路径,该路径应该指向 .ckpt 文件,通常在 checkpoints/ 目录下;$EVAL_LEVEL为评估层级,通常是 0 或 1,用于选择不同的评估分辨率或层级。 bash scripts/sdf_extract.sh $EXP_NAME config/train.yaml $CKPT_PATH $EVAL_LEVEL #命令示例 #使用autodl-tmp/NeuralRecon-W/checkpoints文件夹的 iter_350000.ckpt bash scripts/sdf_extract.sh N3_experiment config/train.yaml checkpoints/train-N3_experiment-20240704_151040/iter_350000.ckpt 0下面内容是$EVAL_LEVEL参数的详细说明($EVAL_LEVEL 参数通常用来设置提取网格时的采样分辨率或层级。):
$EVAL_LEVEL=0 – 高精度评估
描述: 使用高精度的配置进行网格提取。适用于需要详细网格模型的场景。
适用场景: 最终网格模型提取,或者需要高精度展示时。
$EVAL_LEVEL= 1 – 中等精度评估
描述: 使用中等精度的配置进行网格提取。适用于一般性评估和模型验证。
适用场景: 模型验证和中间 结局评估。
$EVAL_LEVEL= 2 及更高层级 – 低精度评估
描述: 使用较低精度的配置进行网格提取。适用于快速预览或粗略评估。
适用场景: 快速迭代和调试时使用。
下面内容是生成的N3数据集的网格模型(跑了整整20个轮次,20多个小时):
6、 拓展资料
训练 时刻很久,两张3090的卡,平均一个轮次需要70分钟,默认设置的轮次是20轮,也就是需要20多个小时(当然可以自定义设置轮次, 由于在训练的 经过中它会显示各个评估指标的值,包括颜色损失、正则化损失、掩码损失、峰值信噪比等,如果训练 经过中显示的这些值达到了要求,或者说是没 何太大的变化,也就是没有优化的空间了,就可以按Ctrl+C停止训练,以节约 时刻和金钱)。
效果很不错,之前在表面重建 技巧Neus、Volsdf上跑N3数据集都没有枝干, 然而本项目NeuralRecon-W模型跑出来的N3植物数据集效果很好,不仅枝干出来了,而且有颜色。 然而大叶植物的颜色效果视乎没有那么好。
虽然N3重建出来的模型效果不错, 然而顶部的枝干还是缺了一点, 并且重建的大叶植物的颜色效果还是不不好,我考虑到是不是过拟合的 缘故,因此对于总轮次数3/4左右的轮次模型页提取的网格,感觉效果不如最终轮次的, 因此应该不是过拟合的 缘故,那又没有可能在多训练一点效果会更好?
意外发现: 由于跑M1数据集时需要修改autodl-tmp/NeuralRecon-W/config/train.yaml中的位于TRAINER下的VAL_FREQ参数,在这一 经过中,我有一个意外发现。原始的VAL_FREQ参数数值为10000.0,最开始没有修改该参数时,训练M1数据集就报错,我就担心是我的环境出了 难题, 因此我就把配置文件里面的数据集路径更改为N3的了, 接着运行训练命令,发现没报错,说明环境没 难题,只是VAL_FREQ参数的 难题,于是我修改了VAL_FREQ参数为3000.0, 然而修改了之后我又忘记把配置文件里面的数据集路径更改为M1的了, 因此最终跑的是N3的数据集,我本以为是浪费 时刻和金钱了, 然而却发现一个意外收获,可以看到下述改了VAL_FREQ参数后进行训练的N3植物模型顶部更加完整了。
M1数据集花盆部分重建不是很成功, 然而植物部分还可以,重建出了小芽。