认知分心检测研究进展:眼动规律性分析成为突破口

前言

认知分心(Cognitive Distraction)指驾驶员视线在道路上但注意力不在。传统 DMS 难以检测,因为驾驶员可能”看着道路”但”心不在焉”。


一、认知分心定义

1.1 与视觉分心的区别

类型 视线 注意力 检测难度
视觉分心 偏离道路 偏离道路
认知分心 在道路上 不在道路上

1.2 认知分心的影响

影响 说明
反应延迟 对危险反应变慢
隧道视野 注意范围缩小
扫视减少 检查后视镜/仪表盘频率降低

二、眼动特征分析

2.1 关键指标

指标 正常驾驶 认知分心
扫视频率
凝视固定 短暂 持续
眨眼频率 正常 增加
瞳孔直径 正常 变化

2.2 眼动规律性

核心发现: 认知负荷下,眼动模式变得更加”机械化”,失去灵活性。

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
class CognitiveDistractionDetector:
def __init__(self):
self.window_size = 30 # 30秒窗口

def extract_gaze_features(self, gaze_sequence):
"""
提取眼动特征

参数:
gaze_sequence: 眼动序列 [(x, y, t), ...]

返回:
特征向量
"""
features = {}

# 1. 扫视频率
saccades = self.detect_saccades(gaze_sequence)
features['saccade_rate'] = len(saccades) / self.window_size

# 2. 凝视固定时长
fixations = self.detect_fixations(gaze_sequence)
features['avg_fixation_duration'] = np.mean([f['duration'] for f in fixations])

# 3. 眼动熵(规律性)
features['gaze_entropy'] = self.calc_gaze_entropy(gaze_sequence)

# 4. 扫视幅度
features['avg_saccade_amplitude'] = np.mean([s['amplitude'] for s in saccades])

# 5. 眨眼频率
blinks = self.detect_blinks(gaze_sequence)
features['blink_rate'] = len(blinks) / self.window_size

return features

def calc_gaze_entropy(self, gaze_sequence):
"""
计算眼动熵

高熵 = 眼动多样、灵活
低熵 = 眼动机械、规律
"""
# 离散化空间
grid_size = 10
positions = [(int(g[0] / grid_size), int(g[1] / grid_size))
for g in gaze_sequence]

# 计算位置分布
from collections import Counter
counts = Counter(positions)
total = len(positions)

# 计算熵
entropy = 0
for count in counts.values():
p = count / total
entropy -= p * np.log2(p)

return entropy

三、检测算法

3.1 多视角时空特征融合

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
class MultiViewSpatioTemporalModel(nn.Module):
"""多视角时空特征融合模型"""

def __init__(self):
super().__init__()

# 空间特征提取
self.spatial_conv = nn.Sequential(
nn.Conv2d(1, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2)
)

# 时间特征提取
self.temporal_lstm = nn.LSTM(
input_size=64 * 16 * 16,
hidden_size=128,
num_layers=2,
batch_first=True
)

# 通道注意力
self.channel_attention = nn.Sequential(
nn.AdaptiveAvgPool2d(1),
nn.Conv2d(64, 16, kernel_size=1),
nn.ReLU(),
nn.Conv2d(16, 64, kernel_size=1),
nn.Sigmoid()
)

# 分类头
self.classifier = nn.Sequential(
nn.Linear(128, 64),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(64, 2) # 正常/认知分心
)

def forward(self, x):
# x: (batch, time, H, W)
batch, time, H, W = x.shape

# 空间特征
spatial_features = []
for t in range(time):
feat = self.spatial_conv(x[:, t:t+1])
# 通道注意力
att = self.channel_attention(feat)
feat = feat * att
spatial_features.append(feat.view(batch, -1))

# 时间特征
temporal_input = torch.stack(spatial_features, dim=1)
temporal_output, _ = self.temporal_lstm(temporal_input)

# 分类
output = self.classifier(temporal_output[:, -1])

return output

3.2 特征重要性分析

特征 重要性 说明
眼动熵 最佳单一指标
扫视频率 认知负荷时降低
凝视时长 认知负荷时增加
眨眼频率 认知负荷时增加

四、实验验证

4.1 数据集

数据集 规模 场景
实验室模拟 50 人 n-back 任务诱发认知负荷
真实道路 30 人 跟车任务 + 认知问答

4.2 性能指标

指标
准确率 85%
召回率 82%
F1 分数 83%

五、实际挑战

5.1 个体差异

挑战 解决方案
基线不同 个性化校准
经验差异 结合驾驶行为

5.2 多任务干扰

挑战 解决方案
对话 区分必要交流 vs 分心
导航 合理的视线转移

六、IMS 开发启示

6.1 开发路线

阶段 任务 难度
Phase 1 视觉分心检测 已完成
Phase 2 疲劳检测 已完成
Phase 3 认知分心检测 研究中
Phase 4 损伤检测 待启动

6.2 技术储备

技术项 状态
眼动追踪
扫视检测
凝视检测
眼动熵计算 🔬 研究中
个性化校准 🔬 研究中

参考资料

  1. Expert Systems with Applications: Driver Cognitive Distraction Detection (2024)
  2. CDC: Driver Cognitive Distraction Using Eye Movements
  3. Nature Scientific Reports: Eye Movements in Working Memory

发布日期: 2026-04-17
标签: 认知分心, 眼动追踪, DMS, 疲劳检测