测试设备:Windows 11 专业版
显卡型号:NVIDIA 3050
显存:4G
CPU型号: Intel 12th Gen i5-12450H
内存:16G
测试代码:https://github.com/xunull/read-nerf-pytorch
测试数据集描述:自建数据集,原始图像大小:1280 px X 720 px,测试过程中使用下采样数据集,下采样2x之后的图像大小为:640px X 360px。数据集中一共包含:113张图片。使用colmap进行位姿恢复。数据格式为:LLFF。
参数设置:
#实验名称和数据集位置
expname = xxx_test
basedir = ./logs
datadir = ./data/llff/test
dataset_type = llff
# 下采样倍数
factor = 2
llffhold = 2
#批量大小1024根光线
N_rand = 1024
N_samples = 64
N_importance = 64
use_viewdirs = True
raw_noise_std = 1e0
spherify = True
render_only = True
1、训练过程:
(1)数据准备过程
(2)主循环(20000次迭代,每一次迭代是一个批量的数据)
3、结论分析:
在数据准备的过程中,将数据集重构最花费时间,将图像数据构建为[(N-3)*H*W, ro+rd+rgb, 3],所需要的时间最多。
然而在训练过程中,最花费时间的是主循环的内容,主循环包括了:获取数据、前向推理和反向传播三个环节。在评估推理时间时,我们将保存模型、测试视频和测试图片的时间出去。当每完成一个批次的训练,将会花费1.3秒钟左右,其中模型前向推理的时间最多,占比81%。如果主循环轮次为20000轮,则可估计出在该电脑配置上,将需要7.2小时完成训练。
在测试过程中,每一个的相机位姿需要10.67秒推理一张图片,所以完成120个相机位姿的计算总共需要花费21.2分钟。经排查,测试过程中最花费时间的仍然是前向推理过程,训练过程中一个批次只有1024条光线参与推理,形状为:[1024, 11]。但是在测试的时候,一张图像存在640*360个像素,所以,输入的数据的形状是:[230400, 11]。输入的数据量更大,自然需要更多的时间。
关于NeRF神经网络的速度优化可以从以下几方面进行优化:
(1)利用instant-ngp、3D高斯等技术加速训练过程。
(2)利用神经网络压缩技术对网络结构进行优化
(3)可以考虑利用maching cubes技术将隐式模型,转换为mesh、点云、obj等格式。可直接获得整体模型,但可能会导致模型精度变差。
(4)不使用colmap生成位姿,由slam直接获取位姿。