**实在时隔太久,自己也记不清了,把训练结果放出记录一下**
*基本是自己断断续续的记录,进行了一个短期摸索*
系列内容:
Nerf-W学习记录(二)——个人LLFF数据集制作-CSDN博客
一、参考代码
1.Nerf/Nerf-W
*遇到问题:nerf-w部分不支持进行个人数据集训练模型,只能够完成nerf-w论文复现,支持blender和phototourism数据集*
2.Nerf-W
*遇到代码问题:复现作者提供数据集与个人制作数据集都会报错no intersection,从而导致模型无法进行训练*
- NeuralRecon-W:https://github.com/zju3dv/NeuralRecon-W
3.LLFF数据集
二、LLFF数据集制作
参考内容:Nerf-W学习记录(二)——个人LLFF数据集制作-CSDN博客
1.制作流程
Step1:模型环拍获得图片
- 选择单一背景拍摄制作数据集成功率较高
- 数量不能过多,影响最终建模效果,100张左右效果比较好
- 通过对环拍视频提取每帧图像进行数据集制作方式效果差,出现大量未匹配图像,实验后舍弃该方式
Step2:Colmap生成稀疏点云
- 特征提取-->特征匹配-->三维重建-->导出模型
- 特征点提取Camera model选用PINHOLE模型,nerf支持PINHOLE和RADIAL
- SIMPLE_PINHOLE与PINHOLE对比缺少畸变参数、主点位置等数据生成
Step3:LLFF生成相关约束poses_bounds.npy文件
- 如果数据集图片数量过多会存在图片未匹配问题,删除对应文件图片重新生成稀疏点云制作数据集,有时删除未匹配上的图片前一张图片更为有效。重复该过程直至成功生成约束文件。
2.相关参数
(1)拍摄设备:iPhone13Pro
- 数据采集时设置为存储兼容性模式,关闭实况与raw模式
(2)格式:JPG(png格式也支持)
(3)数据存储格式:
- images
图片文件夹- xxx.jpg
- sparse
colmap导出生成建模数据- 0
可能存在双目相机情况,故采用此命名存放对应生成数据- cameras.bin
相机模型数据 - images.bin
图片数据 - points3D.bin
3D点云数据 - project.ini
colmap项目文件
- cameras.bin
- 0
- database.db
colmap建模database - poses_bounds.npy
LLFF数据集相关约束信息,运行LLFF pose_utils.py生成
3.遇到问题与解决
- 数据集拍摄图片质量
LLFF数据集生成过程中反复出现未匹配上的图片无法生成约束文件,重新拍摄质量更好的图片,把物体摆放在图片中心且尽可能保证拍摄背景环境单一 - 相机模型选择PINHOLE
最初选用SIMPLE_PINHOLE模型导致nerf-w训练过程camera.bin读取数据数组维度不匹配,缺少cx,cy等参数
三、Nerf环境配置
1.环境配置参数
- 重装torch-lighting
- nerfw
- pytorch-lightning Version: 1.1.5
- master
- pytorch-lightning Version: 0.8.5
- nerfw
- pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
- toolkit 11.1
- cuda 10.2
2.代码修改部分
- get_ray_direction
- 报错
fx, fy, cx, cy = K[0, 0], K[1, 1], K[0, 2], K[1, 2]
IndexError: invalid index to scalar variable. - 分析
- llff数据集传递参数只有焦距,需要多个参数并且进行修改
- 解决
- 通过blender数据集打印参数
GPU available: True, used: True
TPU available: None, using: 0 TPU cores
LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]
add [] perturbation!
[[555.5555156 0. 200. ]
[ 0. 555.5555156 200. ]
[ 0. 0. 1. ]]
[[555.5555156 0. 200. ]
[ 0. 555.5555156 200. ]
[ 0. 0. 1. ]] - llff.py对照blender.py
- readmeta
# step 1.5 define Kw, h = self.img_wh
self.K = np.eye(3)
self.K[0, 0] = self.K[1, 1] = self.focal
self.K[0, 2] = w/2self.K[1, 2] = h/2
self.directions = \
get_ray_directions(self.img_wh[1], self.img_wh[0], self.K) # (H, W, 3)
- readmeta
- 通过blender数据集打印参数
- 报错
- validation_step
- 报错
rays, rgbs, ts = batch['rays'], batch['rgbs'], batch['ts']
KeyError: 'ts' - 分析与解决
没有定义ts(时间步长/帧索引)
- 报错
四、实验部分
1.nerf-w复现
1.1 blender数据集
(1)终端:
(nerf_pl) lib@lib:~/lib/nerf_pl$ python train.py --dataset_name blender --root_dir /home/lib/lib/nerf_pl/nerf_synthetic/lego/ --N_importance 64 --img_wh 400 400 --noise_std 0 --num_epochs 20 --batch_size 1024 --optimizer adam --lr 5e-4 --lr_scheduler cosine --exp_name exp
GPU available: True, used: True
TPU available: None, using: 0 TPU cores
LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]
add [] perturbation!
/home/lib/anaconda3/envs/nerf_pl/lib/python3.6/site-packages/torch/functional.py:445: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ../aten/src/ATen/native/TensorShape.cpp:2157.)
return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]
Epoch 19: 100%|████████████| 15633/15633 [18:30<00:00, 14.08it/s, loss=0.0437, val/psnr=14, train/c_l=0.0207, train/f_l=0.0207, train/psnr=13.8]
Profiler Report
Action | Mean duration (s) |Num calls | Total time (s) | Percentage % |
-----------------------------------------------------------------------------------------------------------------------------
Total | - |_ | 2.2217e+04 | 100 % |
-----------------------------------------------------------------------------------------------------------------------------
run_training_epoch | 1110.4 |20 | 2.2208e+04 | 99.959 |
run_training_batch | 0.067503 |312500 | 2.1095e+04 | 94.948 |
optimizer_step_and_closure_0 | 0.056225 |312500 | 1.757e+04 | 79.085 |
training_step_and_backward | 0.055053 |312500 | 1.7204e+04 | 77.436 |
model_backward | 0.050886
(2)结果:lego


