Neural Rendering
神经渲染用神经网络替代图形渲染流水线的部分环节,以生成从照片中学习到的图像和 3D 场景。内容涵盖相关方法和代码。
神经渲染是指使用神经网络生成图像和视频,以替代或增强传统计算机图形流水线的部分环节,同时仍能控制场景属性,例如相机视角、光照、几何形状和外观。传统渲染利用光传输物理原理,根据手工构建的 3D 模型、材质和光源计算图像。神经渲染则从照片和视频中学习其中一些元素,或直接学习生成最终像素。作为一个领域,神经渲染将生成式机器学习与计算机图形学中的物理知识结合起来,通常会把可微渲染融入网络训练。神经渲染可用于生成真实地点的逼真 3D 捕捉、视频游戏中的 AI 升频和帧生成,以及机器人和自动驾驶汽车的仿真。
神经渲染的工作原理#
最具影响力的分支从普通照片中学习 3D 场景。场景表示可以是神经网络、学习得到的特征网格或一组 3D 基元。它通过可微渲染器,从训练照片的相机位置渲染成图像。由于渲染器的每一步都可以求导,渲染图像与真实照片之间的差异就能通过反向传播追溯到场景的每个参数。对多个视角重复这一过程,就能充分重建场景,并渲染出没有任何相机拍摄过的视角:
照片的相机姿态通常由 Structure from Motion 软件(例如 COLMAP)确定。该软件会在重叠照片之间匹配特征,从而还原每张照片的拍摄位置。
神经场景表示#
2020 年提出的神经辐射场(NeRF),将场景存储在多层感知机的权重中,该感知机把 3D 位置和观察方向映射为密度与颜色。要渲染一个像素,NeRF 会沿着穿过该像素的相机射线采样点,并通过体渲染混合这些点的颜色:每个样本的贡献取决于它的不透明度,以及前方样本之后仍能通过的光线量。下面的 PyTorch 代码训练一个微型场,让它重现沿一条射线观测到的一个像素:
import torch
from torch import nn
# A tiny neural field that maps a 3D point to a density and an RGB color
torch.manual_seed(0)
field = nn.Sequential(nn.Linear(3, 64), nn.ReLU(), nn.Linear(64, 4))
optimizer = torch.optim.Adam(field.parameters(), lr=0.01)
# 64 points along one camera ray, and the color a training photo shows for that pixel
depths = torch.linspace(2.0, 6.0, 64)
points = torch.stack([torch.zeros(64), torch.zeros(64), depths], dim=1)
observed = torch.tensor([0.9, 0.4, 0.1])
for step in range(200):
density, color = field(points).split([1, 3], dim=1)
# Volume rendering: each sample's opacity times the light that reaches it through the samples in front
alpha = 1 - torch.exp(-nn.functional.softplus(density.squeeze(1)) * (depths[1] - depths[0]))
transmittance = torch.cumprod(torch.cat([torch.ones(1), 1 - alpha[:-1]]), dim=0)
pixel = (transmittance * alpha) @ torch.sigmoid(color)
loss = ((pixel - observed) ** 2).sum()
optimizer.zero_grad()
loss.backward()
optimizer.step()
if step in (0, 199):
print(f"step {step}: rendered {pixel.detach().numpy().round(2)}, loss {loss.item():.4f}")它会打印 step 0: rendered [0.71 0.37 0.56], loss 0.2496 和 step 199: rendered [0.9 0.4 0.1], loss 0.0000。未训练的网络会渲染出任意颜色,而通过渲染方程反向传播的梯度会调整网络权重,直到渲染像素与照片相符。真实的 NeRF 会对数十到数百张照片中的数百万条射线执行相同操作。
最初的 NeRF 在 NVIDIA V100 GPU 上需要为每个场景训练一到两天,每张渲染图像需要查询网络 1.5 亿到 2 亿次,即每帧约 30 秒。NVIDIA 的 Instant NGP 用学习得到的多分辨率哈希特征表取代了网络的大部分部分,将训练时间缩短到几秒或几分钟,并将 1920×1080 分辨率下的渲染时间缩短到几十毫秒。2023 年的高斯泼溅更进一步,用数百万个显式 3D 高斯表示场景,并通过光栅化实现实时渲染,无需在渲染时运行网络;由于优化方式相同,它通常也被归入神经渲染。
图像空间神经渲染#
第二个分支保留传统渲染器,并利用网络完善或扩展其输出。NVIDIA 的 DLSS 会以较低分辨率渲染游戏,再用Transformer 模型升频;在 GeForce RTX 50 系列 GPU 上,每渲染一帧游戏画面,最多可生成五帧。路径追踪渲染会使用学习型去噪器,根据每个像素的少量光照样本生成干净图像。其他模型则根据场景布局合成图像:NVIDIA 的 GauGAN 将由天空、水和树木组成的语义图转换为逼真的风景;神经头像系统则可以从新角度或新光照条件渲染人物面部。
神经渲染与相关术语的区别#
- 可微渲染:一种输出可以相对于其输入求导的渲染器。它让神经渲染能够从图像中学习;即使不使用任何神经网络也可以使用,例如将网格拟合到照片上。
- 逆向渲染:从图像中还原几何形状、材质和光照,通常使用可微渲染,以便编辑结果并重新渲染。
- 新视角合成:从未见过的视角生成图像的任务,NeRF 和高斯泼溅都可用于此任务;神经渲染则涵盖更广泛的技术。
- 生成式 AI:文本到图像和视频生成模型根据提示创建内容,通常不会显式构建可从选定相机位置观察的场景。










