NVIDIA Omniverse NuRec:神经重建合成数据驱动跨平台感知适配

本文深度解读 NVIDIA Omniverse NuRec 技术方案——通过 3D 高斯泼溅(3D Gaussian Splatting)重建真实驾驶场景,为新车型感知系统快速生成合成训练数据,并探讨其对 IMS 座舱数据合成的跨领域启示。

1. 问题:跨车型感知适配困境

1.1 核心挑战

当同一套自动驾驶软件从 SUV 移植到轿车时,感知系统对世界的理解会改变:

变化因素 影响
传感器位置 交通灯在画面中位置不同
标定参数 视野范围变化
车身几何 遮挡模式变化
时间同步 多传感器对齐偏差
覆盖范围 盲区变化

1.2 传统方案的痛点

1
收集新车数据 → 标注 → 训练 → 验证 → 部署
  • 成本高: 每个新车型的数据收集+标注成本数百万美元
  • 周期长: 新车队未就绪时无法收集
  • 长尾问题: 罕见场景无法保证捕获
  • 不可重复: 无法在同一条道路上对比不同车型

1.3 NuRec 的方案

用已有车型的真实驾驶数据,重建 3D 场景,然后从目标车型的传感器位置重新渲染——无需新车采集。

2. NuRec 技术架构

2.1 核心原理

NuRec 基于 3D 高斯泼溅(3D Gaussian Splatting, 3DGS) 技术:

2.2 输入数据格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 原始数据组织结构
clip/
└── raw/
├── generated/ # 6 个相机视频
│ ├── front_wide.mp4 # 120° 前广角
│ ├── front_tele.mp4 # 30° 前长焦
│ ├── cross_left.mp4 # 120° 左交叉
│ ├── cross_right.mp4 # 120° 右交叉
│ ├── rear_left.mp4 # 70° 左后
│ └── rear_right.mp4 # 70° 右后
└── clipgt/parquets/ # 元数据
├── calibration_estimate.parquet # 相机标定
├── egomotion_estimate.parquet # 车辆位姿
└── object_fused.parquet # 动态目标

2.3 关键技术能力

能力 说明 技术基础
新视角合成 从任意相机位置渲染 3D Gaussian Splatting
相机模型支持 Pinhole / Fisheye / F-Theta gsplat 投影
标注复用 原始标注可迁移到新视角 USDZ 场景保留轨迹
时序一致 动态物体保持运动轨迹 重建+跟踪

3. 四步工作流

3.1 Step 1: 获取重建场景

1
2
3
4
5
6
7
8
9
10
11
12
import os
from huggingface_hub import login, snapshot_download

# 1.500+ 重建驾驶场景可供下载
login(token=os.environ.get("HF_TOKEN"))

# 下载一个场景(USDZ 格式)
snapshot_download(
repo_id="nvidia/PhysicalAI-Autonomous-Vehicles-NuRec",
repo_type="dataset",
allow_patterns="sample_set/26.04_release/<scene-uuid>/*",
)

3.2 Step 2: 从目标传感器配置渲染

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 目标传感器配置 JSON
# 每个传感器定义:名称、分辨率、镜头模型、内参、外参
rig_config = {
"sensors": [
{
"name": "camera:front:target:120fov",
"width": 1920,
"height": 1080,
"lens_model": "F-Theta",
"intrinsics": {"fx": 800, "fy": 800, "cx": 960, "cy": 540},
"nominalSensor2Rig_FLU": {
"translation": [1.8, 0, 0.8],
"rotation": [0, 0, 0, 1]
}
}
]
}

# Docker 容器执行渲染
# 导出目标相机轨迹
"""
docker run --rm --gpus all --shm-size=64g \
-v "$SCENE_DIR":/inputs/scene:ro \
-v "$RIG_DIR":/inputs/rig:ro \
-v "$OUTPUT_DIR":/outputs \
"$NUREC_IMAGE" export-custom-rig-trajectory \
--artifact-path="/inputs/scene/$SCENE_FILE" \
--rig-json="/inputs/rig/$RIG_FILE" \
--output=/outputs/custom_rig_trajectories.json
"""

# 稀疏渲染验证
"""
docker run --rm --gpus all --shm-size=64g \
-v "$SCENE_DIR":/inputs/scene:ro \
-v "$OUTPUT_DIR":/outputs \
"$NUREC_IMAGE" render \
--artifact-path="/inputs/scene/$SCENE_FILE" \
--output-dir=/outputs/smoke \
--custom-rig-trajectory=/outputs/custom_rig_trajectories.json \
--renderer=default \
--image-format=png \
--frame-step=30 \ # 稀疏:每30帧渲染1帧
--camera-id=camera_front_target_120fov
"""

3.3 Step 3: Harmonizer 优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# NVIDIA Harmonizer:时序感知后处理模型
# 修正神经渲染的伪影:视角相关失真、色彩不一致、动态物体重建错误

