PART:物理感知雷达 Transformer — 类不可知移动目标检测新范式,IMS 舱内雷达感知的下一站

论文:If It Moves, Radar Knows: A Physics-Aware Radar Transformer for Class-Agnostic Moving-Object Detection
作者:Yinghao Sun 等
会议:提交至 2027 ICRA
arXiv:2609.02289
代码:GitHub


论文信息

项目 内容
标题 If It Moves, Radar Knows: A Physics-Aware Radar Transformer for Class-Agnostic Moving-Object Detection
作者 Yinghao Sun 等
会议/期刊 提交至 IEEE ICRA 2027
年份 2026
arXiv 2609.02289
代码 公开(GitHub)

核心创新

PART 提出了一种纯雷达驱动的类不可知(class-agnostic)移动目标检测器,解决了传统检测器只能识别训练集中已知类别的致命缺陷。核心贡献三点:

  1. Doppler-Aware Query Initialization (DAQI) — 用多普勒速度聚类初始化查询,替代场景无关的学习式查询
  2. Physics-Guided Cross-Attention (PGCA) — 将径向-多普勒一致性和雷达截面积(RCS)物理约束嵌入注意力机制
  3. Uncertainty-Aware Supervision — 随机遮蔽GT目标,为模糊雷达回声分配软存在标签,减少对穷举标注的依赖

模型仅 1.1M 参数,在 nuScenes 上达到 CA-AP 0.8827,在夜间/雨/遮挡场景下依然有效。


方法详解

1. 问题定义

传统 3D 目标检测器在闭集标注上训练,无法检测稀有/未知移动目标。汽车雷达提供类别无关的多普勒运动线索,但稀疏、噪声大,难以恢复完整 3D 框。PART 退而求其次,预测存在置信度、表面点位置和 2D 地面速度,而非完整 3D 框——这对舱内雷达感知有重要启发。

2. 核心方法

2.1 Doppler-Aware Query Initialization (DAQI)

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
import torch
import torch.nn as nn
from sklearn.cluster import DBSCAN

class DopplerAwareQueryInit(nn.Module):
"""
DAQI: 用多普勒速度+位置聚类初始化查询

论文 Section 3.2: 用输入依赖的聚类提议替代场景无关的学习式查询

Args:
num_queries: 查询数量上限
velocity_threshold: 速度聚类阈值 (m/s)
position_threshold: 位置聚类阈值 (m)
embed_dim: 嵌入维度
"""

def __init__(self, num_queries=100, velocity_threshold=0.5,
position_threshold=2.0, embed_dim=256):
super().__init__()
self.num_queries = num_queries
self.vel_thresh = velocity_threshold
self.pos_thresh = position_threshold
self.query_embed = nn.Linear(6, embed_dim) # x, y, z, vx, vy, vz

def forward(self, radar_points):
"""
Args:
radar_points: (N, 6+), columns=[x, y, z, vx, vy, vz, rcs, ...]

Returns:
queries: (Q, embed_dim) 初始化的查询嵌入
reference_points: (Q, 3) 参考点坐标
"""
N = radar_points.shape[0]

# Step 1: 速度过滤——只保留有运动的点
speeds = torch.norm(radar_points[:, 3:5], dim=-1) # 2D 速度
moving_mask = speeds > 0.1 # m/s
moving_points = radar_points[moving_mask]

if len(moving_points) < 4:
# 退化处理:均匀采样
idx = torch.randperm(N)[:self.num_queries]
moving_points = radar_points[idx]

# Step 2: 联合位置+速度聚类
# 在 (x, y, vx, vy) 空间做 DBSCAN 聚类
features = moving_points[:, [0, 1, 3, 4]].cpu().numpy()
clustering = DBSCAN(
eps=self.pos_thresh,
min_samples=3
).fit(features)

labels = clustering.labels_
unique_labels = set(labels) - {-1}

# Step 3: 每个聚类生成一个查询
query_list = []
ref_list = []

for label in unique_labels:
mask = labels == label
cluster = moving_points[mask]

# 聚类中心作为参考点
ref_point = cluster[:, :3].mean(dim=0)

# 聚类统计特征作为查询嵌入
center = cluster[:, :3].mean(dim=0)
velocity = cluster[:, 3:5].mean(dim=0)
rcs = cluster[:, 6].mean() if cluster.shape[1] > 6 else 0.0

query_feat = torch.cat([center, velocity, rcs.unsqueeze(0)])[:6]
query_list.append(query_feat)
ref_list.append(ref_point)

