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维(频谱+时序+复杂度) |
核心创新
- 比值阈值标定(RBT):基于θ/β比值动态生成疲劳标签,校准到个体基线EEG,解决主观标签不可靠问题
- 480维特征集:频谱+时序+复杂度三类特征全面覆盖
- 三条并行管道评估:AutoGluon自动机器学习、BiLSTM时序建模、GNN-SE图神经网络+注意力
- 可解释性:敏感性分析(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) 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 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) if ratio > baseline + threshold_std * baseline_std: labels[i] = 1 return labels, ratios
if __name__ == "__main__": rbt = RatioBasedThresholding(fs=200) np.random.seed(42) alert_eeg = np.random.randn(4, 200 * 60) alert_eeg += 2.0 * np.sin(2 * np.pi * 20 * np.arange(200*60) / 200) baseline, baseline_std = rbt.calibrate_baseline(alert_eeg) print(f"基线θ/β比值: {baseline:.4f} ± {baseline_std:.4f}") fatigue_eeg = np.random.randn(4, 200 * 60) fatigue_eeg += 3.0 * np.sin(2 * np.pi * 6 * np.arange(200*60) / 200) 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疲劳检测的标签可靠性问题:
- RBT自动生成标签:从EEG本身(θ/β比值动态+个体清醒基线标定)生成疲劳标签,替代生理上薄弱的行为标签与主观自评
- 480维特征+三条管道:AutoML全局分层F1最高(0.908),GNN-SE跨被试LOSO F1 0.792且被试间方差最低(SD=0.086)
- 可解释性:敏感性分析Cohen’s κ>0.84,时间-标签相关r=0.044(时间独立性);跨架构可解释性分析收敛于额叶通道(Fz/F4/Fp1)
- 与DeltaGateNet协同:RBT生成标签→轻量模型训练部署(协同方案为本站推演,非论文内容)
值得注意:论文最终推荐 GNN-SE 管道用于无需个体化标定的多用户部署——RBT 的个体基线标定用于离线标签生成,而非在线推理前提。