mmWave 手势识别双流 LSTM-BiGRU:嵌入式座舱交互的雷达方案

mmWave 手势识别双流 LSTM-BiGRU:嵌入式座舱交互的雷达方案

论文信息

项目 内容
标题 Embedded mmWave Radar-Based Hand Gesture Recognition Using a Dual-Stream LSTM and Attention-BiGRU Network
作者 Wang, X., Wu, H., Zheng, J., Zhang, Y.
期刊 Electronics, 15(17), 3973
日期 2026-09
DOI MDPI Electronics

核心创新

提出双流 LSTM + Attention-BiGRU 架构,在嵌入式 mmWave 雷达上实现手势识别:

特性 规格
传感器 mmWave 雷达(嵌入式)
架构 双流(距离-多普勒 + 角度-多普勒)
时序模型 LSTM + Attention-BiGRU
优势 抗光照、隐私保护、嵌入式部署

方法详解

架构

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

class DualStreamLSTMBiGRU(nn.Module):
"""
双流 LSTM + Attention-BiGRU 手势识别

Stream 1: 距离-多普勒图 → LSTM
Stream 2: 角度-多普勒图 → LSTM
融合: Attention + BiGRU → 分类
"""

def __init__(self, n_classes=8, input_size=64, hidden_dim=128):
super().__init__()

# Stream 1: Range-Doppler
self.stream1_conv = nn.Sequential(
nn.Conv2d(1, 32, 3, 1, 1),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, 1, 1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(2),
nn.AdaptiveAvgPool2d(1)
)
self.stream1_lstm = nn.LSTM(
input_size=64, hidden_size=hidden_dim,
num_layers=2, batch_first=True, dropout=0.3
)

# Stream 2: Angle-Doppler
self.stream2_conv = nn.Sequential(
nn.Conv2d(1, 32, 3, 1, 1),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, 1, 1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(2),
nn.AdaptiveAvgPool2d(1)
)
self.stream2_lstm = nn.LSTM(
input_size=64, hidden_size=hidden_dim,
num_layers=2, batch_first=True, dropout=0.3
)

# Attention 融合
self.attention = nn.Sequential(
nn.Linear(hidden_dim * 2, hidden_dim),
nn.Tanh(),
nn.Linear(hidden_dim, 2), # 两个流的权重
nn.Softmax(dim=-1)
)

# BiGRU 时序建模
self.bigru = nn.GRU(
input_size=hidden_dim,
hidden_size=hidden_dim,
num_layers=2,
batch_first=True,
bidirectional=True,
dropout=0.3
)

# 分类头
self.classifier = nn.Sequential(
nn.Linear(hidden_dim * 2, 64),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(64, n_classes)
)

def forward(self, rd_map, ad_map):
"""
Args:
rd_map: (B, T, 1, H, W) 距离-多普勒图序列
ad_map: (B, T, 1, H, W) 角度-多普勒图序列

Returns:
logits: (B, n_classes)
"""
B, T = rd_map.shape[:2]

# Stream 1: RD
rd_features = []
for t in range(T):
feat = self.stream1_conv(rd_map[:, t]) # (B, 64, 1, 1)
rd_features.append(feat.squeeze(-1).squeeze(-1)) # (B, 64)
rd_seq = torch.stack(rd_features, dim=1) # (B, T, 64)
rd_lstm, _ = self.stream1_lstm(rd_seq) # (B, T, hidden)

# Stream 2: AD
ad_features = []
for t in range(T):
feat = self.stream2_conv(ad_map[:, t])
ad_features.append(feat.squeeze(-1).squeeze(-1))
ad_seq = torch.stack(ad_features, dim=1)
ad_lstm, _ = self.stream2_lstm(ad_seq)

# Attention 融合
combined = torch.cat([rd_lstm, ad_lstm], dim=-1) # (B, T, 2*hidden)
attn_weights = self.attention(combined) # (B, T, 2)

# 加权融合
fused = (rd_lstm * attn_weights[..., 0:1] +
ad_lstm * attn_weights[..., 1:2])

# BiGRU
gru_out, _ = self.bigru(fused) # (B, T, 2*hidden)

# 取最后时间步
output = gru_out[:, -1, :]

return self.classifier(output)


# 座舱手势定义
CABIN_GESTURES = {
0: "swipe_left", # 左滑 - 上一曲
1: "swipe_right", # 右滑 - 下一曲
2: "swipe_up", # 上滑 - 音量+
3: "swipe_down", # 下滑 - 音量-
4: "rotate_cw", # 顺时针旋转 - 调温度
5: "rotate_ccw", # 逆时针旋转 - 调温度
6: "push", # 前推 - 确认
7: "pull", # 后拉 - 返回
}

if __name__ == "__main__":
model = DualStreamLSTMBiGRU(n_classes=8)

# 模拟输入: batch=4, 30帧, RD图 64x64
rd = torch.randn(4, 30, 1, 64, 64)
ad = torch.randn(4, 30, 1, 64, 64)

logits = model(rd, ad)
print(f"RD输入: {rd.shape}")
print(f"AD输入: {ad.shape}")
print(f"输出: {logits.shape} (8类手势)")
print(f"参数: {sum(p.numel() for p in model.parameters()):,}")

座舱应用场景

手势-功能映射

手势 座舱功能 当前方案 mmWave 优势
左/右滑 切歌/翻页 触摸屏 无需触屏
上/下滑 音量调节 物理按钮 无需找按钮
旋转 温度调节 旋钮 无需低头
前推 确认/接听 按钮 手不离开方向盘
后拉 返回/挂断 按钮 无需触屏

部署方案

组件 型号 参数 安装位置
mmWave 雷达 TI IWR6843 60GHz, 4Tx/4Rx 中控台上方
处理器 QCS8255 26 TOPS 域控制器
帧率 - 30fps -
功耗 - <3W -
检测距离 - 0.3-1.5m 手势交互区

与摄像头手势对比

特性 mmWave 雷达 摄像头
暗光 ❌ 需 IR
隐私
手部遮挡 ✅ 穿透
功耗 <3W ~5W (IR)
精度 87% 93%
成本 $15 $10

IMS 集成建议

graph TB
    A[mmWave 雷达<br/>中控台] --> B[RD/AD 图生成]
    B --> C[双流 LSTM]
    C --> D[Attention 融合]
    D --> E[BiGRU 时序]
    E --> F{手势分类}
    F -->|swipe| G[媒体控制]
    F -->|rotate| H[空调控制]
    F -->|push/pull| I[导航/电话]
    
    J[DMS 摄像头<br/>内后视镜] --> K[驾驶员状态]
    K --> L{分心?}
    L -->|是| M[禁用手势<br/>避免误操作]
    L -->|否| F

总结

mmWave 手势识别为座舱交互提供了隐私友好、暗光鲁棒的替代方案。对 IMS 开发的核心启示:

  1. 双流设计互补:距离-多普勒捕捉速度,角度-多普勒捕捉方向
  2. Attention 融合关键:不同手势最佳流不同,注意力自适应选择
  3. BiGRU 适合短序列:30 帧手势序列,BiGRU 比纯 LSTM 更优
  4. 与 DMS 协同:驾驶员分心时禁用手势,避免误操作
  5. 成本可行:$15 雷达 + QCS8255 复用 DMS 处理器

mmWave 手势识别双流 LSTM-BiGRU:嵌入式座舱交互的雷达方案
https://dapalm.com/2026/09/11/2026-09-11-mmwave-dual-stream-lstm-bigru-gesture-recognition-cabin-ims/
作者
Mars
发布于
2026年9月11日
许可协议