NeRF论文复现1 --- 代码运行和数据集分析

张开发
2026/4/20 8:15:23 15 分钟阅读

分享文章

NeRF论文复现1 --- 代码运行和数据集分析
NeRF是近年来神经网络发展的一大丰碑几年前第一遍看这篇论文的时候几乎马上就爱上了这个研究这个体验是很少的大部分论文看一遍要么盲目地觉得我上我也行要么直接不知道它想干嘛。不过由于走学术弯路和工作重心不在这等等原因一直也没仔细去看这一系列的工作。直到最近开始看可微渲染相关的内容才觉得这块得好好补一补。于是从旧笔记堆里又把这篇原始论文翻出来开始研究。这篇博客就是之前写的官方代码运行的记录主要介绍如何在Windows以及Linux上快速运行起Nerf的代码Pytorch版本注意官方实现用的是Tensorflow但这个Pytorch版本也被非常多人作为参考标准如果要保证100%复现可能得去看Tensorflow的版本以及数据集的简单分析。代码运行WindowsLinux大部分操作是一样的因此没有分开写差别的地方已经注明了。源码拷贝gitclone https://github.com/yenchenlin/nerf-pytorch.gitcdnerf-pytorch虚拟环境配置注意这份代码是六七年前开源的之后没改过。Ubuntuconda create-nnerf_pytorchpython3.9conda activate nerf_pytorch pipinstall-rrequirements.txt一般上面那些就行但因为年代久远的问题可能会出现兼容性错误。比如我用的是RTX4090用requiremnts里面的pytorch版本就会出问题。因此使用支持CUDA12.1的2.5.1。如果不想搞两遍也可以删掉requirements.txt的相关内容然后自己用最后一句话装一下就好这样的话numpy也可以用2.0的版本。# 老显卡一般只需要这一步就行# 降级 NumPy 到 1.x 版本。pipinstallnumpy2# 新显卡还需要这两步操作。# 卸载当前 PyTorchpip uninstall torch torchvision torchaudio# 安装支持 CUDA 12.1 的 PyTorchRTX 4090 需要pipinstalltorch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121windowsconda create-nnerf_pytorchpython3.9conda activate nerf_pytorch condainstallpytorch torchvision torchaudio pytorch-cuda11.8-cpytorch-cnvidia pipinstallimageio pipinstallimageio-ffmpeg pipinstallmatplotlib pipinstallconfigargparse pipinstalltensorboard pipinstalltqdm pipinstallopencv-python运行示例下载数据安装git和wgetLinux下不需要这一步如果没有git命令行安装一下即可Windows下运行下一步的sh文件需要git没有的话需要先安装https://git-scm.comwindows上没有wget命令因此也需要配置上去方法是1、下载wget二进制安装包地址https://eternallybored.org/misc/wget/2、解压安装包将wget.exe 拷贝到C:\xx\Git\mingw64\bin中这里的地址和git的安装位置有关数据下载在Windows下需要在sh文件所在的位置后右键选择“Git Bash Here”然后在控制台上输入Linux上直接终端cd到对应位置输入即可bashdownload_example_data.sh下载完成的数据在data文件夹中。训练神经网络完成上述操作后只需运行如下命令即可进行训练python run_nerf.py--configconfigs/lego.txt训练完后会在logs/lego_test/lego_test_spiral_100000_rgb.mp4路径下生成mp4文件这也是imageio-ffmpeg这个库的作用。整个过程需要的时间比较感人RTX 40903h左右A40009h左右如果希望保留控制台的训练过程也可以使用下面的命令python run_nerf.py--configconfigs/lego.txt21|teeoutput.log数据集分析下载下来的数据集里面有两个文件夹分别是nerf_llff_data和nerf_synthetic。文件夹中分别只有一个场景后者是由blender渲染生成的乐高积木推土机也是论文出现频次最多的一个场景nerf一次只能训练一个场景的内容因此看懂单个场景里面有什么也就知道nerf要求的数据的样子了。单场景数据结构单个场景的数据结构如下legotest不同视角的深度图、渲染图train不同视角的渲染图val不同视角的渲染图transforms_test.jsontransforms_train.jsontransforms_val.json每个json文件中分别存储相机的水平视场角以及多帧图像中的每一帧图像存放的路径和世界坐标系。虽然相机的内参没有直接在json文件中给出但Nerf使用的是理想针孔相机模型可通过水平视场角计算得到。在run_nerf.py文件的images, poses, render_poses, hwf, i_split load_blender_data(args.datadir, args.half_res, args.testskip)这个语句后面加入如下代码可以将各个图像的拍摄相机视锥进行可视化# 可以在这里使用Open3D将各个相机可视化出来# poses里面存放着相机的外参hwf存放着图像的高宽和焦距importopen3daso3d# 遍历所有的相机位姿camera_frames[]foriinrange(poses.shape[0]):# Blender transform_matrix 是相机到世界(c2w, OpenGL: X 右, Y 上, -Z 朝前)# Open3D 的 create_camera_visualization 期望 extrinsic 为世界到相机(w2c, OpenCV: Z 朝前, Y 向下)# 因此需要先取逆得到 w2c_opengl再做 OpenGL - OpenCV 轴变换 (flip y,z)w2c_openglnp.linalg.inv(poses[i])flip_yznp.eye(4)flip_yz[1,1]-1flip_yz[2,2]-1extrinsicflip_yz w2c_opengl# 构建相机内参intrinsicnp.array([[hwf[2],0,hwf[1]/2],[0,hwf[2],hwf[0]/2],[0,0,1]])cameraLineso3d.geometry.LineSet.create_camera_visualization(view_width_pxint(hwf[1]),view_height_pxint(hwf[0]),intrinsicintrinsic,extrinsicextrinsic,scale0.5)# 这里scale是相机图标的大小设置为0.5视觉效果会比较好ifiini_split[0]:# 训练集为蓝色cameraLines.paint_uniform_color((0,0,1))# Blueelifiini_split[1]:# 验证集为黄色cameraLines.paint_uniform_color((1,1,0))# Yellowelse:# 测试集为红色cameraLines.paint_uniform_color((1,0,0))# Redcamera_frames.append(cameraLines)vizualizero3d.visualization.Visualizer()vizualizer.create_window(window_nameCamera Pose,width800,height600)forcameraincamera_frames:vizualizer.add_geometry(camera)vizualizer.run()vizualizer.destroy_window()其中训练数据为蓝色验证数据为黄色而测试数据为红色。参考文章https://github.com/yenchenlin/nerf-pytorch

更多文章