Exploring NeRF: My Journey Through Research and Code
Taichi 社区分享会 2023.4.26
如何阅读一篇论文
Part 1
对于像我一样的入门学习者,提供一些我学习过程中的经验
在读论文之前,先梳理一个框架出来,大致包括以下内容:
What: 这篇论文主要做的工作是什么,基于什么背景
How:
这篇论文具体是怎么做的,一般都会有以下部分
- Pipeline
- Cutting-edge 的方法
- Tricks & Optimizations
Results:
这篇论文最后的结果如何,如何衡量效果
- Experiments & Metrics & Demo
- Benchmarks 的适用范围
可以用笔记或者思维导图的形式先梳理一个这样的 backbone,之后在阅读论文的过程中一点一点填进去
我们以 NeRF 为例来使用一下这个框架
- What:
通过稀疏的输入视图优化底层的的连续神经辐射场,实现复杂场景的新视角合成 - How:
- Pipeline
- Cutting-edge 的方法 : 可微的隐式场景表示
- Tricks & Optimizations
- 位置编码 (Positional encoding)
- 分层采样 (Hierarchical volume sampling)
- Results:
- PSNR/SSIM/LPIPS/Demo(novel view)
- Benchmarks 的适用范围: llff/blender/deepvoxels/LINEMOD
Part 2
关注论文中的图,论文中的图可以最直观的反映论文里提到的内容
Part 3
关注论文中的公式,这有助于更好地理解算法原理,对于阅读源码也会有所帮助,建议自己手推一遍论文中的公式,相关参考资料可以从论文 reference 中收集
在 NeRF 的论文中,涉及到了以下几个公式
- 透射率
- 颜色积分
- 分段体积渲染
- NDC 坐标系转换
公式推导可以参考笔记 ➡️ NeRF 公式推导
借助工具
以下工具可以帮助我们更高效地读取论文,非常值得尝试
ChatPDF: Chat with any PDF
ChatGPT Academic : 科研工作专用 ChatGPT/GLM 拓展
New Bing: 选择 Edge 浏览器为 PDF 文件打开方式,可以直接在页面上与 Bing chat 交互
如何学习代码——以NeRF为例
挑选合适的资源
NeRF 的代码实现有很多方式,可以从中选取比较熟悉的实现方式
- 官方的 TensorFlow 实现
- Pytorch 实现
- Read NeRF Pytorch : 带注释版本的 nerf-pytorch
- Taichi + PyTorch : Taichi + Pytorch 实现
建议学习 Pytorch 相关的实现方式,Pytorch 是现在更加主流的框架
如何学习源码
推荐用模块化的方式来学习源码,边看源码的结构边整理框架
CV/DL 相关的论文源码一般都会包括以下几部分
- Datasets
- Networks
- Evaluators
- Trainers
- Visualizers(optional)
对于 NeRF 而言,还会多一个模块 : Renderer
读代码的过程中,也可以多做一些事情
- 顺手记录一下用到的参数,方便之后复现
- 对比论文中的一些算法和细节,弄清楚如何用代码实现的
(position encoding/volume rendering etc.)
动手实践
一种比较高效的学习源码方式是看代码的同时自己跟着写,慢慢地完善代码的各个部分,最后完全实现
这个过程也有很多需要注意的地方 :
- 自己写很难有和原作者不同的思路和框架,容易变成 C-c + C-v,因此推荐按照之前提到的框架来写
- 按照模块化的方式来检验自己写的代码能不能 work,一次性 debug 整个框架会很困难,debug 的过程很
痛苦快乐 - 学习了源码的实现方式后,提取实现过程中的重点思想和方法,然后尝试不看源码来实现自己的代码
如何复现 NeRF
数据集准备
Pipeline
- 用手机拍摄一段目标物体的多视角视频
- 用 ffmpeg 对视频抽帧得到目标物体的多视角图像
- 借助 Colmap 标定,获得相机的内参和外参
- 整理数据格式,生成 NeRF 对应的数据集 ( 推荐使用 Blender 格式 )
数据集格式
.
├── train
│ ├── r_0.png
│ ├── r_1.png
│ └── ...
├── ...
└── transforms_train.json
训练模型
数据集准备完,在之前自己实现的框架上训练模型,为了检验代码是否能 work,可以在训练的过程中关注一些量化的数据,借助 TensorBoard 我们可以可视化训练过程
Eval 结果
模型训练完之后,可以保存模型做 evaluate,通过 novel view 和 metrics 来检验训练结果 (200k iterations)
一些 Tips
关于自己制作数据集,需要注意以下几点
- 拍摄场景的光照条件尽可能保持一致
- 尽量保持多视角物体在图像中的相对位置不变
- 为了获得更精确的相机内参,可以在用 COLMAP 的时候选择共享内参
- 多视角图像的数量保持在 50-100 张比较合适
训练过程中模型调参
- 先根据论文中的参数复现,遇到问题再检查各个模块
- 由于拍摄场景的不同,需要调整 scene 的 near 和 far 参数 ( 原先 NeRF 中使用的是 2.0 和 6.0 )
- 关注训练过程中 loss 的变化,如果有问题的化可以考虑简化训练过程,只用 coarse model 进行训练,查看结果是否有问题,没问题再加上 fine model
- …