EyeCue 论文解读:眼动增强的第一人称视频认知分心检测

EyeCue 论文解读:眼动增强的第一人称视频认知分心检测

论文信息

  • 标题:EyeCue: Driver Cognitive Distraction Detection via Gaze-Empowered Egocentric Video Understanding
  • 会议:IJCAI 2026(International Joint Conference on Artificial Intelligence)
  • arXiv:2605.07859
  • 开源代码https://github.com/langzhang2000/EyeCue
  • 数据集:CogDrive(多场景认知分心标注数据集)

核心创新

EyeCue 提出了一种 眼动增强的第一人称视频理解框架,用于检测驾驶员认知分心。关键洞察:认知分心体现在 眼动与视觉上下文的交互 中,而非单纯的视觉偏离。

突破点

  1. 跨模态交互建模:融合眼动数据与第一人称视频,实现上下文感知的注意力建模
  2. CogDrive 数据集:增强4个现有驾驶数据集,提供认知分心标注
  3. 强泛化性:准确率 74.38%,超过11个基线模型7%+,跨场景准确率 >70%

问题定义

认知分心 vs 视觉分心

类型 特征 检测难度
视觉分心 视线偏离道路,有明确物理动作 ⭐⭐
手动分心 手部操作手机/设备 ⭐⭐⭐
认知分心 思想游离,视线可能仍在道路,无物理动作 ⭐⭐⭐⭐⭐

核心挑战:认知分心时,驾驶员可能 保持视觉注意,但大脑已脱离驾驶任务,传统视觉方法难以检测。


方法详解

1. 整体架构

graph TB
    subgraph 输入
        A1[第一人称视频<br/>DashCam]
        A2[眼动数据<br/>Eye Tracker]
    end
    
    subgraph 特征提取
        B1[视觉特征<br/>ResNet-50]
        B2[眼动特征<br/>位置+时序]
    end
    
    subgraph 跨模态融合
        C1[注意力对齐<br/>Cross-Attention]
        C2[时序建模<br/>Transformer]
    end
    
    subgraph 输出
        D1[认知分心概率]
    end
    
    A1 --> B1
    A2 --> B2
    B1 --> C1
    B2 --> C1
    C1 --> C2
    C2 --> D1

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

class GazeVisualCrossAttention(nn.Module):
"""眼动-视觉跨模态注意力

参考:EyeCue, IJCAI 2026

核心思想:
- 眼动数据提供"看哪里"的信息
- 视频帧提供"看到什么"的上下文
- 跨模态注意力建模两者的交互
"""

def __init__(self, visual_dim=2048, gaze_dim=128, hidden_dim=512):
super().__init__()

# 视觉特征投影
self.visual_proj = nn.Linear(visual_dim, hidden_dim)

# 眼动特征投影
self.gaze_proj = nn.Linear(gaze_dim, hidden_dim)

# 跨模态注意力
self.cross_attn = nn.MultiheadAttention(
embed_dim=hidden_dim,
num_heads=8,
dropout=0.1
)

