📄 全文中文译稿已上线:本文所述论文(arXiv:2605.07859)的20 页全文译稿(保留全部图表、含工程向译者解读)已发布在论文库,需要逐节细节请直接读译稿。

EyeCue:基于注视点与自视视频的驾驶员认知分心检测框架

论文信息

项目 内容
标题 EyeCue: Driver Cognitive Distraction Detection via Gaze-Empowered Egocentric Video Understanding
作者 Lang Zhang et al.
来源 arXiv:2605.07859
发表时间 2026年5月
代码 https://github.com/langzhang2000/EyeCue
数据集 CogDrive(3,662样本,多场景认知分心标注)

核心创新

EyeCue 是首个将时序眼动数据与自视视频(egocentric video)融合来检测驾驶员认知分心的框架。关键洞察:认知分心体现在注视点与视觉场景的交互模式变化中,而非注视点本身。驾驶员可能”看着路面”但实际上”心不在焉”。

与传统方法的区别

方法类型 检测手段 局限性
手动分心 手部离开方向盘 可直接观察
视觉分心 视线偏离前方 可直接观察
认知分心 注意力被无关思维占据 隐性、不可直接观察
传统EEG方法 脑电信号 需接触式传感器,干扰驾驶
自评问卷 主观报告 仅支持事后评估
EyeCue 注视点+场景上下文 非侵入式,连续监测

方法详解

整体架构

三大核心组件

1. 视频编码器(Video Encoder)

处理每个自视视频片段,提取驾驶员周围环境上下文信息。使用预训练的视觉模型提取视频帧特征序列,捕获场景的时空结构。

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
import torch
import torch.nn as nn
from transformers import VideoMAEModel

class VideoEncoder(nn.Module):
"""
EyeCue 视频编码器
基于VideoMAE提取自视视频的时空特征
"""
def __init__(self, hidden_dim: int = 768):
super().__init__()
# 使用预训练VideoMAE作为视频特征提取器
self.video_mae = VideoMAEModel.from_pretrained("MCG-NJU/videomae-base")
self.proj = nn.Linear(768, hidden_dim)

def forward(self, video_frames: torch.Tensor) -> torch.Tensor:
"""
Args:
video_frames: (B, T, C, H, W)
B=batch, T=时间步, C=通道, H/W=空间
Returns:
video_features: (B, T, hidden_dim)
"""
B, T, C, H, W = video_frames.shape
# 展平batch和时间维度
x = video_frames.view(B * T, C, H, W)
feats = self.video_mae(x).last_hidden_state # (B*T, N_tokens, 768)
# 取CLS token作为每帧特征
feats = feats[:, 0, :] # (B*T, 768)
feats = self.proj(feats) # (B*T, hidden_dim)
return feats.view(B, T, -1) # (B, T, hidden_dim)

2. 注视编码器(Gaze Encoder)

分析眼动追踪数据,提取驾驶员注视模式。包括注视点坐标、注视持续时间、扫视幅度等时序特征。

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
class GazeEncoder(nn.Module):
"""
EyeCue 注视编码器
处理眼动时序数据,提取注视模式特征
"""
def __init__(self, input_dim: int = 4, hidden_dim: int = 256,
num_layers: int = 2, nhead: int = 4):
super().__init__()
# 输入: (x, y, pupil_diameter, timestamp_delta)
self.input_proj = nn.Linear(input_dim, hidden_dim)

# 使用Transformer编码器处理时序眼动数据
encoder_layer = nn.TransformerEncoderLayer(
d_model=hidden_dim,
nhead=nhead,
dim_feedforward=hidden_dim * 4,
dropout=0.1,
batch_first=True
)
self.transformer = nn.TransformerEncoder(encoder_layer, num_layers)

# 位置编码
self.pos_encoding = PositionalEncoding(hidden_dim)

def forward(self, gaze_seq: torch.Tensor,
mask: torch.Tensor = None) -> torch.Tensor:
"""
Args:
gaze_seq: (B, T, 4) 眼动序列
[x, y, pupil_diameter, dt]
mask: (B, T) padding mask
Returns:
gaze_features: (B, T, hidden_dim)
"""
x = self.input_proj(gaze_seq) # (B, T, hidden_dim)
x = self.pos_encoding(x)
x = self.transformer(x, src_key_padding_mask=mask)
return x

3. 注视驱动语义查询模块(GDSQ)

这是EyeCue的核心创新:利用注视点动态选择视频中与驾驶员注意力相关的视觉token。

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
class GazeDrivenSemanticQuery(nn.Module):
"""
注视驱动语义查询模块

核心思想:根据注视点位置,从视频特征中
动态选择驾驶员正在关注的视觉区域
"""
def __init__(self, video_dim: int = 768, gaze_dim: int = 256,
num_queries: int = 8, nhead: int = 4):
super().__init__()
self.num_queries = num_queries

