EEG+眼动协同认知分心检测:双眼视差标注聚焦状态——EMBC 2024论文深度解读

论文:Focused State Recognition Using EEG with Eye Movement-Assisted Annotation
会议:EMBC 2024
DOI: arXiv:2407.09508
数据:17名受试者,62通道EEG+眼动同步

核心创新

本文提出用**双眼视差(binocular disparity)**作为客观标注”专注状态”的方法——当人专注时双眼对齐度高(视差小),分心时视差大。用此标注训练Transformer分类EEG信号,跨被试准确率87.65%。

一句话总结: 不再依赖主观标注判断”是否专注”,而是用双眼视差自动标注——专注时双眼对齐,分心时视差增大。

问题定义

认知分心检测的核心难题

难题 描述 本文方案
标注主观性 “专注”vs”分心”边界模糊 双眼视差客观标注
EEG标注成本 需专家逐帧标注 眼动自动生成标签
跨被试泛化 个体差异大 Transformer+留一验证

双眼视差→聚焦状态的逻辑

1
2
3
4
5
6
7
8
专注状态:双眼凝视同一点 → 视差 ≈ 0
分心状态:注意力分散 → 双眼不协调 → 视差增大

标注规则:
if disparity < mean + std AND gaze_event == fixation:
label = "focused"
else:
label = "unfocused"

方法详解

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
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np

class EyeMovementAnnotator:
"""
眼动辅助标注器

论文方法实现:用双眼视差自动标注EEG的专注/分心状态

输入:双眼眼动数据(注视点坐标)
输出:专注/分心标签 + 时间戳
"""

def __init__(self, disparity_threshold=None):
self.disparity_threshold = disparity_threshold # None=自动计算

def annotate(self, left_gaze, right_gaze, gaze_events):
"""
Args:
left_gaze: (T, 2) 左眼注视点序列
right_gaze: (T, 2) 右眼注视点序列
gaze_events: (T,) 注视事件标签(fixation/saccade/blink)

Returns:
labels: (T,) 0=分心, 1=专注
"""
# 1. 计算双眼视差
disparity = np.linalg.norm(left_gaze - right_gaze, axis=1) # (T,)

# 2. 自适应阈值
if self.disparity_threshold is None:
threshold = np.mean(disparity) + np.std(disparity)
else:
threshold = self.disparity_threshold

# 3. 基础标注:视差小于阈值 → 专注
base_labels = (disparity < threshold).astype(int)

# 4. 精炼:仅注视事件视为真专注
labels = np.where(
(base_labels == 1) & (gaze_events == 'fixation'),
1, 0
)

return labels, disparity


class EEGFocusTransformer(nn.Module):
"""
EEG专注状态识别Transformer

论文核心模型:62通道EEG → 5频段DE特征 → Transformer分类

输入:62通道EEG信号
输出:专注/分心二分类

性能:被试内90.16%,跨被试87.65%
"""

def __init__(self, num_channels=62, num_bands=5,
feat_dim=256, num_heads=8, num_layers=4):
super().__init__()

# 频段投影:5个频段(delta/theta/alpha/beta/gamma) × 62通道
self.band_proj = nn.Linear(num_channels * num_bands, feat_dim)

# 位置编码
self.pos_enc = PositionalEncoding(d_model=feat_dim, max_len=1000)

# Transformer编码器
encoder_layer = nn.TransformerEncoderLayer(
d_model=feat_dim,
nhead=num_heads,
dim_feedforward=feat_dim * 4,
dropout=0.1,
activation='gelu',
batch_first=True
)
self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)

# 分类头
self.classifier = nn.Sequential(
nn.Linear(feat_dim, feat_dim // 2),
nn.GELU(),
nn.Dropout(0.1),
nn.Linear(feat_dim // 2, 2) # 专注/分心
)

def forward(self, eeg_de_features):
"""
Args:
eeg_de_features: (B, T, 62*5) 各通道各频段微分熵

Returns:
logits: (B, T, 2) 专注/分心分类
"""
# 投影
x = self.band_proj(eeg_de_features) # (B, T, feat_dim)

# 位置编码
x = self.pos_enc(x)

# Transformer
x = self.transformer(x) # (B, T, feat_dim)

# 分类
logits = self.classifier(x) # (B, T, 2)

return logits


class PositionalEncoding(nn.Module):
"""正弦位置编码"""

def __init__(self, d_model, max_len=1000):
super().__init__()
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len).unsqueeze(1).float()
div_term = torch.exp(
torch.arange(0, d_model, 2).float() * (-np.log(10000.0) / d_model)
)
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
self.register_buffer('pe', pe.unsqueeze(0))

def forward(self, x):
return x + self.pe[:, :x.size(1)]


# 完整管道
class FocusRecognitionPipeline:
"""
完整的专注状态识别管道

1. 眼动标注 → 2. EEG特征提取 → 3. Transformer分类
"""

def __init__(self):
self.annotator = EyeMovementAnnotator()
self.transformer = EEGFocusTransformer()

def extract_de_features(self, eeg_signal, fs=200, window_sec=2):
"""
提取各频段微分熵(DE)特征

频段:
delta: 1-4 Hz
theta: 4-8 Hz
alpha: 8-14 Hz
beta: 14-31 Hz
gamma: 31-50 Hz
"""
bands = [(1, 4), (4, 8), (8, 14), (14, 31), (31, 50)]
window_samples = int(fs * window_sec)
num_channels = eeg_signal.shape[1]

# FFT计算功率谱密度
fft_vals = np.fft.fft(eeg_signal, axis=0)
freqs = np.fft.fftfreq(eeg_signal.shape[0], 1/fs)

de_features = []
for low, high in bands:
band_mask = (freqs >= low) & (freqs <= high)
band_power = np.sum(np.abs(fft_vals[band_mask])**2, axis=0)
# DE = log(variance) ≈ 0.5 * log(2*power)
de = 0.5 * np.log2(2 * np.pi * np.e * band_power + 1e-8)
de_features.append(de)

return np.concatenate(de_features) # (62*5,)


# 测试
if __name__ == "__main__":
# 1. 眼动标注测试
annotator = EyeMovementAnnotator()
np.random.seed(42)
left = np.random.randn(1000, 2) * 5 + 100
right = left + np.random.randn(1000, 2) * 2 # 添加视差
events = np.random.choice(['fixation', 'saccade', 'blink'], 1000, p=[0.6, 0.3, 0.1])

labels, disparity = annotator.annotate(left, right, events)
print(f"眼动标注: {np.sum(labels)}/1000 帧为专注状态 ({np.mean(labels)*100:.1f}%)")

# 2. Transformer测试
model = EEGFocusTransformer()
x = torch.randn(4, 100, 310) # 4样本, 100帧, 62*5特征
logits = model(x)
print(f"EEG输入: {x.shape}")
print(f"分类输出: {logits.shape}")
print(f"参数量: {sum(p.numel() for p in model.parameters()):,}")

实验结果

核心性能

实验设置 准确率 F1分数 AUC
被试内 90.16% 92.59% 94.09%
跨被试(LOO) 87.65% - -

模型对比

模型 准确率
SVM ~82%
LR ~80%
MLP ~85%
CNN ~87%
RNN ~86%
Transformer 90.16%

频段贡献

频段 单独准确率 主要关联
Delta (1-4Hz) ~78% 深睡眠/不专注
Theta (4-8Hz) ~75% 困倦/冥想
Alpha (8-14Hz) ~76% 放松/闭眼
Beta (14-31Hz) ~77% 活跃思考
Gamma (31-50Hz) ~78% 高级认知
全频段 90.16% 最佳

IMS 应用启示

1. 认知分心检测——从主观到客观

现有方法 本文方法 改善
基于任务表现标注 双眼视差自动标注 客观可量化
问卷/行为标注 实时眼动标注 实时性
专家EEG解读 Transformer自动分类 可规模化

2. 座舱场景适配

座舱限制 适配方案
无EEG设备 仅用眼动视差做分心标注(降低精度)
有眼动追踪 双眼视差→分心检测→预警
未来EEG方向盘 sEMG/EEG方向盘传感器→认知分心

3. 与Euro NCAP认知分心需求对应

1
2
3
4
Euro NCAP 2026 认知分心要求:
- 眼动熵( gaze entropy ) → 本文: 双眼视差
- 行为建模 → 本文: Transformer时序建模
- 客观标注 → 本文: 眼动自动标注

4. 开发建议

优先级 行动
🔴 高 验证双眼视差在座舱环境的有效性
🟡 中 集成到DMS眼动追踪管道
🟡 中 扩展到驾驶员分心分类(手机/交谈/走神)
🟢 低 EEG方向盘传感器探索

本文为论文解读类博客,包含方法详解、代码复现、性能对比、IMS落地指导。