EEG 驱动的自动驾驶乘客危险感知解码框架——认知分心检测的新范式

论文信息

  • 标题: EEG-Driven Decoding Framework for Passenger Hazard Perception in Highly Automated Vehicles
  • 作者: Yingkai Yang, Ashton Yu Xuan Tan, Bowen Li 等
  • 期刊: Automotive Innovation(已接收)
  • arXiv: 2609.07128
  • 代码: https://github.com/SOTIF-AVLab/EEG2023
  • 数据: https://doi.org/10.21227/jw72-m261
  • 核心贡献: 首个将乘客 EEG 认知信号用于 AV 危险感知的 BCI 框架

核心创新

  1. 乘客视角建模:首次将人类建模为 AV 乘客(而非驾驶员),匹配真实 L4+ 场景
  2. 双任务框架:同时解决 Risk Prediction (RP) 和 Danger Identification (DI)
  3. Passenger Cognitive Model (PCM):乘客认知模型,建模乘客对危险的感知过程
  4. Risk-aware Sequential Labeling (RSL):风险感知序列标注策略
  5. 3D-CRNN 模型:3D 卷积循环网络,联合 EEG 解码,BA 达 95.3%

方法详解

1. 问题定义

在 L4 自动驾驶中,乘客不再是驾驶员,但其认知信号仍包含有价值的危险感知信息。论文提出:

  • Risk Prediction (RP):乘客是否能预判危险?
  • Danger Identification (DI):乘客是否能识别具体危险类型?
任务 定义 输入 输出 应用场景
RP 二分类:有/无危险 EEG 信号 0/1 SOTIF 辅助决策
DI 多分类:危险类型 EEG 信号 类别 AV 系统优化

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
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
"""
3D-CRNN: EEG 驱动的乘客危险感知解码模型

论文核心方法复现

架构:
1. 3D 卷积: 提取 EEG 时空特征
2. 循环网络: 建模时序动态
3. 联合解码: RP + DI 多任务学习
"""

import torch
import torch.nn as nn
import torch.nn.functional as F
from typing import Tuple, Dict
import numpy as np

class EEGPreprocessor(nn.Module):
"""
EEG 信号预处理模块

将原始多通道 EEG 信号转换为时空表示

输入: 原始 EEG, shape=(B, C, T)
C=通道数 (32 通道 10-20 系统)
T=时间采样点

输出: 时空特征, shape=(B, D, T')
"""
def __init__(self, n_channels: int = 32, fs: int = 250,
band_low: float = 0.5, band_high: float = 45.0):
super().__init__()
self.n_channels = n_channels
self.fs = fs

# 带通滤波器参数(模拟)
# Alpha (8-13Hz): 放松/警觉
# Beta (13-30Hz): 活跃思考
# Gamma (30-45Hz): 高级认知
self.bands = {
'theta': (4, 8),
'alpha': (8, 13),
'beta': (13, 30),
'gamma': (30, 45)
}

# 通道注意力
self.channel_attention = nn.Sequential(
nn.Linear(n_channels, n_channels // 4),
nn.ReLU(),
nn.Linear(n_channels // 4, n_channels),
nn.Sigmoid()
)

def forward(self, eeg: torch.Tensor) -> torch.Tensor:
"""
Args:
eeg: 原始 EEG 信号, shape=(B, C, T)

Returns:
features: 时空特征, shape=(B, C, T)
"""
# 通道注意力
channel_mean = eeg.mean(dim=2) # (B, C)
weights = self.channel_attention(channel_mean) # (B, C)
weighted_eeg = eeg * weights.unsqueeze(2) # (B, C, T)

return weighted_eeg


class Conv3DBlock(nn.Module):
"""
3D 卷积块

同时在通道×时间×频率维度做卷积,
捕获 EEG 时空-频联合特征

论文 Section 3.3
"""
def __init__(self, in_ch: int, out_ch: int,
kernel_size: Tuple[int, int, int] = (3, 3, 3)):
super().__init__()
self.conv3d = nn.Conv3d(in_ch, out_ch, kernel_size,
padding=(k//2 for k in kernel_size))
self.bn = nn.BatchNorm3d(out_ch)
self.relu = nn.ReLU()
self.pool = nn.MaxPool3d(kernel_size=(1, 2, 2))

def forward(self, x: torch.Tensor) -> torch.Tensor:
"""
Args:
x: shape=(B, C, D, H, W)
D=时间窗, H=通道, W=频率
"""
x = self.conv3d(x)
x = self.bn(x)
x = self.relu(x)
x = self.pool(x)
return x


class CRNNModel(nn.Module):
"""
3D-CRNN: 论文核心模型

组成:
1. EEG 预处理(通道注意力)
2. 3D 卷积特征提取(时空-频)
3. 双向 LSTM 时序建模
4. 双头输出(RP + DI)

论文 Section 3.3
"""
def __init__(self,
n_channels: int = 32,
fs: int = 250,
window_sec: float = 2.0,
hidden_dim: int = 128,
n_danger_types: int = 5,
n_conv_blocks: int = 3):
super().__init__()
self.n_channels = n_channels
self.fs = fs
self.window = int(fs * window_sec)
self.hidden_dim = hidden_dim

# 预处理
self.preprocessor = EEGPreprocessor(n_channels, fs)

# STFT 维度: 将时序转为 (time_frames, freq_bins)
n_freq_bins = self.window // 8 + 1 # FFT bins
n_time_frames = 8 # 每窗内子帧数

# 3D 卷积层
conv_dims = [1, 32, 64, 128]
self.conv_blocks = nn.ModuleList([
Conv3DBlock(conv_dims[i], conv_dims[i+1])
for i in range(n_conv_blocks)
])

# 计算展平后的维度
flat_dim = conv_dims[-1] * n_time_frames

# 双向 LSTM
self.bilstm = nn.LSTM(
input_size=flat_dim,
hidden_size=hidden_dim,
num_layers=2,
batch_first=True,
bidirectional=True,
dropout=0.3
)

# 双头输出
# RP: 二分类(有/无危险)
self.rp_head = nn.Sequential(
nn.Linear(hidden_dim * 2, hidden_dim),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(hidden_dim, 2) # 二分类
)

# DI: 多分类(危险类型)
self.di_head = nn.Sequential(
nn.Linear(hidden_dim * 2, hidden_dim),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(hidden_dim, n_danger_types)
)

def forward(self, eeg: torch.Tensor) -> Dict[str, torch.Tensor]:
"""
Args:
eeg: EEG 信号, shape=(B, C, T)
C=32 通道, T=采样点数

Returns:
outputs: {
'rp': Risk Prediction logits, shape=(B, 2),
'di': Danger Identification logits, shape=(B, n_danger_types)
}
"""
B, C, T = eeg.shape

# 1. 预处理
eeg_processed = self.preprocessor(eeg) # (B, C, T)

# 2. 转为 STFT 时频表示
# 简化: 使用滑动窗口
window_size = self.window
n_windows = T // window_size

all_features = []
for w in range(n_windows):
segment = eeg_processed[:, :, w*window_size:(w+1)*window_size]

# 简化 STFT → (B, 1, n_time_frames, C, n_freq_bins)
# 实际实现使用 torch.stft
stft_result = self._compute_stft(segment)
# shape: (B, 1, 8, C, n_freq_bins)
all_features.append(stft_result)

# 3. 3D 卷积特征提取
conv_features = []
for feat in all_features:
x = feat
for block in self.conv_blocks:
x = block(x)
x = x.flatten(2) # (B, conv_out, flat)
x = x.permute(0, 2, 1) # (B, flat, conv_out)
conv_features.append(x)

# 4. 时序建模
sequence = torch.cat(conv_features, dim=1) # (B, total_flat, hidden_dim)
lstm_out, _ = self.bilstm(sequence) # (B, total_flat, 2*hidden_dim)

# 取最后时刻
final = lstm_out[:, -1, :] # (B, 2*hidden_dim)

# 5. 双头输出
rp_logits = self.rp_head(final)
di_logits = self.di_head(final)

return {
'rp': rp_logits,
'di': di_logits
}

def _compute_stft(self, segment: torch.Tensor) -> torch.Tensor:
"""简化 STFT 计算"""
B, C, T = segment.shape
# 实际使用 torch.stft
n_fft = 256
hop = 32
n_frames = 1 + (T - n_fft) // hop
n_freq = n_fft // 2 + 1

stft = torch.randn(B, 1, 8, C, n_freq) # 简化
return stft


class RiskAwareSequentialLabeling:
"""
RSL: 风险感知序列标注策略

论文 Section 3.2

解决问题: 危险事件前后 EEG 标签不精确
方法: 基于事件时间线的渐进式标签分配
"""
def __init__(self,
pre_risk_window: float = 2.0,
post_risk_window: float = 1.0,
fs: int = 250):
self.pre_window = int(pre_risk_window * fs)
self.post_window = int(post_risk_window * fs)
self.fs = fs

def label_sequence(self,
eeg_length: int,
risk_events: list) -> np.ndarray:
"""
生成风险感知标签序列

Args:
eeg_length: EEG 信号长度
risk_events: 危险事件列表 [(start, end, type), ...]

Returns:
labels: shape=(n_windows, 2)
[:, 0] = RP 标签 (0/1)
[:, 1] = DI 标签 (危险类型, -1=无)
"""
window_size = int(2.0 * self.fs) # 2秒窗口
n_windows = eeg_length // window_size

labels = np.zeros((n_windows, 2), dtype=np.int32) - 1
labels[:, 0] = 0 # 默认无风险
labels[:, 1] = -1

for start, end, dtype in risk_events:
# 预风险窗口(事件前 2s)
pre_start = max(0, start - self.pre_window)
for w in range(pre_start // window_size, start // window_size):
if w < n_windows:
labels[w, 0] = 1 # RP: 有风险预兆
labels[w, 1] = dtype # DI: 危险类型

# 事件窗口
for w in range(start // window_size, min(end // window_size + 1, n_windows)):
labels[w, 0] = 1
labels[w, 1] = dtype

# 后风险窗口(事件后 1s)
post_end = min(eeg_length, end + self.post_window)
for w in range(end // window_size, post_end // window_size):
if w < n_windows:
labels[w, 0] = 1

return labels


# 测试
if __name__ == "__main__":
# 模型初始化
model = CRNNModel(
n_channels=32,
fs=250,
window_sec=2.0,
hidden_dim=128,
n_danger_types=5
)

# 模拟输入:30秒 EEG (32通道, 250Hz)
batch_size = 4
eeg_signal = torch.randn(batch_size, 32, 250 * 30)

# 前向传播
outputs = model(eeg_signal)

print("=== 3D-CRNN 模型测试 ===")
print(f"输入: EEG 信号 {eeg_signal.shape}")
print(f"RP 输出: {outputs['rp'].shape} (二分类)")
print(f"DI 输出: {outputs['di'].shape} (5类)")

# RSL 标注
rsl = RiskAwareSequentialLabeling()
events = [(5000, 7000, 0), (12000, 14000, 2)] # 两个危险事件
labels = rsl.label_sequence(250 * 30, events)

print(f"\nRSL 标签序列: {labels.shape}")
print(f"风险窗口占比: {np.sum(labels[:, 0] == 1) / len(labels) * 100:.1f}%")

# 论文报告性能
print("\n=== 论文性能报告 ===")
print(f"{'任务':<25} {'Balanced Accuracy':<20} {'说明'}")
print(f"{'RP (风险预测)':<25} {'95.3% ± 2.7%':<20} {'3D-CRNN'}")
print(f"{'DI (危险识别)':<25} {'85.0% ± 3.2%':<20} {'+RSL 提升'}")
print(f"{'DI (基线)':<25} {'80.9% ± 3.9%':<20} {'无 RSL'}")
print(f"{'跨会话 DI':<25} {'77.0% ± 5.3%':<20} {'泛化'}")
print(f"{'跨受试 DI (seen)':<25} {'77.4% ± 1.1%':<20} {'已知受试'}")
print(f"{'跨受试 DI (unseen)':<25} {'64.9% ± 8.5%':<20} {'未知受试'}")

3. 实验结果

任务 指标 论文结果 说明
RP Balanced Accuracy 95.3% ± 2.7% 3D-CRNN
DI (无 RSL) Balanced Accuracy 80.9% ± 3.9% 基线
DI (+ RSL) Balanced Accuracy 85.0% ± 3.2% RSL 提升 +4.1%
跨会话 DI Balanced Accuracy 77.0% ± 5.3% 同一受试不同日
跨受试 DI (seen) Balanced Accuracy 77.4% ± 1.1% 训练集受试
跨受试 DI (unseen) Balanced Accuracy 64.9% ± 8.5% 全新受试

4. 危险类型分类

类型 描述 DI 准确率
Type 0 行人横穿 89.2%
Type 1 车辆急刹 85.7%
Type 2 闯红灯 83.1%
Type 3 变道冲突 82.4%
Type 4 静态障碍 84.6%

IMS 认知分心应用方案

从 AV 乘客到 IMS 驾驶员认知检测

虽然论文针对 AV 乘客场景,但其方法可直接迁移到 IMS 驾驶员认知分心检测:

graph TD
    A[驾驶员 EEG 信号] --> B[EEG 预处理]
    B --> C[3D 卷积特征提取]
    C --> D[BiLSTM 时序建模]
    D --> E[认知状态分类]
    E --> F{认知状态}
    F -->|正常| G[正常驾驶]
    F -->|分心| H[一级警告]
    F -->|深度分心| I[二级警告]
    F -->|无响应| J[紧急干预]

认知分心检测框架

组件 论文方法 IMS 迁移 说明
输入 32通道 EEG 32ch 干电极 消费级可穿戴
3D-CRNN ✓ 原方法 ✓ 直接迁移 时空特征提取
RSL 危险事件标注 分心事件标注 事件前后标签
RP 头 风险预测 分心检测 二分类
DI 头 危险类型 分心类型 多分类

认知分心分类体系

类别 描述 EEG 特征 检测难度
0 正常专注 Alpha 抑制, Beta 活跃 基线
1 视觉分心 视觉皮层 Alpha 增强 ⚠️ 中
2 认知分心(走神) Frontal Theta 增大, P300 延迟 ❗ 难
3 情绪分心 不对称 Alpha, 高 Beta ⚠️ 中
4 疲劳前兆 Alpha 扩散, Theta 增大 ✅ 易

与现有 IMS 方案对比

方案 检测延迟 精度 接触方式 量产可行性
PERCLOS (摄像头) 3-5s 85% 非接触 ✅ 已量产
方向盘行为 10-30s 70% 非接触 ✅ 已量产
EEG (32通道) 1-2s 95% 头戴电极 ⚠️ 2027+
EEG (4通道) 2-3s 85% 耳机集成 2028+

硬件方案

组件 型号 参数 用途
EEG 电极 g.Sahara 32ch, 干电极 信号采集
放大器 g.Nautilus 250Hz, 24bit 信号放大
处理器 QCS8255 Hexagon NPU 模型推理
采样率 250 Hz 信号采集
频率范围 0.5-45 Hz 生理频段
延迟 < 2s 检测响应

开发启示

1. EEG 是认知分心的”金标准”

PERCLOS 只能检测视觉疲劳的晚期阶段,而 EEG 能在 1-2秒内 捕获认知状态变化:

  • Alpha 波 (8-13Hz) 抑制程度 → 注意力水平
  • Theta 波 (4-8Hz) 前额增大 → 认知负荷/走神
  • P300 潜伏期延长 → 信息处理变慢

2. RSL 标注策略的关键价值

传统的固定标签(事件时刻=标签)忽略了 EEG 信号中的预知信息。RSL 通过在事件前 2 秒就开始标注,使模型学到乘客/驾驶员的预判认知信号,这比行为指标早 3-5 秒。

3. 跨受试泛化是最大挑战

场景 准确率 量产可用
同一受试 (seen) 77.4% ⚠️ 个体校准
全新受试 (unseen) 64.9% ❌ 不可用

需要 500+ 受试者的预训练 + 少样本个体微调才能达到量产级 85%+。

4. 从 32 通道到 4 通道

量产方案需从实验室 32 通道简化到消费级 4 通道(耳机集成):

  • 通道选择:F3, F4, P3, P4(前额+枕叶)
  • 性能预期:从 95.3% 降至 85-88%
  • 配合 PERCLOS 融合可恢复到 92%+

5. SOTIF 价值

论文提出 EEG 可作为 AV 的 SOTIF (Safety of the Intended Functionality) 辅助信号:

  • AV 系统决策前参考乘客认知反馈
  • 乘客预判危险 → AV 更谨慎
  • 乘客未感知危险 → AV 可更激进

这为 IMS 与 ADAS 协同提供了新思路。

测试场景

CG-01 认知分心检测

前置条件:

  • 驾驶员佩戴 4 通道 EEG 耳机
  • 驾驶模拟器,高速公路场景
  • 正常驾驶 → 心算任务(认知分心)→ 恢复

测试步骤:

  1. 正常驾驶 60s(基线 EEG)
  2. 开始心算任务(100-7 连续减法)
  3. 持续 30s 认知分心
  4. 停止任务,恢复驾驶 30s

判定条件:

检测项 通过条件 失败条件
分心检测延迟 ≤ 3s > 5s
分类准确率 ≥ 85% < 80%
误报率 ≤ 10% > 15%
恢复检测 ≤ 5s 检测到恢复 > 10s

总结

这篇论文是认知分心检测领域的重要突破:

  1. 首次在 AV 乘客场景验证 EEG 危险感知可行性(BA 95.3%)
  2. RSL 标注策略使模型学到预判信息,比行为指标早 3-5 秒
  3. 3D-CRNN 架构可直接迁移到 IMS 驾驶员认知分心检测
  4. 跨受试泛化(64.9%)是量产最大障碍,需大规模预训练
  5. 4 通道简化方案 + PERCLOS 融合是可行量产路径
  6. EEG + ADAS 协同为 SOTIF 提供新维度安全保障

对 IMS 的核心价值: EEG 是目前唯一能在 1-2 秒内检测认知分心的技术,远快于 PERCLOS(3-5秒)和方向盘行为(10-30秒)。虽然量产还需 2-3 年,但作为前沿研究方向必须提前布局。


https://dapalm.com/2026/09/14/2026-09-14-eeg-passenger-hazard-perception-cognitive-distraction-ims/
作者
Mars
发布于
2026年9月14日
许可协议