Nerf-W学习记录(三)——个人数据训练

**实在时隔太久,自己也记不清了,把训练结果放出记录一下**

*基本是自己断断续续的记录,进行了一个短期摸索*

系列内容:

Nerf-W学习记录(一)——环境配置-CSDN博客

Nerf-W学习记录(二)——个人LLFF数据集制作-CSDN博客

Nerf-W学习记录(三)——个人数据训练-CSDN博客

一、参考代码

1.Nerf/Nerf-W

*遇到问题:nerf-w部分不支持进行个人数据集训练模型,只能够完成nerf-w论文复现,支持blender和phototourism数据集*

2.Nerf-W

*遇到代码问题:复现作者提供数据集与个人制作数据集都会报错no intersection,从而导致模型无法进行训练*

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项目文件
  • database.db
    colmap建模database
  • poses_bounds.npy
    LLFF数据集相关约束信息,运行LLFF pose_utils.py生成

3.遇到问题与解决

  1. 数据集拍摄图片质量
    LLFF数据集生成过程中反复出现未匹配上的图片无法生成约束文件,重新拍摄质量更好的图片,把物体摆放在图片中心且尽可能保证拍摄背景环境单一
  2. 相机模型选择PINHOLE
    最初选用SIMPLE_PINHOLE模型导致nerf-w训练过程camera.bin读取数据数组维度不匹配,缺少cx,cy等参数

三、Nerf环境配置

1.环境配置参数

2.代码修改部分

  1. 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)
  2. 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.下载:

b.文件格式

  • dense
    • images
      • 1363张jpg文件,wh不一
    • sparse
      参数
      • cameras.bin
      • images.bin
      • points3D.bin
    • stereo
      深度信息
      • depth_maps
      • depth_maps_clean_300_th_0.10
  • 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
  • nerfw分支
    • train.py
      训练数据集
      • NeRFSystem类
        • hparams
          超参定义模型配置,包括嵌入维度、学习率等
        • 射线xyz和dir
        • 初始化外观向量a和瞬态向量t
      • 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
    • 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
      评价指标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值