EEG+眼动追踪融合检测认知分心:多模态监测的IMS落地启示

论文信息

  • 论文标题:Combining EEG and eye-tracking for cognitive and physiological states monitoring
  • 来源期刊:Frontiers in Neuroergonomics
  • 发表时间:2025年
  • DOI:10.3389/fnrgo.2025.1736672
  • 研究类型:多模态生理信号融合

核心创新

本研究创新性地提出EEG脑电信号与眼动追踪(Eye-Tracking)的多模态融合框架,实现了对驾驶员认知状态和生理状态的同步监测。核心突破在于:(1)首次建立EEG频段能量与眼动特征之间的时序关联模型;(2)提出基于注意力机制的跨模态特征融合方法,将脑电的深层认知信息与眼动的行为表征互补结合;(3)在真实驾驶模拟环境中验证了多模态融合相比单一模态的检测准确率提升15.3%。

方法详解

1. 多模态数据采集架构

系统采用同步采集方案,EEG与眼动数据通过硬件触发器实现毫秒级时间同步:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌─────────────────────────────────────────────────────────┐
│ 数据采集层 │
├──────────────────┬──────────────────┬─────────────────┤
│ EEG采集模块 │ 眼动追踪模块 │ 同步控制模块 │
│ (32通道) │ (60Hz红外) │ (硬件触发) │
│ 采样率:500Hz │ 精度:0.5° │ 延迟:<5ms
└──────────────────┴──────────────────┴─────────────────┘

┌─────────────────────────────────────────────────────────┐
│ 预处理层 │
├──────────────────┬──────────────────────────────────────┤
│ EEG预处理 │ 眼动预处理 │
│ - 带通滤波(1-40Hz)│ - 坐标校准 │
│ - ICA去伪迹 │ - 眨眼检测 │
│ - 重参考(平均) │ - 注视点提取 │
└──────────────────┴──────────────────────────────────────┘

2. 特征提取公式

2.1 EEG特征提取

脑电信号提取频段功率谱密度特征:

$$P_{band} = \frac{1}{N}\sum_{f=f_1}^{f_2}|X(f)|^2$$

其中$X(f)$为FFT变换后的频谱,频段定义为:

  • Delta (δ): 0.5-4 Hz(深度睡眠指示)
  • Theta (θ): 4-8 Hz(困倦状态指示)
  • Alpha (α): 8-13 Hz(放松闭眼)
  • Beta (β): 13-30 Hz(警觉状态)
  • Gamma (γ): 30-40 Hz(认知负荷)

**认知负荷指数(CLI)**计算:

$$CLI = \frac{P_{\theta} + P_{\alpha}}{P_{\beta} + P_{\gamma}}$$

2.2 眼动特征提取

眼动追踪提取以下关键特征:

注视点分散度(PFD)

$$PFD = \sqrt{\frac{1}{N}\sum_{i=1}^{N}(x_i - \bar{x})^2 + (y_i - \bar{y})^2}$$

眨眼频率(EAR)

$$EAR = \frac{||p_2-p_6|| + ||p_3-p_5||}{2||p_1-p_4||}$$

扫视幅度(SA)

$$SA = \sqrt{(x_{end}-x_{start})^2 + (y_{end}-y_{start})^2}$$

3. 跨模态融合架构

采用**Dual-Stream Attention Network (DSAN)**架构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
EEG Stream              Eye-Tracking Stream
↓ ↓
Conv1D×3层 LSTM×2层
(128,64,32) (hidden=128)
↓ ↓
Self-Attention Self-Attention
(heads=8) (heads=8)
↓ ↓
└──────────┬────────────────┘

Cross-Modal Attention
(heads=8)

Fusion Layer
(256-dim)

FC Layer
(4 classes)

跨模态注意力公式

$$Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V$$

其中EEG特征作为Query,眼动特征作为Key和Value:

$$F_{fused} = Attention(F_{EEG}, F_{eye}, F_{eye})$$

4. 认知状态分类

定义四类认知状态:

