仅仅复现出Mip-NeRF论文所提出的实验,不包含原理的介绍。
代码链接:
hjxwhy/mipnerf_pl(仅仅进行了训练,并没有渲染出视频,训练得到的质量不错,PSNR几乎都在35左右)
bebeal/mipnerf-pytorch(训练、渲染视频、导出mesh,比较顺利)本篇文章复现的是这个项目
给出一些关于Mip-NeRF原理讲解的博客:
mip-NeRF
Mip-NeRF论文笔记
Mip-NeRF阅读笔记
目录
一、系统环境安装
二、数据集的获取
三、训练
四、渲染视频
错误一:
错误二:
五、导出mesh
报错:
解决方法:
补充:
操作系统:Ubuntu 20.04
显卡:RTX3090
使用miniconda搭建环境
注:本次复现的代码和配置环境的代码不一样,主要是我第一次在github上复现的那篇渲染不出视频,我也不晓得出现了啥子问题,有可能我没有训练完,训练了八个轮次就终止了(我看一篇综述论文上说mip-nerf训练只需要三个小时,我训练了十多个小时,感觉时间太长了),于是我另外找一个mip-nerf pytorch版的代码进行复现。
环境配置请参考:hjxwhy/mipnerf_p
# Clone the repo
git clone https://github.com/hjxwhy/mipnerf_pl.git; cd mipnerf_pl
# Create a conda environment
conda create --name mipnerf python=3.9.12; conda activate mipnerf
# Prepare pip
conda install pip; pip install --upgrade pip
# Install PyTorch
pip3 install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu113
# Install requirements
pip install -r requirements.txt
我采用的是nerf_synthetic数据集,在网上下载就可
下载链接:nerf_data(里面有很多其他的关于nerf的数据集,都可以使用建议下载到u盘备份)
如果网速卡,下载很慢的话可以评论区留言,我把数据集的百度网盘链接发给你。
下载万数据集后建议和代码放在一个文件夹中,并命名为data方便管理和输入数据地址。
配置好上述环境和数据集后就可以进行训练了,在终端输入:
python train.py
就开始进行长达十八个小时的训练了,这训t练时间和我看的论文描述的不一样啊,但是质量还是不错的,psnr也比较高,期间可以打开tensorboard进行观察变化,能看到损失和psnr的变化。
python -m tensorboard.main --logdir=log #在终端输入,即可打开tensorboard
渲染视频运用到visualize.py这个文件,只需要在终端中输入即可
python visualize.py #以从经过训练的模型中渲染视频
但是我在渲染出视频的时候出现了几个错误
TypeError: _open() got an unexpected keyword argument 'codecs'
解决方案:打开visualize.py文件,直接进行修改。只需要将代码中的codecs
参数替换为codec
,如下所示:
imageio.mimwrite(path.join(config.log_dir, "video.mp4"), rgb_frames, fps=30, quality=10, codec="hvec")
if config.visualize_depth:
imageio.mimwrite(path.join(config.log_dir, "depth.mp4"), depth_frames, fps=30, quality=10, codec="hvec")
if config.visualize_normals:
imageio.mimwrite(path.join(config.log_dir, "normals.mp4"), normal_frames, fps=30, quality=10, codec="hvec")
这个代码段中的imageio.mimwrite()
函数被用来写入视频文件。错误消息中提到了一个不期望的关键字参数codecs
,这是因为在最新版本的imageio
库中,mimwrite()
函数已经将codec
参数更改为codec
,因此使用旧的codecs
参数会导致错误。
Unknown encoder 'hvec'
Traceback (most recent call last):
File "/home/wxy/miniconda3/envs/mipnerf/lib/python3.9/site-packages/imageio_ffmpeg/_io.py", line 493, in write_frames
p.stdin.write(bb)
BrokenPipeError: [Errno 32] Broken pipe
During handling of the above exception, another exception occurred:
这个错误消息表示在使用imageio.mimwrite()
函数时,尝试使用未知的编码器hvec
,因此无法写入视频文件。此外,还发生了BrokenPipeError
异常,这可能是由于进程在写入数据时被意外中断或终止导致的。
为了解决这个问题,可以尝试使用另一个编码器,或者安装支持hvec
编码器的库/插件。hvec
编码器通常需要特殊的硬件支持,因此可能需要检查你的计算机是否支持该编码器。
另外,也可以尝试减少视频的质量和帧率,以减轻编码器的负担,从而避免BrokenPipeError
异常的发生。例如,可以将代码中的quality
参数设置为更低的值,如5
或2
。
解决方案:
imageio.mimwrite(path.join(config.log_dir, "video.mp4"), rgb_frames, fps=30, quality=5, codec="h264")
if config.visualize_depth:
imageio.mimwrite(path.join(config.log_dir, "depth.mp4"), depth_frames, fps=30, quality=5, codec="h264")
if config.visualize_normals:
imageio.mimwrite(path.join(config.log_dir, "normals.mp4"), normal_frames, fps=30, quality=5, codec="h264")
我是将"hvec"修改成"h264"并且quality由10降到5,最后渲染出来的视频效果不好。
video
导出mesh需要用到extract_mesh.py这个文件
python extract_mesh.py #render a mesh from the trained model
缺少mcubes这个包,如果直接使用 pip install mcubes来安装这个包会出现以下错误
ERROR: Could not find a version that satisfies the requirement mcubes (from versions: none)
ERROR: No matching distribution found for mcubes
pip install pymcubes
#有可能还会缺少一些包,直接安装就好
pip install PlyData
接下来就可以提取mesh了,大概十分钟后就结束,会生成一个mesh.ply文件,之后直接导入到meshlab中就可以打开mesh
可以看出这个mesh效果还是非常不错的,mip-nerf是继基线nerf后提出比较有意义的一次创新,使用锥跟踪代替标准NERF体绘制的光线跟踪。通过引入集成位置编码实现了这一点。 为了生成一个单独的像素,从摄像机的中心沿观察方向投射一个圆锥,穿过像素的中心。
=========================================================================
关于hjxwhy / mipnerf_pl
我又尝试了一下,在训练的时候打开tensorboard观察,可以看到图像和深度图,效果还是不错的,我也只训练了五个轮次,在训练的时候可以打开tensorboard模型的查看。