1.2 phototourism数据集
(1)数据集
a.下载:
- IMC-PT 2020 dataset | Kwang Moo Yi @ UBC
图片、相机参数、深度信息 - NeRF in the Wild
在Additional Links里面下载了Train/Test split文件
b.文件格式
- dense
- images
- 1363张jpg文件,wh不一
- sparse
参数- cameras.bin
- images.bin
- points3D.bin
- stereo
深度信息- depth_maps
- depth_maps_clean_300_th_0.10
- images
- brandenburg.tsv
训练集和测试集划分,10张图用于测试
c.准备(可选部分)(降采样提高训练速度)
- 终端
python train.py \
--root_dir /home/lib/lib/nerf_pl/example/brandenburg_gate/ --dataset_name phototourism \
--img_downscale 8 --use_cache --N_importance 64 -
--encode_a --encode_t --beta_min 0.03 --N_vocab 1500 \
--num_epochs 20 --batch_size 1024 \
--optimizer adam --lr 5e-4 --lr_scheduler cosine \
--exp_name brandenburg_scale8_nerfw
- 结果
(nerf_pl) lib@lib:~/lib/nerf_pl$ python train.py \
> --root_dir /home/lib/lib/nerf_pl/example/brandenburg_gate/ --dataset_name phototourism \
> --img_downscale 8 --use_cache --N_importance 64 --N_samples 64 \
> --encode_a --encode_t --beta_min 0.03 --N_vocab 1500 \
> --num_epochs 20 --batch_size 1024 \
> --optimizer adam --lr 5e-4 --lr_scheduler cosine \
> --exp_name brandenburg_scale8_nerfw
GPU available: True, used: True
TPU available: None, using: 0 TPU cores
LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]
Epoch 19: 100%|█| 8539/8539 [12:56<00:00, 11.00it/s, loss=0.109, val/psnr=24.9, train/c_l=0.00419, train/f_l=0.285, train/b_l=-.176, train/s_l=0.00112
Profiler Report
Action | Mean duration (s) |Num calls | Total time (s) | Percentage % |
-----------------------------------------------------------------------------------------------------------------------------
Total | - |_ | 1.5331e+04 | 100 % |
-----------------------------------------------------------------------------------------------------------------------------
run_training_epoch | 766.39 |20 | 1.5328e+04 | 99.979 |
run_training_batch | 0.088139 |170760 | 1.5051e+04 | 98.171 |
optimizer_step_and_closure_0 | 0.07664 |170760 | 1.3087e+04 | 85.363 |
training_step_and_backward | 0.075009 |170760 | 1.2808e+04 | 83.546 |
model_backward | 0.061202 |170760 | 1.0451e+04 | 68.168 |
model_forward | 0.01358 |170760 | 2319.0 | 15.126 |
on_train_batch_end
d.训练
- 终端
python train.py \ --root_dir /home/lib/lib/nerf_pl/example/brandenburg_gate/ --dataset_name phototourism \ --img_downscale 8 --use_cache --N_importance 64 - --encode_a --encode_t --beta_min 0.03 --N_vocab 1500 \ --num_epochs 20 --batch_size 1024 \ --optimizer adam --lr 5e-4 --lr_scheduler cosine \ --exp_name brandenburg_scale8_nerfw - 结果

1.3 llff数据集fern(gif太大了)


2.基于nerf的LLFF数据集质量检测
2.1 512*512Goda
1.epoch=20,spheric
- 终端
(nerf_pl) lib@lib:~/lib/nerf_pl$ python train.py --dataset_name llff --root_dir /home/lib/lib/Goda/goda1_512_512/ --N_importance
64 --img_wh 512 512 --num_epochs 20 --batch_size 1024 --optimizer adam --lr 5e-4 --lr_scheduler steplr --decay_step 10 20 --decay_g
amma 0.5 --exp_name goda1_20_spheric --spheric
GPU available: True, used: True
TPU available: False, using: 0 TPU cores
CUDA_VISIBLE_DEVICES: [0]
val image is /home/lib/lib/Goda/goda1_512_512/images/0098.jpg
Epoch 20: 100%|██████████████| 37121/37121 [42:38<00:00, 14.51it/s, loss=0.003, v_num=0, train_psnr=28.1, val_loss=0.00446, val_psnr=27.3]
Profiler Report
Action | Mean duration (s) | Total time (s)
-----------------------------------------------------------------
on_train_start | 0.00016261 | 0.00016261
on_epoch_start | 0.00020084 | 0.0040168
get_train_batch | 0.00017425 | 129.36
on_batch_start | 4.4315e-06 | 3.2899
model_forward | 0.012029 | 8930.4
model_backward | 0.041819 | 3.1046e+04
on_after_backward | 1.2296e-06 | 0.91287
optimizer_step | 0.0013475 | 1000.4
on_batch_end | 0.00024676 | 183.2
on_epoch_end | 6.1626e-06 | 0.00012325
on_train_end | 0.00014522 | 0.00014522
结果

2.epoch=20



*应该还是要设置spheric的,否则渲染过程存在大面积留白等问题*
2.2 504*504 Goda2
1.epoch=10,spheric



五、Nerf-pl代码解读
- 模型
- 渲染阶段
- Coarse Sampling粗略采样——N_samples
在场景中使用均匀的深度范围,对每条光线进行采样,得到初步的粗略估计。采样点数量通常固定,对应参数 N_samples
- Fine Sampling 精细采样——N_importance
基于粗略阶段的结果对光线进行更密集的采样。N_importance 决定精细阶段中每条光线额外采样的点的数量。采样根据粗略阶段的概率分布进行,从而聚焦于更有可能贡献细节的区域。
- 总采样点=N_samples+N_importance
- Coarse Sampling粗略采样——N_samples
- 渲染阶段
- nerfw分支
- train.py
训练数据集- NeRFSystem类
- hparams
超参定义模型配置,包括嵌入维度、学习率等
- 射线xyz和dir
- 初始化外观向量a和瞬态向量t
- hparams
- forward前向传播
- 输入:rays 是光线数据,ts 是时间戳。
- 输出:通过将光线和嵌入送入 render_rays 函数,得到场景的渲染结果。使用 chunk 处理大批量数据,防止显存溢出。
- setup
- dataset_dict:根据超参数中的数据集名称,加载相应的数据集类。
- train_dataset和 val_dataset:分别定义训练集和验证集。
- configure_optimizers
优化器和学校率调度器
- training_step
- batch:训练数据集中的一个批次,包括光线数据 rays、RGB 图像 rgbs 和时间戳 ts。
- loss_d:计算损失函数。
- psnr_:通过 PSNR (峰值信噪比) 评估图像质量。
- self.log:将损失和 PSNR 记录下来,方便监控训练过程。
- 执行
- phototourism数据集
python train.py \> --root_dir /home/lib/lib/nerf_pl/example/brandenburg_gate/ --dataset_name phototourism \> --img_downscale 8 --use_cache --N_importance 64 --N_samples 64 \> --encode_a --encode_t --beta_min 0.03 --N_vocab 1500 \> --num_epochs 20 --batch_size 1024 \> --optimizer adam --lr 5e-4 --lr_scheduler cosine \> --exp_name brandenburg_scale8_nerfw
- blender数据集
python train.py --dataset_name blender --root_dir /home/lib/lib/nerf_pl/nerf_synthetic/lego/ --N_importance 64 --img_wh 400 400 --noise_std 0 --num_epochs 20 --batch_size 1024 --optimizer adam --lr 5e-4 --lr_scheduler cosine --exp_name exp
- phototourism数据集
- NeRFSystem类
- prepare_phototourism.py
预处理photorourism数据集,进行降采样提高速度- 执行
python prepare_phototourism.py --root_dir $ROOT_DIR --img_downscale {an integer, e.g. 2 means half the image sizes}
- 执行
- opt.py
配置参数
- datasets
数据集
- models
模型
- utils
工具函数
- losses
损失函数
- metrics
评价指标
- train.py
——个人数据训练&spm=1001.2101.3001.5002&articleId=148030828&d=1&t=3&u=1a4888a7180545048cd6f08ab4951105)
2万+

被折叠的 条评论
为什么被折叠?