# 构建 Harmonizer 环境
"""
git clone https://github.com/NVIDIA/harmonizer.git
cd harmonizer
docker build -t harmonizer-cosmos-env -f Dockerfile.cosmos .
./download_checkpoints.sh
"""

# 运行 Harmonizer 修正
"""
docker run --rm --gpus all --ipc=host \
--entrypoint python \
-v "$HARMONIZER_DIR":/work \
-v "$RENDER_ROOT":/frames \
-w /work/src \
harmonizer-cosmos-env \
inference_pix2pix_turbo_harmonizer.py \
--input_image="/frames/$CAMERA_ID" \
--model_path=/work/models/diffusion_harmonizer.pkl \
--model_identifier=harmonized \
--timestep=250 \
--resolution=1024 \
--use_sched
"""

# Harmonizer 修正效果:
# - 减少天空伪影
# - 提升视觉一致性
# - 不能修复:标定错误、未覆盖区域、目标相机验证

3.4 Step 4: 感知模型训练

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader

class NuRecSyntheticDataset(Dataset):
"""
NuRec 合成数据集加载器

将渲染+Harmonizer 处理后的图像
与迁移标注一起用于感知模型训练
"""

def __init__(self, render_dir: str, label_dir: str,
transform=None):
"""
Args:
render_dir: Harmonizer 输出图像目录
label_dir: 迁移标注目录(从原始场景适配)
transform: 数据增强
"""
self.render_dir = render_dir
self.label_dir = label_dir
self.transform = transform

# 加载图像列表
self.samples = sorted(os.listdir(render_dir))

def __len__(self):
return len(self.samples)

def __getitem__(self, idx):
# 加载渲染图像
img_path = os.path.join(self.render_dir, self.samples[idx])
image = load_image(img_path) # PIL/numpy

# 加载适配标注
label_path = os.path.join(self.label_dir,
self.samples[idx].replace('.png', '.json'))
labels = load_labels(label_path)

if self.transform:
image, labels = self.transform(image, labels)

return image, labels


class CarlineAdaptationTrainer:
"""
跨车型感知适配训练器

使用 NuRec 合成数据微调感知模型
"""

def __init__(self, model: nn.Module,
source_domain: str,
target_domain: str):
"""
Args:
model: 预训练感知模型(如 BEV 检测器)
source_domain: 源车型数据集
target_domain: 目标车型 NuRec 合成数据
"""
self.model = model
self.source_loader = self._build_loader(source_domain)
self.target_loader = self._build_loader(target_domain)

# 域适应参数
self.domain_weight = 0.5 # 合成数据权重
self.adaptation_epochs = 20

def train(self):
"""
域适应训练

混合源域真实数据和目标域合成数据
"""
optimizer = torch.optim.AdamW(
self.model.parameters(),
lr=1e-4,
weight_decay=0.01
)

for epoch in range(self.adaptation_epochs):
# 衰减合成数据权重
self.domain_weight = max(0.1, 0.5 - epoch * 0.02)

for (src_imgs, src_labels), (tgt_imgs, tgt_labels) in zip(
self.source_loader, self.target_loader
):
# 源域损失(真实数据)
src_loss = self._compute_loss(src_imgs, src_labels)

# 目标域损失(NuRec 合成数据)
tgt_loss = self._compute_loss(tgt_imgs, tgt_labels)

# 加权总损失
total_loss = (1 - self.domain_weight) * src_loss + \
self.domain_weight * tgt_loss

optimizer.zero_grad()
total_loss.backward()
optimizer.step()

print(f"Epoch {epoch+1}/{self.adaptation_epochs}: "
f"src={src_loss:.4f}, tgt={tgt_loss:.4f}")

def _compute_loss(self, imgs, labels):
"""检测损失(简化)"""
outputs = self.model(imgs)
# Focal loss + L1 loss for detection
cls_loss = focal_loss(outputs['cls'], labels['cls'])
reg_loss = l1_loss(outputs['reg'], labels['reg'])
return cls_loss + reg_loss

def _build_loader(self, domain):
"""构建数据加载器"""
return DataLoader(domain, batch_size=8, shuffle=True,
num_workers=4, pin_memory=True)

4. NVIDIA 内部验证结果

4.1 跨车型适配实验

NVIDIA 在内部自动驾驶项目中评估了该工作流:

评估项 结果
场景 从现有车型数据适配到新相机配置
方法 NuRec 渲染 + Harmonizer 修正 + 感知训练
对比基线 零样本迁移(无合成数据)
结果 VRU(弱势道路使用者)精确率和召回率显著提升

4.2 数据集规模

参数 数值
重建场景数 1,500+
每场景时长 ~20 秒
源相机数 6(前广角/前长焦/左交叉/右交叉/左后/右后)
格式 USDZ(OpenUSD)
开放获取 HuggingFace(gated)

