Nerf是什么?
NeRF全名Representing Scenes as Neural Radiance Fields for View Synthesis,其本质是将深度学习与传统物理建模进行结合,从而在2020年的View Synthesis任务上取得了SOTA效果。这个View Synthesis任务具体来说,就是给定一个目标以及环绕在其周围不同拍摄点对目标所拍摄的2D照片,然后通过这些2D照片来补全目标周围每一个拍摄点的2D照片,本质上是一个3D的渲染任务。
如下图所示,左边是喂入模型的监督信息,而右边则是通过NeRF生成的View Synthesis。

Nerf的相关解说
https://www.bilibili.com/video/BV1KQ4y1Y7pg/?spm_id_from=333.788.recommend_more_video.-1
https://www.bilibili.com/video/BV1ZY411a7XA/?spm_id_from=333.788.recommend_more_video.-1
https://www.bilibili.com/video/BV1a44y1V7KR/?spm_id_from=333.788.recommend_more_video.3&vd_source=c6a5df6f9965d2232441093678afd2fe
这些都是b站上的视频,第一个链接简单明了地说明了NeRF在做什么,第二个视频则是关于https://github.com/kwea123/nerf_pl 库如何使用colab进行NeRF的训练,第三个视频则是围绕着https://github.com/kwea123/nerf_pl代码库进行一系列NeRF的讲解,我认为看完这三个视频能够对NeRF做了什么?有什么改进?代码大致如何实现?有一个初步的认识。
Nerf的架构
ru'x如下图所示,NeRF首先将归一化的世界坐标输入到MLP中,来预测某一位置是否有物体遮挡,然后补充上一系列相机视角的内参和外参,再次喂入到一个MLP中,来预测对应点的RGB值,最终与用户输出的2D真实标签对齐,并计算损失来更新模型

事实上,作者提出了两个创新点,分别是:
-
NeRF函数的输入为位置和角度信息,作者发现直接将位置和角度作为网络的输入得到的结果是相对模糊的。而用positon encoding 的方式将位置信息映射到高频则能有效提升清晰度效果。具体而言,这里采用的是与Transformer 中类似的正余弦周期函数的形式。我的理解是,采用position encoding 能够使得网络更容易的理解并建模位置信息。
-
NeRF的渲染过程计算量很大,每条射线都要采样很多点。但实际上,一条射线上的大部分区域都是空区域,或者是被遮挡的区域,对最终的颜色没有啥贡献。因此,作者采用了一种“coarse to fine" 的形式,同时优化coarse 网络和fine 网络。这一部分也非常有趣。首先对于coarse 网络,我们可以采样较为稀疏的N_c个点,并通过一系列归一化操作来得到对应射线上的PDF函数,再根据这个PDF函数继续采样N_f个点,然后用N_c+N_f个点一同渲染对应的目标。
可以借鉴的pytorch代码库
可以借鉴的代码库有两个,分别是基于原始pytorch实现以及基于pytorch-lightning框架实现的:
- https://github.com/yenchenlin/nerf-pytorch
- https://github.com/kwea123/nerf_pl/tree/b7e44f661b9c391cf10760bf19b9243c019cfbe8
在我看来第二个是更好的,因为第二个基于pytorch-lightning框架实现事实上和libai非常类似,因为他们都把框架常用代码和NeRF核心代码分离了开来,这使得我们借鉴起来有着一定的便捷性,具体如下:
-
第二个仓库的代码有着详细的注释,同时b站上有多个视频对第二个仓库的代码实现进行了讲解,这是便于我们理解的,而这一系列优势第一个仓库是没有的,但也不意味着第一个仓库不能提供借鉴,第一个仓库将所有代码基本集成到了一个文件中https://github.com/yenchenlin/nerf-pytorch/blob/master/run_nerf.py,因此也能够从另一方面提供理解。