# 补齐到固定数量
while len(query_list) < self.num_queries:
idx = torch.randint(0, N, (1,))
query_feat = torch.cat([
radar_points[idx, 0:3].squeeze(0),
radar_points[idx, 3:5].squeeze(0),
torch.tensor([0.0])
])
query_list.append(query_feat)
ref_list.append(radar_points[idx, 0:3].squeeze(0))

queries = torch.stack(query_list[:self.num_queries])
refs = torch.stack(ref_list[:self.num_queries])

# 投影到嵌入空间
query_embeddings = self.query_embed(queries)

return query_embeddings, refs


# 测试
if __name__ == "__main__":
daqi = DopplerAwareQueryInit(num_queries=50, embed_dim=256)

# 模拟雷达点云 (N, 7): x, y, z, vx, vy, vz, rcs
torch.manual_seed(42)
radar_data = torch.randn(200, 7) * 5 # 200个点
radar_data[:, 3:5] *= 2 # 放大速度

queries, refs = daqi(radar_data)
print(f"Queries shape: {queries.shape}") # (50, 256)
print(f"Reference points shape: {refs.shape}") # (50, 3)
print(f"Moving points ratio: {(torch.norm(radar_data[:,3:5],dim=-1) > 0.1).float().mean():.2%}")

2.2 Physics-Guided Cross-Attention (PGCA)

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
class PhysicsGuidedCrossAttention(nn.Module):
"""
PGCA: 将径向-多普勒一致性和 RCS 物理约束嵌入注意力

论文 Section 3.3: 物理引导的交叉注意力

核心思想:
- 径向速度一致性: 雷达测量的径向速度应与查询到点的方向一致
- RCS 相关性: 大 RCS 的雷达点更可能对应真实目标
"""

def __init__(self, embed_dim=256, num_heads=8):
super().__init__()
self.embed_dim = embed_dim
self.num_heads = num_heads
self.head_dim = embed_dim // num_heads

# 标准注意力投影
self.q_proj = nn.Linear(embed_dim, embed_dim)
self.k_proj = nn.Linear(embed_dim, embed_dim)
self.v_proj = nn.Linear(embed_dim, embed_dim)

# 物理特征投影
self.physics_proj = nn.Linear(4, num_heads) # 径向一致性, RCS, 距离, 速度

self.scale = self.head_dim ** -0.5
self.out_proj = nn.Linear(embed_dim, embed_dim)

def compute_radial_consistency(self, query_pos, point_pos, point_velocity):
"""
计算径向-多普勒一致性

径向速度 = velocity · (point_pos - query_pos) / ||point_pos - query_pos||

Args:
query_pos: (Q, 3) 查询位置
point_pos: (N, 3) 雷达点位置
point_velocity: (N, 3) 雷达点速度

Returns:
consistency: (Q, N) 径向一致性分数
"""
# 方向向量 (Q, N, 3)
diff = point_pos.unsqueeze(0) - query_pos.unsqueeze(1) # (Q, N, 3)
dist = torch.norm(diff, dim=-1, keepdim=True).clamp(min=0.1)
direction = diff / dist # (Q, N, 3)

# 径向速度 (Q, N)
radial_vel = (point_velocity.unsqueeze(0) * direction).sum(dim=-1) # (Q, N)

# 一致性分数: 径向速度越接近测量速度,分数越高
measured_speed = torch.norm(point_velocity, dim=-1) # (N,)
consistency = torch.abs(radial_vel) / (measured_speed.unsqueeze(0) + 0.1)
consistency = consistency.clamp(0, 1)

return consistency

def forward(self, query_feat, key_feat, value_feat,
query_pos, point_pos, point_velocity, point_rcs):
"""
Args:
query_feat: (Q, D) 查询特征
key_feat: (N, D) 键特征
value_feat: (N, D) 值特征
query_pos: (Q, 3) 查询位置
point_pos: (N, 3) 雷达点位置
point_velocity: (N, 3) 雷达点速度
point_rcs: (N,) 雷达截面积
"""
Q, D = query_feat.shape
N = key_feat.shape[0]
H = self.num_heads

# 标准注意力
q = self.q_proj(query_feat).view(Q, H, self.head_dim).transpose(0, 1)
k = self.k_proj(key_feat).view(N, H, self.head_dim).transpose(0, 1)
v = self.v_proj(value_feat).view(N, H, self.head_dim).transpose(0, 1)

attn = torch.matmul(q, k.transpose(-2, -1)) * self.scale # (H, Q, N)

# 物理引导偏置
consistency = self.compute_radial_consistency(
query_pos, point_pos, point_velocity
) # (Q, N)