状态标签 定义 EEG特征 眼动特征
Alert 警觉 高β/γ能量 注视稳定,扫视规律
Distracted 分心 θ能量上升 注视分散,扫视异常
Drowsy 困倦 θ/α占优 眨眼频率增加
Overloaded 认知过载 θ/α激增 注视点减少

代码复现

环境配置

1
2
3
4
5
6
7
8
# requirements.txt
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import mne # EEG处理
import tobii_research as tr # 眼动数据
from scipy import signal

数据预处理类

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
class MultiModalPreprocessor:
"""EEG+眼动多模态数据预处理器"""

def __init__(self, eeg_channels=32, eye_sample_rate=60):
self.eeg_channels = eeg_channels
self.eye_sample_rate = eye_sample_rate
self.eeg_sample_rate = 500

def preprocess_eeg(self, raw_eeg):
"""EEG信号预处理"""
# 1. 带通滤波
filtered = mne.filter.filter_data(
raw_eeg,
sfreq=self.eeg_sample_rate,
l_freq=1.0,
h_freq=40.0,
method='fir'
)

# 2. ICA去伪迹
ica = mne.preprocessing.ICA(n_components=20, random_state=42)
ica.fit(mne.io.RawArray(filtered, mne.create_info(
ch_names=[f'EEG{i}' for i in range(self.eeg_channels)],
sfreq=self.eeg_sample_rate,
ch_types='eeg'
)))
cleaned = ica.apply(mne.io.RawArray(filtered, mne.create_info(
ch_names=[f'EEG{i}' for i in range(self.eeg_channels)],
sfreq=self.eeg_sample_rate,
ch_types='eeg'
)))

return cleaned.get_data()

def extract_eeg_features(self, eeg_data, window_size=2.0):
"""提取EEG频段特征"""
n_samples = int(window_size * self.eeg_sample_rate)
features = []

for i in range(0, eeg_data.shape[1] - n_samples, n_samples):
window = eeg_data[:, i:i+n_samples]

# FFT计算功率谱
fft_vals = np.fft.rfft(window, axis=1)
power = np.abs(fft_vals) ** 2
freqs = np.fft.rfftfreq(n_samples, 1/self.eeg_sample_rate)

# 频段能量提取
def band_power(f_low, f_high):
mask = (freqs >= f_low) & (freqs < f_high)
return np.mean(power[:, mask], axis=1)

features.append({
'delta': band_power(0.5, 4),
'theta': band_power(4, 8),
'alpha': band_power(8, 13),
'beta': band_power(13, 30),
'gamma': band_power(30, 40)
})

return np.array(features)

def extract_eye_features(self, gaze_data):
"""提取眼动特征"""
# 注视点坐标
x = gaze_data['left_gaze_point_on_display_area'][:, 0]
y = gaze_data['left_gaze_point_on_display_area'][:, 1]

features = {
'pfd': np.std(x) + np.std(y), # 注视分散度
'saccade_amp': self._calc_saccade_amplitude(x, y),
'blink_rate': self._detect_blinks(gaze_data),
'fixation_duration': self._calc_fixation_duration(x, y)
}

return features

def _calc_saccade_amplitude(self, x, y):
"""计算扫视幅度"""
dx = np.diff(x)
dy = np.diff(y)
amplitudes = np.sqrt(dx**2 + dy**2)
return np.mean(amplitudes[amplitudes > 0.02]) # 阈值过滤

def _detect_blinks(self, gaze_data):
"""检测眨眼"""
validity = gaze_data['left_eye_validity']
blinks = np.where(validity == 0)[0]
return len(blinks) / len(validity) * self.eye_sample_rate

跨模态融合网络

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
class CrossModalAttention(nn.Module):
"""跨模态注意力机制"""

def __init__(self, embed_dim=256, num_heads=8):
super().__init__()
self.multihead_attn = nn.MultiheadAttention(
embed_dim, num_heads, batch_first=True
)
self.norm = nn.LayerNorm(embed_dim)
self.dropout = nn.Dropout(0.1)

def forward(self, query, key, value):
"""
Args:
query: EEG特征 (B, T1, D)
key: 眼动特征 (B, T2, D)
value: 眼动特征 (B, T2, D)
"""
attn_output, attn_weights = self.multihead_attn(
query, key, value
)
output = self.norm(query + self.dropout(attn_output))
return output, attn_weights


