mmMind:教基础模型”读懂”毫米波雷达——人体行为理解新范式

论文标题: Teaching Foundation Models to Read mmWave: Pose-Guided Kinematic Representation for Human Behavior Understanding
作者: Duo Zhang, Zhehui Yin, Zhiyun Yao 等(北京大学 + ETH Zürich)
发布时间: 2026年8月4日(v2: 8月9日)
arXiv: 2608.04127
Benchmark: mmMind-Bench(17.9小时,23名参与者,7类室内环境)


核心创新

mmMind 首次将大语言模型(LLM)与 mmWave 雷达结合,创建了一个能”理解”雷达信号行为的雷达-语言模型:

  1. Pose-Guided 预训练:用 3D 姿态作为训练时监督,推理时仅需雷达
  2. 雷达-语言对齐:将雷达表示与 LLM 对齐,实现行为描述和问答
  3. mmMind-Bench:首个真实世界 mmWave-语言基准

1. 为什么需要 mmMind?

1.1 LLM Agent 需要感知物理世界

当前 LLM Agent 主要通过文本和图像感知世界,但在以下场景中摄像头不可用:

场景 摄像头 mmWave 雷达
浴室/卧室 ❌ 隐私 ✅
夜间监控 ❌ 需要光照 ✅
穿墙感知 ❌ ✅
车内后排 ⚠️ 遮挡 ✅
长期健康监测 ❌ 隐私+存储 ✅

1.2 技术挑战

挑战 描述 mmMind 方案
雷达信号难以语言化 雷达回波与自然语言差异巨大 姿态作为中间桥梁
缺乏配对数据 雷达-语言配对数据极少 用姿态预训练,再与 LLM 对齐
泛化能力不足 现有方法依赖合成数据 真实世界基准 mmMind-Bench

2. 方法详解

2.1 整体架构

2.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
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
import torch
import torch.nn as nn

class SpatioTemporalRadarEncoder(nn.Module):
"""
时空雷达编码器

捕获体态配置和运动动态
论文 Section 3.1

输入:雷达张量序列 (B, T, C, D_r, D_d, D_a)
输出:时空特征序列 (B, T, hidden)
"""
def __init__(self, in_channels=4, hidden=256,
num_heads=4, num_layers=4):
super().__init__()

