Implicit Neural Representations (INRs)
隐式神经表示将图像、形状或 3D 场景存储为一个把坐标映射为数值的神经网络,可在任意分辨率下进行查询。
隐式神经表示(INR)将信号表示为由神经网络学习得到的连续函数,通常使用小型多层感知机(MLP)将坐标映射为数值。图像可表示为从像素位置 (x, y) 到颜色的函数;3D 形状可表示为从点 (x, y, z) 到其与表面有符号距离的函数;场景则可表示为从点和观察方向到颜色与密度的函数。网络权重就是这种表示:它不包含像素或体素网格,因此可以查询任意坐标处的信号,内存占用不会随输出分辨率增长,而且通过自动微分可以直接获得导数。INR 也称为基于坐标的网络或神经场,是神经辐射场以及许多现代3D 重建方法的基础。
隐式神经表示的工作原理#
INR 每次只拟合一个信号。训练时对坐标进行采样,将网络输出与这些坐标处的真实值进行比较,并通过梯度下降更新权重,因此拟合过程本质上是有意进行的过拟合:目标就是记住这个信号。使用 ReLU 激活函数的普通 MLP 表现不佳,因为网络学习低频信息的速度远快于高频信息;Nasim Rahaman 及其同事在 2019 年将这种现象称为频谱偏置。若直接输入原始坐标,网络生成的信号会很模糊。2020 年有两项改进让 INR 变得实用:一种是将坐标映射为多个频率下的正弦和余弦,即 Matthew Tancik 及其同事提出的 Fourier 特征以及 NeRF 的位置编码;另一种是用正弦激活函数替换 ReLU,例如 Vincent Sitzmann 及其同事提出的 SIREN。
下面的 PyTorch 示例将同一个 MLP 对一张照片拟合两次,一次使用原始坐标,另一次使用 Fourier 特征:
import torch
from skimage import data, transform
from torch import nn
torch.manual_seed(0)
# The signal: a 128 x 128 grayscale photo, and the (x, y) coordinate of every pixel in [-1, 1]
image = torch.tensor(transform.resize(data.camera(), (128, 128)), dtype=torch.float32).reshape(-1, 1)
grid = torch.linspace(-1, 1, 128)
coords = torch.stack(torch.meshgrid(grid, grid, indexing="ij"), dim=-1).reshape(-1, 2)
# Fourier features: sines and cosines of the coordinates at 128 random frequencies
proj = torch.pi * coords @ (10 * torch.randn(2, 128))
inputs = {"Raw coordinates": coords, "Fourier features": torch.cat([proj.sin(), proj.cos()], dim=-1)}
for name, x in inputs.items():
# The INR: a small MLP from coordinate to gray value, fit to this one image
mlp = nn.Sequential(nn.Linear(x.shape[1], 256), nn.ReLU(), nn.Linear(256, 256), nn.ReLU(), nn.Linear(256, 1))
optimizer = torch.optim.Adam(mlp.parameters(), lr=1e-3)
for _ in range(1000):
loss = (mlp(x) - image).pow(2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"{name}: PSNR {-10 * torch.log10(loss).item():.1f} dB")经过 1,000 步训练后,使用原始坐标的网络达到 22.0 dB 峰值信噪比,生成的图像比较模糊;而使用 Fourier 特征的网络达到 46.0 dB,几乎可以精确复制原图。这里的频率尺度设为 10,但需要针对不同信号进行调整:太低时拟合结果仍然模糊,太高时网络会记住采样点,却在采样点之间产生噪声值。Meta 的 Segment Anything Model 在 Ultralytics 软件包中运行,它使用相同的随机高斯 Fourier 特征对点提示和边界框提示的坐标进行编码,然后再将其传给掩码解码器。
形状、场景与速度#
用于 3D 形状的 INR 于 2019 年出现:DeepSDF 预测有符号距离,Occupancy Networks 则预测任意 3D 点位于形状内部还是外部的概率,因此可以在任意分辨率下提取网格。NeRF 于 2020 年问世,将位置和视角方向映射为颜色和密度,用于新视角合成。纯 MLP 训练和查询速度都很慢,因此混合设计会将学习到的特征存储在网格中,再用一个极小的 MLP 解码。Thomas Müller 及其 NVIDIA 同事提出的 Instant-NGP 使用多分辨率特征哈希表,可在几秒内拟合 NeRF,而非数小时。
与 INR 不同,像素网格、体素网格、网格和点云等显式表示会直接存储数值,并且会随分辨率增大;体素网格的增长速度则是立方级。高斯泼溅是 NeRF 的一种近期显式替代方案,它通过光栅化数百万个 3D 高斯实现更快渲染。由于基础 INR 只针对单个信号进行拟合,要让它泛化到多个信号就需要额外机制:超网络根据潜在代码输出 INR 权重,或通过元学习学习一个能够在几步内拟合新信号的初始化参数。










