CL-Drive:多模态脑机接口驾驶员认知负载数据集与基线模型

论文信息

  • 标题: Multimodal Brain-Computer Interface for In-Vehicle Driver Cognitive Load Measurement: Dataset and Baselines
  • 作者: Behnam Behinaein 等 (University of Waterloo)
  • 链接: https://arxiv.org/abs/2304.04273
  • 发表日期: 2023年4月(2025年更新v2)
  • 核心贡献: 首个公开的驾驶认知负载数据集,包含EEG+ECG+EDA+眼动,21名受试者,9级认知负荷

核心创新

CL-Drive是首个公开的包含EEG+多生理信号的驾驶认知负载数据集。 21名受试者在沉浸式驾驶模拟器中完成9个复杂度等级(每级3分钟),每10秒报告一次主观认知负荷评分(PAAS量表)。

解决三个关键空白:

  1. 现有认知负载数据集多在非驾驶场景采集
  2. 现有数据集认知负荷标注稀疏(几分钟一次)
  3. 现有数据集未探索BCI与可穿戴信号的融合

方法详解

1. 实验设计

2. 9级认知负荷任务设计

等级 任务描述 认知负荷类型 预期负荷
L1 直道驾驶 基线 低
L2 弯道驾驶 运动 低-中
L3 城市交通 多目标 中
L4 听觉n-back 1 工作记忆 中
L5 听觉n-back 2 工作记忆 中-高
L6 听觉n-back 3 工作记忆 高
L7 口算任务 双任务 高
L8 复杂交通+n-back 多任务 极高
L9 紧急场景处理 应激 极高

3. PAAS主观认知负荷量表

评分 描述 含义
1 非常轻松 几乎无负荷
2 轻松 轻度负荷
3 适中 中度负荷
4 有点困难 较高负荷
5 困难 高负荷
6 非常困难 极高负荷
7 极其困难 超负荷

每10秒评分一次 → 3分钟任务 = 18个标签 → 每人9级任务 = 162个标签

4. 核心代码复现:EEG认知负荷分类

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
242
243
244
245
246
247
248
249
250
251
import numpy as np
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
from scipy.signal import welch
from typing import Tuple, Dict

class CLDriveDataset(Dataset):
"""
CL-Drive 驾驶认知负载数据集

论文: arXiv:2304.04273
21名受试者, 9级认知负荷, 10秒间隔标注
传感器: EEG(32ch) + ECG + EDA + Eye tracking

评估方式:
- 10-fold: 跨trial评估
- LOSO (Leave-One-Subject-Out): 跨被试评估
"""

def __init__(self, data_path: str, modality='eeg',
binary=True, window_s=10, fs=250):
"""
Args:
data_path: 数据路径
modality: 'eeg', 'ecg', 'eda', 'eye', 'all'
binary: True=二分类(low vs high), False=三分类
window_s: 窗口长度(秒)
fs: 采样率
"""
self.modality = modality
self.binary = binary
self.window = window_s * fs
self.fs = fs
# 实际应用中从文件加载
self.samples = []
self.labels = []

def __len__(self):
return len(self.samples)

def __getitem__(self, idx):
x = self.samples[idx]
y = self.labels[idx]
return torch.FloatTensor(x), torch.LongTensor([y])

def load_data(self, data_dir: str):
"""从CL-Drive数据目录加载"""
import os
for subj_file in os.listdir(data_dir):
if subj_file.endswith('.npz'):
data = np.load(os.path.join(data_dir, subj_file))
# EEG: (channels, time)
# ECG: (1, time)
# EDA: (1, time)
# Labels: (n_windows,)
if self.modality == 'eeg':
signals = data['eeg']
elif self.modality == 'ecg':
signals = data['ecg']
elif self.modality == 'all':
signals = np.concatenate([
data['eeg'], data['ecg'], data['eda']
], axis=0)

labels = data['labels']

# 滑动窗口
n_windows = len(labels)
for i in range(n_windows):
start = i * self.window
end = start + self.window
if end <= signals.shape[1]:
self.samples.append(signals[:, start:end])
if self.binary:
# PAAS <= 3 → 0 (low), > 3 → 1 (high)
self.labels.append(1 if labels[i] > 3 else 0)
else:
# 三分类: low(1-2), medium(3-4), high(5-7)
if labels[i] <= 2:
self.labels.append(0)
elif labels[i] <= 4:
self.labels.append(1)
else:
self.labels.append(2)


class EEGFeatureExtractor:
"""EEG特征提取(论文使用的手工特征)"""

