— order: 4 — Info参考1.github.com/awesome-NeRF/2.NeRF 系列工作个人总结3.NeRF Baking 系列工作个人总结4.新视角图像生成:讨论基于NeRF的泛化方法5.神经体绘制:NeRF及其以外方法6.NeRF大总结】基于NeRF的三维视觉年度进展报告清华大学刘烨斌1 NeRF 进一步的论文(略读)时间按 Arxiv 提交时间排序Generalization1.GRAF: Generative Radiance Fields for 3D-Aware Image Synthesis(2020.7)2.GIRAFFE: Representing Scenes as Compositional Generative Neural Feature Fields(2020.11)Multiscale1.NeRF++: Analyzing and Improving Neural Radiance Fields(2020.10)2.Mip-NeRF: A Multiscale Representation for Anti-Aliasing Neural Radiance Fields(2021.3)3.Mip-NeRF 360: Unbounded Anti-Aliased Neural Radiance Fields(2021.11)Faster Training & Inference1.NSVF: Neural Sparse Voxel Fields(2020.7)2.AutoInt: Automatic Integration for Fast Neural Volume Rendering(2020.10)3.FastNeRF: High-Fidelity Neural Rendering at 200FPS(2021.3)4.PlenOctrees for Real-time Rendering of Neural Radiance Fields(2021.3)5.KiloNeRF: Speeding up Neural Radiance Fields with Thousands of Tiny MLPs(2021.3)6.Direct Voxel Grid Optimization: Super-fast Convergence for Radiance Fields Reconstruction(2021.11)7.Plenoxels: Radiance Fields without Neural Networks(2021.11)8.InstantNGP: Instant Neural Graphics Primitives with a Multiresolution Hash Encoding(2022.1)9.TensoRF: Tensorial Radiance Fields(2022.3)10.MobileNeRF: Exploiting the Polygon Rasterization Pipeline for Efficient Neural Field Rendering on Mobile Architectures(2022.7)Representation Enhancement1.VolSDF: Volume rendering of neural implicit surfaces(2021.6)2.NeuS: Learning neural implicit surfaces by volume rendering for multi-view reconstruction(2021.6)1.1 Generalization参考1.NeRF GAN 碰撞出的火花 —— CVPR 2021 最佳论文:GIRAFFE 读起(一)2.NeRF -> GRAF -> GIRAFFE2021 CVPR Best Paper 诞生记方法总览如上GRAF 分成 Generator Discriminator 两个部分Generator 部分将相机矩阵𝑲(固定),相机 pose𝝃,采样模板𝝂和形状/外观编码𝒛𝑠𝑚/𝒛𝑎𝑛作为输入预测一个图像𝑰一个 patch𝑃其中每个 Ray 𝑲,𝝃,𝝂=((𝑢,𝑣),𝑠)三个输入决定,𝜈表示采样点的 2D 位置和步幅。每个 Ray 上采样点的方法同 NeRFConditional Radiance Field Generator 唯一可学习的部分Discriminator 对预测合成的 patch𝑃和用𝝂从真实图片采样得到真实 patch𝑃进行判断训练阶段,GRAF 使用稀疏的𝐾𝐾个像素点 2D 采样模板进行优化,损失函数如下;测试阶段,预测出目标图片的每个像素的颜色值𝑉(𝜃,𝜑)=𝔼𝒛𝑠𝑝𝑠,𝒛𝑎𝑝𝑎,𝝃𝑝𝝃,𝝂𝑝𝝂[𝑓(𝐷𝜑(𝐺𝜃(𝒛𝑠,𝒛𝑎,𝝃,𝝂)))]+𝔼𝑰𝑝𝒟,𝝂𝑝𝝂[𝑓(𝐷𝜑(Γ(𝑰,𝝂)))𝜆𝐷𝜑(Γ(𝑰,𝝂))]𝝃,𝝂,𝑰,𝒛𝑠/𝒛𝑎全都是根据分布随机采样来的说是有泛化性,但其实还是比较有限,只能对同一类物体(比如都是对汽车、椅子)进行建模,在这个基础上形状、颜色略微不同。这个泛化性一方面是 GAN 本身自带一点点,另一方面则是因为引入了 shape/appearance codepose 的采样十分让人迷惑,如何保证 Generator 对一个离谱的 pose 依然能生成合理的图片?原因可能是使用了 GAN这样尽管 Discriminator 的判别不如 NeRF 的像素级别监督来的有效直接,但迫使 Generator 学会对不同pose 生成逼真图像。反之,像素对齐很容易让错误的 pose image 对应起来但还是觉得好奇怪啊。。。虽然 GRAF 已经在 3D 的图像生成方面实现了高分辨率的可控图像生成,但 GRAF 仅限于单物体的场景,而且在更复杂的真实世界图像生成方面的表现不尽人意GIRAFFE 提出将场景表示为合成的 neural feature fields能够从背景中分离出一个或多个物体以及单个物体的形状和外观方法总览如上总体而言跟 GRAF 很类似Generator 选取图片𝐼,将相机位姿𝝃𝑁个形状/外观编码𝒛𝑖𝑠,𝒛𝑖𝑎以及仿射变换𝑻𝑖作为输入1.经过 Ray casting Point Sampling 得到以𝑗索引的光线,以𝑖索引的光线上采样点,这样的所有点云2.将其复制𝑁份,分别用仿射变换得到𝑁个想要表达的物体,送入神经网络得到 每个物体 每条射线𝑗每个采样点𝑖的隐式表征3.使用 Scene Compositions 操作将其在物体层面上整合4.接着送入体渲染公式得到 2D 特征图5.最后通过一个 2D Neural Rendering 转化成 RGB ImageDiscriminator 则是对输入图片和预测图片进行判断,没什么好说的图中橙色矩形为可学习部分,蓝色为不可学习部分仿射变换𝑻={𝒔,𝒕,𝑹}允许我们将不同物体从场景中分解出来,可以对单个物体的姿态、形状和外观进行控制。具体来说,表示放置物体的算子为𝑘(𝒙)=𝑹[[[𝑠1𝑠2𝑠3]]]𝒙+𝑡 Generative Neural Feature Fields 可以表示为(𝜎,𝒇)=𝜃(𝛾(𝑘1(𝒙)),𝛾(𝑘1(𝒅)),𝒛𝑠,𝒛𝑎)Scene Compositions场景中有𝑁1 objects1 background其仿射变换始终固定),这𝑁个实体的点云的隐式表征(𝜎𝑖𝑗,𝒇𝑖𝑗)因为仿射变换 shape/appearance code 而产生不同。这自然产生了一个问题,如何将它们组合到一起?文章给出了一个简单的算子𝐶,即 density 求平均,feature 加权平均,且保证了 backpropagation 的过程中梯度可以传播到每个实体:𝐶(𝒙,𝒅)=(((𝜎,1𝑁𝑖=1𝜎𝑖𝑁𝑖=1𝜎𝑖𝒇𝑖)))2D Neural Rendering𝜋neural𝜃,看起来比较复杂,但目的很简单训练阶段,在原始图片集合上进行,测试阶段,可以同时控制相机位姿、目标位姿和目标的形状和外观来产生 2D 图片。并且,GIRAFFE 可以合成超出训练图片中以外的物体回顾一下从 NeRF GRAF 再到 GIRAFFE 的场景表达公式(隐式表达)NeRF:𝑓𝜃:(𝛾(𝒙),𝛾(𝒅))(𝜎,𝒄)𝐿𝑥×𝐿𝑑+×3GRAF:𝑔𝜃:(𝛾(𝒙),𝛾(𝒅),𝒛𝑠,𝒛𝑎)(𝜎,𝒄)𝐿𝑥×𝐿𝑑×𝑚×𝑛+×3GRAFEE:𝜃:(𝛾(𝒙),𝛾(𝒅),𝒛𝑠,𝒛𝑎)(𝜎,𝒇)𝐿𝑥×𝐿𝑑×𝑚×𝑛+×𝑀𝑓1.2 Multiscale动机NeRF 需要沿着光线方向采样,无法处理无边界的场景NeRF MLP 提取(压缩)了场景的辐射场信息,可以想见这个场景不能太大,否则 MLP 难以学习解决方法一种想法就是类似 MegaNeRF 这样将大场景划分为一组区域,每个场景用一个 MLP network 表示另一种想法,我们希望在采样时用非线性变换考虑尺度信息最后,用 3DGS 这种可以像点云一样无限扩展的显式表示方法,就不会有 NeRF 的这个问题1.2.1 NeRF++具体来说,这篇文章首先讨论了几何-辐射模糊性 (shape-radiance ambiguity) 这一现象,并且分析了 NeRF 对于避免该现象的成功之在缺少正则化处理的情况下,本应该出现结果退化(degenerate solution)的情况,即不同的 shape 在训练时都可以得到良好的表现,但是在测试时效果会明显退化。但是 NeRF 却避免了这种情况的发生究其原因,作者提出两点(参考 NeRF++ 论文部分解读:为何 NeRF 如此强大?):1.当预测的 geometry 与真实场景相差甚远时,其 surface light field 会变得十分复杂。而正确 geometry 下对应的 surface light field一般较为 smooth (e.g. Lambertian case)网络表征高频 surface light field 的局限性迫使其学习到正确的 geometry2.NeRF 特殊的 MLP 网络结构不对称地处理着位置信息𝒙和方向信息𝒅,后者的傅里叶特征(位置编码函数中的𝐿𝒅)仅由较低频分量组成,且网络输入位置靠后。即对于一个固定的𝒙,辐射场𝑐(𝒙,𝒅)𝒅表示性有限接下来,NeRF++ 引入一种全空间非线性参数化模型,解决无界 3D 场景下 NeRF 建模问题问题:对于 360 capturesNeRF 假设整个场景可以打包到一个有界的体积中。但对于大规模场景来说,要么我们将场景的一小部分装进体积中,并对其进行详细采样,但完全无法捕捉背景元素;或者我们将整个场景放入体积中,由于有限的采样分辨率,到处都缺少细节想法是,把光线𝒓=𝒐+𝑡𝒅用半径为𝑡的球分成两部分,用不同的 NeRF不同的 MLP去计算𝐶(𝒓)=𝑡𝑡=0𝜎(𝒐+𝑡𝒅)𝒄(𝒐+𝑡𝒅,𝒅)𝑒𝑡𝑠=0𝜎(𝒐+𝑠𝒅)d𝑠d𝑡(𝑖)+𝑒𝑡𝑠=0𝜎(𝒐+𝑡𝒅)d𝑠(𝑖𝑖)𝑡=𝑡𝜎(𝒐+𝑡𝒅)𝒄(𝒐+𝑡𝒅,𝒅)𝑒𝑡𝑠=𝑡𝜎(𝒐+𝑠𝒅)d𝑠d𝑡(𝑖𝑖𝑖)(i)项和(ii)项在欧式空间中计算,(iii)在反球面空间中计算 —— 一个处在外球体的 3D (𝑥,𝑦,𝑧),𝑟=𝑥2+𝑦2+𝑧2可以重参数化为(𝑥,𝑦,𝑧,1𝑟),这个四元组中的所有数都是有界的,提高了数值稳定性(但是变换回原本空间采样频率不还是不够吗?没懂)1.2.2 Mip-NeRF参考 NeRF神经辐射场学习笔记(四)——Mip NeRF论文创新点解读NeRF必读:Mip-NeRF总结与公式推导Mip-NeRF mip CG mipmap 的那个 mip 是同一个东西,意思是放置很多东西的小空间,旨在解决 NeRF 原始方法由于远景近景的分辨率不同而出现模糊和锯齿的现象。主要创新点分为三个方面1.Mip-NeRF 的渲染过程是基于抗锯齿的圆锥体 (anti-aliased conical frustums) Cone Tracing当观察方向产生远近或者方向变化时,NeRF 基于 ray 的采样方式对此种变化不敏感,采样频率跟不上变化频率。而基于圆锥体采样的方式显示地建模了每个采样圆锥台的体积变化,从而解决了这种模糊性对于任意一个像素点,从相机中心𝒐沿着像素中心的方向𝒅投射出一个圆锥体,设在图像平面𝒐+𝒅处的圆锥面的半径为̇𝑟,位[𝑡0,𝑡1]圆锥台之间的位置𝒙的集合可以表示为(即径向和轴向分别表征)𝐹(𝒙,𝒐,𝒅,̇𝑟,𝑡0,𝑡1)=1{(𝑡0<𝒅𝑇(𝒙𝒐)𝑑2<𝑡1)(𝒅𝑇(𝒙𝒐)𝑑2𝒙𝒐>11+(̇𝑟/𝑑)2)}针对基于圆锥体采样方式,原始的位置编码表达式的积分没有封闭形式的解,不能有效地计算,故采用了多元高斯函数来近似圆锥台。因为每个圆锥台截面是圆形的,而且圆锥台轴线对称,所以给定𝒐,𝒅,高斯模型完全由3个值来表示:𝜇𝑡​(沿射线的平均距离)、𝜎𝑡(沿射线方向的方差)、𝜎𝑟(沿射线垂直方向的方差),最终的多元高斯模型为𝜇𝑡=𝑡𝜇+2𝑡𝜇𝑡2𝛿3𝑡2𝜇+𝑡2𝛿,𝜎2𝑡=𝑡2𝜇34𝑡4𝛿(12𝑡2𝜇𝑡2𝛿)15(3𝑡2𝜇+𝑡2𝛿)2,𝜎2𝑟=̇𝑟2(𝑡2𝜇4+5𝑡2𝛿124𝑡4𝛿15(3𝑡2𝜇+𝑡2𝛿))其中𝑡𝜇=𝑡0+𝑡1,𝑡𝛿=𝑡1𝑡02,我们将其转到世界坐标系中:𝜇=𝒐+𝜇𝑡𝒅,Σ=𝜎2𝑡(𝒅𝑇𝒅)+𝜎2𝑟(𝑰𝒅𝒅𝑇𝒅2)2.Mip-NeRF 提出了新的位置编码的方法 —— IPE (Integrated Positional Encoding)首先将位置编码改写为矩阵形式 (Fourier feature)𝑃=[[[1000100012000200022𝐿10002𝐿10002𝐿1]]]𝑇𝛾(𝒙)=[sin(𝑷𝒙)cos(𝑷𝒙)]IPE 为高斯分布的 positional encoding 的期望值𝛾(𝜇,Σ)=𝔼𝒙𝒩(𝑷𝜇,𝑷Σ𝑷𝑇)[𝛾(𝒙)]=[sin(𝑷𝜇)exp(12diag(𝑷Σ𝑷𝑇))cos(𝑷𝜇)exp(12diag(𝑷Σ𝑷𝑇))]有点难以理解,就把它依旧当成是一条射线,在其上𝑡𝑛𝑡𝑓之间采样许多个高斯椭球就行了,后续渲染依旧是以射线为单位IPE 的优点a.平滑地 encode 一个 volume 的大小和形状,考虑了采样点的频率(越远的点应当提供越少信息量,但 PE 编码违背了这一原则,导致走样),降低了带有锯齿 PE 特征的影响b.IPE 的高频维度收缩能够使其摆脱超参数 L 的限制3.Mip-NeRF 使用 a single multiscale MLPNeRF 使用层次抽样 —— fine coarse这在 NeRF 中是必要的,因为它的 PE 特性意味着它的 MLP 只能学习单一规模的场景模型但是 Mip-NeRF 服从高斯分布的位置编码可以自动在采样频率较低时(IPE 特征间隔较宽时)弱化高频特征,从而缓解 aliasing现象。这种采样设计本身决定了其适用于多尺度情况,因此两个 MLP 可以合并为一个缺点1.IPE 的计算较之 PE 更耗时,但单个 MLP 弥补了这一点2.Mip-NeRF 相比 NeRF 能够更有效且准确地构建 Multi-View 与目标物体的关系,但这也意味着相机 Pose 的偏差会更容易使 Mip-NeRF 产生混淆,出现更严重的失真3.同理,当拍摄过程中存在 motion blur曝光等噪声时,Mip-NeRF 也会很容易受到影响(只有当图片成像质量高且相机姿态准确时,Mip-NeRF 才能实现非常棒的效果)1.2.3 Mip-NeRF 360 Mip-NeRF 的基础上提出三个创新点1.非线性场景参数化 (non-linear scene parameterization)提出一种类似卡尔曼滤波的方式将超出一定距离的无界区域的高斯模型变换到非欧式空间中contract(𝒙)={𝒙𝒙1(21𝒙)(𝒙𝒙)𝒙>1该函数将坐标映射到半径为2(橙色)的球上,其中半径为1(蓝色)内的点不受影响。并且其设计使得从场景原点的相机投射的光线在橙色区域具有等距间隔2.在线蒸馏 (online distillation)使用一个小的 proposal MLP 和一个大的 NeRF MLP前者只预测权重𝒘(体渲染公式的那玩意儿),并用许多采样点反复重采样;后者真正预测隐式表征,只过一遍感觉就是把原始 NeRF Hierarchical Volume Sampling 分得更开更细化3.基于失真的正则项 (novel distortion-based regularizer)传统的 NeRF 经训练后表现出两种模糊现象a.floaters体积密集空间中的小而不相连的区域渲染后的结果像模糊的云一样(光线的𝑤分布是多峰的)b.background collapse远处的表面被错误地建模为靠近相机的密集内容的半透明云(光线的𝑤分布没有显著的峰)提出正则项:regularization 的作用就是拔高单峰,压制多峰(即对于光线上每个点的归一化权重,让显著的更加显著,一群不显著的就都压低)最后的损失函数考虑了 NeRF recon,蒸馏的损失函数prop,以及正则项dist1.3 Fast Train & Inference1.3.1 AutoInt提出一种自动积分框架,可以学习定积分的求解,能在精度只掉一点的情况下比原始 NeRF 10正常来说我们学习网络参数Φ𝜃去拟合𝑓(),根据微积分基本定理有Φ𝜃(𝒙)=𝜕Φ𝜃𝜕𝑥𝑖(𝒙)d𝑥𝑖=Ψ𝑖𝜃(𝒙)d𝑥𝑖那么如果我们先构建积分网络(integral network)据此构建梯度网络(grad network)对每个输入的梯度值作为学习对象,但要求其与被拟合函数对齐,那么最终积分网络的输出直接就是定积分的结果𝒃𝒂𝑓(𝒙)d𝑥𝑖=Φ𝜃(𝒃)Φ𝜃(𝒂)具体到 NeRF 里面就是把这个玩意儿用到体渲染公式上去,积分网络直接去预测最后的颜色值1.3.2 NSVFNSVF 试图从采样的角度出发解决 NeRF 渲染慢的问题体渲染需要考虑光线上的许多样本点,对于刚体而言绝大部分非表面样本点没有意义因此 NSVF 维护了一个稀疏网格用来指导光线上的样本点采样,从而跳过不必要的样本点实际上 NeRF 的运算量大的原因,一方面是不必要的样本点,另一方面则是所有样本点都要过一个大的 MLP前者被 NSVF 解决了,但后者没有,这也是后来 FastNeRF, Plenoxels, DVGO 的改进处 NSVF 提出的一些技术后续依然得到广泛应用1.Early Termination,即并不遍历完光线上所有的样本点,当 transparency𝑇衰减到一定地步时就停止遍历2.Empty Space Skipping,对于 AABB (axis-aligned bounding box) 网络,可以用另一个更高分辨率的 AABB 网络来指示哪些区域是空的,从而跳过这些区域3.网格表示和网格自剪枝 (self-pruning),在后续基于网格表示的工作中得到广泛的应用1.3.3 FastNeRF核心方法是受图形学启发的因子分解,允许1.简洁地存储空间中每个位置的 deep radiance map2.高效地用 ray 的方向查询 map 来估计渲染图像的像素值比原始 NeRF 3000倍,比其他的快一个数量级(CVPR2021 之前)问题:NeRF 一个像素的每个采样点都要调用一次神经网络为了实时效果利用了 caching用内存换时间。对空间中(𝑥,𝑦,𝑧)每一维均匀采样𝑘个值,(𝜃,𝜑)每一维采样𝑙个值并且把位置和方向分开存储,复杂度𝑂(𝑘3𝑙2)𝑂(𝑘3(1+3𝐷)+𝑙2𝐷),解决内存爆炸问题上面那个 MLP𝐹pos只和位置有关,输出𝐷(𝑢𝑖,𝑣𝑖,𝑤𝑖)向量,下面的 MLP𝐹dir只和方向有关,输出上面𝐷个向量的权重,最终两个做点乘算𝑅𝐺𝐵𝜎,输入从5维变成3+2维。为了加速也用了跳点和早停策略初看的时候很难理解在换了 pose 之后,在浮点数世界里采样新的点进行渲染,怎么可能利用得起来之前 cache 的计算结果?其实深度学习一般用的精度都不高,论文里说是 float16小数点后也就4个有效位。比如方向中的𝜃in[0,2𝜋],顶天了几万个不同值。并且论文在 Implementation 中提到对于整个 NeRF 场景过大的情况还会把整个包围盒降采样换句话说,实际上整个场景中的点和方向没那么稀疏,是可以做到稠密地离散化的。可以理解为也是体素化了,把 inference 变成 offline 的,不再需要过网络而是直接查值。查询时会进行 nearest neighbour interpolation for𝐹posand trilinear sampling for𝐹dir把输入值规整到 cache key 上去 Note这种体素化的方法在同期和后期的许多工作中得到广泛应用。这种方法的思想,在图形学中被称作烘焙” (bake, baking) —— 将颜色、法线、光照等需要大量计算的东西预先计算好,以某种形式存储起来,之后直接加载套到 NeRF 里,就是把原本需要经过大 MLP 的结果提前算好然后固定到体素网格、八叉树、哈希表等,接下来介绍的许多工作都是沿着这个思路展开1.3.4 PlenOctrees三个创新点修改 NeRF radiance field 部分使之基于球谐函数实现(MLP 预测对应球谐函数的系数),称之为 NeRF-SH一方面可能更符合物理,另一方面学习任务变为预测系数,相对简单且更快提出 sparsity prior起到的作用类似于 weight decay其中𝜆是超参,𝐾是空间中采样点的数量𝐿sparsity=1𝐾𝐾𝑖=1|1exp(𝜆𝜎𝑘)|将训练好的 NeRF-SH 网络提取成体素网格,然后压缩到基于八叉树的结构中(对辐射场进行预计算,避免渲染时进行网络推理,即空间换时间,随后用 Octree 节省存储空间)1.Evalution把包围盒均匀划分成网格,然后预测这些网格点的𝜎。这个网格能够 auto scale 到适应场景的大小(通过调整包围盒大小使所有网格点的𝜎都大于一个阈值𝜏𝑎2.Filtering对每个网格点,计算它在所有训练视图渲染的𝑤最大值,然后利用阈值𝜏𝑤过滤掉未被占用的点(它在任何一个视角下都是内部点)。以剩下的每个点为体素中心,作为叶节点来构建体素网格的八叉树(每个叶节点要么是体素要么是空节点)3.Sampling对于固定下来的叶节点体素,内部随机采 256 个点预测其𝜎和球谐函数系数更新该体素的值(反走样)并且可以进行微调 (tree structure fixed, finetune values to optimize)优缺点1.这样构建一个八叉树大概要用15min但是后续就不用再过网络而是直接查八叉树的值,推理速度快得多2.渲染结果上看跟原始 NeRF 其实差不太多甚至好一点3.但它最大的缺点在于空间占用太大,一个物体就需要接近 2G 的存储(尽管已经使用八叉树来减少了)1.3.5 KiloNeRFIdea 非常直观,把空间体素化,每个体素用不同 tiny MLP使用三阶段策略:1.训练一个原生 NeRF2.将原生 NeRF MLP 预测结果逐点蒸馏到 tiny MLP 3.fine-tune tiny MLP为了加速也用了跳点和早停策略评价Idea 直观,主要是代码实现有挑战性,作者用 CUDA 实现了一个 GEMM 使得不同样本点通过 tiny MLP 并行计算显著降低运算量并加渲染约数千倍相比于其他方法,其灵活性相对较差,不太好转换也不好部署1.3.6 Plenoxels PlenOctrees 是同一个作者作者发现 Baking 的主要作用反而不是 Raidance 部分的固定,而是 Geometry 部分的固定(PlenOctree fine-tune 不改变八叉树结构)而且我个人觉得这种训练完再 baking 的思路不那么端到端。那么能不能在训练的过程中就以 Baking 的表征进行训练呢?Plenoxels就是这样的尝试八叉树并不是一个适合进行形状优化的表征,所以 baking 表征又回到了稀疏体素网格上Plenoxel 是完全的 explicit 方法,没有用到任何 MLP为场景构建体素网格。遵守 Coarse to Fine 的原则,后续训练到一定阶段时,对网格进行上采样(一分八,分辨率从25635123插值出的网格参数用三线性插值得到);同时会对网格根据𝑤或者𝜎进行剪枝,仅关注非空网格只用网格顶点来存参数(沿用 PlenOctree 中用到的𝜎和球谐函数系数)。要渲染一条光线,只需要在光线上采点并根据样本点的位置进行三线性插值(比较 PlenOctree 是查询八叉树得到样本点所在网格的值)从而得到样本点的参数,最后在进行体渲染积分即可直接用顶点参数进行学习,但有个问题是相邻网格之间的参数是独立的(不像神经网络那样连续),导致失真想象一下,我某部分网格参数调整得比较好来满足训练视角的渲染,而一些网格随便糊弄一下。很自然的,可以想到添加相邻顶点之间的正则化项对此 Plenoxel 提出了相应的 smooth prior通过计算 TV loss 来使相邻网格的值变得平滑TV=1|𝒱|𝒗𝒱,𝑑𝒟Δ2𝑥(𝒗,𝑑)+Δ2𝑦(𝒗,𝑑)+Δ2𝑧(𝒗,𝑑)Plenoxel 也处理了 Unbound Scene 的情况,方法和 NeRF++ 较为相似,用 sparse grid 处理内部情况;用多层球壳(Multi-SphereImages)处理外部情况,不同层之间可以进行插值(外部的球壳不再是 view-dependent 的了,而是类似贴图)评价:在实际使用中 Plenoxel 可能并不是很好用。一方面,完全 explicit 方法不是那么即插即用,不好融合到别的方法;另一方面,explicit 设计很容易陷入局部最优解(网格顶点间的特征相对孤立),产生撕裂效果的失真(论文里用的是合成的数据,噪声比较少,但在真实场景下就不是这样了)。与之相比,大家还是更倾向于 Hybrid 方案,用离散的特征存储结合小型 MLP 的方式,实现存储、速度、效果的权衡1.3.7 DVGODVGO 应该是第一篇 hybrid NeRF 的工作,只是时运不济,被 InstantNGP 盖过了风头DVGO 的主要贡献1.用网格存取特征取代了 Encoding InstantNGP hash encoding 是一个性质的,具体分析见下文)2.三线性插值后过一个 SoftPlus网格顶点的值可以学的更广,增强了网格拟合高频信号的能力3.分了两个阶段训练 Coarse geometry searching 学出大概的 coarse density grid𝑉(density)(𝜎) coarse color grid𝑉(rgb)(𝑐),一方面用来加大采样密度,另一方面做跳点加速(剪枝无效空间)然后进行上采样 + 微调,对颜色的预测引入一个 MLP结合了网格学习的特征和神经网络学习 (hybrid)一句话概括:通过体素网格低密度初始化、插值后激活等训练策略直接优化体素表达的 NeRF 密度场与颜色特征场,实现分钟级别的训练收敛1.3.8 InstantNGPInstant NGP 同样使用了体素网络,这并不是创新。但是它用哈希表这一数据结构来加速查找,并使用多分辨率混合来得到以往Coarse-to-Fine 的效果。更重要的是,它这一整套方法的 CUDA 配套代码工程价值极高,这才有了它极快的速度(但其实几秒出图也只是能粗看的状态,更多是个噱头,实际优化到论文中的指标还是需要几分钟的时间,但已经比原始方法快非常非常多),奠定了它的巨大名气,直接盖过了 Plenoxel DVGO 的风头我们可以比较一下到此为止 encoding 的演变1.NeRF Mip-NeRF 分别使用了 PE IPE它们没有可供学习的参数,只是引入了高频信息和尺度信息2.稠密参数编码:一些使用 grid 的方法引入了 Baking 的思想,通过查询和插值大大加快了渲染速度;并且参数可学习提高了表达能力。坏处是,稠密参数编码的空间占用是立方级别(只有2.5%的区域是有效的表面),并且有时展现出过于平滑的学习,总的来说太浪费资源3.稀疏参数编码:于是一些方法提出 Coarse-to-Fine 的训练(但可能由于定期更新稀疏数据结构而使训练复杂度增加),一些方法提 Octree sparse grid但其剪枝或多或少要求表面信息而影响方法适用性 Instant NGP 采用 hash table本质上来说也是一种可学习的参数编码,跟 grid 没太大区别,只是查询得更快。但通过引入这一数据结构,我们可以很方便地使用𝑇来控制参数数量,同时多个哈希表实现 muitiscale 也更自然。另外,hash table 相比 treestructure 更加 cache 友好引用一个解读回到我一开始对 NeRF Position Encoding 的解读,我认为 Positional Encoding 是对欧式空间的三个轴分别引入了一组正交基函数,MLP 则用来预测这些个基函数的系数。我觉得这一套观点可以套进 Instant-NGP 或者下面会说到的 DVGO 这些个Hybrid 方法中,它们网格存储的值可以视作是某种基函数在该点的离散采样。高分辨率等同于高采样率,这也就意味着高分辨率的网格可以存取高频基函数的离散点采样结果,相对的低分辨率的网格则存取低频基函数的离散点采样结果。只是相比于给定的一组正交基函数,这些个网格对应的基基本不会是正交的,但确实可以学习可以优化的,这就意味着 MLP 的学习负担被更进一步地降低,整个收敛过程也会更快。Multi-Resolution 最重要的一点在于引入了合适的归纳偏置 (inductive bias) 来使得不同分辨率的网格能够捕获到相应频率的信息下面看一下 InstantNGP 的具体做法整体流程和 NeRF 依旧类似,但是位置信息采用 hash table 编码(方向信息依旧是 PE),预测密度特征的 MLP 变小。两个 MLP hash table 都会在训练过程中优化1.按照多种分辨率将空间划分成网格(图示为二维情况,方便理解),每个网格顶点都有其量化的坐标2.构建并初始化𝑀个大小均为𝑇 hash table每个表代表一种分辨率,其中每个顶点保存的特征编码维度为𝐹。构建 hashfunction从而建立每个网格顶点坐标到 hash table 的索引3.对于输入的点𝒙,在每个分辨率下找到他最近的8网格顶点,利用 hash function 取出对应的值;利用三线性插值得到该点的特征编码,将每个分辨率下的特征 concate 起来,随后送入 MLPMulti-resolution我们通过超参𝑇去控制 hash table 的大小,为了达到良好的效果,这个值往往设置得比最大分辨率网格要小很多,但比最小分辨率要大(e.g.163<643<5123),显然高分辨率下会发生 hash collision我们知道网格中绝大部分区域(非表面)是无效的,如果是无效区域的网格顶点和物体表面附近的网格顶点发生了冲突,通过梯度反传,hash table 中的值自然会更加关注物体表面区域的密度值。换句话说,通过 MLP 的注意力自适应地实现了剪枝(或者说,素压缩1.3.9 TensoRF使用张量分解技术,将 4D 张量分解成多个低秩的张量分量,以小见大。论文中使用了 CP 分解和 VM 分解,当然也可以尝试使用其他的张量分解方式本质上是把体素网格分解为低维平面网格表达,空间占用从立方级降为平方级不细看了,类似思路的还有:EG3D(Efficient Geometry-aware 3D Generative Adversarial Networks, CVPR 2022), MeRF(Memory-Efficient Radiance Fields for Real-time View Synthesis in Unbounded Scenes, SIGGRAPH 2023) 1.3.10 MobileNeRF假如我们设计了这样一种 NeRF1.每条射线上的采样点位置和个数(且远少于原始 NeRF是已知的2.每个采样点的位置特征向量是预先存储好的 (grid, bake)仅执行 NeRF MLP 最后那一小部分(称作 Decoder的推理3.对于当前待渲染画面的每个像素,上述的计算是通过图形渲染 pipeline GPU 上并行的那么这种新 NeRF相比原始 NeRF显然会大幅降低计算量。MobileNeRF 就是这样的设计,以至于可以在移动设备上实时运行为了实现上述过程,作者将训练分为三个阶段:1.初始化一个 grid mesh基于可微渲染思想,学习场景的几何结构,以及透明度𝛼连续的 Radius Field初始化一个三维 grid mesh先生成 voxel grid每个 grid 中设置一个点,作为顶点 vertice每相邻的 4 个连接组成 mesh face整个 mesh 被称为 grid mesh),初始化三个 MLP分别预测透明度𝛼、空间特征向量𝑓𝑘(即 NeRF Encoder)、颜色𝑐(即 NeRFDecoder根据相机位姿以及像素坐标,计算射线,射线与 grid mesh 的交点作为采样点(不是原始 NeRF 的随机采样了),颜色加权融合计算lossMobileNeRF 采用了可微渲染的思想,把 vertice 位置作为可训练参数,用 loss 推动顶点位置变化,同时用正则化限制每个顶点的活动范围在格子内借鉴 InstantNGP创建了另一个𝑃×𝑃×𝑃×1 grid mesh用于排除无关区域,加速训练引入 sparsity loss smooth loss1.𝛼二值化因为在渲染引擎里,处理半透明的 mesh比完全透明或安全不透明的要更耗时,因此需要将透明度进行二值化,同时继续训练参数为了让训练更稳定,在第二阶段训练过程中,既渲染合成透明度二值化时的最终图像̂𝐶(𝑟),又渲染合成透明度连续时的图像𝐶(𝑟),二者 loss 相加回传最后当 loss 快收敛时,冻结其它参数,只 finetune,2. grid mesh 进行剪枝操作,保存为 OBJ以及烘培特征向量为纹理图像 Texture保存 Decoder 的网络权重将训练图像完全无法看到 face 删除(95%以上的 grid 都被删除),然后保存为 OBJ给每个 face四边形)分配一个分辨率为𝐾×𝐾的纹理区域(texture patch)因为 face 的顶点坐标已知,容易计算 texturepatch 上每个像素对应的空间坐标,获得相应的特征值。这样就完成了 bake 特征纹理的工作(即 Encoder 的输出)后面的部分就比较简单了,主要创新点在于这里的各种优化和想到把 Decoder 塞到 shader 里面从而利用传统图形学 pipeline 的已有技术优点:1.第一次实现了移动设备上的实时神经渲染2.通过引入 OBJ, texture 以及 neural shader使得很多传统图形优化技术,可以直接使用。例如对大型场景的 LOD九宫格加载等缺点:1.仅通过一个采样点来代表整条光线路径,当需要表现出半透明或者高光等复杂光学现象时,需要较高的模型精度以及准确的材质模型,mobileNeRF 并不擅长解决后两者2.通过固定分辨率的网格学习表达整个空间,会导致两个问题:细节分辨率不够;大块平坦区域的 mesh 过于碎片化,顶点数过多3.为了降低最终的 obj 顶点数量,在第三个阶段删除了对于训练图像完全不可见的 face这要求采集训练图像时覆盖几乎所有渲染阶段需要的相机角度,否则会在渲染画面中出现大量的空洞。另外,这种删除策略也会损失模型的泛化能力,表现是在相邻相机角度切换时,出现画面突变4.推理快但训练慢,8 A100训练24小时左右1.3.11 IBRNet & MVSNeRF利用 MVS 的方法降低训练迭代次数IBRNet 将图像特征输入神经网络直接预测每个空间点的颜色和密度IBRNet: Learning Multi-View Image-Based RenderingRGB: 采样点投影到各输入视角,然后用神经网络预测最后的 RGB 值(其实可以直接拿像素值颜色的平均,但神经网络往往能学出更好的结果)𝛼: 采样点投影到各输入视角,比较它们像素值的方差,如果比较小,就认为这里确实有个点,𝛼给大1.4 Representation Enhancement动机NeRF 的重建几何质量较低,尤其是在表面容易产生粗糙凹凸面另外,它在弱纹理区域难以重建(老大难问题了)几何重建质量低动机1.基于 Surface Rendering 的方法仅关注其与表面的交点部分,而基于 Volume Rendering 的方法的样本是光线上的很多采样点,所以后者能够更合理和全面地对隐式场进行监督换句话说,基于 Volume Rendering 能够使这个变形更深入,因为它能够在当前表面的远处也产生监督,而 SurfaceRendering 与之相比则容易陷入到当前表面附近的局部最优解2. NeRF 这种隐式表示也有其困难,因为我们最终的目的一般还是渲染刚体,从中提取高质量的表面是困难的,因为在表示中没有足够的表面约束(NeRF 本质上还是基于的表达,在上没有足够的约束,实际上跟上一点是 trade-off3.隐式曲面场具有表示几何的优越性,但难以通过 NeRF 光线步进的方法渲染训练;若使用朴素方法将隐式曲面函数转换为密度函数,光线积分所估计的表面位置会略近于真实表面比如,VolSDF (Volume rendering of neural implicit surfaces, NeurIPS 2021), NeuS (Learning neural implicit surfaces by volumerendering for multi-view reconstruction, NeurIPS 2021) SDF 指导采样点的生成,数学公式推导比较多,不细看了弱纹理区域的重建MonoSDF: 使用 Monocular depth and normal 作为约束1.5 Lighting动机互联网图片存在光照不一致的情况更进一步,同一个场景随时间不同纹理图案的变化(比如涂鸦、墙纸)等,也可以视为某种程度的光照NeRF in the Wild: Neural Radiance Fields for Unconstrained Photo Collections非常暴力,在 NeRF 输入中加入可学习的外观编码,以建模外观变化在此基础上可以改变光照1.6 Video原始的 NeRF 从静态场景进行学习,无法建模动态场景动态街景建模Street Gaussians for Modeling Dynamic Urban Scenes对场景进行解耦表示,对每个运动物体重建一个辐射场(用 3DGS 建模)对每个物体单独重建的另一个好处是,编辑变得很方便,比如换个车、改轨迹等任意动态场景建模动态场景中的物体移动导致无法进行多视图匹配Deformable NeRF将动态场景建模为一个 canonical NeRF 和一个 deformation field当然,这样建模出来的运动不能太大,不然 deformation 优化不出来动态人体建模Neural Body4K4D