新智元报道

  编辑:LRS

  最近谷歌发布了全新的 MobileNeRF 模型,直接将神经辐射场拉入移动时代,内存需求仅为1/6,渲染 3D 模型速度提升 10 倍,手机、浏览器都能用!

  2020 年,神经辐射场(NeRF)横空出世,只需几张 2D 的静态图像,即可合成出该模型的 3D 场景表示,从此改变了 3D 模型合成的技术格局。

  NeRF 以一个多层感知器(MLP)来学习表示场景,评估一个 5D 隐式函数来估计从任何方向、任何位置发出的密度和辐射,可在体渲染(volumic rendering)框架下用于生成新图像。

  NeRF 经过最小化多视图色彩一致性的损失的优化后,相比传统的生成方式,对于新视图能够保留更好的图像细节。

  但目前主流的 NeRF 实现方式仍然存在弊端,即需要专门的渲染算法,而这些算法与当下常见的硬件并不匹配。

  传统的 NeRF 实现使用体积渲染算法,用于在光线沿线的数百个采样位置为每个像素都运行一次大规模 MLP,以便估计和密度和辐射度。这种渲染过程对于交互式的可视化来说太慢了,没法用于实时渲染。

  最近有研究将 NeRF 烘焙(baking)到稀疏的 3D voxel grid 中来解决这个问题,比如 SNeRG 中的每个激活的 voxel 包含不透明度、漫反射颜色和学习的特征向量。

  从 SNeRG 绘制图像分为两个阶段:第一阶段使用光线行进来累积沿每条光线的预计算漫反射颜色和特征向量,第二阶段使用对累积特征向量进行操作的轻型 MLP 来产生与视图相关的残差,该残差添加到 ac 累积漫反射颜色,这种预计算和延迟渲染方法将 NeRF 的渲染速度提高了三个数量级。

  但 SNeRG 仍然依靠光线在稀疏体素网格中行进来生成每个像素的特征,因此无法充分利用 GPU 的并行性。

  此外,SNeRG 需要大量的 GPU 内存来存储体积纹理,所以没办法在手机等移动端设备上运行。

  最近,Google Research 和西蒙菲莎大学的研究人员联合提出一种全新的模型 MobileNeRF,成功将 NeRF 模型部署在多种常见的移动设备上。

  论文链接:https://arxiv.org/abs/2208.00277

  Demo 链接:https://mobile-nerf.github.io/

  NeRF 由一组纹理多边形(textured polygons)表示,其中多边形大致沿着场景表面排布,纹理图集存储不透明度和特征向量。

  在渲染图像阶段,MobileNeRF 利用带Z-buffering 的经典多边形光栅化管道为每个像素生成特征向量,并将其传递给 GLSL 片段着色器中的轻型 MLP 运行以生成输出颜色。

  渲染管道不按深度顺序对光线采样或对多边形排序,因此只能对二进制不透明进行建模。但 MobileNeRF 可以充分利用了现代图形集成电路硬件中z缓冲区和片段着色器提供的并行性,因此在标准测试场景上比 SNeRG 快 10 倍,而且输出质量几乎相同。

  此外,MobileNeRF 只需要一个标准的多边形渲染管道,可以在几乎所有的计算平台上实现和加速,因此可以在手机和其他以前无法以交互速率支持 NeRF 可视化的设备上运行。

  作者还提供了一个演示网站,可以在 web 浏览器上实时渲染。

  文章的第一作者 Zhiqin Chen 是西蒙菲莎大学的三年级博士生。于 2019 年获得西蒙菲莎大学硕士学位,2017 年获得上海交通大学学士学位。主要研究兴趣是计算机图形学,主修几何建模和机器学习。

  NeRF 进入移动时代

  给定一个经过校准的图像集合,NeRF 的目标就是找到一个高效的新视图合成(novel-view synthesis)的表征,包括一个多边形网格(polygonal mesh),其纹理图存储了特征和不透明度。

  在渲染时,给定一个摄像机的姿势,MobileNeRF 采用两阶段的延迟渲染过程:

  渲染阶段1:将网格栅格化为屏幕空间,并构建一个特征图像,即在 GPU 内存中创建一个延迟渲染缓冲区。

  渲染阶段2:通过运行在片段着色器中的神经延迟渲染器将这些特征转换成彩色图像,即一个小型 MLP,能够接收特征和视图方向并输出一个像素颜色。

  表示法的训练分为三个阶段,从一个经典的类似于 NeRF 的连续表示法逐渐转向一个离散的表示法。

  训练阶段1:连续训练。训练一个类似于 NeRF 的连续不透明度模型,其中体积渲染正交点来自于多边形 mesh

  在不损失一般性的情况下,研究人员描述了合成 360 度场景中使用的多边形网格,首先在单位立方体中以原点为中心定义一个大小为P×P×P的 regular grid,通过为每个创建一个顶点来实例化V,通过为每个网格边缘创建一个连接四个相邻 voxel 顶点的四边形(两个三角形)来实例化。

  在优化过程中,将顶点位置初始化为V=0,即对应于 regular Euclidean lattice,并对其进行正则化处理,以防止顶点离开 voxel,并在优化问题受限的情况下使其返回到中间位置。

  训练阶段2:对不透明度进行二进制化,因为虽然经典的栅格化可以很容易地将碎片分解,但对于半透明碎片的处理却很麻烦。

  一般硬件实现的渲染管道并不支持半透明的网格。渲染半透明网格需要对每一帧进行排序,因此要按从后到前的顺序执行渲染,以保证正确的 alpha 合成。

  研究人员通过将平滑不透明度转换为离散/分类不透明度解决了这一问题。

  为了通过 photometric supervision 的方式来优化离散不透明度,模型还采用了直通式估计器(straight-through estimator)。需要注意的是,其梯度是透明地通过离散化操作,不考虑平滑透明度和离散透明度的值。为了稳定训练,研究人员选择对连续和离散模型进行联合训练。

  训练阶段3:提取一个稀疏的多边形网格,将不透明度和特征烘焙成纹理图,并存储神经递延着色器的权重。网格被存储为 OBJ 文件,纹理图被存储为 PNG 文件,而延迟着色器的权重则被存储在一个(小型)JSON 文件中。

  在传统的光栅化 pipeline 中,想要获得高质量的光栅化结果,混叠(aliasing)是一个必须考虑的问题。虽然经典的 NeRF 通过半透明体来实现平滑的边缘,但半透明体需要对每帧多边形排序。

  研究人员通过采用超采样抗锯齿来克服这个问题。虽然可以简单地执行四次/像素,并对得到的颜色进行平均,但延迟神经着色器的执行仍然是该技术的计算瓶颈。研究人员通过简单地平均化特征来缓解这个问题,即平均化延迟神经着色器的输入,而非平均化其输出。

  在将其送入神经延迟着色器之前,对子像素特征进行平均,以产生抗混叠表示。

  由于 MobileNeRF 采用了标准的 GPU 光栅化管道,所以需要的实时渲染器可以在 HTML 网页中运行。

  在实验阶段,研究人员设置了一系列的实验来测试 MobileNeRF 在各种场景和设备上的表现。

  使用了三个数据集进行测试:NeRF 的 8 个合成 360°场景,LLFF 的 8 个正面场景,以及 Mip-NeRF 360 的 5 个无界 360°户外场景。

  主要的对比模型为 SNeRG,因为它是目前唯一一个可以在常见的设备上实时运行的 NeRF 模型。

  渲染的分辨率与训练的图像相同,800×800 的合成图像,1008×756 的正向图像,以及 1256×828 的无界图像,并且在 chrome 浏览器上测试所有的方法,并在一个完整的圈中旋转/平移相机,以渲染 360 个框架。

  在测试时,GPU 内存消耗和存储成本相比 SNeRG 来说也降低了很多。

  其中 SNeRG 由于其网格表示方法不同,无法表示无界的 360°场景,并且由于兼容性或内存不足的问题,无法在手机或平板电脑上运行。

  在渲染质量上来看,用常见的 PSNR、SSIM 和 LPIPS 指标与其他方法进行比较后,可以发现 MobileNeRF 的质量与 SNeRG 大致相同。

  当摄像机处于适当的距离时,我们的方法实现了与 SNeRG 相似的图像质量。当相机被放大时,SNeRG 倾向于呈现过度平滑的图像。

  在多边形的计数中,可以看到 MobileNeRF 对每个场景产生的顶点和三角形的平均数量,以及与初始网格中所有可用顶点/三角形相比的百分比。由于 MobileNeRF 只保留了可见的三角形,所以在最终的网格中大部分顶点/三角形被移除。

  阴影网格(shading mesh)对比下,文中展示了提取的没有纹理的三角形网格。三角形面大部分是轴对齐的,而不是与实际物体表面对齐。

  因此,如果希望有更好的表面质量,需要设计出更好的正则化损失或训练目标,但优化顶点也确实改善了渲染质量。

  参考资料:

  https://czq142857.github.io/