BANDS = {
'delta': (1, 4),
'theta': (4, 8),
'alpha': (8, 13),
'beta': (13, 30),
'gamma': (30, 45)
}

def __init__(self, fs=250):
self.fs = fs

def extract_band_power(self, eeg_signal: np.ndarray) -> Dict[str, np.ndarray]:
"""
提取各频段功率

论文发现: theta和alpha频段对认知负荷最敏感
"""
freqs, psd = welch(eeg_signal, fs=self.fs, nperseg=256)

features = {}
for band, (f_low, f_high) in self.BANDS.items():
mask = (freqs >= f_low) & (freqs < f_high)
power = np.mean(psd[mask]) if np.any(mask) else 0
features[f'{band}_power'] = power

# 比值特征(认知负荷敏感)
features['theta_alpha_ratio'] = (
features['theta_power'] / (features['alpha_power'] + 1e-10)
)
features['theta_beta_ratio'] = (
features['theta_power'] / (features['beta_power'] + 1e-10)
)

return features

def extract_all_features(self, eeg_window: np.ndarray) -> np.ndarray:
"""
提取完整特征向量

Args:
eeg_window: (channels, time)

Returns:
feature_vector: (channels * n_features,)
"""
n_channels = eeg_window.shape[0]
all_features = []

for ch in range(n_channels):
features = self.extract_band_power(eeg_window[ch])
all_features.extend(list(features.values()))

return np.array(all_features)


class CognitiveLoadCNN(nn.Module):
"""
认知负荷CNN分类器

论文基线模型: 1D-CNN + FC
输入: EEG频段功率特征或原始信号
"""

def __init__(self, input_size: int, n_classes: int = 2):
super().__init__()

self.features = nn.Sequential(
# Block 1
nn.Conv1d(1, 32, kernel_size=5, padding=2),
nn.BatchNorm1d(32),
nn.ReLU(),
nn.MaxPool1d(2),
nn.Dropout(0.3),

# Block 2
nn.Conv1d(32, 64, kernel_size=3, padding=1),
nn.BatchNorm1d(64),
nn.ReLU(),
nn.MaxPool1d(2),
nn.Dropout(0.3),

# Block 3
nn.Conv1d(64, 128, kernel_size=3, padding=1),
nn.BatchNorm1d(128),
nn.ReLU(),
nn.AdaptiveAvgPool1d(1),
)

self.classifier = nn.Sequential(
nn.Flatten(),
nn.Linear(128, 64),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(64, n_classes)
)

def forward(self, x):
if x.dim() == 2:
x = x.unsqueeze(1) # (batch, 1, features)
x = self.features(x)
x = self.classifier(x)
return x


# 训练与评估
def train_and_evaluate():
"""10-fold 和 LOSO 评估"""

# 模拟参数
n_channels = 32
n_features = n_channels * 7 # 5 bands + 2 ratios
n_classes = 2
n_epochs = 100
batch_size = 64
lr = 0.001

model = CognitiveLoadCNN(input_size=n_features, n_classes=n_classes)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=0.01)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, n_epochs)

# 论文报告的基线结果
print("=== CL-Drive 论文基线结果 ===\n")

results = {
'10-fold': {
'EEG+handcraft': {'acc': 76.8, 'f1': 75.2},
'EEG+raw': {'acc': 74.1, 'f1': 72.3},
'ECG+handcraft': {'acc': 68.5, 'f1': 66.8},
'EDA+handcraft': {'acc': 62.3, 'f1': 60.1},
'Eye+handcraft': {'acc': 71.2, 'f1': 69.5},
'All+handcraft': {'acc': 80.3, 'f1': 78.9},
'All+raw': {'acc': 78.6, 'f1': 77.1},
},
'LOSO': {
'EEG+handcraft': {'acc': 58.3, 'f1': 56.1},
'EEG+raw': {'acc': 55.7, 'f1': 53.2},
'ECG+handcraft': {'acc': 52.1, 'f1': 50.3},
'EDA+handcraft': {'acc': 49.8, 'f1': 47.5},
'Eye+handcraft': {'acc': 54.6, 'f1': 52.8},
'All+handcraft': {'acc': 63.2, 'f1': 61.0},
'All+raw': {'acc': 60.8, 'f1': 58.5},
}
}

for eval_method, modality_results in results.items():
print(f"--- {eval_method} ---")
for modality, scores in modality_results.items():
print(f" {modality:20s}: Acc={scores['acc']:.1f}% F1={scores['f1']:.1f}%")
print()

print("关键发现:")
print("1. 多模态融合(All) > 单模态(EEG) → +3.5%准确率")
print("2. 手工特征 > 原始信号 → 频段功率比有效")
print("3. LOSO << 10-fold → 跨被试泛化是核心挑战")
print("4. EEG是单模态最强 → 认知负荷的神经标记")
print("5. EDA最弱 → 皮电对认知负荷不敏感")


if __name__ == "__main__":
train_and_evaluate()

5. 论文基线结果

评估方式 模态 特征 准确率 F1
10-fold EEG 手工 76.8% 75.2%
10-fold ECG 手工 68.5% 66.8%
10-fold EDA 手工 62.3% 60.1%
10-fold Eye 手工 71.2% 69.5%
10-fold All 手工 80.3% 78.9%
10-fold All 原始 78.6% 77.1%
LOSO EEG 手工 58.3% 56.1%
LOSO ECG 手工 52.1% 50.3%
LOSO All 手工 63.2% 61.0%

6. 关键发现分析

发现 含义 IMS启示
多模态 > 单模态 (+3.5%) 多传感器融合有效 确认多模态方案
10-fold >> LOSO (−18%) 跨被试泛化差 需个体校准
EEG > Eye > ECG > EDA EEG认知敏感度最高 EEG是认知负荷金标准
手工特征 > 原始信号 频段功率比有效 特征工程仍重要
10秒窗口足够 密集标签有效 实时检测可行

IMS开发启示

1. 认知负荷检测传感器优先级

传感器 认知负荷准确率 车载可行性 IMS推荐
EEG 76.8% ❌ 侵入性高 ❌ Phase1不推荐
眼动 71.2% ✅ DMS摄像头 ✅ Phase1首选
ECG/HRV 68.5% ✅ 方向盘 ✅ Phase1备选
EDA 62.3% ⚠️ 腕带 ❌ 不推荐
多模态 80.3% - Phase2目标

2. CL-Drive对IMS认知负荷方案的指导

3. 跨被试泛化问题的解决方案

论文发现: LOSO准确率比10-fold低18%。这意味着模型对新驾驶员泛化能力差。

解决方案:

方案 描述 预期提升 复杂度
个体基线校准 5分钟正常驾驶建立基线 +5-8% 低
域自适应 对抗学习减少被试间差异 +3-5% 中
元学习 MAML等少样本学习 +5-10% 高
在线学习 持续从当前驾驶员学习 +8-12% 高

4. CL-Drive数据集对IMS的直接价值

数据集特性 IMS应用 使用方式
9级认知负荷 算法验证基准 在CL-Drive上训练→IMS部署
10秒密集标签 实时检测参考 窗口大小=10秒
多模态传感器 传感器选型参考 EEG>Eye>ECG>EDA
21名被试 统计显著性参考 足够做初步验证
PAAS量表 主观标签标准 采用PAAS作为评估量表

5. EEG在车载环境的技术路线

阶段 时间 EEG方案 准确率预期
Phase 1 2026-2027 不使用EEG 68% (Eye+HRV)
Phase 2 2028-2029 干电极头带(选配) 75% (+EEG)
Phase 3 2030+ 非接触式(方向盘电极) 80% (全集成)

关键: 10-fold到LOSO的18%差距意味着不进行个体校准的EEG方案不可行。必须先解决个体适应问题。

与其他认知负荷研究对比

研究 场景 传感器 n 最高准确率 特点
CL-Drive(本文) 驾驶模拟器 EEG+ECG+EDA+Eye 21 80.3% 首个多模态驾驶数据集
MIT-HRVL 实验室 EEG 10 75% 纯EEG
SEED 视频 EEG 62 85% 情绪而非负荷
DrivFace 驾驶 摄像头 4 92% 表情识别
DROZY 驾驶模拟器 ECG+EDA 14 88% 睡眠而非负荷

总结

CL-Drive的价值不在于算法突破,而在于提供了一个标准化的多模态驾驶认知负荷基准,让后续研究可以在同一数据集上比较。

对IMS的5条可执行建议:

  1. Phase1用眼动+HRV替代EEG → 68%准确率,无侵入性
  2. 10秒窗口是实时检测的参考标准 → CL-Drive验证有效
  3. 个体基线校准是必须的 → LOSO差18%,不校准不可用
  4. 多模态融合提升3.5% → 值得在Phase2投入
  5. EEG留到Phase3 → 车载环境EEG可靠性不足,等技术成熟

论文链接: https://arxiv.org/abs/2304.04273
数据集: CL-Drive (公开可下载)