distance = torch.norm(
point_pos.unsqueeze(0) - query_pos.unsqueeze(1),
dim=-1
) # (Q, N)

physics_input = torch.stack([
consistency, # 径向一致性
point_rcs.unsqueeze(0).expand(Q, -1) / 10.0, # RCS 归一化
1.0 / (distance + 1.0), # 距离衰减
torch.norm(point_velocity, dim=-1).unsqueeze(0).expand(Q, -1), # 速度
], dim=-1) # (Q, N, 4)

physics_bias = self.physics_proj(physics_input) # (Q, N, H)
physics_bias = physics_bias.permute(2, 0, 1) # (H, Q, N)

attn = attn + physics_bias
attn = torch.softmax(attn, dim=-1)

out = torch.matmul(attn, v) # (H, Q, head_dim)
out = out.transpose(0, 1).reshape(Q, D)
out = self.out_proj(out)

return out


# 测试
if __name__ == "__main__":
pgca = PhysicsGuidedCrossAttention(embed_dim=256, num_heads=8)

Q, N, D = 50, 200, 256
query_feat = torch.randn(Q, D)
key_feat = torch.randn(N, D)
value_feat = torch.randn(N, D)
query_pos = torch.randn(Q, 3)
point_pos = torch.randn(N, 3)
point_vel = torch.randn(N, 3)
point_rcs = torch.rand(N) * 10

out = pgca(query_feat, key_feat, value_feat,
query_pos, point_pos, point_vel, point_rcs)
print(f"PGCA output shape: {out.shape}") # (50, 256)
print(f"Parameters: {sum(p.numel() for p in pgca.parameters()):,}")

2.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
def uncertainty_aware_loss(
predictions,
ground_truth,
mask_prob=0.3,
soft_label=0.3
):
"""
不确定性感知监督

论文 Section 3.4: 随机遮蔽 GT 目标,为模糊回声分配软标签

核心思想:
- 以概率 mask_prob 随机遮蔽真实目标
- 对于有雷达支持但无标注的查询,分配软标签 soft_label
- 这减少了模型对穷举标注的依赖

Args:
predictions: (Q, 1) 存在置信度预测
ground_truth: (Q,) 二值标签 (1=存在, 0=不存在)
mask_prob: 遮蔽概率
soft_label: 软标签值
"""
import torch.nn.functional as F

Q = predictions.shape[0]

# 随机遮蔽部分正样本
positive_mask = ground_truth == 1
positive_indices = torch.where(positive_mask)[0]

num_masked = int(len(positive_indices) * mask_prob)
if num_masked > 0:
mask_indices = positive_indices[torch.randperm(len(positive_indices))[:num_masked]]
# 被遮蔽的样本使用软标签
soft_targets = ground_truth.clone().float()
soft_targets[mask_indices] = soft_label
else:
soft_targets = ground_truth.float()

# 二元交叉熵损失
loss = F.binary_cross_entropy_with_logits(
predictions.squeeze(-1),
soft_targets
)

return loss


# 测试
if __name__ == "__main__":
torch.manual_seed(42)
Q = 50
predictions = torch.randn(Q, 1) * 2
gt = (torch.rand(Q) > 0.7).long() # 30% 为正

loss = uncertainty_aware_loss(predictions, gt, mask_prob=0.3, soft_label=0.3)
print(f"Uncertainty-aware loss: {loss.item():.4f}")
print(f"Positive samples: {gt.sum().item()}")
print(f"Masked samples: {int(gt.sum().item() * 0.3)}")

实验结果

性能对比

指标 PART (1.1M params) 对比方法 提升
CA-AP 0.8827 — —
mASTE 0.3188 m — —
mAVE 0.8084 m/s — —
稀有类别 Recall 0.9203 传统检测器 0.3-0.5 +80%+

恶劣条件鲁棒性

条件 性能表现 说明
夜间 有效 雷达不受光照影响
雨天 有效 雷达穿透雨雾
严重遮挡 有效 雷达穿透部分遮挡物

关键发现

论文检查了假正例(apparent false positives),发现部分预测对应了 nuScenes 标注中缺失的真实移动目标——这证明了类不可知检测的实际价值。


IMS 应用启示

1. CPD 儿童检测新思路

PART 的类不可知检测思路对 CPD 有直接启示:

  • 不需要预定义”儿童”类别——检测任何移动目标
  • 多普勒速度聚类天然区分呼吸微动(CPD)和大幅度运动
  • 物理约束注意力可以在不增加标注成本的情况下提升精度
  • 软标签监督适合 CPD 场景——很多微动信号缺乏明确标注

