EEG+fNIRS 多模态跨被试驾驶警觉检测:EF-SCConv-CapsGCN 模型——论文解读与认知分心检测启示

论文信息

要素 内容
标题 Cross-subject driving vigilance detection based on hybrid EEG-fNIRS brain-computer interface
期刊 Expert Systems with Applications (影响因子 7.5)
时间 2026年7月28日在线发表
DOI 10.1016/j.eswa.2026.S0957417426027016
核心模型 EF-SCConv-CapsGCN(EEG-fNIRS Spatial-Channel Convolution + Capsule Graph Convolutional Network)
精度 跨被试 79.40 ± 14.75%(显著优于 EF-Net 和 pth-PF)

核心创新

一句话总结: 首次将 EEG+fNIRS 多模态融合与胶囊图卷积网络结合,实现跨被试驾驶警觉检测,无需目标用户训练数据即可达到 79.4% 精度。

与现有方法的关键区别

维度 现有方法 本文方法
信号模态 单模态(EEG 或 fNIRS) 多模态融合(EEG+fNIRS)
跨被试能力 受限(每人需训练数据) 零样本跨被试
模型架构 CNN/Transformer SCConv + CapsGCN
生理互补性 单一脑信号 电信号(EEG) + 血氧信号(fNIRS)
脑区分析 粗略 GLM HbO 激活图 + EEG PSD 拓扑图

方法详解

1. 多模态生理信号融合原理

EEG 和 fNIRS 在驾驶警觉检测中具有互补性:

特性 EEG(脑电) fNIRS(功能近红外光谱)
测量信号 脑皮层电活动 脑皮层血氧变化
时间分辨率 高(~ms) 低(~5-8s 血液动力学延迟)
空间分辨率 低 高
敏感脑区 浅层皮层 浅层皮层(可定位)
疲劳敏感度 α/θ 波功率变化 前额叶 HbO 下降
环境抗干扰 差(运动伪影/电源干扰) 好(光学测量)
互补点 快速检测警觉状态变化 确认持续疲劳的脑区激活模式

2. EF-SCConv-CapsGCN 架构

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
"""
EF-SCConv-CapsGCN: EEG-fNIRS Spatial-Channel Convolution + Capsule GCN

论文核心模型复现
参考:Expert Systems with Applications, 2026
"""

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

class SCConv(nn.Module):
"""
Spatial-Channel Convolution (SCConv)

同时提取空间维(脑区位置)和通道维(特征类型)的特征
- 空间维:脑电极位置的空间关系
- 通道维:不同频段的功率特征
"""

def __init__(self, in_channels: int, out_channels: int,
n_eeg_channels: int = 32, n_fnirs_channels: int = 16):
super().__init__()

# 空间卷积(沿通道方向)
self.spatial_conv = nn.Conv2d(
in_channels, out_channels,
kernel_size=(n_eeg_channels + n_fnirs_channels, 1),
stride=1, padding=(0, 0)
)

# 通道卷积(沿特征方向)
self.channel_conv = nn.Conv2d(
out_channels, out_channels,
kernel_size=(1, 3), stride=1, padding=(0, 1),
groups=out_channels # 深度可分离
)

self.bn = nn.BatchNorm2d(out_channels)
self.act = nn.GELU()

def forward(self, x: torch.Tensor) -> torch.Tensor:
"""
Args:
x: (B, C, T) where C = EEG_ch + fNIRS_ch, T = time_steps
Returns:
out: (B, out_C, 1, T)
"""
x = x.unsqueeze(2) # (B, C, 1, T)
x = self.spatial_conv(x) # (B, out_C, 1, T)
x = self.channel_conv(x) # (B, out_C, 1, T)
x = self.bn(x)
x = self.act(x)
return x.squeeze(2) # (B, out_C, T)


class CapsuleGCN(nn.Module):
"""
Capsule Graph Convolutional Network

将脑区视为图节点,用图卷积建模脑区间功能连接
胶囊网络替代传统 FC 层,保留空间层次关系
"""

def __init__(self, n_features: int, n_regions: int = 7,
n_classes: int = 3, capsule_dim: int = 16):
super().__init__()

self.n_regions = n_regions
self.capsule_dim = capsule_dim

# 脑区邻接矩阵(基于先验解剖知识)
self.register_buffer(
'adj_matrix',
self._create_brain_region_adjacency(n_regions)
)

# 图卷积层
self.gc1 = nn.Linear(n_features, 64)
self.gc2 = nn.Linear(64, capsule_dim)

# 胶囊路由
self.routing_iterations = 3
self.W_route = nn.Parameter(
torch.randn(n_regions, capsule_dim, capsule_dim) * 0.01
)

# 分类器
self.classifier = nn.Linear(n_regions * capsule_dim, n_classes)

def _create_brain_region_adjacency(self, n: int) -> torch.Tensor:
"""创建脑区邻接矩阵"""
adj = torch.zeros(n, n)
regions = ['frontal', 'central', 'parietal', 'occipital',
'temporal_l', 'temporal_r', 'motor']
# 前额叶连接最广
adj[0, [1, 5, 6, 4]] = 1
adj[1, [0, 2, 6]] = 1
adj[2, [1, 3]] = 1
adj[3, [2]] = 1
adj[4, [0]] = 1
adj[5, [0]] = 1
adj[6, [0, 1]] = 1
adj = (adj + adj.T).clamp(max=1)
adj.fill_diagonal_(1)
# 对称归一化
degree = adj.sum(dim=1, keepdim=True)
adj_norm = adj / (degree + 1e-8)
return adj_norm

def graph_conv(self, x: torch.Tensor) -> torch.Tensor:
"""图卷积"""
x = torch.matmul(self.adj_matrix, x) # 邻域聚合
return x

def forward(self, x: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
"""
Args:
x: (B, n_regions, n_features)
Returns:
logits: (B, n_classes)
capsules: (B, n_regions, capsule_dim)
"""
B, N, F_in = x.shape

# GCN Layer 1
h = self.graph_conv(x)
h = F.gelu(self.gc1(h))

# GCN Layer 2
h = self.graph_conv(h)
h = F.gelu(self.gc2(h)) # (B, N, capsule_dim)

# 动态路由胶囊
capsules = self._dynamic_routing(h)

# 展平并分类
flat = capsules.view(B, -1)
logits = self.classifier(flat)

return logits, capsules

def _dynamic_routing(self, h: torch.Tensor) -> torch.Tensor:
"""动态路由算法(简化版)"""
B, N, D = h.shape

# 初始化 logits
b = torch.zeros(B, N, N, device=h.device)

for i in range(self.routing_iterations):
# softmax over j
c = F.softmax(b, dim=2) # (B, N, N)

# 计算预测向量
s = torch.einsum('bij,jkl->bikl', c, self.W_route)
s = s.sum(dim=1) # (B, N, D)

# squash
v = self._squash(s)

# 更新 logits
if i < self.routing_iterations - 1:
b = b + torch.einsum('bik,bjk->bij', v, h)

return v

@staticmethod
def _squash(s: torch.Tensor) -> torch.Tensor:
"""Squash 激活函数"""
sq = torch.norm(s, dim=-1, keepdim=True)
return s * sq / (1 + sq**2)


class EFSCConvCapsGCN(nn.Module):
"""
完整的 EF-SCConv-CapsGCN 模型

输入:EEG (B, 32, T) + fNIRS (B, 16, T)
输出:警觉等级 (B, 3) [清醒, 轻度疲劳, 重度疲劳]
"""

def __init__(self, n_eeg: int = 32, n_fnirs: int = 16,
n_classes: int = 3, n_brain_regions: int = 7):
super().__init__()

# EEG 分支
self.eeg_scconv = SCConv(1, 32, n_eeg_channels=n_eeg)
self.eeg_pool = nn.AdaptiveAvgPool1d(1)

# fNIRS 分支
self.fnirs_scconv = SCConv(1, 16, n_eeg_channels=n_fnirs)
self.fnirs_pool = nn.AdaptiveAvgPool1d(1)

# 融合
self.fusion = nn.Linear(32 + 16, n_brain_regions * 32)

# CapsGCN
self.caps_gcn = CapsuleGCN(
n_features=32, n_regions=n_brain_regions,
n_classes=n_classes, capsule_dim=16
)

def forward(self, eeg: torch.Tensor, fnirs: torch.Tensor):
"""
Args:
eeg: (B, 32, T)
fnirs: (B, 16, T)
"""
# 分支提取
eeg_feat = self.eeg_scconv(eeg.unsqueeze(1)) # (B, 32, T)
eeg_feat = self.eeg_pool(eeg_feat).squeeze(-1) # (B, 32)

fnirs_feat = self.fnirs_scconv(fnirs.unsqueeze(1)) # (B, 16, T)
fnirs_feat = self.fnirs_pool(fnirs_feat).squeeze(-1) # (B, 16)

# 融合
fused = torch.cat([eeg_feat, fnirs_feat], dim=1) # (B, 48)
region_feat = self.fusion(fused) # (B, N*32)
region_feat = region_feat.view(-1, 7, 32) # (B, 7, 32)

# CapsGCN 分类
logits, capsules = self.caps_gcn(region_feat)

return logits, capsules


# 测试
if __name__ == "__main__":
model = EFSCConvCapsGCN(n_eeg=32, n_fnirs=16, n_classes=3)

# 模拟输入
eeg = torch.randn(4, 32, 100) # batch=4, 32通道, 100时间步
fnirs = torch.randn(4, 16, 100) # batch=4, 16通道, 100时间步

logits, capsules = model(eeg, fnirs)
print(f"Logits shape: {logits.shape}")
print(f"Capsules shape: {capsules.shape}")
print(f"Prediction: {torch.argmax(logits, dim=-1)}")
print(f"Total params: {sum(p.numel() for p in model.parameters()):,}")

3. 跨被试域适应策略

跨被试的关键挑战是个体差异:不同人的脑信号模式差异巨大。本文策略:

策略 描述 效果
多模态互补 EEG 快速变化 + fNIRS 慢速趋势 减少单模态个体差异
图卷积脑区建模 基于解剖先验而非个体通道 抽象到脑区级别降低个体差异
胶囊动态路由 自适应选择关键脑区 忽略个体特有噪声通道
数据增强 时间滑窗 + 噪声注入 扩充训练样本多样性

4. 脑激活模式分析

论文提供了详细的脑激活分析,这对理解疲劳机制有重要价值:

EEG 功率谱拓扑图发现:

  • 清醒状态:β 波(13-30 Hz)前额叶和中央区占优
  • 轻度疲劳:α 波(8-13 Hz)全脑扩散,θ 波(4-8 Hz)开始出现在额叶
  • 重度疲劳:θ 波额叶占优,β 波显著降低

fNIRS HbO 激活图发现:

  • 清醒状态:前额叶 HbO 高(高认知负荷)
  • 疲劳状态:前额叶 HbO 显著下降(认知资源耗竭)
  • 运动皮层:驾驶操作时 HbO 上升,疲劳时操作减少导致 HbO 下降

实验结果对比

方法 模态 跨被试精度 标准差 来源
SVM EEG only 62.3% ±18.2 基线
CNN EEG only 65.8% ±16.5 2024
EF-Net EEG+fNIRS 72.1% ±15.8 2025
pth-PF EEG+fNIRS 74.3% ±15.1 2025
本文 EEG+fNIRS 79.40% ±14.75 2026
仅 EEG(消融) EEG only 68.2% ±17.3 本文
仅 fNIRS(消融) fNIRS only 61.5% ±19.8 本文

关键发现:

  1. 多模态比单模态提升 11-18 个百分点
  2. CapsGCN 比普通 GCN 提升 3-5 个百分点
  3. 跨被试标准差仍较大(±14.75%),说明个体差异是核心难题

认知分心检测启示

1. 从”警觉检测”到”认知分心检测”

本文的警觉检测是疲劳维度的二分类/三分类。对认知分心检测的启示:

警觉检测 认知分心检测 借鉴点
清醒 vs 疲劳 专注 vs 走神 多模态融合策略直接可用
EEG α/θ 变化 EEG 前额叶 θ 增多 频段分析框架通用
fNIRS 前额叶 HbO 下降 fNIRS 前额叶 HbO 变化模式不同 需要新实验范式
驾驶任务 驾驶 + 次任务(手机/思考) 实验设计可扩展

2. 座舱部署可行性评估

评估项 实验室 座舱部署 差距
EEG 电极 医疗级湿电极 干电极头带/座椅头枕 信号质量下降 30-50%
fNIRS 探头 前额叶多通道 驾驶员前额(头带或仪表台) 可行但舒适性挑战
环境干扰 屏蔽室 发动机震动/EMG 伪影 显著增大
实时性 离线分析 需要 < 2s 延迟 算法需优化
个体差异 跨被试 79.4% 更大差异(年龄/性别/状态) 需更多被试数据

3. 实用化路径

4. 与眼动追踪的融合方案

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
"""
认知分心多模态融合:EEG 指标 + 眼动指标 + 行为指标
"""

from dataclasses import dataclass
from typing import Optional
import numpy as np

@dataclass
class CognitiveDistractionInput:
"""认知分心检测输入"""
# EEG 指标
eeg_theta_alpha_ratio: Optional[float] # θ/α 比率(前额叶)
eeg_frontal_theta: Optional[float] # 前额叶 θ 功率
# fNIRS 指标
fnirs_hbo_slope: Optional[float] # 前额叶 HbO 变化斜率
# 眼动指标
gaze_entropy: Optional[float] # 视线熵(越高越分散)
blink_rate: Optional[float] # 眨眼频率
saccade_frequency: Optional[float] # 扫视频率
pupil_diameter_var: Optional[float] # 瞳孔直径方差
# 行为指标
steering_entropy: Optional[float] # 转向熵
lane_deviation: Optional[float] # 车道偏离
speed_variation: Optional[float] # 速度变异系数

class CognitiveDistractionFusion:
"""多模态认知分心融合判定"""

def __init__(self):
self.weights = {
'eeg': 0.25, # EEG 权重
'fnirs': 0.15, # fNIRS 权重(座舱部署更难)
'eye': 0.40, # 眼动权重(最实用)
'behavior': 0.20, # 行为权重
}
self.thresholds = {
'normal': 0.3,
'mild': 0.6,
'severe': 0.8,
}

def assess(self, inputs: CognitiveDistractionInput) -> dict:
"""评估认知分心等级"""
scores = []

# EEG 评分
if inputs.eeg_theta_alpha_ratio is not None:
# θ/α > 1.5 提示认知负荷过高
eeg_score = min(1.0, inputs.eeg_theta_alpha_ratio / 3.0)
scores.append(('eeg', eeg_score))

# fNIRS 评分
if inputs.fnirs_hbo_slope is not None:
# HbO 斜率 < 0 提示认知资源耗竭
fnirs_score = max(0, min(1.0, 0.5 - inputs.fnirs_hbo_slope * 0.1))
scores.append(('fnirs', fnirs_score))

# 眼动评分
if inputs.gaze_entropy is not None:
# 视线熵 > 0.7 提示注意力分散
eye_score = min(1.0, inputs.gaze_entropy / 1.0)
scores.append(('eye', eye_score))

# 行为评分
if inputs.steering_entropy is not None:
beh_score = min(1.0, inputs.steering_entropy / 0.5)
scores.append(('behavior', beh_score))

# 加权融合
total_score = 0
total_weight = 0
for modality, score in scores:
w = self.weights.get(modality, 0.1)
total_score += w * score
total_weight += w

if total_weight > 0:
final_score = total_score / total_weight
else:
final_score = 0

# 等级判定
if final_score >= self.thresholds['severe']:
level = 'SEVERE'
elif final_score >= self.thresholds['mild']:
level = 'MILD'
elif final_score >= self.thresholds['normal']:
level = 'SUSPECTED'
else:
level = 'NORMAL'

return {
'distraction_score': final_score,
'level': level,
'modality_scores': dict(scores),
}


# 测试
if __name__ == "__main__":
fusion = CognitiveDistractionFusion()

# 场景1:正常驾驶
normal_input = CognitiveDistractionInput(
eeg_theta_alpha_ratio=0.8,
fnirs_hbo_slope=0.02,
gaze_entropy=0.3,
blink_rate=15,
saccade_frequency=2.0,
steering_entropy=0.1,
)
result = fusion.assess(normal_input)
print(f"Normal: {result['level']}, score={result['distraction_score']:.2f}")

# 场景2:认知分心(走神思考问题)
distracted_input = CognitiveDistractionInput(
eeg_theta_alpha_ratio=2.5,
fnirs_hbo_slope=-0.05,
gaze_entropy=0.85,
blink_rate=25,
saccade_frequency=0.5,
steering_entropy=0.35,
)
result2 = fusion.assess(distracted_input)
print(f"Distracted: {result2['level']}, score={result2['distraction_score']:.2f}")
print(f" EEG: {result2['modality_scores'].get('eeg', 'N/A')}")
print(f" Eye: {result2['modality_scores'].get('eye', 'N/A')}")

开发启示与优先级排序

对 IMS 认知分心模块的启示

启示 优先级 行动项 时间线
多模态融合是认知分心的必经之路 🔴 P0 启动眼动+EEG 采集实验 3 个月内
前额叶 θ/α 比率是核心 EEG 指标 🟡 P1 采购消费级干电极 EEG 头带 1 个月内
脑区图卷积可降低个体差异 🟡 P1 在现有算法框架中引入脑区级特征 2 个月内
fNIRS 座舱部署是长期方向 🟢 P2 跟踪消费级 fNIRS 设备进展 持续
跨被试 79.4% 仍不足量产 🔴 P0 需更大规模数据集 + 迁移学习 6 个月内

建议研究路线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
### Phase 1: 眼动 + 行为(当前可做)
- 利用现有 DMS 摄像头提取视线熵、眨眼、扫视
- 结合转向熵、车道偏离
- 目标:认知分心检测 70% 精度

### Phase 2: + EEG 辅助(6-12个月)
- 驾驶模拟器 + 干电极 EEG 采集
- 重点提取前额叶 θ/α 比率
- 目标:精度提升至 75%

### Phase 3: 多模态融合(12-24个月)
- 眼动 + EEG + 行为 + 雷达微动
- 图卷积脑区建模 + 跨被试域适应
- 目标:精度 80%+,延迟 < 3s

### Phase 4: 量产部署(24-36个月)
- 座椅/头枕内嵌 EEG 干电极
- 与 DMS 摄像头深度融合
- 目标:精度 85%+,满足 Euro NCAP 认知分心要求

参考文献

  1. “Cross-subject driving vigilance detection based on hybrid EEG-fNIRS brain-computer interface,” Expert Systems with Applications, 2026. DOI: 10.1016/j.eswa.2026.S0957417426027016
  2. EEG-based fatigue detection framework, Frontiers in Neuroscience, 2026. DOI: 10.3389/fnins.2026.1903252
  3. Exploratory Integration of EEG Spectral Features and Gaze Variability, arXiv:2607.29493, 2026
  4. Euro NCAP 2026 Cognitive Distraction Protocol Requirements
  5. “Investigating EEG-based cross-session and cross-task vigilance estimation in BCI systems,” IOP Science, 2023. DOI: 10.1088/1741-2552/acf345