# 将注视点映射到视觉token空间
self.gaze_to_query = nn.Linear(gaze_dim, video_dim)

# 多头交叉注意力
self.cross_attn = nn.MultiheadAttention(
embed_dim=video_dim,
num_heads=nhead,
kdim=video_dim,
vdim=video_dim,
batch_first=True
)

# 层归一化和FFN
self.norm1 = nn.LayerNorm(video_dim)
self.norm2 = nn.LayerNorm(video_dim)
self.ffn = nn.Sequential(
nn.Linear(video_dim, video_dim * 4),
nn.GELU(),
nn.Linear(video_dim * 4, video_dim)
)

def forward(self, video_feats: torch.Tensor,
gaze_feats: torch.Tensor) -> torch.Tensor:
"""
Args:
video_feats: (B, T_v, video_dim) 视频特征
gaze_feats: (B, T_g, gaze_dim) 注视特征
Returns:
queried_features: (B, T_g, video_dim) 查询后的特征
"""
# 用注视特征作为query查询视频特征
queries = self.gaze_to_query(gaze_feats) # (B, T_g, video_dim)

# 交叉注意力:注视query -> 视频key/value
attn_out, _ = self.cross_attn(
query=queries,
key=video_feats,
value=video_feats
)

# 残差连接
x = self.norm1(queries + attn_out)

# FFN
x = self.norm2(x + self.ffn(x))

return x

完整推理流程

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
class EyeCueModel(nn.Module):
"""
EyeCue 完整模型

论文:arXiv:2605.07859
代码:https://github.com/langzhang2000/EyeCue
"""
def __init__(self, config: dict):
super().__init__()
self.video_encoder = VideoEncoder(
hidden_dim=config.get('video_dim', 768)
)
self.gaze_encoder = GazeEncoder(
input_dim=config.get('gaze_input_dim', 4),
hidden_dim=config.get('gaze_dim', 256),
num_layers=config.get('gaze_layers', 2),
nhead=config.get('nhead', 4)
)
self.gdsq = GazeDrivenSemanticQuery(
video_dim=config.get('video_dim', 768),
gaze_dim=config.get('gaze_dim', 256),
num_queries=config.get('num_queries', 8),
nhead=config.get('nhead', 4)
)

# 分类头
fusion_dim = config.get('video_dim', 768) + config.get('gaze_dim', 256)
self.classifier = nn.Sequential(
nn.Linear(fusion_dim, 256),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(256, 2) # 认知分心 vs 正常
)

def forward(self, video_frames: torch.Tensor,
gaze_seq: torch.Tensor,
gaze_mask: torch.Tensor = None) -> torch.Tensor:
"""
Args:
video_frames: (B, T, C, H, W)
gaze_seq: (B, T_g, 4)
gaze_mask: (B, T_g)
Returns:
logits: (B, 2)
"""
# 1. 提取视频特征
video_feats = self.video_encoder(video_frames) # (B, T, 768)

# 2. 提取注视特征
gaze_feats = self.gaze_encoder(gaze_seq, gaze_mask) # (B, T_g, 256)

# 3. 注视驱动语义查询
queried = self.gdsq(video_feats, gaze_feats) # (B, T_g, 768)

# 4. 融合: 拼接查询特征和原始注视特征
# 对query特征做时序池化
query_pooled = queried.mean(dim=1) # (B, 768)
gaze_pooled = gaze_feats.mean(dim=1) # (B, 256)
fused = torch.cat([query_pooled, gaze_pooled], dim=-1) # (B, 1024)

# 5. 分类
logits = self.classifier(fused)
return logits


# ==================== 测试代码 ====================
if __name__ == "__main__":
import numpy as np

config = {
'video_dim': 768,
'gaze_input_dim': 4,
'gaze_dim': 256,
'gaze_layers': 2,
'nhead': 4,
'num_queries': 8
}

model = EyeCueModel(config)

# 模拟输入
batch_size = 2
video = torch.randn(batch_size, 16, 3, 224, 224) # 16帧视频
gaze = torch.randn(batch_size, 50, 4) # 50个眼动采样点

with torch.no_grad():
logits = model(video, gaze)
probs = torch.softmax(logits, dim=1)

print(f"输出形状: {logits.shape}")
print(f"分心概率: {probs[:, 1].tolist()}")
print(f"参数量: {sum(p.numel() for p in model.parameters()) / 1e6:.1f}M")

CogDrive 数据集