-
第二个仓库有许多demo和colab的演示,相比于第一个仓库更具备集成框架的特性,我们也能从其中进行借鉴。
-
第二个仓库的NeRF核心代码在https://github.com/kwea123/nerf_pl/tree/b7e44f661b9c391cf10760bf19b9243c019cfbe8/models,第一个仓库的核心代码在https://github.com/yenchenlin/nerf-pytorch/blob/master/run_nerf.py,要完成复现我们需要实现对应的四个数据集。
复现难点
- NeRF与我的领域不太相关,一些涉及到图形学,3D学的知识需要进行学习。
- 一些算子oneflow可能存在问题,例如torch.cumsum这个,因为我上次在算子兼容那里看到了这个flow.cumsum似乎存在问题,但其他一些例如flow.sort,flow.repeat_interleave,flow.cumprod这些比较少用的算子我发现是都存在的,所以问题应该不大。
- 一些和torch相关的库可能没有,例如 torchsearchsorted 中。
- 这个项目资源消耗巨大,根据第二个库的描述,在pytorch-lightning库的优化下,他们完成合成数据集的多卡训练需要1小时。
Nerf是什么?
NeRF全名Representing Scenes as Neural Radiance Fields for View Synthesis,其本质是将深度学习与传统物理建模进行结合,从而在2020年的View Synthesis任务上取得了SOTA效果。这个View Synthesis任务具体来说,就是给定一个目标以及环绕在其周围不同拍摄点对目标所拍摄的2D照片,然后通过这些2D照片来补全目标周围每一个拍摄点的2D照片,本质上是一个3D的渲染任务。
如下图所示,左边是喂入模型的监督信息,而右边则是通过NeRF生成的View Synthesis。

Nerf的相关解说
https://www.bilibili.com/video/BV1KQ4y1Y7pg/?spm_id_from=333.788.recommend_more_video.-1
https://www.bilibili.com/video/BV1ZY411a7XA/?spm_id_from=333.788.recommend_more_video.-1
https://www.bilibili.com/video/BV1a44y1V7KR/?spm_id_from=333.788.recommend_more_video.3&vd_source=c6a5df6f9965d2232441093678afd2fe
这些都是b站上的视频,第一个链接简单明了地说明了NeRF在做什么,第二个视频则是关于https://github.com/kwea123/nerf_pl 库如何使用colab进行NeRF的训练,第三个视频则是围绕着https://github.com/kwea123/nerf_pl代码库进行一系列NeRF的讲解,我认为看完这三个视频能够对NeRF做了什么?有什么改进?代码大致如何实现?有一个初步的认识。
Nerf的架构
ru'x如下图所示,NeRF首先将归一化的世界坐标输入到MLP中,来预测某一位置是否有物体遮挡,然后补充上一系列相机视角的内参和外参,再次喂入到一个MLP中,来预测对应点的RGB值,最终与用户输出的2D真实标签对齐,并计算损失来更新模型
事实上,作者提出了两个创新点,分别是:
NeRF函数的输入为位置和角度信息,作者发现直接将位置和角度作为网络的输入得到的结果是相对模糊的。而用positon encoding 的方式将位置信息映射到高频则能有效提升清晰度效果。具体而言,这里采用的是与Transformer 中类似的正余弦周期函数的形式。我的理解是,采用position encoding 能够使得网络更容易的理解并建模位置信息。
NeRF的渲染过程计算量很大,每条射线都要采样很多点。但实际上,一条射线上的大部分区域都是空区域,或者是被遮挡的区域,对最终的颜色没有啥贡献。因此,作者采用了一种“coarse to fine" 的形式,同时优化coarse 网络和fine 网络。这一部分也非常有趣。首先对于coarse 网络,我们可以采样较为稀疏的N_c个点,并通过一系列归一化操作来得到对应射线上的PDF函数,再根据这个PDF函数继续采样N_f个点,然后用N_c+N_f个点一同渲染对应的目标。
可以借鉴的pytorch代码库
可以借鉴的代码库有两个,分别是基于原始pytorch实现以及基于pytorch-lightning框架实现的:
在我看来第二个是更好的,因为第二个基于pytorch-lightning框架实现事实上和libai非常类似,因为他们都把框架常用代码和NeRF核心代码分离了开来,这使得我们借鉴起来有着一定的便捷性,具体如下:
第二个仓库的代码有着详细的注释,同时b站上有多个视频对第二个仓库的代码实现进行了讲解,这是便于我们理解的,而这一系列优势第一个仓库是没有的,但也不意味着第一个仓库不能提供借鉴,第一个仓库将所有代码基本集成到了一个文件中https://github.com/yenchenlin/nerf-pytorch/blob/master/run_nerf.py,因此也能够从另一方面提供理解。

第二个仓库有许多demo和colab的演示,相比于第一个仓库更具备集成框架的特性,我们也能从其中进行借鉴。
第二个仓库的NeRF核心代码在https://github.com/kwea123/nerf_pl/tree/b7e44f661b9c391cf10760bf19b9243c019cfbe8/models,第一个仓库的核心代码在https://github.com/yenchenlin/nerf-pytorch/blob/master/run_nerf.py,要完成复现我们需要实现对应的四个数据集。
复现难点