# 空间编码:3D CNN 处理每帧雷达张量
self.spatial_encoder = nn.Sequential(
nn.Conv3d(in_channels, hidden // 4, 3, stride=2, padding=1),
nn.BatchNorm3d(hidden // 4),
nn.ReLU(),
nn.Conv3d(hidden // 4, hidden // 2, 3, stride=2, padding=1),
nn.BatchNorm3d(hidden // 2),
nn.ReLU(),
nn.Conv3d(hidden // 2, hidden, 3, stride=2, padding=1),
nn.BatchNorm3d(hidden),
nn.ReLU(),
nn.AdaptiveAvgPool3d(1)
)

# 时间编码:Transformer 处理序列
self.temporal_pos_embed = nn.Parameter(torch.randn(1, 256, hidden))
encoder_layer = nn.TransformerEncoderLayer(
d_model=hidden,
nhead=num_heads,
dim_feedforward=hidden * 4,
dropout=0.1,
activation='gelu',
batch_first=True
)
self.temporal_encoder = nn.TransformerEncoder(encoder_layer, num_layers)

def forward(self, radar_sequence):
"""
Args:
radar_sequence: (B, T, C, D_r, D_d, D_a)
Returns:
features: (B, T, hidden) - 时空特征
"""
B, T = radar_sequence.shape[:2]

# 空间编码每帧
spatial_feats = []
for t in range(T):
feat = self.spatial_encoder(radar_sequence[:, t]) # (B, hidden, 1, 1, 1)
spatial_feats.append(feat.flatten(1))
spatial_feats = torch.stack(spatial_feats, dim=1) # (B, T, hidden)

# 加入时间位置编码
spatial_feats = spatial_feats + self.temporal_pos_embed[:, :T, :]

# 时间编码
temporal_feats = self.temporal_encoder(spatial_feats)

return temporal_feats


class PoseGuidedPretraining(nn.Module):
"""
Stage 1: 姿态引导预训练

训练时用 3D 姿态作为监督
推理时移除姿态头,仅用雷达

论文 Section 3.2
"""
def __init__(self, hidden=256, pose_dim=66): # 22 joints * 3
super().__init__()
self.encoder = SpatioTemporalRadarEncoder()

# 姿态预测头(训练时使用,推理时移除)
self.pose_head = nn.Sequential(
nn.Linear(hidden, hidden),
nn.GELU(),
nn.Linear(hidden, pose_dim)
)

def forward(self, radar_sequence, return_pose=False):
features = self.encoder(radar_sequence)

if return_pose:
# 训练时预测姿态
pose_pred = self.pose_head(features)
return features, pose_pred
else:
# 推理时仅返回特征
return features


class mmMindModel(nn.Module):
"""
mmMind: 完整的雷达-语言模型

论文:arXiv:2608.04127
"""
def __init__(self, hidden=256, llm_dim=4096,
num_radar_tokens=32):
super().__init__()

# 雷达编码器(姿态引导预训练后冻结)
self.radar_encoder = PoseGuidedPretraining(hidden=hidden)
for param in self.radar_encoder.parameters():
param.requires_grad = False

# 投影层:雷达特征 -> LLM 空间
self.projection = nn.Sequential(
nn.Linear(hidden, llm_dim),
nn.GELU(),
nn.Linear(llm_dim, llm_dim)
)

# 可学习的查询 Token
self.query_tokens = nn.Parameter(
torch.randn(num_radar_tokens, llm_dim)
)

# LLM(使用 LoRA 微调)
# 假设使用 LLaMA-3 8B
# 实际使用 transformers 库
self.llm_dim = llm_dim

def forward(self, radar_sequence, text_input=None):
"""
Args:
radar_sequence: (B, T, C, D_r, D_d, D_a)
text_input: 文本输入(问答模式)
Returns:
radar_tokens: (B, num_tokens, llm_dim) - 用于 LLM
"""
# 雷达编码
features = self.radar_encoder(radar_sequence) # (B, T, hidden)

# 投影到 LLM 空间
projected = self.projection(features) # (B, T, llm_dim)

# 扩展查询 Token
B = projected.shape[0]
queries = self.query_tokens.unsqueeze(0).expand(B, -1, -1)

# 简化的 Token 融合
radar_tokens = torch.cat([queries, projected], dim=1)

return radar_tokens

2.3 mmMind-Bench 基准

属性 值
总时长 17.9 小时
参与者 23 名
环境 7 类室内(客厅、卧室、厨房、浴室、办公室、走廊、楼梯间)
任务 行为描述、时空问答、未见动作泛化
传感器 mmWave 雷达 + 同步 3D 动捕
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
class mmMindBench:
"""mmMind-Bench 基准数据集说明"""

TASKS = {
'captioning': {
'description': '根据雷达信号描述人体行为',
'example_input': '雷达流(10s, 30fps)',
'example_output': '一个人从客厅走入厨房,打开冰箱,取出一瓶水后关闭冰箱门。',
'evaluation': 'BLEU, ROUGE, CIDEr'
},
'qa': {
'description': '时空问答',
'example_q': '这个人在第5秒时在做什么?',
'example_a': '他正坐在沙发上,看起来在用右手操作手机。',
'evaluation': '准确率, F1'
},
'generalization': {
'description': '未见动作泛化',
'test': '训练集不含的动作类别',
'evaluation': 'zero-shot 准确率'
}
}

ACTIONS = [
'walking', 'sitting', 'standing', 'waving',
'picking_up', 'placing_down', 'opening_door',
'drinking', 'phone_use', 'reading',
'cleaning', 'cooking', 'exercising',
'falling', 'lying_down', 'searching'
]

3. 实验结果

3.1 主要结果

任务 指标 基线 mmMind 提升
行为描述 BLEU-4 12.3 28.7 16.4↑
行为描述 CIDEr 45.2 82.1 36.9↑
时空问答 准确率 38.5% 62.3% 23.8%↑
未见动作 准确率 22.1% 45.7% 23.6%↑

3.2 消融实验

配置 BLEU-4 QA准确率 说明
完整 mmMind 28.7 62.3% 姿态引导 + LLM 对齐
无姿态引导 19.2 48.5% -9.5 BLEU, -13.8%
无 LLM 对齐 15.1 35.2% 直接分类
合成数据训练 22.3 52.1% 泛化差

关键发现: 姿态引导预训练是核心贡献,移除后性能下降 33-34%。


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
"""
mmMind 推理管道复现
论文:arXiv:2608.04127
"""

import torch
import numpy as np

def test_mmmind():
print("=" * 60)
print("mmMind 雷达-语言模型测试")
print("=" * 60)

# 模型配置
hidden = 256
llm_dim = 4096 # LLaMA-3 8B hidden dim
num_radar_tokens = 32

model = mmMindModel(hidden=hidden, llm_dim=llm_dim,
num_radar_tokens=num_radar_tokens)

# 模拟雷达流:10秒,30fps,4通道,64x16x32
T = 10 # 10 帧(每帧 ~1s 的雷达数据)
radar_stream = torch.randn(1, T, 4, 64, 16, 32)

# 推理
radar_tokens = model(radar_stream)

print(f"输入: {radar_stream.shape} (B, T, C, D_r, D_d, D_a)")
print(f"输出: {radar_tokens.shape} (B, num_tokens + T, llm_dim)")
print(f"Token 数: {radar_tokens.shape[1]} (32 查询 + {T} 时空)")

# 参数量
total = sum(p.numel() for p in model.parameters())
trainable = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f"\n总参数量: {total / 1e6:.2f}M")
print(f"可训练参数: {trainable / 1e6:.2f}M")
print(f"冻结参数: {(total - trainable) / 1e6:.2f}M")

# 推理速度
import time
model.eval()
with torch.no_grad():
for _ in range(5):
_ = model(radar_stream)
times = []
for _ in range(20):
start = time.perf_counter()
_ = model(radar_stream)
times.append((time.perf_counter() - start) * 1000)

print(f"\n雷达编码延迟: {np.mean(times):.2f} ms")
print(f"理论帧率: {1000 / np.mean(times):.1f} fps")

return model


def test_action_recognition():
"""行为识别测试"""
print("\n" + "=" * 60)
print("行为识别测试")
print("=" * 60)

model = mmMindModel()
model.eval()

# 模拟不同行为的雷达流
actions = {
'sitting': torch.randn(1, 10, 4, 64, 16, 32) * 0.5, # 低动态
'walking': torch.randn(1, 10, 4, 64, 16, 32) * 3.0, # 高动态
'falling': torch.randn(1, 10, 4, 64, 16, 32) * 5.0, # 突变动态
}

with torch.no_grad():
for name, radar in actions.items():
tokens = model(radar)
# 计算动态特征
dynamic_energy = torch.std(tokens, dim=1).mean().item()
print(f"{name:12s}: token 能量 = {dynamic_energy:.4f}")


if __name__ == "__main__":
model = test_mmmind()
test_action_recognition()

5. IMS 开发启示

5.1 座舱行为理解新范式

mmMind 的雷达-语言模型可应用于座舱:

应用场景 雷达输入 LLM 输出
驾驶员状态 mmWave DMS 雷达 “驾驶员正在打哈欠,可能疲劳”
后排乘员行为 座舱 mmWave “后排左座乘客在低头看手机”
异常事件 mmWave 监控 “检测到驾驶员突然前倾,可能突发疾病”
儿童行为 CPD 雷达 “后排有儿童在移动,可能未系安全带”

5.2 与现有 DMS 的融合

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
class mmMindCabinIntegration:
"""mmMind 与座舱 DMS 的集成方案"""

def __init__(self):
self.scenarios = {
'driver_monitoring': {
'radar_input': 'A柱 mmWave 雷达',
'current_method': 'IR 摄像头',
'mmind_advantage': '隐私友好 + 穿遮挡',
'implementation': '姿态引导预训练 + 座舱动作微调'
},
'rear_occupant': {
'radar_input': '车顶 mmWave 雷达',
'current_method': '无/座椅传感器',
'mmind_advantage': '行为理解 + 描述',
'implementation': 'mmMind + 问答接口'
},
'cpd_enhanced': {
'radar_input': 'UWB + 60GHz',
'current_method': '二分类(有人/无人)',
'mmind_advantage': '行为描述("婴儿在呼吸" vs "婴儿在动")',
'implementation': 'mmMind 微调 + CPD 数据'
},
'safety_event': {
'radar_input': '座舱多雷达',
'current_method': '规则触发',
'mmind_advantage': '语义理解("驾驶员突然倒向右侧")',
'implementation': 'mmMind + 紧急事件微调'
}
}

5.3 与 RaStream / Wave2Body 的互补

模型 输出 优势 座舱角色
RaStream SMPL-X 网格 时间稳定 + 边缘部署 精细姿态
Wave2Body 22 关节骨架 跨域泛化 + 极快 快速骨架
mmMind 语言描述 + 问答 语义理解 + LLM 交互 行为解释

三层架构: RaStream/Wave2Body 做底层姿态 → mmMind 做语义理解 → LLM 做决策和交互


6. 局限与未来方向

  1. LLM 延迟:LLM 推理延迟可能不适合实时安全系统
  2. 训练数据需求:需要大量雷达-姿态配对数据
  3. 座舱环境差异:室内 benchmark 与车内环境有差距
  4. 多人场景:当前针对单人,座舱需多人

改进方向: 使用轻量 LLM(1-3B 参数)+ 座舱专用微调 + 多人扩展


论文信息

  • arXiv: 2608.04127
  • 机构: 北京大学、ETH Zürich
  • 代码: 待发布
  • Benchmark: mmMind-Bench(17.9h, 23人, 7环境)