Exploring NeRF-My Journey Through Research and Code


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 的代码实现有很多方式,可以从中选取比较熟悉的实现方式

建议学习 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

文章作者: Immortalqx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Immortalqx !
评论