假设你看过一个物体的几张照片,你能想象它从其他角度看是怎样的吗?人类可以做到,我们可以推测我们没有看到的部分,或者我们没有看到的角度是什么样的。其实模型也是有办法做到的。给定一些场景图片,它还可以从看不见的角度合成一些图像。渲染一个新的视角,最近最引人注目的是NeRF(NeuralRadianceField),获得了ECCV2020最佳论文的荣誉提名。它不需要之前复杂的3D重建过程。只需要几张照片和拍照时相机的位置,就可以合成新视角下的图像。NeRF惊人的效果吸引了众多视觉研究者,后续也做出了一系列优秀的工作。但难点在于此类模型构建复杂,目前还没有统一的代码库框架来实现,这无疑会阻碍该领域的进一步探索和发展。为此,OpenXRLab渲染生成平台构建了高度模块化的算法库XRNeRF,帮助快速实现类NeRF模型的构建、训练和推理。开源地址:https://github.com/openxrlab/xrnerf什么是NeRF类模型NeRF类任务,泛指在已知视角下捕捉场景信息,包括捕捉到的图像,以及每幅图像对应的内外参数从新的角度合成图像的参数。借助NeRF论文中的图表,我们可以清楚地理解这个任务。检索自arxiv:2003.08934。NeRF在采集图像的时候,同时采集了5维的场景信息,即一张图像对应一个三维坐标值和另外两个光线辐射角度。这样的场景会通过多层感知器建模为RadianceField,也就是说多层感知器会输入一个三维坐标点,映射到该点的Density和RGB颜色,使得Radiance字段被渲染为逼真的虚拟透视图。如上图所示,用一些图片构建RadianceField后,就可以生成一个新视角的架子鼓图像。由于NeRF不需要明确的3D重建来获得所需的新视角,它提供了一种基于深度学习的3D隐式表示范例,可以训练它仅使用2D姿势图像数据来包含3D场景。深度神经网络中的信息。自NeRF以来,类似NeRF的模型层出不穷:Mip-NeRF使用锥体代替射线来优化精细结构的生成;KiloNeRF使用数千个微型多层感知器代替单个大型多层感知器,减少了另外,AniNeRF和NeuralBody等模型从简单的短视频帧学习人体视角变换以获得良好的视角合成和驱动效果;此外,GN'R模型利用稀疏透视图像和几何先验,实现不同ID间的泛化人体渲染。GN'R提出的可泛化人体隐式场表示,实现了单模型人体渲染效果,为NeRF装上了轮子。虽然目前类NeRF的算法在研究领域很流行,但毕竟是比较新的方法,所以模型实现起来肯定比较麻烦。如果使用PyTorch或TensorFlow等常规框架,首先要找到类似的NeRF模型,然后在其基础上进行修改。这样做会带来几个明显的问题。首先,我们必须充分理解一个实现,然后才能根据它改成我们想要的。其实这部分工作量不小;其次,由于官方实现不统一,在比较不同NeRF模型的源代码时会消耗大量精力。毕竟,没有人知道某篇论文的训练过程中是否有一些新奇的技巧;最后,如果没有统一的代码,对新模型验证新想法无疑会慢很多。为了解决诸多问题,OpenXRLab针对NeRF类模型构建了一个统一的、高度模块化的代码库框架XRNeRF。XRNeRF实现了很多NeRF模型,更容易上手,也能轻松复现相应论文的实验结果。XRNeRF将这些模型分为五个模块:datasets、mlp、network、embedder和render。XRNeRF的易用性在于它只需要使用config机制将不同的模块拼装成一个完整的模型,极其简单易用,同时也大大增加了复用性。在保证易用性的基础上,还需要灵活性。XRNeRF可以通过另一套寄存器机制自定义不同模块的具体特性或实现,使XRNeRF更加解耦,代码更易理解。此外,XRNeRF实现的所有算法均采用Pipeline模式。数据上的Pipeline读取原始数据,经过一系列处理后得到模型的输入。模型的Pipeline对输入数据进行处理,得到相应的输出。这样一个Pipeline将config机制和registry机制连接起来,形成一个完整的架构。XRNeRF实现了很多核心的NeRF模型,并通过以上三种机制将它们串联起来,构建了一个高度模块化的代码框架,既易用又灵活。XRNeRFXRNeRF的核心特点是基于Pytorch框架的类NeRF算法库,在场景和人体两个方向复刻了8篇经典论文。与直接建模相比,XRNeRF在模型构建效率、成本和灵活性方面有显着提升,并且拥有完善的文档、示例和Issue反馈机制。总的来说,XRNeRF具有以下五个核心特征。1.实现了NeRF、CVPR2021BestPaperCandidate(NeuralBody)、ICCV2021BestPaperHonorableMention(Mip-NeRF)和Siggraph2022BestPaper(InstantNGP)等众多主流核心算法。XRNeRF在实现这些模型的基础上,也可以保证再现效果与论文中基本一致。如下图所示,从客观的PSNR和SSIM指标来看,可以很好的复现原代码的效果。2.模块化设计XRNeRF将整个代码框架模块化,最大限度地提高了代码的复用性,方便研究人员阅读和修改现有代码。通过分析现有的NeRF类模型方法,XRNeRF设计的具体模块流程如下图所示:模块化的好处是,如果我们需要修改数据格式,只需要修改Dataset模块下的逻辑即可。假设我们需要修改渲染图片逻辑,那么只需要修改Render模型模块即可。3.标准数据处理流水线针对类NeRF算法复杂多样的数据预处理问题,XRNeRF提供了一套标准的数据处理流水线。由多次数据处理操作串行获取,只需要修改config配置文件中的datapipeline部分即可完成数据处理的平滑构建。NeRF配置数据流部分。多个数据集所需的数据处理操作已在XRNeRF中实现。你只需要在config中按顺序定义这些ops就可以完成数据处理过程。如果以后需要添加新的op,只需要在对应的文件夹下完成新op的实现,一行代码就可以完成整个数据处理过程。4.模块化网络构建方式XRNeRF中的模型主要由embedder、MLP和rendermodel组成,通过网络连接。这些可以相互解耦,这样不同算法之间的不同模块就可以替换。其中embedder输入点的位置和视角,输出嵌入的特征数据;MLP以embedder的输出作为输入,输出采样点的Density和RGB颜色;渲染模型输入MLP的输出结果,沿着射线上的点进行积分等操作,从而得到图像上某个像素点的RGB值。然后这三个模块通过标准网络模块连接起来,形成一个完整的模型。自定义网络模块的代码结构。5.再现效果好支持最快60秒训练网络,每秒30帧实时渲染,支持高清、抗锯齿、多尺度场景和人体图像渲染。无论是从客观的PSNR和SSIM指标,还是主观的demo展示效果,XRNeRF都能很好的复现原码的效果。使用XRNeRFXRNeRF框架似乎有很好的特性,而且使用起来非常简单方便。比如在安装过程中,XRNeRF依赖了很多开发环境,比如PyTorch、CUDA环境、视觉处理库等等。不过XRNeRF提供了Docker环境,可以直接通过DockerFile构建镜像文件。我们试过了。相比一步步配置各种运行环境和包,dockerbuild一行命令的配置方式显然要方便很多。另外在构建Docker镜像的时候,在DockerFile中配置了国内的镜像地址,所以速度还是很快的,基本不用担心网络问题。构建镜像并从镜像启动容器后,我们就可以通过dockercp命令将项目代码和数据传输到容器中。不过也可以在创建容器时通过-v参数直接将项目地址映射到容器内部。不过这里要注意,数据集需要放在某个位置(否则需要更改config文件),比如XRNeRF工程下的data文件夹。一般来说,下载完数据后,大概的文件夹结构如下图所示:至此,环境、数据、代码都准备好了,只需要一行代码就可以执行NeFR模型的训练和验证了:pythonrun_nerf.py--configconfigs/nerf/nerf_blender_base01.py--datanamelego其中dataname代表数据目录下的具体数据集,config代表模型的具体配置文件。由于XRNeRF采用了高度模块化的设计,它的config是使用字典构造的。虽然乍一看可能有点繁琐,但真正了解了XRNeRF的设计结构后,阅读起来就非常简单了。主观上,config配置文件(nerf_blender_base01.py)包含了训练模型、优化器、分布式策略、模型架构、数据预处理和迭代等所有必要的信息,甚至很多与图像处理相关的配置也包含在里面.综上所述,除了具体的代码实现,config配置文件描述了整个训练和推理过程。描述模型结构部分的配置。总体体验来看,XRNeRF从基础运行环境的搭建到最终执行训练任务,都比较顺利。而且,通过配置config文件或实现特定的OP,也可以获得很高的建模灵活性。与直接使用深度学习框架建模相比,XRNeRF无疑会减少大量的开发工作,研究人员或算法工程师可以将更多的时间花在模型或任务创新上。NeRF类模型仍然是计算机视觉领域的研究热点。一个像XRNeRF这样统一的代码库,就像HuggingFace的Transformer库一样,可以聚集越来越多优秀的研究工作,聚集越来越多的新代码、新思想。反过来,XRNeRF也将大大加快研究人员探索类NeRF模型的步伐,使这一新领域更容易应用于新场景和新任务,NeRF的潜力也将得到加速。
