STAR: 场景-任务感知的4D雷达预处理,端到端认知雷达新范式

论文信息

  • 标题: STAR: Scene- and Task-Aware 4D Radar Preprocessing Towards End-to-End Cognitive Radar
  • arXiv: 2609.24151 (2026年9月21日)
  • 作者: Seung-Hyun Song 等
  • 基准: K-Radar benchmark
  • 代码: 论文附带

核心创新

STAR提出场景和任务感知的雷达预处理器,打破传统CFAR检测与下游感知独立优化的局限,实现端到端训练的4D雷达认知感知。

关键性能

指标 STAR CFAR基线 提升
K-Radar AP 74.3 68.7 +5.6 AP
通用性 提升多种3D检测器 — 正向增益
信息保留 任务相关点 信号级选择 全局优化

方法详解

传统CFAR vs STAR

1
2
3
4
5
6
7
传统4D雷达管道:
原始雷达数据 → CFAR检测(信号级) → 点云 → 3D检测(独立优化)
↑ 问题: 可能丢弃有价值的任务信息

STAR管道:
原始雷达数据 → STAR预处理器(场景+任务感知) → 任务相关点云 → 3D检测
↑ 上下文引导 ↑ 端到端优化

STAR架构

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
"""
论文:STAR: Scene- and Task-Aware 4D Radar Preprocessing
arXiv: 2609.24151

核心方法:场景+任务感知的4D雷达预处理
"""

import torch
import torch.nn as nn
import torch.nn.functional as F

class STARPreprocessor(nn.Module):
"""
Scene- and Task-Aware Radar Preprocessor

输入: 原始4D雷达数据 (range-Doppler-azimuth-elevation)
输出: 任务相关的点云

核心思想:
1. 场景上下文编码: 理解当前驾驶场景
2. 任务目标引导: 根据检测目标选择相关点
3. 端到端优化: 预处理+检测联合训练
"""

def __init__(self,
range_bins: int = 512,
doppler_bins: int = 64,
azimuth_bins: int = 128,
elevation_bins: int = 16,
hidden_dim: int = 256):
super().__init__()

# 场景上下文编码器
self.scene_encoder = nn.Sequential(
nn.Conv3d(1, 32, kernel_size=(5, 3, 3), stride=(2, 1, 1), padding=(2, 1, 1)),
nn.BatchNorm3d(32),
nn.GELU(),
nn.Conv3d(32, 64, kernel_size=(5, 3, 3), stride=(2, 1, 1), padding=(2, 1, 1)),
nn.BatchNorm3d(64),
nn.GELU(),
nn.Conv3d(64, 128, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1)),
nn.BatchNorm3d(128),
nn.GELU(),
nn.AdaptiveAvgPool3d((1, 1, 1)),
nn.Flatten(),
nn.Linear(128, hidden_dim)
)

# 任务感知点选择器
self.task_aware_selector = nn.Sequential(
nn.Linear(hidden_dim + range_bins * doppler_bins, hidden_dim * 2),
nn.GELU(),
nn.Dropout(0.1),
nn.Linear(hidden_dim * 2, hidden_dim),
nn.GELU(),
nn.Dropout(0.1),
nn.Linear(hidden_dim, range_bins * azimuth_bins * elevation_bins)
)

# 可学习阈值 (替代固定CFAR阈值)
self.adaptive_threshold = nn.Parameter(torch.tensor(0.5))

def forward(self, radar_data, task_context=None):
"""
Args:
radar_data: (B, 1, R, D, A) range-Doppler-Azimuth张量
task_context: 可选的任务上下文 (如检测类别)

Returns:
selected_points: 任务相关点云
selection_mask: 点选择掩码
"""
B = radar_data.shape[0]

# 1. 场景上下文编码
scene_features = self.scene_encoder(radar_data) # (B, hidden_dim)

# 2. 雷达特征展平
radar_flat = radar_data.squeeze(1).flatten(1) # (B, R*D*A)

# 3. 任务感知选择
if task_context is not None:
combined = torch.cat([scene_features, task_context], dim=-1)
else:
combined = torch.cat([scene_features, radar_flat[:, :hidden_dim]], dim=-1)

selection_logits = self.task_aware_selector(combined)
selection_logits = selection_logits.view(B, -1)

# 4. 自适应阈值选择
selection_mask = torch.sigmoid(selection_logits) > self.adaptive_threshold

# 5. 生成任务相关点云
selected_points = self._extract_points(radar_data, selection_mask)

return selected_points, selection_mask

def _extract_points(self, radar_data, mask):
"""从原始数据中提取选中的点"""
# 简化实现: 实际需根据雷达坐标映射
B = radar_data.shape[0]
points = []
for b in range(B):
indices = mask[b].nonzero()
points.append(indices.float())
return points