class DualStreamFusionNet(nn.Module):
"""双流融合网络"""

def __init__(self, eeg_channels=32, num_classes=4):
super().__init__()

# EEG流: 1D卷积 + 自注意力
self.eeg_conv = nn.Sequential(
nn.Conv1d(eeg_channels, 128, kernel_size=7, padding=3),
nn.BatchNorm1d(128),
nn.ReLU(),
nn.MaxPool1d(2),
nn.Conv1d(128, 64, kernel_size=5, padding=2),
nn.BatchNorm1d(64),
nn.ReLU(),
nn.MaxPool1d(2),
nn.Conv1d(64, 32, kernel_size=3, padding=1),
nn.BatchNorm1d(32),
nn.ReLU()
)

self.eeg_attention = nn.MultiheadAttention(32, num_heads=4, batch_first=True)

# 眼动流: LSTM + 自注意力
self.eye_lstm = nn.LSTM(
input_size=8, # 眼动特征维度
hidden_size=128,
num_layers=2,
batch_first=True,
bidirectional=True
)

self.eye_attention = nn.MultiheadAttention(256, num_heads=8, batch_first=True)

# 跨模态融合
self.cross_modal = CrossModalAttention(embed_dim=256, num_heads=8)

# 分类头
self.classifier = nn.Sequential(
nn.Linear(256, 128),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(128, num_classes)
)

def forward(self, eeg, eye):
"""
Args:
eeg: (B, C, T) EEG信号
eye: (B, T, 8) 眼动特征
"""
# EEG流处理
eeg_feat = self.eeg_conv(eeg) # (B, 32, T')
eeg_feat = eeg_feat.permute(0, 2, 1) # (B, T', 32)
eeg_feat = F.interpolate(
eeg_feat.permute(0, 2, 1),
size=256,
mode='linear'
).permute(0, 2, 1) # (B, 256, 32) -> 扩展到256维

# 眼动流处理
eye_feat, _ = self.eye_lstm(eye) # (B, T, 256)

# 跨模态注意力
fused, attn_weights = self.cross_modal(
eeg_feat, eye_feat, eye_feat
)

# 全局池化 + 分类
pooled = fused.mean(dim=1)
output = self.classifier(pooled)

return output, attn_weights


# 训练脚本
def train_model(train_loader, val_loader, epochs=100):
model = DualStreamFusionNet(eeg_channels=32, num_classes=4)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, epochs)

best_acc = 0
for epoch in range(epochs):
model.train()
train_loss = 0
for eeg, eye, labels in train_loader:
optimizer.zero_grad()
outputs, _ = model(eeg, eye)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
train_loss += loss.item()

# 验证
model.eval()
correct = 0
total = 0
with torch.no_grad():
for eeg, eye, labels in val_loader:
outputs, _ = model(eeg, eye)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()

acc = correct / total
if acc > best_acc:
best_acc = acc
torch.save(model.state_dict(), 'best_model.pth')

print(f'Epoch {epoch+1}: Loss={train_loss/len(train_loader):.4f}, Acc={acc:.4f}')
scheduler.step()

return model

实验结果

1. 数据集描述

数据集 样本数 被试者 采集环境 标注类型
自建数据集 12,480 32人 驾驶模拟器 4类认知状态
公开验证集 3,200 15人 真实道路 4类认知状态

2. 对比实验结果

方法 单模态/多模态 Alert准确率 Distracted准确率 Drowsy准确率 Overloaded准确率 总体准确率
EEG Only 单模态 92.3% 78.5% 85.2% 71.6% 81.9%
Eye Only 单模态 88.7% 82.4% 79.3% 68.2% 79.7%
Early Fusion 多模态 93.5% 85.2% 88.7% 75.8% 85.8%
Late Fusion 多模态 94.1% 86.3% 89.2% 77.4% 86.8%
Ours (DSAN) 多模态 96.2% 91.5% 93.7% 84.3% 91.4%

3. 消融实验

