NeRF神经辐射场:从原理到实践,手把手实现三维场景重建 1. 从一张照片到三维世界NeRF到底是什么如果你玩过手机上的3D扫描App或者对电影特效里那些栩栩如生的数字场景感到好奇那你可能已经接触过神经辐射场Neural Radiance Fields简称NeRF这项技术的“远房亲戚”。简单来说NeRF是一种用深度学习“教会”计算机从一堆普通的二维照片中理解并重建出连续、高保真三维场景的方法。这听起来有点像魔法给你几十张从不同角度拍摄的同一个房间的照片NeRF就能构建出一个你可以走进去、从任意新视角观察的虚拟房间光影、材质、甚至半透明物体都还原得惟妙惟肖。我第一次接触NeRF是在2020年当时ECCV会议上的那篇同名论文《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》几乎震动了整个计算机视觉和图形学界。它解决的是一个存在已久的“新视角合成”问题——如何生成一个从未被相机拍摄过的角度的图像。传统方法要么依赖复杂的多视图几何和稠密点云重建过程繁琐且对遮挡和弱纹理区域束手无策要么使用基于图像的渲染但效果生硬难以处理复杂的光照和视差。NeRF另辟蹊径它不直接重建几何表面而是用一个多层感知机一个简单的神经网络去隐式地建模整个场景的“辐射场”。你可以把这个辐射场想象成一个布满空间的、智能的“光雾”。对于空间中的任意一个点 (x, y, z)以及观察这个点的方向 (θ, φ)这个神经网络都能预测出两样东西一是该点的颜色 (RGB)二是该点的体密度可以理解为不透明度。通过从相机出发发射一条光线穿过这个“光雾”并沿着光线采样大量点将这些点的颜色和密度按照体渲染的公式积分起来就能合成出这条光线最终抵达相机成像平面的像素颜色。整个过程是端到端可微的因此通过输入大量已知的、带有精确相机位姿的图片神经网络就能通过反向传播自动学习到这个复杂“光雾”的分布从而学会从任意角度“渲染”出逼真的图像。这项技术适合谁呢首先肯定是计算机视觉、计算机图形学的研究人员和工程师这是他们工具箱里的新利器。其次对于数字内容创作者、影视特效师、游戏开发者NeRF提供了一种低成本、高保真的三维资产创建方式。甚至对于文化遗产保护、虚拟看房、电商展示等领域它也有着巨大的应用潜力。无论你是想深入理解其原理的学者还是寻找落地可能性的开发者搞懂NeRF都将是通往下一代视觉内容生成技术的关键一步。2. NeRF的核心思想为什么一个简单的网络能建模复杂场景NeRF的成功看似突然但其核心思想建立在对传统三维重建和渲染瓶颈的深刻反思之上。传统方法通常遵循“重建-渲染”的流水线先从多张图像中估计出稀疏或稠密的3D点云再构建网格表面最后贴上纹理进行渲染。这个流程的每个环节都容易出错——特征匹配在无纹理区域失效点云融合会产生空洞网格化对噪声敏感而渲染难以处理复杂的全局光照和半透明效果。NeRF跳出了这个框架它选择用一个连续的、可微的神经网络函数 F_Θ 来直接表示整个场景。这个函数的输入是一个5D坐标空间位置 (x, y, z) 和观察方向 (θ, φ)。输出是该位置的颜色 c (r, g, b) 和体密度 σ。体密度 σ 是一个标量它与观察方向无关只取决于空间位置表示该点存在“物质”的可能性。而颜色 c 则同时依赖于位置和观察方向这使得NeRF能够建模像镜面高光、金属反光这类视角相关的外观变化。注意这里“与观察方向无关”的体密度是NeRF的一个关键假设。它意味着场景的几何是固定的不会因为你从左边看还是右边看而改变形状。这符合大多数刚性场景的物理事实也是网络能够有效学习几何的基础。那么如何从这个5D函数得到一张2D图片呢答案就是经典的体渲染技术。对于图像上的每一个像素我们从相机光心出发沿着穿过该像素的光线方向发射一条射线。在这条射线上我们采样一系列点。对于每个采样点查询神经网络得到其颜色和密度。然后通过体渲染积分公式将这些离散采样点的贡献累积起来计算出这条光线最终抵达相机的颜色。这个积分过程是可微的它允许我们将渲染出的像素颜色与真实照片中对应像素的颜色进行比较计算损失通常是简单的L2损失然后通过反向传播来更新神经网络的参数 Θ。这个设计的精妙之处在于它把整个三维重建和渲染问题转化为了一个纯粹的函数拟合问题。网络不需要显式地理解什么是“边缘”、什么是“平面”它只需要学会在那些有实物高密度的地方输出正确的颜色在空旷低密度的地方输出透明的密度。通过成千上万条光线、数百万个采样点的监督网络最终会自发地在高密度区域“勾勒”出物体表面在正确的空间位置“涂抹”上正确的颜色。这种隐式表示带来了巨大的优势它天然是连续的可以生成任意分辨率的图像它能平滑地插值处理模糊和透明效果它统一了重建和渲染避免了传统流水线中的误差累积。3. 从理论到代码NeRF实现的关键技术拆解理解了核心思想我们来看看要把NeRF从论文变成可运行的代码需要攻克哪些具体的技术关卡。原始的NeRF论文虽然概念惊艳但直接实现会面临计算成本极高、训练缓慢的问题。后续的许多研究和改进都围绕着如何让这个“优雅但昂贵”的模型变得更实用。3.1 位置编码让网络“看见”高频细节一个最基础的多层感知机MLP倾向于学习低频函数这意味着它很难表示像物体边缘、纹理细节这类高频信息。直接输入原始的 (x, y, z) 坐标网络渲染出的结果会非常模糊缺乏细节。NeRF论文引入了一个非常关键的技巧位置编码。具体来说在将位置坐标和方向向量输入MLP之前先对它们进行高频映射。对于输入值 p可以是位置或方向的分量我们将其映射到一组正弦和余弦函数上γ(p) [sin(2^0 π p), cos(2^0 π p), sin(2^1 π p), cos(2^1 π p), ..., sin(2^(L-1) π p), cos(2^(L-1) π p)]其中 L 是编码的阶数。对于位置坐标论文中 L10对于方向向量L4。经过这样的编码一个标量 p 就被扩展成了一个 2L 维的向量。这个操作相当于把输入信号投影到了一个高维空间使得后续的MLP能够更容易地拟合高频变化。你可以把它类比为傅里叶变换任何复杂的信号都可以分解为不同频率的正弦波叠加。位置编码显式地提供了这些不同频率的基网络只需要学会组合它们的权重即可。没有位置编码NeRF的效果会大打折扣这几乎是所有后续NeRF变体都保留的核心组件。3.2 分层采样把计算力用在“刀刃”上体渲染需要在每条光线上采样大量点例如64个或128个。如果对整条光线均匀地密集采样计算量会非常大因为大部分采样点都落在空旷的区域密度为0对最终颜色贡献极小却占用了大量的网络查询开销。NeRF采用了一种“分层采样”策略来优化这个过程。它分为两步粗采样首先沿着每条光线均匀地采样一批较少的点例如 N_c 64个通过粗网络或同一个网络的一次前向传播得到这些点的密度估计。根据这些密度值我们可以大致知道物体的边界在哪里密度高的区域更可能是物体表面。细采样然后我们根据粗采样得到的密度分布重新构造一个概率密度函数。在密度高的区域我们进行更密集的采样在密度低的区域减少采样。接着再采样一批点例如 N_f 128个。最后将两批采样点合并用细网络或更精确的评估进行体渲染积分。这个过程类似于重要性采样。它确保了大部分的计算资源都集中在了对最终图像有实际贡献的区域即物体表面附近从而在保持甚至提升渲染质量的同时显著提高了训练和渲染的效率。在代码实现中这通常体现为两个并行的网络“coarse”和“fine”或者一个网络的两阶段查询。3.3 体渲染积分从离散采样到连续图像这是将神经网络输出转化为像素颜色的数学核心。假设在一条光线 r(t) o t*d 上我们采样了 N 个点其位置为 t_i颜色为 c_i密度为 σ_i。体渲染的离散近似公式如下Ĉ(r) Σ_{i1}^{N} T_i * (1 - exp(-σ_i * δ_i)) * c_i其中δ_i t_{i1} - t_i是相邻采样点之间的距离。T_i exp(- Σ_{j1}^{i-1} σ_j * δ_j)是累积透射率表示光线从起点到达第 i 个采样点之前没有被阻挡的概率。这个公式的物理意义很直观(1 - exp(-σ_i * δ_i))可以看作是光线在第 i 个区间内被“吸收”或“发射”颜色的概率与密度和区间长度正相关。T_i是权重表示前面的物质已经阻挡了多少光因此后面的点贡献会变小。最终颜色是所有采样点颜色的加权和。在实现时我们需要非常小心数值稳定性。例如计算exp(-σ_i * δ_i)时如果σ_i * δ_i很大可能导致下溢。通常的实践是使用torch.exp(-torch.clamp(sigma * dists, max50))之类的操作进行截断。此外采样点距离δ_i的计算要准确特别是在非均匀采样时这直接影响到密度积分的正确性。4. 手把手实现一个基础NeRF从数据准备到训练循环纸上得来终觉浅我们来一步步拆解如何用PyTorch实现一个最基础的NeRF。这里我会省略一些非常底层的代码聚焦于核心流程和关键模块。4.1 数据准备nerf_synthetic数据集NeRF论文使用了多个数据集其中nerf_synthetic数据集包含乐高、椅子、鼓等物体是最常用的基准数据集。这个数据集提供了在黑色背景下、从球面轨迹拍摄的物体图像以及对应的相机位姿旋转矩阵和平移向量和焦距。加载数据的核心步骤如下加载位姿和图像数据通常以poses_bounds.npy和一系列.png文件的形式提供。poses_bounds.npy是一个 Nx17 的数组前12个元素是3x4相机矩阵世界到相机坐标系的变换的展平后5个元素与边界和焦距有关。解析相机参数从3x4矩阵中分离出旋转矩阵 R 和平移向量 t。注意NeRF通常假设相机坐标系是x轴向右y轴向下z轴向里OpenGL风格。需要检查数据集的坐标系并可能进行转换。构建光线对于一张 H x W 的图像我们需要为每个像素构建一条光线。光线的原点 o 就是相机在世界坐标系中的位置o -R^T * t。光线的方向 d 需要根据像素坐标 (u, v)、相机焦距 f 和 principal point 计算得出然后通过旋转矩阵 R 变换到世界坐标系d_world R^T * d_camera。划分训练集/验证集通常留出1-2张图像作为验证集用于在训练过程中监控新视角合成质量。实操心得数据预处理是NeRF实现中最容易出错的一环。一个常见的坑是坐标系不匹配。如果你的渲染结果看起来是上下颠倒、左右翻转或者支离破碎的99%的问题出在光线方向的计算或坐标系转换上。建议在预处理后写一个简单的调试函数将几条光线的原点方向可视化出来确保它们都从相机原点指向场景的正确区域。4.2 网络结构设计一个基础的NeRF网络结构如下import torch import torch.nn as nn import torch.nn.functional as F class TinyNeRF(nn.Module): def __init__(self, pos_in_dim60, dir_in_dim24, hidden_dim256): super().__init__() # 处理位置编码输入的层 self.block1 nn.Sequential(nn.Linear(pos_in_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU()) # 输出密度和中间特征 self.block2 nn.Sequential(nn.Linear(hidden_dim pos_in_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU()) # 密度头无激活函数后续用ReLU处理 self.density_head nn.Linear(hidden_dim, 1) # 特征融合与颜色头 self.color_head nn.Sequential( nn.Linear(hidden_dim dir_in_dim, hidden_dim//2), nn.ReLU(), nn.Linear(hidden_dim//2, 3), nn.Sigmoid() # 输出RGB范围[0,1] ) def forward(self, x, d): # x: 位置编码后的坐标 [B, pos_in_dim] # d: 位置编码后的方向 [B, dir_in_dim] h self.block1(x) h self.block2(torch.cat([h, x], dim-1)) sigma self.density_head(h) # [B, 1] # 将方向信息与特征融合预测颜色 h_color torch.cat([h, d], dim-1) rgb self.color_head(h_color) # [B, 3] return rgb, sigma注意这里使用了论文中提到的“残差连接”思想block1的输出和原始位置编码x拼接后再输入到block2。密度sigma理论上应为非负在体渲染计算时我们通常使用F.relu(sigma)或torch.exp(sigma)来确保其非负性原始论文使用的是relu。4.3 训练循环的核心逻辑训练循环的伪代码逻辑如下# 初始化模型、优化器 model_coarse TinyNeRF().cuda() model_fine TinyNeRF().cuda() optimizer torch.optim.Adam(list(model_coarse.parameters()) list(model_fine.parameters()), lr5e-4) for epoch in range(num_epochs): for batch_idx, batch in enumerate(dataloader): # 1. 从数据加载器中获取一个批量的光线数据 # rays_o: [B, 3], 光线原点 # rays_d: [B, 3], 光线方向未归一化 # target_rgb: [B, 3], 该光线对应的真实像素颜色 # 2. 对每条光线在 [near, far] 范围内均匀采样 N_c 个点粗采样 # 计算采样点的3D坐标: pts rays_o[:, None, :] t_samples[:, :, None] * rays_d[:, None, :] # 对坐标和方向进行位置编码 # 3. 将编码后的坐标和方向输入 coarse 网络得到颜色和密度 rgb_coarse, sigma_coarse model_coarse(encoded_pts, encoded_dirs) # 4. 使用体渲染公式根据粗采样的结果渲染出 coarse 图像并计算权重分布 # 渲染公式实现... # weights ... # [B, N_c]每个采样点的权重 # 5. 根据权重分布进行重要性采样得到 N_f 个细采样点 # 将粗采样点和细采样点合并 # 6. 将合并后的所有采样点输入 fine 网络再次得到颜色和密度并进行体渲染得到 fine 图像 rgb_fine, sigma_fine model_fine(encoded_pts_all, encoded_dirs_all) # 渲染得到最终预测颜色 C_fine # 7. 计算损失 # 损失函数通常包括两部分fine 网络输出的颜色与真实颜色的MSE以及 coarse 网络输出的颜色与真实颜色的MSE作为正则项 loss mse_loss(C_fine, target_rgb) mse_loss(C_coarse, target_rgb) # 8. 反向传播与优化 optimizer.zero_grad() loss.backward() optimizer.step()这个循环的核心在于每次迭代处理一批光线通过两次前向传播粗/细和体渲染积分得到预测的像素颜色然后与真实颜色比较进行优化。由于每条光线都是独立处理的这个过程非常适合并行计算。4.4 渲染与可视化见证场景的诞生训练完成后我们如何查看结果呢我们需要一个渲染函数给定一个相机位姿渲染出整张图像。生成光线网格根据目标图像的尺寸和相机内参为每个像素生成一条光线的原点和方向。批处理由于全分辨率图像像素数量巨大例如800x80064万无法一次性处理所有光线。需要将光线分批送入训练好的model_fine进行推理。推理与积分对每一批光线执行与训练时“细采样”阶段类似的操作采样、位置编码、网络查询、体渲染积分得到该批光线对应的像素颜色。组装图像将所有批次的渲染结果按顺序组装成完整的图像矩阵。保存与评估将渲染图像保存下来并与真实图像如果有的话计算PSNR、SSIM等指标进行定量评估。在训练初期渲染出的图像可能是一片混沌或单一颜色。随着训练的进行物体会逐渐从噪声中显现细节变得越来越清晰。通常在nerf_synthetic数据集上训练10万到20万次迭代大约几个小时到一天取决于硬件后就能得到非常不错的效果。5. 超越基础NeRF家族的演进与优化方向原始NeRF虽然效果惊艳但其缺点也很明显训练和渲染速度极慢渲染一张图需数十秒、内存占用大、对动态场景支持差。自2020年以来研究者们提出了数以百计的改进方案形成了庞大的“NeRF家族”。了解这些方向能帮助我们在实际项目中做出合适的技术选型。5.1 加速训练与渲染从小时到秒的飞跃这是NeRF落地应用最迫切的需求。主要加速思路有哈希编码与小型网络Instant-NGP这是革命性的工作。它不再使用耗时的位置编码和深层的MLP而是引入了一个可学习的多分辨率哈希表。3D空间被划分为不同分辨率的网格每个网格顶点存储一个特征向量。查询一个点的特征时通过哈希函数快速找到其所在网格的八个顶点进行三线性插值得到该点的特征。这个特征再输入一个非常小仅1-2层的MLP来预测颜色和密度。这种方法将训练时间从数十小时缩短到几分钟渲染速度达到实时级别。显式稀疏体素表示Plenoxels, DVGO这类方法放弃了纯粹的隐式表示转而使用显式的稀疏体素网格来存储密度和球谐函数系数用于表示颜色。优化过程直接针对这些体素属性无需神经网络前向传播因此速度极快。Plenoxels甚至不需要任何神经网络仅通过梯度下降优化体素属性就能达到不错的渲染质量。模型剪枝与蒸馏训练一个大而全的NeRF后通过剪枝、量化、知识蒸馏等技术得到一个更小、更快的模型适合部署在移动端或边缘设备。实操心得如果你的目标是快速原型验证或对实时性要求高Instant-NGPNVIDIA的框架是目前最好的选择。如果你的场景相对简单且静态Plenoxels这种纯显式方法实现起来更简单速度也快得惊人。原始NeRF更适合作为研究基线深入理解原理。5.2 处理无界场景与大规模环境原始NeRF假设场景在一个有界的包围盒内。对于户外等无界场景直接建模会导致远处细节丢失或资源浪费。参数化与归一化Mip-NeRF 360 等方法将场景参数化为一个收缩的空间例如将远处的点映射到一个球体内确保网络容量集中在前景物体上。层级化模型一些方法使用两个网络一个负责前景高细节一个负责背景低细节或天空盒或者使用渐进式训练策略。5.3 动态场景与变形建模让NeRF“动起来”是另一个热门方向。时间维度最直接的方法是将时间t作为额外的输入维度让网络学习F_Θ(x, y, z, t, d)。但这需要大量不同时间点的数据且难以泛化到新动作。变形场学习一个从规范空间canonical space到每一帧观测空间的变形场。网络主要学习规范空间的静态辐射场以及一个随时间变化的变形网络。这种方法对单目视频重建动态场景非常有效。光照分解将外观分解为光照不变的反射率和随光照变化的部分使得场景在光照改变下也能保持一致性这对于AR/VR应用很重要。5.4 数据效率与泛化能力原始NeRF一个场景就需要几百张图片和数小时训练这严重限制了其应用。先验知识注入使用在大规模数据上预训练的2D视觉模型如CLIP, DINO的特征作为监督信号或者使用3D扩散模型作为先验可以在极少甚至单张图像输入下生成合理的3D场景。生成式NeRF如GRAF、pi-GAN等将NeRF与GAN结合学习一个类别的3D表示分布可以从随机噪声生成新的、多视角一致的3D物体实现了“单张图片推理”或“零样本生成”。6. 实战避坑指南从数据到调参的常见问题在实际复现和调优NeRF模型时你会遇到各种各样的问题。下面是我踩过的一些坑和总结的经验。6.1 数据相关问题问题渲染结果一片模糊或颜色异常。排查首先检查相机位姿。这是最常见的问题根源。确保你的位姿矩阵是正确的世界到相机还是相机到世界并且光线方向计算正确。可以用一个简单场景比如几个已知位置的球进行调试。检查图像像素值是否被正确归一化到[0, 1]如果输入是0-255的整数需要除以255.0。检查背景处理。nerf_synthetic数据集是黑色背景但真实场景背景复杂。如果使用真实数据可能需要一个分割蒙版来剔除背景或者使用像NeRF in the Wild这类能处理复杂背景的模型。问题训练损失下降很慢或者震荡剧烈。排查学习率可能不合适。NeRF通常使用Adam优化器学习率从5e-4开始并配合指数衰减。可以尝试使用Warm-up策略。排查位置编码的阶数L是否合适L太小会导致细节模糊L太大会导致训练不稳定容易过拟合。对于合成数据论文的L_pos10, L_dir4是很好的起点。对于真实数据可能需要调低。排查采样范围[near, far]是否包含了整个场景如果场景只有一部分在采样范围内网络将无法学习到完整几何。6.2 训练与渲染问题问题训练后期出现“漂浮物”或场景内部有云雾状噪声。原因这是NeRF的一个典型问题称为“密度场模糊”或“背景坍塌”。网络倾向于在自由空间也预测一个很小的非零密度这些微小的密度在体渲染积分中累积就会产生雾状伪影。解决权重正则化在损失函数中加入对权重w_i T_i * (1 - exp(-σ_i δ_i))的熵正则化项鼓励权重分布是稀疏的即只有少数点有高权重。密度场惩罚直接对空旷区域的密度值施加 L1 或 L2 惩罚。使用更好的采样策略确保在训练后期采样点能更精确地集中在表面附近。问题渲染速度太慢尤其是高分辨率图像。优化批处理大小在GPU内存允许的情况下尽量增大批处理的光线数量。提前终止光线在体渲染积分时当累积透射率T_i低于某个阈值如1e-4时可以提前终止这条光线的计算因为后续点对最终颜色的贡献微乎其微。使用更高效的实现考虑使用CUDA内核或像torch.compilePyTorch 2.0来加速核心计算循环。考虑升级模型架构如前所述迁移到Instant-NGP或Plenoxels等加速框架是根本性解决方案。6.3 模型设计与调参问题网络容量不足细节重建不好容量过大又容易过拟合。策略网络宽度hidden_dim和深度是关键。对于合成数据集hidden_dim2568层左右的MLP是常见的基线。可以尝试逐步增加宽度或深度观察验证集PSNR的变化。如果PSNR在训练集上继续提升但在验证集上下降可能就是过拟合了需要增加数据增强如添加噪声、颜色抖动或使用Dropout。问题对于有镜面反射或透明物体渲染效果差。分析原始NeRF的颜色输出仅依赖于位置和方向这对于简单的漫反射表面足够但对于强镜面反射其外观随视角变化剧烈需要网络有更强的表达能力。尝试可以增加方向编码的维度L_dir或者在网络后期为颜色预测分配更多的层和神经元。更高级的方法会显式地将外观分解为漫反射和镜面反射分量。7. 从玩具到工业NeRF的应用场景与未来展望经过几年的发展NeRF早已不再是实验室里的玩具它正在快速渗透到各个行业。1. 影视与游戏制作这是最直接的应用。传统的高精度3D扫描需要昂贵的激光雷达或结构光设备且后期处理繁琐。NeRF仅用一组普通相机拍摄的照片就能生成高质量的三维资产用于虚拟制片、特效预览、数字孪生场景创建。游戏行业可以用它快速生成游戏场景的背景或道具模型。2. 文化遗产与数字存档对博物馆的文物、历史建筑、考古遗址进行多角度拍摄通过NeRF构建出可交互的数字化模型可以实现永久的、高保真的数字存档并用于线上虚拟展览让更多人能够远程、多角度地欣赏文化遗产。3. 地理测绘与城市规划结合无人机倾斜摄影NeRF可以生成比传统三维实景模型更具真实感和细节如玻璃反光、树木层次的城市数字模型。这对于城市规划、灾害评估、智慧城市建设有巨大价值。4. 电子商务与零售商品的三维展示比二维图片更具吸引力。NeRF可以低成本地为商品生成360度展示模型用户可以在线旋转、查看细节提升购物体验。对于家具等大件商品还能实现AR预览看放在家里的效果。5. 机器人视觉与自动驾驶NeRF可以为机器人构建高保真的环境地图不仅包含几何还包含外观信息有助于进行更复杂的场景理解和模拟。在自动驾驶中可以用NeRF合成各种极端天气、光照条件下的训练数据提升模型的鲁棒性。未来的挑战与趋势在我看来主要集中在几个方面一是效率的极致化目标是实现手机端实时高质量的NeRF重建与渲染二是通用性与可控性如何让模型具备强大的泛化能力并能通过文本、草图等简单指令进行编辑和生成三是与物理世界的融合如何将光照、材质、动力学等物理属性从NeRF模型中解耦出来使其不仅能“看”还能“用”真正成为连接虚拟与现实的数字基石。我个人在实际操作中的体会是NeRF的魅力在于它用一种“暴力美学”般简单统一的框架解决了复杂的3D问题。它不需要你手动设计特征、调整网格只需要准备好数据定义好网络和损失剩下的就交给梯度下降。这种端到端的范式正是深度学习力量的体现。当然它的“黑盒”特性也带来调试的困难。很多时候效果不好你需要像侦探一样从数据、光线、采样、网络结构、损失函数等多个维度去排查。这个过程虽然痛苦但当你看到第一个模糊的轮廓逐渐变得清晰最终成为一个栩栩如生的三维场景时那种成就感是无与伦比的。对于想入门的朋友我的建议是从复现原始NeRF在nerf_synthetic数据集上的结果开始把每一个环节都吃透然后再去探索那些更高效的变体。这个领域变化飞快但万变不离其宗扎实的基础会让你在阅读新论文时事半功倍。