2. OOP 异常姿态检测

PART 能力 OOP 应用
表面点预测 可以定位人体关键部位位置
2D 速度估计 检测姿态变化速度(突然前倾=危险)
类不可知 不需要训练”异常姿态”类别
恶劣条件鲁棒 夜间/遮挡下仍可工作

3. 落地建议

优先级 方向 具体措施 输入 输出 精度要求
🔴 P0 CPD 雷达 迁移 DAQI 到 60GHz UWB 60GHz ADC 移动检测 Recall > 95%
🔴 P1 OOP 姿态 用表面点定位关键部位 77GHz radar 3D point 误差 < 10cm
🟡 P2 多模态融合 PART + 摄像头融合 Radar + RGB 联合检测 AP > 0.9

4. 硬件配置建议

组件 型号 参数 用途
毫米波雷达 TI IWR6843AOP 60GHz, 4发4收 CPD 检测
毫米波雷达 TI MMWCAS-RF-EVM 77GHz, 4芯片级联, 192虚拟通道 舱内全景感知
处理器 QCS8295 Hexagon NPU, 27 TOPS 实时推理
接口 MIPI CSI-2 4-lane, 2.5 Gbps/lane 数据传输

5. 部署优化

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
import torch

def export_part_to_onnx(model, output_path="part_radar.onnx"):
"""
导出 PART 模型到 ONNX 用于边缘部署

PART 仅 1.1M 参数,非常适合量化部署
"""
model.eval()
dummy_input = torch.randn(1, 200, 7) # batch=1, 200点, 7特征

torch.onnx.export(
model,
dummy_input,
output_path,
input_names=["radar_points"],
output_names=["detections"],
dynamic_axes={
"radar_points": {0: "batch", 1: "num_points"},
"detections": {0: "batch"}
},
opset_version=14
)

# 量化到 INT8
import onnxruntime.quantization as quant

quant.quantize_dynamic(
output_path,
output_path.replace(".onnx", "_int8.onnx"),
weight_type=quant.QuantType.QUInt8
)

print(f"PART model exported: {output_path}")
print(f"INT8 quantized: {output_path.replace('.onnx', '_int8.onnx')}")
print(f"Params: 1.1M → INT8 ≈ 1.1MB")


if __name__ == "__main__":
print("PART deployment optimization:")
print(f" Model size (FP32): ~4.4 MB")
print(f" Model size (INT8): ~1.1 MB")
print(f" Inference time (QCS8295): ~2-5 ms")
print(f" Power consumption: < 0.5 W")

与现有方案对比

方案 检测方式 类别限制 参数量 CPD适用性 OOP适用性 恶劣条件
PART 纯雷达类不可知 ❌ 无限制 1.1M ✅ 优 ✅ 优 ✅
传统RDM-CNN 雷达分类检测 ✅ 闭集 5-20M ⚠️ 需标注 ❌ 有限 ✅
摄像头检测 视觉分类 ✅ 闭集 10-50M ❌ 隐私问题 ✅ 优 ❌
多模态融合 Radar+Camera ✅ 闭集 20-100M ✅ 优 ✅ 优 ⚠️

总结与路线建议

PART 论文的核心价值在于证明了纯雷达可以做类不可知检测,这对 IMS 的 CPD 和 OOP 场景是重要突破:

  1. 短期(1-3月): 在现有 60GHz UWB 雷达上验证 DAQI 聚类方法,看能否用多普勒聚类检测呼吸微动
  2. 中期(3-6月): 完整复现 PART 模型,在 nuScenes 上验证 CA-AP > 0.85
  3. 长期(6-12月): 迁移到舱内场景,建立舱内雷达数据集,训练类不可知检测器

关键瓶颈: 舱内雷达数据集稀缺。建议用 NVIDIA Omniverse + Isaac Sim 合成舱内雷达数据,参考 Rad-R 数据集的故障注入方法。


参考文献

  1. Sun, Y. et al. “If It Moves, Radar Knows: A Physics-Aware Radar Transformer for Class-Agnostic Moving-Object Detection.” arXiv:2609.02289, 2026.
  2. Mallick, M. et al. “Rad-R: A Raw-ADC Radar Dataset and Capture-Invariant SSM for Hardware-Fault Diagnosis.” arXiv:2608.30896, 2026.
  3. Han, Y. et al. “A Survey on Millimeter-Wave Radar and Vision Fusion Perception in Autonomous Driving.” Electronics 15(17), 3919, 2026.

本文由 AI 研究助手自主生成,基于 arXiv 2609.02289 论文深度解读。