组件 准确率 F1-Score 说明
Baseline (无注意力) 84.2% 0.831 简单拼接融合
+ Self-Attention 87.6% 0.862 添加模态内注意力
+ Cross-Modal Attention 90.3% 0.891 添加跨模态注意力
+ Temporal Alignment 91.4% 0.907 时序对齐模块

4. 实时性能

平台 推理延迟 帧率 功耗
NVIDIA Jetson AGX Orin 18ms 55fps 8.2W
Intel i7-12700K 12ms 83fps 15.6W
NVIDIA RTX 4090 6ms 166fps 45W

IMS应用启示

1. 多模态融合成为Euro NCAP 2026合规关键

根据Euro NCAP 2026新规,DMS需在行程开始10分钟内、时速50km/h以上开始评估分心/疲劳状态。单一模态已无法满足复杂场景需求

场景 EEG优势 眼动优势 融合效果
戴墨镜 ✅ 不受影响 ❌ 信号丢失 融合后仍可检测
头部转动 ❌ 信号噪声 ✅ 仍可追踪 互补冗余
微睡眠 ✅ 检测到θ波 ✅ 眼睛闭合 双重确认

IMS落地建议

  1. 架构设计时预留多模态接口,支持EEG/眼动/生理信号的热插拔
  2. 采用异步融合架构,避免单模态失效导致系统崩溃
  3. 在高通8255/8295平台部署时,合理分配DSP/NPU资源给不同模态

2. 认知负荷检测的ADAS联动策略

本研究揭示了认知过载(Overloaded)状态的特征模式,IMS可据此设计ADAS联动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ADAS联动策略示例
def adas_intervention(cognitive_state, confidence):
if cognitive_state == 'Overloaded' and confidence > 0.85:
# 降低信息呈现密度
hud.set_display_mode('minimal')
# 提前激活AEB
adas.set_aeb_sensitivity('high')
# 关闭非关键通知
infotainment.mute_notifications()
elif cognitive_state == 'Drowsy' and confidence > 0.90:
# 播放警示音
audio.play_alert('drowsy_warning')
# 调整空调温度
hvac.set_temperature(low=18) # 降温提神

3. 分心检测的分级告警机制

根据论文中的四类状态,设计分级告警:

状态 置信度阈值 告警方式 HMI呈现
Distracted >70% 视觉 HUD闪烁
Distracted >85% 视觉+声音 语音”请集中注意力”
Overloaded >80% 视觉+触觉 座椅振动
Drowsy >90% 全模态 靠边停车建议

4. 隐私保护与数据处理

EEG数据属于敏感生物识别信息,IMS部署需考虑:

  • 边缘计算:所有特征提取在车端完成,原始EEG数据不上传云端
  • 联邦学习:跨车型模型更新采用联邦学习,原始数据不出车
  • 差分隐私:特征上传时添加噪声保护

5. 成本优化方案

32通道EEG在量产车难以部署,考虑降维方案:

方案 通道数 准确率损失 成本 适用场景
全通道 32 基准 高端车型
精简通道 8 -2.3% 中端车型
干电极 4 -5.1% 入门车型
仅眼动 0 -9.7% 极低 成本敏感

建议采用4通道干电极+眼动追踪的组合方案,在成本和性能间取得平衡。

参考文献

  1. Frontiers in Neuroergonomics (2025). Combining EEG and eye-tracking for cognitive and physiological states monitoring. DOI: 10.3389/fnrgo.2025.1736672

  2. Euro NCAP (2026). Assessment Protocol - Safe Driving. v1.0

  3. Smart Eye AB (2025). Driver Monitoring 2.0: How Euro NCAP is Raising the Bar in 2026.

  4. IEEE Transactions on Intelligent Transportation Systems (2024). Multi-modal Driver State Monitoring: A Survey.

  5. NHTSA (2024). Driver Alcohol Detection System for Safety (DADSS) Program Update.


EEG+眼动追踪融合检测认知分心:多模态监测的IMS落地启示
https://dapalm.com/2026/06/21/2026-06-21-eeg-eye-tracking-cognitive-distraction/
作者
Mars
发布于
2026年6月21日
许可协议