“ NeRF(Neural Radiance Fields)是一种先进的计算机图形学技术,能够使用深度全连接神经网络优化场景的连续5D函数表示,从而生成高度逼真的3D场景。该技术的优势在于没有使用离散化的网格或体素来表示场景,而是使用一个连续的函数来表示整个场景,可以从任意角度渲染,创造令人惊叹的高质量渲染,并在可视效果方面优于现有的渲染方法。
NeRF的工作原理是自监督的,通过在有限的输入视图上训练数据,可以用较少的数据集来生成高质量的渲染。该技术通过在深度神经网络(MLP)中训练数据来获得场景的连续函数表示,并使用体积渲染技术来合成图像。因为这个合成过程是可微分的,所以可以使用梯度下降来优化这个函数,从而得到更好的场景表示。”
01
—
NeRF基本原理
通过一组输入图像优化场景的连续5D神经辐射场表示(在任何连续位置处有体积密度和视角相关的颜色)的方法。使用体积渲染技术沿着光线累积场景表示的样本,并可以从任何角度渲染出场景。在上图中展示了从周围半球随机捕获的100个合成Drums场景的输入视图集合,并展示了从我们优化的NeRF表示渲染的两个新视角。
那么神经辐射场场景表示和可微渲染过程是什么样的呢,如下图所示:
通过沿相机射线采样5D坐标(位置和视角方向)来合成图像(a),将这些位置输入MLP以生成颜色和体积密度(b),并使用体积渲染技术将这些值融合到图像中(c)。这种渲染函数是可微的,然后通过最小化合成和真实观察图像之间的残差来优化场景的表示。
具体来说:首先将一个静态场景表示为连续的5D函数,该函数输出空间中每个点(x, y, z)处发射的每个方向(θ, ϕ)的辐射度,以及每个点的密度,该密度表现为微分不透明度,控制光线通过(x,y,z)时累积的辐射量。然后使用深度全连接神经网络进行优化,该神经网络没有卷积层(通常称为多层感知器或MLP),以通过从单个5D坐标 (x, y, z, θ, ϕ) 回归到单个体积密度和视角相关的RGB颜色来表示这个函数。要从特定视点渲染这个神经辐射场(NeRF),需要如下步骤:
1)沿着摄像机射线遍历场景,生成一组3D采样点;
2)将这些点及其对应的2D视角作为输入,输入到神经网络中得到一组输出颜色和密度;
3)使用经典的体积渲染技术将这些颜色和密度积累成一张2D图像。由于这个过程是可微的,于是可以使用梯度下降来优化这个模型,通过最小化每个观察图像和相应的从辐射场表示中渲染的视图之间的误差来实现这个目标。通过在多个视图中最小化这个误差,可以鼓励网络通过将高体积密度和准确的颜色分配给包含真实底层场景内容的位置来预测一个连贯的场景模型。
对于复杂的场景,优化神经辐射场表示的基本实现不能收敛到足够高分辨率的表示,并且在每个摄像机射线所需的样本数方面效率低下。通过使用位置编码来转换输入的5D坐标,从而使MLP能够表示更高频率的函数,并且通过分层采样的过程来减少所需的查询数量,以充分采样这个高频率的场景表示。
总体的技术包括:
1、一种将具有复杂几何和材料的连续场景表示为5D神经辐射场的方法,参数化为基本的MLP网络。
2、一种基于经典的体积渲染技术的可导渲染程序,使用它来从标准RGB图像优化这些表示。这包括一种分层采样策略,用于将MLP的能力分配到具有可见场景内容的空间中。
3、一种位置编码方式,将每个输入的5D坐标映射到更高维的空间,从而能够成功地优化神经辐射场以表示高频率的场景内容。
02
—
Instant-ngp安装
Instant-ngp主要用于解决NeRF在对全连接神经网络进行参数化时的效率问题。该方法提出一种编码方式,使得可以使用一个较小规模的网络来实现NeRF同时不会产生精度的损失。该网络由特征向量的多分辨率哈希表实现增强,基于随机梯度下降执行优化。多分辨率结构有助于GPU并行,能够通过消除哈希冲突减少计算。该方法最大的亮点是将NeRF以小时计的时间开销提升到秒级。下图为一些渲染样例,可以看到渲染时间有显著的提升
github地址:NVlabs/instant-ngp: Instant neural graphics primitives: lightning fast NeRF and more (github.com)
基本安装步骤:
1、安装anaconda,我之前的图文有说明
2、安装MSCV2019,在这个地址下载安装Download Visual Studio Tools - Install Free for Windows, Mac, Linux (microsoft.com)
3、安装cmake,Download | CMake,选择对应的版本安装
git clone --recursive https://github.com/nvlabs/instant-ngp cmake . -B build cmake --build build --config RelWithDebInfo -j 16
4、cmake完成后会在目录生成一个instant-ngp.exe的文件
5、创建对应的python环境
conda create -n ngp python=3.9
conda activate ngp
pip install -r requirments.txt
踩坑:
1、如果出现“Build problem: No CUDA toolset found”
打开Windows资源管理器并导航到CUDA安装目录:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\visual_studio_integration\MSBuildExtensions
复制所有文件。
粘贴到Visual Studio 2019安装目录:C:\Program Files (x86)\Microsoft VisualStudio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomization
03
—
Instant-ngp测试
1、随便拍一个物体,注意尽量不要跳跃太大或者时长太短,否则后面将无法进行特征提取,或者即使提取了特征,也无法重建3D,在重建过程中若出现闪退,大概率是图片的问题。
2、将视频放到instant-ngp文件夹下的data下,可以自行再新建一个文件夹,比如mydata
3、使用scripts文件下的视频抽帧脚本进行视频抽帧
python .\scripts\convert_video.py
--input H:\instant-ngp\data\mydata\sample.mp4
--output H:\instant-ngp\data\mydata\images
--show_image 1
--scale 2
4、使用scripts文件下的colmap2nerf脚本进行辐射场转换
python scripts/colmap2nerf.py
--colmap_matcher exhaustive
--colmap_camera_model PINHOLE
--run_colmap
--images H:\instant-ngp\data\mydata\images
--aabb_scale 4
--out H:\instant-ngp\data\mydata\transform.json
5、然后在终端运行
instant-ngp.exe H:\instant-ngp\data\mydata\images H:\instant-ngp\data\mydata\transform.json
整个训练过程很快,5秒左右就能达到图3的效果,可以通过界面中crop size选择需要重建的部分,或者crop box下拉菜单中进行微调
整个测试下来,速度还是相当快的,GPU好一点的电脑速度应该会更快,后续打算通过controlNet中的openpose来生成不同角度的图片,然后喂给instant-ngp来生成3D模型,从而实现文字到3D图像的生成,也算是曲线救国吧
欢迎关注公众号:IoT Inn