HelloWorld:生成式驾驶世界模型走向实用化

arXiv 2609.28931 论文解读与 IMS 数据合成启示

论文信息

  • 标题: HelloWorld: Towards Practical Applications of Generative Driving World Models
  • 作者: Fan Lu, Hanshi Wang, Zijing Wang, et al.(23位作者)
  • arXiv: 2609.28931
  • 发布日期: 2026年9月24日
  • 项目页: https://helloworld-4d.github.io
  • 文件大小: 43,485 KB(含视频/模型附件)

核心创新

HelloWorld 是一个 2B 参数的驾驶世界模型,旨在将生成式 AI 从”概念验证”推向”实用化部署”:

传统数据采集: 真实路采 → 标注 → 训练
世界模型范式: HD地图+3D框+ego位姿 → 生成多传感器数据 → 训练

四大实用化要求

要求 传统世界模型 HelloWorld
场景泛化 限于训练分布 从异构视频学习广泛先验
控制响应 弱关联 ego位姿+HD地图+3D框精确控制
多传感器一致 单摄像头 7摄像头同步RGB + LiDAR合成
推理效率 慢 蒸馏到少步推理

架构详解

关键技术组件

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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
"""
HelloWorld 驾驶世界模型核心架构复现

关键组件:
1. 2B参数世界基础模型
2. Block-Causal 生成接口
3. 7摄像头同步生成
4. 条件LiDAR合成
5. 少步推理蒸馏

论文亮点:从异构视频数据学习广义先验,
然后逐步专业化到可控驾驶场景生成
"""

import torch
import torch.nn as nn
from typing import List, Optional, Tuple


class DrivingWorldModel(nn.Module):
"""
2B参数驾驶世界模型

输入条件:
- ego_pose: 自车位姿 (x, y, theta)
- hd_map: HD地图栅格化表示
- 3d_boxes: 3D目标边界框

输出:
- 7摄像头RGB图像
- LiDAR点云
"""

def __init__(self,
latent_dim=256,
num_cameras=7,
map_channels=3,
map_size=256,
hidden_dim=1024,
num_layers=24):
super().__init__()
self.latent_dim = latent_dim
self.num_cameras = num_cameras

# 条件编码器
self.pose_encoder = nn.Sequential(
nn.Linear(3, 64),
nn.ReLU(),
nn.Linear(64, latent_dim)
)

self.map_encoder = nn.Conv2d(
map_channels, latent_dim // 4,
kernel_size=8, stride=4
)

self.box_encoder = nn.Sequential(
nn.Linear(7, 64), # x,y,z,w,h,l,theta
nn.ReLU(),
nn.Linear(64, latent_dim)
)

# 世界模型主干(2B参数)
self.backbone = nn.TransformerEncoder(
nn.TransformerEncoderLayer(
d_model=hidden_dim,
nhead=16,
dim_feedforward=hidden_dim * 4,
dropout=0.1,
batch_first=True
),
num_layers=num_layers
)

# 7摄像头解码器
self.camera_decoders = nn.ModuleList([
CameraDecoder(hidden_dim, out_channels=3)
for _ in range(num_cameras)
])

# LiDAR解码器
self.lidar_decoder = LiDARDecoder(hidden_dim)

def forward(self, ego_pose, hd_map, boxes_3d,
context_frames=None):
"""
前向传播

Args:
ego_pose: (B, 3) 自车位姿
hd_map: (B, C, H, W) HD地图
boxes_3d: (B, N, 7) 3D边界框
context_frames: (B, T, ...) 历史上下文

Returns:
cameras: (B, 7, 3, H, W) 7摄像头RGB
lidar: (B, P, 4) LiDAR点云
"""
# 编码条件
pose_feat = self.pose_encoder(ego_pose)
map_feat = self.map_encoder(hd_map)
map_feat = map_feat.flatten(2).mean(dim=2)

# 编码3D框(取最多N个目标)
B, N, _ = boxes_3d.shape
box_feat = self.box_encoder(boxes_3d)
box_feat = box_feat.mean(dim=1) # 全局池化

# 融合条件
cond = pose_feat + map_feat + box_feat

# 添加上下文
if context_frames is not None:
T = context_frames.shape[1]
context_emb = self._encode_context(context_frames)
seq = torch.cat([context_emb, cond.unsqueeze(1)], dim=1)
else:
seq = cond.unsqueeze(1)

# 世界模型推理
out = self.backbone(seq)
world_state = out[:, -1, :] # 取最后帧

# 解码7摄像头
cameras = []
for decoder in self.camera_decoders:
cam_img = decoder(world_state)
cameras.append(cam_img)
cameras = torch.stack(cameras, dim=1) # (B, 7, 3, H, W)

