1. 首页 > 电脑知识

NeuralRecon-W复现 swin transformer复现

作者:admin 更新时间:2025-06-15
摘要:1、配置环境 autodl选择镜像如下: 开机后执行以下命令: #进入数据盘 cd autodl-tmp #下载项目 git clone https://github.com/zju3dv/NeuralRecon-W.git #进入项目 cd NeuralRecon-W 直接运行下述命令安装所有依赖项时,会报错,是因为 Pip,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.sh

2、数据集

这篇文章小编将采用的数据集是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.zip

NeuralRecon-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 done

scripts/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数据集花盆部分重建不是很成功, 然而植物部分还可以,重建出了小芽。