EEG-FADE:可解释可泛化的EEG驾驶疲劳检测引擎——基于θ/β比值阈值标定

论文信息

项目 内容
标题 EEG-FADE: A generalizable and explainable framework for EEG-based driver fatigue detection
期刊 Machine Learning with Applications (Elsevier),vol.25, art.100912
发表 2026年6月5日在线(2026年9月刊出)
链接 https://www.sciencedirect.com/science/article/pii/S2666827026000770(DOI: 10.1016/j.mlwa.2026.100912,开放获取 CC BY-NC)
核心方法 Ratio-Based Thresholding (RBT) + AutoML + BiLSTM + GNN-SE
特征数 480维(频谱+时序+复杂度)

核心创新

  1. 比值阈值标定(RBT):基于θ/β比值动态生成疲劳标签,校准到个体基线EEG,解决主观标签不可靠问题
  2. 480维特征集:频谱+时序+复杂度三类特征全面覆盖
  3. 三条并行管道评估:AutoGluon自动机器学习、BiLSTM时序建模、GNN-SE图神经网络+注意力
  4. 可解释性:敏感性分析(Cohen’s κ > 0.84)与跨架构归因分析验证θ/β比值相关特征的疲劳敏感性

问题定义

现有EEG疲劳检测三大局限

局限 描述 EEG-FADE解决方案
标签弱 PERCLOS等行为标签与神经状态不同步 RBT:从EEG本身生成标签
泛化差 个体差异导致跨被试准确率骤降 个体基线校准
不可解释 深度学习黑盒 Cohen’s d效应量+特征重要性

θ/β比值的生理学基础

频段 频率 清醒状态 疲劳状态
Theta (θ) 4-8 Hz 低功率 ↑增强
Beta (β) 13-30 Hz 高功率(专注) ↓减弱
θ/β比值 - 低 ↑升高
标注验证(论文) - - 敏感性分析 Cohen’s κ > 0.84;时间-标签相关 r = 0.044(时间独立性检验)

方法详解

1. RBT比值阈值标定

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
# 示意代码,不可直接运行:阈值参数与实现细节为示意,论文未公布完整代码
import numpy as np
from scipy.signal import welch

class RatioBasedThresholding:
"""
比值阈值标定(RBT)

论文核心方法:
1. 计算清醒基线θ/β比值
2. 动态计算当前θ/β比值
3. 基于基线偏差生成疲劳标签
"""

def __init__(self, fs: int = 200,
theta_band=(4, 8),
beta_band=(13, 30)):
self.fs = fs
self.theta_band = theta_band
self.beta_band = beta_band

def compute_theta_beta_ratio(self, eeg: np.ndarray) -> float:
"""
计算θ/β功率比值

Args:
eeg: [n_channels, n_samples] EEG信号

Returns:
ratio: θ/β功率比值
"""
# 平均参考
eeg = eeg - eeg.mean(axis=0)

# Welch功率谱
freqs, psd = welch(eeg, fs=self.fs, nperseg=512)

# θ和β频段功率
theta_mask = (freqs >= self.theta_band[0]) & \
(freqs < self.theta_band[1])
beta_mask = (freqs >= self.beta_band[0]) & \
(freqs < self.beta_band[1])

theta_power = np.sum(psd[:, theta_mask], axis=1).mean()
beta_power = np.sum(psd[:, beta_mask], axis=1).mean()

return theta_power / (beta_power + 1e-8)

def calibrate_baseline(self, alert_eeg: np.ndarray,
window_sec: int = 10) -> float:
"""
从清醒状态EEG标定个体基线

Args:
alert_eeg: 清醒状态EEG数据
window_sec: 窗口长度

Returns:
baseline_ratio: 基线θ/β比值
"""
window_samples = window_sec * self.fs
n_windows = len(alert_eeg[0]) // window_samples

ratios = []
for i in range(n_windows):
window = alert_eeg[:, i*window_samples:(i+1)*window_samples]
ratios.append(self.compute_theta_beta_ratio(window))

baseline = np.mean(ratios)
baseline_std = np.std(ratios)

return baseline, baseline_std

def generate_labels(self, eeg: np.ndarray,
baseline: float,
baseline_std: float,
threshold_std: float = 1.5) -> np.ndarray:
"""
基于RBT生成疲劳标签

Args:
eeg: [n_channels, n_samples]
baseline: 基线θ/β比值
baseline_std: 基线标准差
threshold_std: 阈值标准差倍数

Returns:
labels: [n_windows] 0=清醒, 1=疲劳
"""
window_samples = 10 * self.fs # 10秒窗口
n_windows = len(eeg[0]) // window_samples

labels = np.zeros(n_windows)
ratios = []

for i in range(n_windows):
window = eeg[:, i*window_samples:(i+1)*window_samples]
ratio = self.compute_theta_beta_ratio(window)
ratios.append(ratio)

# RBT判定:超过基线+1.5σ为疲劳
if ratio > baseline + threshold_std * baseline_std:
labels[i] = 1

return labels, ratios


# 测试
if __name__ == "__main__":
rbt = RatioBasedThresholding(fs=200)

# 模拟清醒EEG(低θ高β)
np.random.seed(42)
alert_eeg = np.random.randn(4, 200 * 60) # 4通道60秒
alert_eeg += 2.0 * np.sin(2 * np.pi * 20 *
np.arange(200*60) / 200) # 20Hz β

# 标定基线
baseline, baseline_std = rbt.calibrate_baseline(alert_eeg)
print(f"基线θ/β比值: {baseline:.4f} ± {baseline_std:.4f}")

# 模拟疲劳EEG(高θ低β)
fatigue_eeg = np.random.randn(4, 200 * 60)
fatigue_eeg += 3.0 * np.sin(2 * np.pi * 6 *
np.arange(200*60) / 200) # 6Hz θ

# 生成标签
labels, ratios = rbt.generate_labels(
fatigue_eeg, baseline, baseline_std
)
print(f"疲劳窗口比例: {labels.mean():.1%}")
print(f"平均θ/β比值: {np.mean(ratios):.4f}")
print(f"基线+1.5σ阈值: {baseline + 1.5 * baseline_std:.4f}")

2. 480维特征提取

论文提取共 480 维特征(频谱、时序、复杂度三类,摘要未给出各类的维数拆分):

特征类别 具体特征
频谱特征 各频段功率与跨频段比值特征
时序特征 Hjorth参数、统计量、AR系数等
复杂度特征 近似熵/样本熵/模糊熵等多尺度熵特征

3. 三条并行管道

管道 架构 论文摘要给出的结果
AutoML AutoGluon集成 全局分层 F1 最高(0.908)
BiLSTM 双向LSTM 摘要未给单项数字
GNN-SE 图神经网络+Squeeze-and-Excitation注意力 LOSO F1 0.792(p<0.001),被试间方差最低(SD=0.086)

实验结果

跨被试泛化性能(LOSO)

论文在 Cao et al. 数据集(23 名被试、98,848 个片段)上评估,核心发现是”性能排名反转”:全局指标上 AutoML 最好(分层 F1 0.908),但留一被试(LOSO)泛化上 GNN-SE 显著更好(F1 0.792, p<0.001),且被试间方差最低(SD=0.086)。摘要未提供 SVM/CNN 等基线对比数字。

管道 全局分层 F1 LOSO F1 说明
AutoML 0.908(最高) 摘要未给出 全局指标高但被试间方差大
GNN-SE 摘要未给出 0.792(p<0.001) 方差最低(SD=0.086),论文推荐用于多用户部署
消融:去除150个TBR相关特征 - 0.65–0.69 非TBR特征仍可维持分类,缓解标签循环论证

RBT vs 传统标签

论文论点(摘要未给出标注方法间的准确率对比数字):

标签方法 标签来源 论文立场
行为标签(如PERCLOS) 眼动/行为 生理上与神经状态不同步(”physiologically weak behavioral labels”)
KSS自评 主观 主观性强
RBT EEG θ/β比值动态+个体清醒基线标定 经敏感性分析(Cohen’s κ>0.84)与时间独立性检验(r=0.044)验证

IMS开发启示

1. 与DeltaGateNet的协同

组件 DeltaGateNet EEG-FADE 协同价值
标签生成 需外部标签 ✅ RBT自生成 解决数据标注瓶颈
时序建模 ✅ 双向Delta BiLSTM 互验
轻量化 ✅ 45K参数 需优化 DeltaGateNet更适合可穿戴
可解释性 中等 ✅ 高 RBT+效应量

2. 自动标签生产管道

步骤 输入 产出 工具
1 原始EEG 基线标定 RBT calibrate
2 连续EEG 自动标签 RBT generate_labels
3 标签+EEG 训练模型 DeltaGateNet
4 新驾驶员EEG 个性化标签 基线校准

3. 部署方案

方案 硬件 标签 模型 实时性
离线训练 全帽EEG 32ch RBT GNN-SE 否
在线推理 耳道EEG 1-4ch - DeltaGateNet ✅
个性化 驾驶员5min清醒EEG RBT基线 更新阈值 ✅

总结

EEG-FADE解决了EEG疲劳检测的标签可靠性问题:

  1. RBT自动生成标签:从EEG本身(θ/β比值动态+个体清醒基线标定)生成疲劳标签,替代生理上薄弱的行为标签与主观自评
  2. 480维特征+三条管道:AutoML全局分层F1最高(0.908),GNN-SE跨被试LOSO F1 0.792且被试间方差最低(SD=0.086)
  3. 可解释性:敏感性分析Cohen’s κ>0.84,时间-标签相关r=0.044(时间独立性);跨架构可解释性分析收敛于额叶通道(Fz/F4/Fp1)
  4. 与DeltaGateNet协同:RBT生成标签→轻量模型训练部署(协同方案为本站推演,非论文内容)

值得注意:论文最终推荐 GNN-SE 管道用于无需个体化标定的多用户部署——RBT 的个体基线标定用于离线标签生成,而非在线推理前提。