# 解码LiDAR
lidar = self.lidar_decoder(world_state)

return cameras, lidar

def _encode_context(self, frames):
"""编码历史上下文帧"""
B, T = frames.shape[0], frames.shape[1]
# 简化:使用线性投影
flat = frames.reshape(B, T, -1)
return nn.Linear(flat.shape[-1],
1024).to(flat.device)(flat)


class CameraDecoder(nn.Module):
"""单摄像头解码器"""

def __init__(self, in_dim, out_channels=3):
super().__init__()
self.net = nn.Sequential(
nn.Linear(in_dim, 512),
nn.ReLU(),
nn.Linear(512, 256 * 4 * 4),
nn.ReLU(),
nn.Unflatten(1, (256, 4, 4)),
nn.ConvTranspose2d(256, 128, 4, 2, 1),
nn.ReLU(),
nn.ConvTranspose2d(128, 64, 4, 2, 1),
nn.ReLU(),
nn.ConvTranspose2d(64, 32, 4, 2, 1),
nn.ReLU(),
nn.ConvTranspose2d(32, out_channels, 4, 2, 1),
)

def forward(self, x):
return self.net(x)


class LiDARDecoder(nn.Module):
"""LiDAR点云解码器"""

def __init__(self, in_dim, num_points=16384):
super().__init__()
self.num_points = num_points
self.net = nn.Sequential(
nn.Linear(in_dim, 512),
nn.ReLU(),
nn.Linear(512, num_points * 4),
)

def forward(self, x):
B = x.shape[0]
out = self.net(x)
return out.reshape(B, self.num_points, 4)


# ========== 测试 ==========

if __name__ == "__main__":
# 模型参数量验证
model = DrivingWorldModel(
latent_dim=256,
num_cameras=7,
hidden_dim=1024,
num_layers=24
)

total_params = sum(p.numel() for p in model.parameters())
print(f"=== HelloWorld 模型 ===")
print(f" 总参数量: {total_params / 1e9:.2f}B")
print(f" 摄像头数: 7")
print(f" LiDAR: 条件合成")

# 模拟推理
B = 2
ego_pose = torch.randn(B, 3)
hd_map = torch.randn(B, 3, 256, 256)
boxes_3d = torch.randn(B, 20, 7)

cameras, lidar = model(ego_pose, hd_map, boxes_3d)

print(f"\n=== 推理结果 ===")
print(f" 摄像头输出: {cameras.shape}")
print(f" LiDAR输出: {lidar.shape}")
print(f" 摄像头数: {cameras.shape[1]}")

Block-Causal 生成接口

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
"""
Block-Causal 生成接口
让世界模型支持序列化模拟

核心思想:
- 将时间序列分块(block)
- 每个block内自回归生成
- block间使用因果关系(只能看过去)
- 支持自生成上下文(用模型自己的输出作为下一帧输入)
"""

class BlockCausalGenerator:
"""Block-Causal 序列生成器"""

def __init__(self, world_model, block_size=8):
self.world_model = world_model
self.block_size = block_size

def generate_sequence(self, initial_conditions,
num_frames=64):
"""
生成驾驶序列

Args:
initial_conditions: 初始 ego位姿、地图、3D框
num_frames: 生成帧数

Returns:
sequence: 生成的多帧数据
"""
sequence = []
context = None

for t in range(num_frames):
# 获取当前帧条件
ego = initial_conditions['ego_poses'][t]
hd_map = initial_conditions['hd_map']
boxes = initial_conditions['boxes_3d'][t]

# 生成
cameras, lidar = self.world_model(
ego, hd_map, boxes, context
)

# 存储结果
frame = {
'cameras': cameras,
'lidar': lidar,
'ego_pose': ego
}
sequence.append(frame)

# 更新上下文(使用自生成输出)
if context is None:
context = torch.stack([
cameras.mean(dim=1) # 简化
], dim=1)
else:
new_ctx = cameras.mean(dim=1).unsqueeze(1)
context = torch.cat([context, new_ctx], dim=1)

# 保持上下文长度
if context.shape[1] > self.block_size:
context = context[:, -self.block_size:]

return sequence

评估维度

论文从6个维度全面评估:

评估维度 方法 指标
视觉质量 FID, FVD 与真实数据分布距离
控制保真度 控制响应一致性 ego位姿→生成内容匹配度
跨视图一致性 7摄像头对齐 多视图几何一致性
重复生成鲁棒性 多次推理稳定性 同条件多次生成方差
推理效率 推理时间 每帧生成时间
LiDAR合成质量 点云分布 与真实LiDAR分布对比

对 IMS 开发的启示

1. 座舱数据合成的可行性

HelloWorld 证明了世界模型可以生成多传感器一致数据。对 IMS 的意义:

1
2
当前: 真实路采 → 人工标注 → 训练 DMS/OMS
未来: HD地图+3D框 → 世界模型 → 生成座舱场景 → 自动标注

适用场景:

IMS 场景 可生成内容 价值
DMS 训练 多角度驾驶员图像 视角多样化
OMS 训练 不同乘员组合 场景覆盖
CPD 训练 不同遮挡条件 边缘案例
多摄像头标定 7摄像头同步数据 标定验证

2. NVIDIA Cosmos 生态对比

特性 NVIDIA Cosmos HelloWorld
参数量 未公开 2B
摄像头 通用 7摄像头同步
LiDAR 不支持 条件合成
控制方式 文本/动作 ego位姿+HD地图+3D框
开源 框架开源 项目页+arXiv
适用场景 机器人/AV 自动驾驶

3. 从驾驶世界模型到座舱世界模型

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
"""
将 HelloWorld 架构迁移到座舱场景生成

座舱世界模型需要:
- 输入:座舱3D模型 + 乘员位姿 + 光照条件
- 输出:多摄像头DMS/OMS图像 + 雷达数据

这与 HelloWorld 的多摄像头+LiDAR架构高度对齐
"""

class CabinWorldModel(nn.Module):
"""
座舱世界模型(基于 HelloWorld 架构迁移)

输入条件:
- cabin_3d: 座舱3D模型
- occupant_poses: 乘员位姿(关键点)
- lighting: 光照条件

输出:
- dms_camera: 驾驶员监控摄像头
- oms_cameras: 多角度乘员监控
- radar_data: 雷达数据
"""

def __init__(self, latent_dim=256, num_oms_cameras=3):
super().__init__()

# 座舱3D编码器
self.cabin_encoder = nn.Sequential(
nn.Conv3d(1, 32, 4, 2, 1),
nn.ReLU(),
nn.Conv3d(32, 64, 4, 2, 1),
nn.ReLU(),
nn.AdaptiveAvgPool3d(1),
nn.Flatten(),
nn.Linear(64, latent_dim)
)

# 乘员位姿编码器
self.pose_encoder = nn.Sequential(
nn.Linear(17 * 3, 256), # 17关键点 * 3D
nn.ReLU(),
nn.Linear(256, latent_dim)
)

# 光照编码器
self.lighting_encoder = nn.Sequential(
nn.Linear(4, 64), # R,G,B,intensity
nn.ReLU(),
nn.Linear(64, latent_dim)
)

# 世界模型主干
self.backbone = nn.TransformerEncoder(
nn.TransformerEncoderLayer(
d_model=latent_dim, nhead=8,
dim_feedforward=latent_dim * 4,
batch_first=True
),
num_layers=12
)

# DMS摄像头解码器
self.dms_decoder = CameraDecoder(latent_dim, 3)

# OMS多摄像头解码器
self.oms_decoders = nn.ModuleList([
CameraDecoder(latent_dim, 3)
for _ in range(num_oms_cameras)
])

def forward(self, cabin_3d, occupant_poses, lighting):
"""生成座舱传感器数据"""
cabin_feat = self.cabin_encoder(cabin_3d)
pose_feat = self.pose_encoder(occupant_poses)
light_feat = self.lighting_encoder(lighting)

cond = cabin_feat + pose_feat + light_feat
out = self.backbone(cond.unsqueeze(1))
state = out[:, -1, :]

dms_img = self.dms_decoder(state)
oms_imgs = [dec(state) for dec in self.oms_decoders]

return dms_img, oms_imgs


# 测试
if __name__ == "__main__":
model = CabinWorldModel(latent_dim=256, num_oms_cameras=3)

# 模拟输入
cabin_3d = torch.randn(2, 1, 64, 64, 64)
poses = torch.randn(2, 17 * 3)
lighting = torch.randn(2, 4)

dms, oms = model(cabin_3d, poses, lighting)
print(f"DMS图像: {dms.shape}")
print(f"OMS图像: {len(oms)} 个, 每个 {oms[0].shape}")
print(f"参数量: {sum(p.numel() for p in model.parameters())/1e6:.1f}M")

4. 数据合成管道建议

结论

HelloWorld 代表了驾驶世界模型从”概念验证”到”实用化部署”的关键一步。2B 参数的模型规模、7 摄像头+LiDAR 多传感器生成、block-causal 序列模拟,使其成为最接近量产应用的世界模型之一。

对 IMS 开发而言,世界模型可以直接迁移到座舱场景合成:座舱3D模型+乘员位姿+光照条件 → 生成DMS/OMS训练数据。这将大幅降低数据采集和标注成本,特别是边缘案例(遮挡、异常姿态)的覆盖。


参考链接: