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) 技术:
flowchart LR
A[真实驾驶录制<br/>6相机+标定+运动] --> B[3D 高斯泼溅重建<br/>神经辐射场]
B --> C[USDZ 场景文件<br/>3D 重建环境]
C --> D[目标车型传感器配置<br/>JSON rig 文件]
D --> E[新视角渲染<br/>目标相机视角]
E --> F[Harmonizer 优化<br/>消除伪影]
F --> G[合成训练数据<br/>用于感知模型训练]
2.2 输入数据格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 clip/ └── raw/ ├── generated/ │ ├── front_wide.mp4 │ ├── front_tele.mp4 │ ├── cross_left.mp4 │ ├── cross_right.mp4 │ ├── rear_left.mp4 │ └── rear_right.mp4 └── 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 osfrom huggingface_hub import login, snapshot_downloadlogin(token=os.environ.get("HF_TOKEN" )) 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 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 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 """ git clone https://github.com/NVIDIA/harmonizer.git cd harmonizer docker build -t harmonizer-cosmos-env -f Dockerfile.cosmos . ./download_checkpoints.sh """ """ 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 """
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 torchimport torch.nn as nnfrom torch.utils.data import Dataset, DataLoaderclass 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) 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) 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:.4 f} , tgt={tgt_loss:.4 f} " ) def _compute_loss (self, imgs, labels ): """检测损失(简化)""" outputs = self .model(imgs) 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(弱势道路使用者)精确率和召回率显著提升
graph LR
A[源车型真实数据] --> B[NuRec 重建]
B --> C[目标车型渲染]
C --> D[Harmonizer 优化]
D --> E[感知模型训练]
E --> F[目标车型部署]
G[零样本基线] --> F
E -.->|相比基线| F
style E fill:#4CAF50,color:#fff
style F fill:#2196F3,color:#fff
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 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 """
6. 对 IMS 座舱数据合成的启示 6.1 从车外到车内:NuRec 理念的迁移
NuRec 车外方案
IMS 车内适配
6 路车外相机 → 3D 重建
DMS/OMS 多路相机 → 3D 重建
新车型传感器配置渲染
不同座舱布局/光照渲染
Harmonizer 消除伪影
修正车内反光/遮挡伪影
感知模型域适应
DMS 模型跨车型适配
6.2 座舱合成数据管道
flowchart TD
A[真实座舱录制<br/>DMS+OMS 多路视频] --> B[3D 重建<br/>座舱神经辐射场]
B --> C[目标配置渲染<br/>新车型/新相机位置]
C --> D[光照变化渲染<br/>白天/夜间/逆光]
D --> E[乘员场景渲染<br/>成人/儿童/空座]
E --> F[Harmonizer 修正]
F --> G[标注迁移<br/>自动适配新视角]
G --> H[DMS/OMS 模型训练]
style B fill:#2196F3,color:#fff
style D fill:#FF9800,color:#fff
style H fill:#4CAF50,color:#fff
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 代表了合成数据生成从”纯仿真”到”真实重建+重渲染”的范式转变。其核心价值在于:
复用真实数据 :已有车型的驾驶数据可以服务新车型
保持物理一致性 :3D 重建保留真实场景几何
Harmonizer 闭环 :后处理修正神经渲染伪影
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