数据源 Attentive Distracted 总计
DR(eye)VE 1,485 409 1,894
BDD-A 424 210 634
DADA-2000 463 164 627
TrafficGaze 481 26 507
CogDrive 总计 2,853 (77.91%) 809 (22.09%) 3,662

标注方式

遵循DR(eye)VE的标注流程:

  • 每段视频按时间窗口切分
  • 每个窗口标注”认知分心”或”正常”标签
  • 分心定义:注意力被与驾驶无关的思维占据,即使视线在路面上

实验结果

配置 准确率 说明
EyeCue(完整) 74.38% 注视+视频+GDSQ
仅注视特征 54.13% 无场景上下文
仅视频特征 67.53% 无注视信息
仅 GDSQ 模块 68.80% 查询模块单独使用
video+gaze 直接融合 72.31% 不经过 GDSQ

摘要另称:EyeCue 超越 6 个模型家族共 11 个基线方法 7 个百分点以上。

跨场景泛化

论文按道路类型/时段/天气三个维度报告分场景准确率(无”直道/弯道”维度):

维度 场景 准确率
道路类型 城市 73.64%
道路类型 高速 76.00%
道路类型 乡村 78.79%
时段 白天 74.32%
时段 傍晚 61.36%
时段 夜间 79.73%
天气 晴天 74.70%
天气 多云 72.79%
天气 雨天 72.62%

IMS 开发启示

1. 算法架构启示

注视-场景交互建模是认知分心检测的关键突破方向。当前IMS的视线落点模块主要输出视线方向,但缺少”视线与场景的关系建模”。EyeCue的GDSQ模块提供了一种可落地的跨模态注意力机制:

  • 输入:IMS已有的视线方向 + 摄像头场景帧
  • 改造:在现有视线落点输出后增加一个注意力查询层
  • 输出:认知分心概率 + 注意力分配热力图

2. 数据采集启示

CogDrive数据集的构建方式表明:可复用现有驾驶数据集(如DR(eye)VE)增加认知分心标注层,而不必从零采集。IMS可考虑:

  • 复用现有DMS数据集中的视频片段
  • 增加认知分心标注层(基于眼动模式+驾驶场景)
  • 扩充到中国道路场景

3. 部署可行性

维度 EyeCue方案 IMS可落地性
眼动输入 Meta Aria Gen 2 AR眼镜 IMS已有红外眼动追踪
视频输入 自视摄像头 IMS DMS摄像头可直接复用
模型大小 138M参数(TimeSformer骨干设置,760G FLOPs) 需量化压缩后再评估
推理速度 论文报告L40S GPU单样本约0.4s 未报告FPS,嵌入式平台未实测
精度 74.38% 高于行业基线,可用于辅助判断

4. 与Euro NCAP的关联

Euro NCAP 2026 DSM协议中”认知分心”是未来扩展方向。EyeCue提供了首个可量产的认知分心检测框架:

  • 不依赖EEG等侵入式传感器
  • 仅使用DMS已有摄像头+眼动追踪
  • 跨场景泛化能力>70%

5. 技术路线建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
IMS认知分心检测路线图(基于EyeCue):

Phase 1(1-3月):数据准备
├── 复用现有DMS数据,增加认知分心标注
├── 标注规范:参照CogDrive流程
└── 目标:5000+样本

Phase 2(3-6月):模型训练
├── 实现GDSQ模块
├── 在IMS现有眼动模型基础上增加场景查询层
└── 目标:准确率>70%

Phase 3(6-12月):部署优化
├── 模型量化(INT8)
├── 在QCS8255上部署推理
└── 目标:实时>15fps,延迟<2s

与其他认知分心方法的对比

方法 输入模态 准确率 侵入性 实时性 IMS可落地
EEG + 眼动 脑电+眼动 —(原文未提供该类方法数字) 高(需传感器接触) 否 ❌
问卷/DRT 自评/响应任务 —(原文未提供) 高(干扰驾驶) 否 ❌
仅眼动指标 眼动统计 —(原文未提供) 低 是 ⚠️ 缺场景上下文
仅视频行为 面部表情 —(原文未提供) 低 是 ⚠️ 缺注视信息
EyeCue 眼动+场景视频 74.38% 低 是 ✅ 推荐

局限性与改进方向

  1. 标注主观性:认知分心标签依赖人工标注,标注一致性需验证
  2. 文化差异:数据集基于欧美驾驶场景,中国道路场景需验证
  3. 实时性未验证:论文仅在 L40S GPU 上报告单样本推理约 0.4s,未给出 FPS,嵌入式平台(NPU)未实测
  4. 多乘员场景:仅针对驾驶员,未涉及乘员分心

论文GitHub仓库:https://github.com/langzhang2000/EyeCue
数据集申请:CogDrive已公开