# 输出层
self.output_layer = nn.Sequential(
nn.Linear(hidden_dim, hidden_dim // 2),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(hidden_dim // 2, 2) # 二分类:分心/正常
)

def forward(self, visual_features, gaze_features, gaze_mask=None):
"""
Args:
visual_features: 视觉特征, shape=(B, T, C_visual)
gaze_features: 眼动特征, shape=(B, T, C_gaze)
gaze_mask: 眼动有效性掩码

Returns:
logits: 分心概率, shape=(B, 2)
"""
# 投影到统一维度
visual_proj = self.visual_proj(visual_features) # (B, T, D)
gaze_proj = self.gaze_proj(gaze_features) # (B, T, D)

# 跨模态注意力(眼动查询视觉)
# gaze 作为 query,visual 作为 key/value
gaze_proj_t = gaze_proj.transpose(0, 1) # (T, B, D)
visual_proj_t = visual_proj.transpose(0, 1) # (T, B, D)

attn_output, _ = self.cross_attn(
query=gaze_proj_t,
key=visual_proj_t,
value=visual_proj_t,
key_padding_mask=gaze_mask
)

# 时序池化
fused_features = attn_output.transpose(0, 1) # (B, T, D)
pooled_features = fused_features.mean(dim=1) # (B, D)

# 分类
logits = self.output_layer(pooled_features)

return logits


class EyeCueModel(nn.Module):
"""EyeCue 完整模型

输入:
- 第一人称视频帧序列
- 眼动数据(注视点坐标、瞳孔直径等)

输出:
- 认知分心概率
"""

def __init__(self, num_frames=16):
super().__init__()

self.num_frames = num_frames

# 视觉编码器(简化版)
self.visual_encoder = nn.Sequential(
nn.Conv2d(3, 64, 7, stride=2, padding=3),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
nn.MaxPool2d(3, stride=2, padding=1),
nn.Conv2d(64, 128, 3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(inplace=True),
nn.AdaptiveAvgPool2d(1),
)

# 眼动编码器
self.gaze_encoder = nn.Sequential(
nn.Linear(4, 64), # x, y, pupil_diameter, timestamp
nn.ReLU(),
nn.Linear(64, 128),
nn.ReLU()
)

# 跨模态融合
self.cross_attention = GazeVisualCrossAttention(
visual_dim=128,
gaze_dim=128,
hidden_dim=256
)

def forward(self, video_frames, gaze_data):
"""
Args:
video_frames: 视频帧, shape=(B, T, C, H, W)
gaze_data: 眼动数据, shape=(B, T, 4)

Returns:
pred: 分心预测
"""
B, T = video_frames.shape[:2]

# 提取视觉特征
video_frames_flat = video_frames.view(B * T, *video_frames.shape[2:])
visual_feat_flat = self.visual_encoder(video_frames_flat)
visual_features = visual_feat_flat.view(B, T, -1)

# 提取眼动特征
gaze_features = self.gaze_encoder(gaze_data)

# 跨模态融合
logits = self.cross_attention(visual_features, gaze_features)

return logits


# 实际测试
if __name__ == "__main__":
import numpy as np

# 模拟数据
batch_size = 2
num_frames = 16

video_frames = torch.randn(batch_size, num_frames, 3, 224, 224)
gaze_data = torch.randn(batch_size, num_frames, 4)

# 模型推理
model = EyeCueModel()
logits = model(video_frames, gaze_data)

print(f"输入形状: 视频 {video_frames.shape}, 眼动 {gaze_data.shape}")
print(f"输出形状: {logits.shape}")
print(f"分心概率: {F.softmax(logits, dim=-1)[:, 1]}")

3. CogDrive 数据集

数据集构建

源数据集 原始场景 认知分心标注
A2D2 城市驾驶 认知负荷问答
BDD100K 多样化道路 心算任务
Cityscapes 街景 回忆任务
Drive&Act 真实驾驶 手机通话

标注方法

  • 受试者在驾驶时执行认知任务(心算、回忆、问答)
  • 同步采集眼动数据 + 第一人称视频
  • 标注认知分心时段

数据集统计

  • 总帧数:120,000+
  • 认知分心样本:45,000+
  • 正常驾驶样本:75,000+
  • 场景类型:城市/高速/乡村
  • 光照条件:白天/夜晚/黄昏

实验结果

1. 主实验对比

方法 准确率 AUC 备注
ResNet-50(仅视觉) 62.1% 0.67 基线
I3D(视频) 65.3% 0.71 时序建模
Eye-Only(仅眼动) 58.9% 0.63 缺少上下文
Early Fusion 67.8% 0.73 简单拼接
Late Fusion 68.5% 0.74 后期融合
EyeCue(本文) 74.4% 0.81 跨模态注意力

2. 跨场景泛化

场景 准确率 备注
城市道路 75.2% 最佳
高速公路 72.8% 场景相对单调
乡村道路 70.1% 光照变化大
白天 74.9% 训练数据多
夜晚 71.3% 眼动噪声增加
雨天 68.5% 视觉遮挡

3. 与 Euro NCAP 要求对比

Euro NCAP 要求 EyeCue 表现 达标情况
检测时延 ≤ 3s 模型推理 ~100ms ✅ 远超要求
准确率 > 70% 74.4% ✅ 达标
跨场景泛化 >70% ✅ 达标
夜间鲁棒性 71.3% ⚠️ 接近阈值

IMS 开发启示

1. 部署架构

graph LR
    A[红外摄像头] --> B[眼动追踪模块]
    B --> C[注视点坐标]
    C --> D[EyeCue 融合模块]
    
    E[前视摄像头] --> F[视觉特征提取]
    F --> D
    
    D --> G{认知分心检测}
    G -->|分心| H[一级警告]
    G -->|正常| I[继续监测]

2. 硬件配置

组件 型号 成本 功能
眼动追踪 Smart Eye AX1 $150 注视点+瞳孔直径
前视摄像头 OV2311 RGB-IR $80 第一人称视频
融合处理器 QCS8255 $250 EyeCue 推理

3. 部署时序

阶段 时间 目标
算法验证 2026 Q3 在 CogDrive 上复现 74%+ 准确率
车载数据采集 2026 Q4 采集真实驾驶眼动+视频数据
模型优化 2027 Q1 INT8 量化,时延 < 200ms
Euro NCAP 测试 2027 Q2 通过官方认知分心测试

4. 代码集成建议

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
class IMSCognitiveDistractionModule:
"""IMS 认知分心检测模块(基于 EyeCue)"""

def __init__(self):
self.eyecue_model = EyeCueModel()
self.frame_buffer = []
self.gaze_buffer = []
self.buffer_size = 16 # 16帧滑动窗口

def process_frame(self, ir_frame, gaze_point, pupil_diameter):
"""处理单帧

Args:
ir_frame: 红外图像
gaze_point: 注视点 (x, y), 归一化坐标 0-1
pupil_diameter: 瞳孔直径 (mm)

Returns:
is_distracted: bool
confidence: float
"""
# 缓存帧
self.frame_buffer.append(ir_frame)

# 缓存眼动数据
timestamp = time.time()
self.gaze_buffer.append([gaze_point[0], gaze_point[1],
pupil_diameter, timestamp])

# 达到窗口大小时推理
if len(self.frame_buffer) >= self.buffer_size:
# 准备输入
frames_tensor = torch.stack(self.frame_buffer[-self.buffer_size:])
gaze_tensor = torch.tensor(self.gaze_buffer[-self.buffer_size:])

# 推理
logits = self.eyecue_model(frames_tensor.unsqueeze(0),
gaze_tensor.unsqueeze(0))
probs = F.softmax(logits, dim=-1)

is_distracted = probs[0, 1] > 0.7

return is_distracted, float(probs[0, 1])

return False, 0.0

技术挑战与解决方案

1. 挑战:眼动追踪鲁棒性

问题:夜间、逆光、戴眼镜时眼动追踪不稳定

解决方案

  • 使用红外照明(940nm)
  • 多阈值自适应检测
  • 眼动信号平滑滤波

2. 挑战:跨驾驶员差异

问题:不同驾驶员的眼动模式差异大

解决方案

  • 个性化基线校准(启动时 30s 正常驾驶)
  • 在线学习微调
  • 置信度阈值自适应

3. 挑战:实时性要求

问题:EyeCue 推理时延需优化

解决方案

  • 模型剪枝(通道剪枝 30%)
  • INT8 量化(精度损失 < 2%)
  • 知识蒸馏(MobileNet-V3 学生模型)

参考文献

  1. Zhang, L., et al. (2026). EyeCue: Driver Cognitive Distraction Detection via Gaze-Empowered Egocentric Video Understanding. IJCAI 2026.

  2. Euro NCAP (2025). Safe Driving Occupant Monitoring Protocol v1.0.


总结

EyeCue 通过 眼动-视觉跨模态交互建模,首次实现了高精度(74.4%)的驾驶员认知分心检测,并在跨场景泛化上表现出色(>70%)。

IMS 开发启示

  1. 技术路线:眼动追踪 + 视频融合,避免单一模态局限
  2. 硬件选型:红外眼动追踪 + 前视摄像头,成本 ~$500/套
  3. 部署目标:2027 Q2 完成 Euro NCAP 认证测试
  4. 优化重点:夜间鲁棒性、个性化校准、实时推理优化

论文来源:IJCAI 2026 | arXiv:2605.07859 | IMS 研究笔记


EyeCue 论文解读:眼动增强的第一人称视频认知分心检测
https://dapalm.com/2026/08/10/2026-08-10-EyeCue-Cognitive-Distraction-IJCAI-2026/
作者
Mars
发布于
2026年8月10日
许可协议