5. Agentic Skills 自动化

5.1 nurec-skills 仓库

1
git clone https://github.com/NVIDIA/nurec-skills.git
Skill 功能
physical-ai-datasets 查找和下载 Physical AI 数据集
nre 执行 NuRec 渲染
nurec-fixer 应用 Harmonizer 修正
nurec-carline-adaptation 兼容性和来源管理

5.2 AI Agent 驱动的工作流

1
2
3
4
5
6
7
8
9
# 使用 AI coding agent 执行 NuRec 工作流
agent_prompt = """
Use the $nurec-carline-adaptation skill to:
1. Validate this USDZ and sanitized target rig
2. Show me the exact local Docker commands
3. Run a sparse one-camera smoke test
4. Stop before the full render if any camera or windshield check fails
"""
# AI agent 自动执行验证、渲染、修正全流程

6. 对 IMS 座舱数据合成的启示

6.1 从车外到车内:NuRec 理念的迁移

NuRec 车外方案 IMS 车内适配
6 路车外相机 → 3D 重建 DMS/OMS 多路相机 → 3D 重建
新车型传感器配置渲染 不同座舱布局/光照渲染
Harmonizer 消除伪影 修正车内反光/遮挡伪影
感知模型域适应 DMS 模型跨车型适配

6.2 座舱合成数据管道

6.3 关键应用场景

场景 NuRec 方案 IMS 价值
新车型 DMS 适配 从旧车型数据渲染新视角 无需新车采集即可预训练
光照变化增强 同一场景不同光照渲染 解决 DMS 低光场景数据不足
罕见场景复现 重建后的场景可任意调整 儿童/宠物/异常姿态等长尾
传感器迁移 不同相机模型渲染 标定变化时快速适配
对比实验 同一场景不同配置 公平的 A/B 测试

6.4 技术规格对比

参数 NuRec(车外) IMS 适配(车内)
相机数 6 路车外 2-4 路车内(DMS+OMS)
场景大小 道路场景(开阔) 座舱场景(封闭小空间)
重建难度 中等(动态物体多) 高(反光/遮挡/小空间)
光照变化 日/夜/隧道 日/夜/逆光/隧道
标注类型 车道线/交通灯/物体 人脸/眼睛/姿态/行为
渲染精度要求 中(感知训练) 高(DMS 需精确眼部特征)

6.5 IMS 实施建议

建议 优先级 难度 预期收益
用 NuRec 重建座舱场景 🟡 中 高 跨车型快速适配
Harmonizer 修正反光伪影 🟡 中 中 提升合成数据质量
多光照条件渲染 🔴 高 中 解决低光数据不足
罕见场景合成(儿童/OOP) 🔴 高 高 补充长尾数据
标注自动迁移 🟢 低 高 减少标注成本

7. 技术限制与挑战

7.1 当前局限

限制 原因 影响
动态物体重建质量有限 3DGS 对非刚性物体重建困难 行人/乘员动作可能失真
源相机覆盖不足 未覆盖区域渲染质量差 盲区无法生成数据
Harmonizer 不能修复标定错误 后处理只能改善视觉 需要前置验证
计算资源需求高 多模型并行渲染 需要 GPU 集群

7.2 车内场景的额外挑战

挑战 车外场景 车内场景
反光 较少 大量(仪表盘/窗户/屏幕)
遮挡 相对可控 复杂(方向盘/座椅/手)
小目标 行人/车辆较大 眼睛/嘴巴等小区域
光照动态 缓慢变化 快速变化(进隧道/树荫)
乘员姿态 N/A 高度可变

8. 总结

NVIDIA Omniverse NuRec 代表了合成数据生成从”纯仿真”到”真实重建+重渲染”的范式转变。其核心价值在于:

  1. 复用真实数据:已有车型的驾驶数据可以服务新车型
  2. 保持物理一致性:3D 重建保留真实场景几何
  3. Harmonizer 闭环:后处理修正神经渲染伪影
  4. Agentic 工作流:AI Agent 可自动执行全流程

对 IMS 而言,NuRec 的理念可以迁移到座舱场景:用 DMS/OMS 多路相机重建座舱 3D 环境,然后为不同车型/配置/光照条件渲染合成数据。虽然车内场景的重建难度更高(反光/遮挡/小目标),但这恰恰是目前座舱合成数据最稀缺的方向——罕见场景(儿童、OOP、安全带误用)的真实重建+重渲染可能成为突破数据瓶颈的关键路径。


参考来源:

  • NVIDIA Developer Blog: “Scale AV Perception Across Vehicle Platforms with NVIDIA Omniverse NuRec” (2026-08-28)
  • NVIDIA/nurec-skills GitHub 仓库
  • NVIDIA/harmonizer GitHub 仓库
  • Physical AI NuRec Dataset on HuggingFace