Dynamic-NeRF解决的是动态场景在新视角合成中的核心矛盾:场景随时间变化,但辐射场需要稳定的几何表示。它的做法不是把时间拼到坐标向量里直接训练,而是先训练一个时间条件变形场,把任意时刻的采样点变换到统一的规范空间,再在规范空间里查询颜色和密度。这样动态信息被显式存储在变形场中,规范场不用反复学习相互冲突的时变内容。

接下来从静态NeRF的局限、变形场设计、体渲染训练过程和工程调优几个方面展开。
一、静态NeRF遇上动态场景的问题在哪
静态NeRF假设同一世界坐标在任何时刻对应相同的辐射属性。相机光线穿过空间时,对每个采样点可以稳定查询颜色和密度,因此优化函数只依赖三维坐标与视角方向。动态场景破坏了这个假设,例如行走的人、转动的风扇或流动的水体,同一空间点在不同时间可能属于完全不同的物体表面,颜色和密度会剧烈变化。直接把不同时刻的图像混合进同一个网络,网络会输出平均值或产生重影。
有人尝试把时间 t 作为额外输入,形成六维权值函数 F(x,y,z,θ,φ,t)。理论上网络可以学习时间变化,但实际优化很困难。多层感知机对时间维度的插值能力有限,当运动幅度较大时,坐标与时间之间的耦合关系高度非线性,网络会在高频细节上抖动。Dynamic-NeRF引入变形场的核心目的就是降低这种学习难度,让规范空间回归静态辐射场的稳定性质。
另一个被忽略的问题是几何一致性和训练效率。如果每个时刻都单独建一个NeRF,不仅存储量随视频帧数线性增长,还会丢失相邻帧共有的几何结构。时空建模需要的不是一堆独立快照,而是一个统一的四维表示,变形场与规范场的解耦正是朝这个方向迈出的关键一步。
二、变形场与规范空间如何协同工作
Dynamic-NeRF通常将场景表示成两个网络:变形网络 D 和规范网络 C。给定时刻 t 和世界坐标 x,变形网络输出一个位移向量或刚体变换,把 x 映射为规范坐标 x' = x + D(x,t)。随后 C(x', d) 输出密度 σ 和颜色 c。这样做的好处是,规范网络只负责描述物体在未变形状态下的形状和外观,时间变化被隔离在 D 中。
变形场的设计直接影响动态建模能力。最简单的是预测三维位移,适合弹性形变和局部运动。更复杂的方法预测 SE(3) 变换,用旋转和平移描述刚体运动,适合关节体或刚体场景。部分工作还会加入可学习的潜在编码,使每个时间帧拥有独立的隐变量,再用一个轻量网络生成变形参数。无论哪种形式,变形场都必须保持时间连续性,否则相邻帧会产生跳变。
import torch
import torch.nn as nn
class DeformationNetwork(nn.Module):
def __init__(self, dim=128):
super().__init__()
self.mlp = nn.Sequential(
nn.Linear(4, dim),
nn.ReLU(),
nn.Linear(dim, dim),
nn.ReLU(),
nn.Linear(dim, 3)
)
def forward(self, x, t):
# x: (N, 3) 世界坐标
# t: (N, 1) 时间
inp = torch.cat([x, t], dim=-1)
delta = self.mlp(inp)
return x + delta
class CanonicalNeRF(nn.Module):
def __init__(self, dim=128):
super().__init__()
self.mlp = nn.Sequential(
nn.Linear(3, dim),
nn.ReLU(),
nn.Linear(dim, dim),
nn.ReLU(),
nn.Linear(dim, 4) # RGB + density
)
def forward(self, x_canonical):
out = self.mlp(x_canonical)
density = out[:, :1]
color = torch.sigmoid(out[:, 1:])
return density, color
上面这段代码展示了最基础的位移变形场。实际系统中通常还需要视角方向作为输入,并且会对坐标进行位置编码,使网络能够表达高频几何细节。位置编码把坐标映射到不同频率的正弦或余弦函数,再送入MLP,这样即使较浅的网络也能学习到丰富的纹理和边界。
训练时两条路径是端到端可微的。体渲染损失通过规范网络回传到变形网络,迫使变形网络学会如何把不同时刻的采样点对齐到同一个规范空间。如果变形网络把运动方向预测反了,规范网络接收到的坐标就会错乱,渲染颜色与真实图像差异变大,梯度会逐渐修正这种错位。这种协同优化是Dynamic-NeRF能处理连续运动的关键机制。
三、时空体渲染与损失函数设计
动态场景的渲染仍然使用体积渲染方程。对于某条相机光线 r(s)=o+s*d,在时刻 t 上采样 N 个点,先经过变形网络得到规范坐标,再查询密度和颜色。之后沿着光线积分,颜色 C(r,t) = Σ Ti(1-exp(-σi δi)) ci,其中 Ti 是累积透射率。因为变形网络参与了采样点映射,渲染结果自然携带时间信息。
基础损失是渲染颜色与真实像素颜色的均方误差。仅靠L2损失有时不够,因为变形场可能出现过大的非刚性扭曲,尤其在纹理不明显的区域。很多实现会加入正则项,例如变形场的总变分损失,或表面法向一致性损失,或对位移大小进行惩罚。对于刚体运动较多的场景,还可以约束变形网络的输出接近SE(3)群元素,避免自由度浪费。
def compute_loss(pred_color, target_color, delta, alpha_reg=0.01):
# 颜色重构损失
mse_loss = torch.mean((pred_color - target_color) ** 2)
# 位移平滑正则,限制相邻采样点之间位移变化过猛
delta_diff = delta[1:] - delta[:-1]
reg_loss = torch.mean(delta_diff ** 2)
return mse_loss + alpha_reg * reg_loss
优化过程中通常按照批次随机采样光线和时间。多相机同步拍摄的数据可以直接使用不同视角,单目视频则需要借助姿态估计和深度先验。训练初期可以先固定规范网络,只训练变形网络若干轮,或者采用较低分辨率,让网络先抓住大致的运动趋势,再逐步提高采样分辨率和频率编码范围。这种课程式训练能显著减少早期发散。
训练完成后,推理阶段只需指定新的时间 t 和新的相机位姿,就能渲染出该时刻从任意视角观察的画面。如果时间 t 采样足够密集,还可以生成平滑的视频插帧,甚至调整时间来观察慢动作或反向运动。
四、主要变体与实现取舍
D-NeRF把场景分解为场景流中的变形部分和静态部分,通过可学习的变形场将每帧映射到规范空间。Nerfies侧重手持拍摄的单目视频,在变形场中加入弹性正则和粗到细的优化策略。HyperNeRF进一步把变形空间扩展为更高维环境图,可以处理拓扑变化,例如张嘴、闭合等形态改变。这些方法都遵循变形场加规范场的基本框架,只是在变形表示和训练约束上有所不同。
另一种加速路线是使用张量分解或平面表示。K-Planes将四维空间分解为多个二维平面,TiNeuVox用体素网格编码时空信息。这些方法不再使用纯MLP,而是用显式特征网格加浅层MLP,训练速度可以提升数倍到数十倍。代价是内存占用随空间分辨率增长,且需要额外的平滑约束来避免噪声。
选择哪种实现取决于数据规模和设备条件。如果只有几分钟的单目视频,基于MLP的变形场通常更稳定;如果面对多相机同步采集的高速动态场景,显式时空特征表示更能满足实时或准实时需求。工程上还会混合多种策略,例如用光流初始化变形场、用语义掩膜分离前景和背景,这些都能降低优化难度。
五、常见问题与调优建议
Dynamic-NeRF并不是万能方案。快速运动、严重遮挡和非刚性拓扑变化会导致变形场估计失败。出现这种问题时,可以先检查相机位姿是否准确,因为位姿误差会直接污染时间对应关系。然后尝试增加时间潜在编码维度,或引入光流损失来引导变形网络。对于遮挡区域,加大多视角覆盖比单纯调整网络结构更有效。
另一个典型问题是训练时间过长。采样点数量、MLP层数和位置编码频率是影响速度的主要因素。可以先用低分辨率图像和低频率编码训练,再逐步提高。推理时对同一时刻的多条光线做批处理,使用CUDA和半精度浮点可以进一步提升吞吐。
如果规范空间出现几何漂移,即静态背景也跟着变形,建议对背景区域单独建模或加入静态场景先验。最终效果稳定后,动态场景的4D表示还可以用于动作重定向、视角回放和数字资产生成,这是它比起传统逐帧重建更有吸引力的地方。
Dynamic-NeRF4D时空建模神经辐射场修改时间:2026-08-23 15:11:59