ECRAR:环境感知4D毫米波雷达动作识别 — 联合人体运动与场景上下文

论文:Environmental Context-Aware Human Action Recognition from 4D Millimeter-Wave Radar Point Clouds
期刊:Sensors 2026, 26(18), 5717
框架:ECRAR (Environmental Context-aware Radar Action Recognition)


论文信息

项目 内容
标题 Environmental Context-Aware Human Action Recognition from 4D mmWave Radar Point Clouds
期刊 Sensors 2026
框架 ECRAR
传感器 4D mmWave radar
创新 联合人体运动 + 场景上下文

核心创新

ECRAR 提出了将环境场景上下文纳入雷达动作识别的新范式:

  1. 人体运动建模 — 从 4D 点云提取人体关键运动特征
  2. 场景上下文建模 — 同时编码室内/舱内环境特征
  3. 联合框架 — 运动 × 场景 联合推理
  4. 4D 毫米波雷达 — 比 2D/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
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
import torch
import torch.nn as nn

class ECRAR(nn.Module):
"""
ECRAR: 环境上下文感知雷达动作识别

两个并行分支:
1. 人体运动分支: 4D 点云 → 运动特征
2. 场景上下文分支: 雷达背景 → 场景特征
3. 联合推理: 运动 × 场景 → 动作分类
"""

def __init__(self, num_classes=10, hidden_dim=256):
super().__init__()

# 人体运动分支
self.motion_encoder = MotionEncoder4D(
in_channels=5, # x, y, z, doppler, intensity
hidden_dim=hidden_dim
)

# 场景上下文分支
self.context_encoder = SceneContextEncoder(
in_channels=5,
hidden_dim=hidden_dim
)

# 联合推理
self.fusion = nn.Sequential(
nn.Linear(hidden_dim * 2, hidden_dim),
nn.GELU(),
nn.Dropout(0.2),
nn.Linear(hidden_dim, num_classes)
)

def forward(self, human_points, scene_points):
"""
Args:
human_points: (B, N_h, 5) 人体雷达点
scene_points: (B, N_s, 5) 场景雷达点
"""
motion_feat = self.motion_encoder(human_points) # (B, hidden_dim)
context_feat = self.context_encoder(scene_points) # (B, hidden_dim)

combined = torch.cat([motion_feat, context_feat], dim=-1)
logits = self.fusion(combined)

return logits


class MotionEncoder4D(nn.Module):
"""4D 雷达人体运动编码器"""

def __init__(self, in_channels=5, hidden_dim=256):
super().__init__()

# PointNet++ 简化版
self.mlp = nn.Sequential(
nn.Linear(in_channels, 64), nn.ReLU(),
nn.Linear(64, 128), nn.ReLU(),
nn.Linear(128, hidden_dim)
)

# 时序建模
self.temporal = nn.GRU(
hidden_dim, hidden_dim // 2,
batch_first=True, bidirectional=True
)

def forward(self, points):
# (B, N, 5) → (B, hidden_dim)
feat = self.mlp(points) # (B, N, hidden_dim)
feat = feat.max(dim=1)[0] # max pooling

# 时序 (假设有多帧)
if feat.dim() == 3: # (B, T, hidden_dim)
feat, _ = self.temporal(feat)
feat = feat[:, -1, :]

return feat


class SceneContextEncoder(nn.Module):
"""场景上下文编码器"""

def __init__(self, in_channels=5, hidden_dim=256):
super().__init__()

self.encoder = nn.Sequential(
nn.Linear(in_channels, 64), nn.ReLU(),
nn.Linear(64, 128), nn.ReLU(),
nn.Linear(128, hidden_dim)
)

# 空间注意力
self.spatial_attn = nn.Sequential(
nn.Linear(hidden_dim, 1),
nn.Softmax(dim=1)
)

def forward(self, scene_points):
feat = self.encoder(scene_points) # (B, N, hidden_dim)
attn = self.spatial_attn(feat) # (B, N, 1)
feat = (feat * attn).sum(dim=1) # 加权求和
return feat


if __name__ == "__main__":
model = ECRAR(num_classes=10)

human = torch.randn(2, 100, 5) # 100 个人体点
scene = torch.randn(2, 500, 5) # 500 个场景点

out = model(human, scene)
print(f"Human points: {human.shape}")
print(f"Scene points: {scene.shape}")
print(f"Output: {out.shape}")
print(f"Params: {sum(p.numel() for p in model.parameters()):,}")

IMS 应用启示

舱内场景上下文

场景上下文 对动作识别的帮助 Euro NCAP 相关
座椅位置 区分”前倾”vs”正常坐姿” OOP
方向盘位置 区分”操作方向盘”vs”手机使用” D-02
中控台 区分”操作中控”vs”分心” D-05
后座空间 区分”儿童活动”vs”物体移动” CPD
安全带锚点 判断”系带姿态” 安全带误用

落地建议

优先级 方向 场景上下文 雷达配置
🔴 P0 OOP 座椅+方向盘 77GHz 4D radar
🔴 P1 CPD 后座空间 60GHz UWB
🟡 P2 分心 中控+方向盘 77GHz

参考文献

  1. “Environmental Context-Aware Human Action Recognition from 4D Millimeter-Wave Radar Point Clouds.” Sensors 2026, 26(18), 5717.

本文由 AI 研究助手自主生成,基于 Sensors 2026 论文解读。