# 对比: 传统CFAR检测
class CFARDetector(nn.Module):
"""传统CFAR检测器 (基线)"""

def __init__(self, guard_cells=2, training_cells=8, pfa=1e-6):
super().__init__()
self.guard_cells = guard_cells
self.training_cells = training_cells
self.pfa = pfa

def forward(self, radar_data):
"""CFAR检测: 固定阈值,信号级选择"""
# 简化: 实际需滑窗+噪声估计
threshold = torch.tensor(0.5) # 固定阈值
detected = radar_data > threshold
return detected


# 端到端训练框架
class STARTrainer:
"""STAR端到端训练"""

def __init__(self):
self.preprocessor = STARPreprocessor()
# 下游3D检测器 (可插拔)
self.detector = nn.Sequential(
nn.Linear(256, 128),
nn.GELU(),
nn.Linear(128, 7) # x, y, z, w, h, l, confidence
)

self.optimizer = torch.optim.AdamW(
list(self.preprocessor.parameters()) + list(self.detector.parameters()),
lr=1e-4
)

def train_step(self, radar_data, gt_boxes):
"""
端到端训练步骤

Args:
radar_data: 原始4D雷达
gt_boxes: 标注框 (x, y, z, w, h, l, conf)
"""
# 1. STAR预处理
points, mask = self.preprocessor(radar_data)

# 2. 下游检测
# (简化: 实际用PointPillars/CenterPoint等)
predictions = self.detector(points[0].unsqueeze(0)) if points[0].shape[0] > 0 else torch.zeros(1, 7)

# 3. 检测损失
det_loss = F.mse_loss(predictions, gt_boxes)

# 4. 正则化: 鼓励稀疏选择
sparsity_loss = mask.float().mean() * 0.01

# 5. 总损失
total_loss = det_loss + sparsity_loss

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

return {"det_loss": det_loss.item(), "sparsity": sparsity_loss.item()}


# 测试
if __name__ == "__main__":
print("=== STAR vs CFAR 对比 ===")

# 模拟4D雷达数据
radar_data = torch.randn(2, 1, 512, 64, 128) # (B, C, Range, Doppler, Azimuth)

# STAR预处理
star = STARPreprocessor(range_bins=512, doppler_bins=64, azimuth_bins=128)
points, mask = star(radar_data)

print(f"输入: {radar_data.shape}")
print(f"选择掩码: {mask.shape}")
print(f"选中点数: {mask.sum().item()}")
print(f"选择率: {mask.float().mean():.2%}")

# 论文结果
print("\n=== K-Radar基准测试结果 ===")
print(f"STAR: 74.3 AP (新SOTA)")
print(f"CFAR基线: 68.7 AP")
print(f"提升: +5.6 AP")
print(f"\n通用性: 提升多种3D检测器性能")

从外部感知到座舱感知

STAR原则迁移到座舱雷达

1
2
3
4
5
6
7
外部4D雷达 (论文):
场景 → CFAR选择 → 3D目标检测
STAR: 场景+任务感知 → 任务相关点 → 检测

座舱60GHz雷达 (迁移):
场景 → 固定阈值 → 生命体征检测
STAR迁移: 场景+任务感知 → 任务相关点 → CPD/呼吸/姿态

座舱STAR架构

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
# 座舱版STAR: 任务感知雷达预处理
class CabinSTAR(nn.Module):
"""座舱场景的任务感知雷达预处理"""

def __init__(self):
super().__init__()
# 座舱场景编码
self.cabin_scene_encoder = SceneEncoder()
# 多任务选择器
self.task_selectors = {
"cpd": CPDSelector(), # 儿童检测
"breathing": BreathSelector(), # 呼吸检测
"posture": PostureSelector(), # 姿态检测
"occupancy": OccupancySelector() # 占用检测
}

def forward(self, radar_data, task="cpd"):
# 1. 场景编码
scene = self.cabin_scene_encoder(radar_data)

# 2. 任务感知选择
selector = self.task_selectors[task]
points = selector(radar_data, scene)

return points

IMS开发启示

1. 认知雷达概念

STAR代表了认知雷达的趋势:

  • 传统:固定参数 → 固定输出
  • 认知:场景感知 → 自适应参数 → 任务相关输出

2. 座舱雷达认知化

场景 传统CFAR STAR认知化
座椅有人 固定阈值检测呼吸 根据座椅位置/姿态自适应
毯子覆盖 信号衰减可能漏检 任务=CPD→保留弱信号
多人座舱 所有点统一处理 任务=分类→聚焦关键区域
姿态异常 不关心 任务=OOP→关注高度/角度

3. 多任务雷达架构

参考


发布时间: 2026-09-25 03:30
分类: 雷达感知 | 4D雷达 | 认知雷达 | CPD | 论文解读