认知分心检测:眼动行为模式分析与 DCDD 模型

前言

认知分心(Cognitive Distraction)是 Euro NCAP 2026 关注的重点,但检测难度远高于视觉分心

分心类型 检测难度 技术成熟度
视觉分心 成熟
手动分心 成熟
认知分心 研究阶段

一、认知分心的特征

1.1 定义

类型 说明 示例
视觉分心 视线离开道路 看手机、看中控
手动分心 手离开方向盘 操作中控、喝水
认知分心 思绪游离 思考问题、走神

1.2 检测难点

难点 说明
无明显行为 视线可能仍在道路上
个体差异大 每个人走神模式不同
时长不固定 可能持续数秒到数分钟
难以标注 真实数据难以标注

二、眼动行为模式分析

2.1 关键眼动指标

指标 说明 认知分心表现
凝视熵 (Gaze Entropy) 视线分布随机性 熵值升高(视线混乱)
扫视频率 快速眼动次数 频率降低
注视时长 单点凝视时间 时长增加
瞳孔直径 认知负荷指标 直径增大
眨眼频率 眨眼次数 频率变化

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
# 凝视熵计算(概念代码)
import numpy as np

def calculate_gaze_entropy(gaze_points, grid_size=10):
"""
计算凝视熵

gaze_points: [N, 2] 视线落点坐标
grid_size: 网格划分大小

高熵值 = 视线分布混乱 = 可能认知分心
低熵值 = 视线集中 = 正常驾驶
"""
# 离散化到网格
x_bins = np.linspace(0, 1, grid_size + 1)
y_bins = np.linspace(0, 1, grid_size + 1)

# 统计每个网格的出现频率
hist, _, _ = np.histogram2d(
gaze_points[:, 0],
gaze_points[:, 1],
bins=[x_bins, y_bins]
)

# 计算概率分布
prob = hist.flatten() / hist.sum()

# 计算熵
prob = prob[prob > 0] # 排除零值
entropy = -np.sum(prob * np.log2(prob))

# 最大熵(均匀分布)
max_entropy = np.log2(grid_size * grid_size)

# 归一化熵
normalized_entropy = entropy / max_entropy

return normalized_entropy

# 使用示例
# 高熵值 (>0.7) 可能表示认知分心
# 低熵值 (<0.3) 表示视线集中

2.3 认知分心特征向量

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
# 认知分心特征提取
class CognitiveDistractionFeatures:
def __init__(self, window_size=30):
self.window_size = window_size

def extract(self, gaze_data):
"""
提取认知分心特征

gaze_data: {
'gaze_points': [N, 2],
'pupil_diameter': [N],
'blink_times': list,
'fixation_duration': [N]
}
"""
features = {}

# 1. 凝视熵
features['gaze_entropy'] = calculate_gaze_entropy(
gaze_data['gaze_points']
)

# 2. 凝视分散度
features['gaze_dispersion'] = np.std(gaze_data['gaze_points'], axis=0).mean()

# 3. 瞳孔直径变化
features['pupil_change_rate'] = np.diff(gaze_data['pupil_diameter']).mean()

# 4. 眨眼频率变化
blink_intervals = np.diff(gaze_data['blink_times'])
features['blink_rate'] = len(gaze_data['blink_times']) / self.window_size

# 5. 注视时长分布
features['mean_fixation'] = np.mean(gaze_data['fixation_duration'])
features['std_fixation'] = np.std(gaze_data['fixation_duration'])

# 6. 扫视频率
# ...

return features

三、DCDD 模型

3.1 模型架构

Driver Cognitive Distraction Detection (DCDD) 模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DCDD 模型架构:

┌─────────────────────────────────────────────┐
│ 输入层 │
│ ├─ 眼动数据(凝视点序列) │
│ └─ DCI(综合疲劳指数) │
├─────────────────────────────────────────────┤
│ 特征提取层 │
│ ├─ 空间特征(凝视分布) │
│ ├─ 时间特征(序列模式) │
│ └─ 频域特征(眼动频率) │
├─────────────────────────────────────────────┤
│ 时空融合层 │
│ ├─ CNN(空间特征) │
│ ├─ LSTM(时间特征) │
│ └─ Attention(关键帧加权) │
├─────────────────────────────────────────────┤
│ 分类层 │
│ ├─ 正常驾驶 │
│ └─ 认知分心 │
└─────────────────────────────────────────────┘

3.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
61
# DCDD 模型(概念代码)
import torch
import torch.nn as nn

class DCDDModel(nn.Module):
def __init__(self, feature_dim=64, hidden_dim=128, num_classes=2):
super().__init__()

# 空间特征提取(CNN)
self.spatial_cnn = nn.Sequential(
nn.Conv1d(feature_dim, 128, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv1d(128, 128, kernel_size=3, padding=1),
nn.ReLU(),
)

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

# 注意力层
self.attention = nn.Sequential(
nn.Linear(hidden_dim * 2, 64),
nn.Tanh(),
nn.Linear(64, 1),
nn.Softmax(dim=1)
)

# 分类头
self.classifier = nn.Sequential(
nn.Linear(hidden_dim * 2, 64),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(64, num_classes)
)

def forward(self, x):
"""
x: [batch, seq_len, feature_dim]
"""
# 空间特征
x = x.permute(0, 2, 1) # [batch, feature_dim, seq_len]
spatial_feat = self.spatial_cnn(x)
spatial_feat = spatial_feat.permute(0, 2, 1) # [batch, seq_len, 128]

# 时间特征
temporal_feat, _ = self.temporal_lstm(spatial_feat)

# 注意力加权
attn_weights = self.attention(temporal_feat)
weighted_feat = (temporal_feat * attn_weights).sum(dim=1)

# 分类
output = self.classifier(weighted_feat)

return output

四、性能评估

4.1 数据集

数据集 场景 样本数
NUDrive 自然驾驶 1000+ 小时
AUCD1 认知分心诱导 100+ 小时
100-Car 真实驾驶 2000+ 小时

4.2 检测性能

方法 准确率 召回率 F1
单一特征 65% 60% 0.62
多特征融合 78% 75% 0.76
DCDD 模型 87% 84% 0.85

4.3 实时性

平台 延迟 FPS
Jetson NX 35ms 28
PC (RTX 3080) 8ms 125

五、开发启示

5.1 技术路线

阶段 方法 准确率
阶段 1 单一特征(凝视熵) 65%
阶段 2 多特征融合 78%
阶段 3 DCDD 模型 87%
阶段 4 多模态融合 >90%

5.2 数据采集建议

数据类型 采集方法 标注难度
诱导认知分心 实验室控制
自然驾驶 驾驶模拟器
真实道路 后标注

5.3 与 IMS 集成

功能 集成方式
眼动追踪 复用现有模块
凝视熵计算 新增模块
DCDD 模型 新增模型
警告策略 与疲劳/分心统一

六、总结

关键要点

要点 说明
认知分心难检测 无明显行为特征
眼动指标有效 凝视熵是关键指标
DCDD 模型 时空融合,准确率 87%
数据是瓶颈 标注难度大

开发启示

启示 说明
先验证可行性 小规模实验验证
多特征融合 单一特征不够
注意力机制 关键帧加权有效
渐进式开发 从简单到复杂

参考来源:

发布日期: 2026-04-14
标签: #认知分心 #眼动追踪 #DCDD模型 #DMS


认知分心检测:眼动行为模式分析与 DCDD 模型
https://dapalm.com/2026/04/14/2026-04-14-Cognitive-Distraction-Detection-Eye-Movement-DCDD/
作者
Mars
发布于
2026年4月14日
许可协议