AutomotiveUI 2025 论文解读:眼动指标检测认知分心的突破——ACC与交通复杂度影响研究

AutomotiveUI 2025 论文解读:眼动指标检测认知分心的突破——ACC与交通复杂度影响研究

论文信息

项目 内容
标题 Gaze-Based Indicators of Driver Cognitive Distraction: Effects of Different Traffic Conditions and Adaptive Cruise Control Use
作者 Halin et al. (University of Liège, Belgium)
会议 17th International Conference on Automotive User Interfaces and Interactive Vehicular Applications (AutomotiveUI Adjunct ‘25)
年份 2025
地点 Brisbane, QLD, Australia
DOI 10.1145/3744335.3758497
链接 https://arxiv.org/html/2508.10624v1

核心创新

首次揭示认知分心眼动指标的动态变化规律:

  • 认知分心期间:视线集中→道路中心(PRC增加)
  • 认知分心间隙:视线分散→垂直方向(VD增加)
  • ACC使用:视线进一步集中→道路中心
  • 交通复杂度:垂直分散增加

这一发现推翻了”认知分心=视线分散”的传统假设,为Euro NCAP 2026认知分心检测提供了科学依据。

1. 问题背景

1.1 认知分心定义与危害

定义来源 描述
NHTSA 驾驶员思考与驾驶无关内容时的心理负荷
Euro NCAP 2026 DSM必须检测的五大状态之一
特征 “看但未见”(Look but not see)

危害统计:

  • 认知分心导致事故风险增加 3-5倍
  • 手机对话比面对面对话风险更高(认知负荷)
  • Euro NCAP 2026要求:KSS>7或等效指标检测

1.2 传统检测局限

方法 局限 适用场景
视觉分心检测 “视线偏离道路” 有效
认知分心检测 视线可能在道路中心 失效
目的编码法 需要丰富上下文信息 研究复杂
目标编码法 只能检测”看哪里” 不适用认知分心

1.3 研究核心问题

RQ: 认知分心如何影响眼动参数?交通复杂度和ACC使用如何调节这些影响?

2. 方法详解

2.1 实验设计

实验参数
被试人数 N=29(22男,7女)
设备 CARLA驾驶模拟器 + 3×50寸屏幕
DMS摄像头 60Hz红外摄像头(方向盘后方)
场景数 6个(3×交通复杂度 × 2×认知分心)
场景时长 约8分钟/场景
ACC使用 自由开启/关闭
认知任务 口算两位数加法(如83+42)

交通复杂度三等级

等级 交通密度 道路施工
Level 1
Level 2
Level 3 中+高密度 3处施工区

2.2 眼动指标定义

Percent Road Center (PRC)

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
"""
Percent Road Center (PRC) 计算
道路中心视线百分比

参考:Victor et al., 2005
Halin et al., AutomotiveUI 2025

定义:落在道路中心区域的视线点百分比
道路中心区域:20°(水平) × 15°(垂直) 矩形区域
"""

import numpy as np
from typing import Tuple

def calculate_prc(
gaze_angles: np.ndarray,
road_center: Tuple[float, float],
horizontal_range: float = 20.0, # ±10°
vertical_range: float = 15.0 # ±7.5°
) -> float:
"""
计算PRC

Args:
gaze_angles: 视线角度序列, shape=(N, 2)
[horizontal_angle, vertical_angle] 单位:度
road_center: 道路中心点角度 (h_center, v_center)
horizontal_range: 水平角度范围(总宽度)
vertical_range: 垂直角度范围(总高度)

Returns:
prc: 道路中心视线百分比 (0-100)

Euro NCAP 2026 应用:
- PRC > 80% → 可能认知分心(过度集中)
- PRC < 60% → 可能视觉分心(过度分散)
- 正常范围:60-80%
"""
h_center, v_center = road_center

# 道路中心区域边界
h_min = h_center - horizontal_range / 2
h_max = h_center + horizontal_range / 2
v_min = v_center - vertical_range / 2
v_max = v_center + vertical_range / 2

# 计算落在区域内的视线点数
in_region = (
(gaze_angles[:, 0] >= h_min) &
(gaze_angles[:, 0] <= h_max) &
(gaze_angles[:, 1] >= v_min) &
(gaze_angles[:, 1] <= v_max)
)

# PRC百分比
prc = np.sum(in_region) / len(gaze_angles) * 100

return prc

def determine_road_center(
gaze_angles: np.ndarray
) -> Tuple[float, float]:
"""
确定道路中心点(每个驾驶员的most frequent gaze angle)

Args:
gaze_angles: 视线角度序列

Returns:
road_center: (horizontal_mode, vertical_mode)

方法:计算视线角度的众数(mode)
"""
# 使用直方图找众数
h_hist, h_bins = np.histogram(gaze_angles[:, 0], bins=50)
v_hist, v_bins = np.histogram(gaze_angles[:, 1], bins=50)

# 众数索引
h_mode_idx = np.argmax(h_hist)
v_mode_idx = np.argmax(v_hist)

# 众数值(取bin中心)
h_mode = (h_bins[h_mode_idx] + h_bins[h_mode_idx + 1]) / 2
v_mode = (v_bins[v_mode_idx] + v_bins[v_mode_idx + 1]) / 2

return (h_mode, v_mode)


# 测试
if __name__ == "__main__":
# 模拟视线数据
np.random.seed(42)

# 正常驾驶:视线在道路中心附近
normal_gaze = np.random.randn(1000, 2) * 5 + np.array([0, 0])

# 认知分心:视线过度集中
cognitive_gaze = np.random.randn(1000, 2) * 2 + np.array([0, 0])

# 视觉分心:视线分散
visual_gaze = np.random.randn(1000, 2) * 8 + np.array([0, 0])

road_center = determine_road_center(normal_gaze)

prc_normal = calculate_prc(normal_gaze, road_center)
prc_cognitive = calculate_prc(cognitive_gaze, road_center)
prc_visual = calculate_prc(visual_gaze, road_center)

print(f"道路中心点: H={road_center[0]:.1f}°, V={road_center[1]:.1f}°")
print(f"正常驾驶 PRC: {prc_normal:.1f}%")
print(f"认知分心 PRC: {prc_cognitive:.1f}% (集中)")
print(f"视觉分心 PRC: {prc_visual:.1f}% (分散)")

Gaze Dispersion

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
"""
Gaze Dispersion(视线分散度)计算
水平分散度(HD)和垂直分散度(VD)

参考:Victor et al., 2005; Wang et al., 2014
Halin et al., AutomotiveUI 2025

定义:视线角度的标准差
"""

import numpy as np

def calculate_gaze_dispersion(
gaze_angles: np.ndarray
) -> Tuple[float, float]:
"""
计算水平和垂直视线分散度

Args:
gaze_angles: 视线角度序列, shape=(N, 2)

Returns:
horizontal_dispersion: 水平分散度(度)
vertical_dispersion: 垂直分散度(度)

Euro NCAP 2026 应用:
- VD > 8° → 认知分心(间隙期间)
- VD < 5° → 认知分心(计算期间)
- HD > 10° → ACC关闭(正常扫描)
- HD < 8° → ACC开启(集中)
"""
horizontal_angles = gaze_angles[:, 0]
vertical_angles = gaze_angles[:, 1]

# 标准差作为分散度
h_dispersion = np.std(horizontal_angles)
v_dispersion = np.std(vertical_angles)

return h_dispersion, v_dispersion


# 测试
if __name__ == "__main__":
np.random.seed(42)

# 认知分心期间(计算):视线集中
during_calculation = np.random.randn(1000, 2) * 3

# 认知分心间隙:视线分散(垂直)
between_calculation = np.random.randn(1000, 2) * 6
between_calculation[:, 1] *= 1.5 # 垂直更分散

hd_during, vd_during = calculate_gaze_dispersion(during_calculation)
hd_between, vd_between = calculate_gaze_dispersion(between_calculation)

print(f"认知分心期间(计算):")
print(f" HD: {hd_during:.2f}°, VD: {vd_during:.2f}°")
print(f"认知分心间隙:")
print(f" HD: {hd_between:.2f}°, VD: {vd_between:.2f}°")
print(f"\n结论:间隙期间VD显著增加")

2.3 统计分析方法

使用 Linear Mixed Model (LMM)

固定效应 变量
环境复杂度 3等级
认知分心 有/无
ACC使用 开/关
随机效应 变量
个体差异 Participant intercept

分析方法: REML + Satterthwaite’s approximation

3. 关键结果

3.1 Percent Road Center (PRC)

条件 PRC值 显著性
无认知分心 76.1 ± 12.8% -
有认知分心 73.3 ± 12.8% p < .001
ACC关闭 71.9 ± 13.8% -
ACC开启 75.8 ± 13.4% p < .001

关键发现:

  • 认知分心 降低 PRC(与传统假设相反!)
  • ACC使用 增加 PRC(视线更集中)

3.2 Horizontal Gaze Dispersion (HD)

条件 HD值 显著性
ACC关闭 8.7° -
ACC开启 7.2° p < .001

关键发现:

  • ACC使用减少水平扫描范围
  • 认知分心对HD无显著影响

3.3 Vertical Gaze Dispersion (VD)

条件 VD值 显著性
交通Level 1 4.5° -
交通Level 2 4.8° -
交通Level 3 5.2° p < .05
无认知分心 4.9° -
有认知分心 5.1° p < .001

关键发现:

  • 交通复杂度增加VD
  • 认知分心增加VD(尤其在间隙期间)

3.4 动态变化规律(最重要发现)

sequenceDiagram
    participant D as 驾驶员
    participant E as 眼动系统
    participant T as 计算任务
    
    Note over D,T: 认知分心周期
    
    T->>D: 口算任务开始(83+42=?)
    D->>E: 视线集中道路中心
    Note over E: PRC增加, VD减少
    Note over E: "看但未见"状态
    
    D->>D: 计算完成
    Note over D: 任务间隙
    D->>E: 视线垂直分散
    Note over E: PRC减少, VD增加
    Note over E: 扫描仪表盘/导航
    
    T->>D: 下一个口算任务
    D->>E: 视线再次集中
    Note over E: 循环往复

周期特征:

阶段 眼动特征 持续时间
计算期间 PRC↑, VD↓ ~2-3秒
间隙期间 PRC↓, VD↑ ~5-10秒
循环周期 集中-分散交替 10-15秒

3.5 与ACC和交通复杂度的交互

graph TD
    A[认知分心状态] --> B{ACC状态}
    B --> C[ACC开启]
    B --> D[ACC关闭]
    
    C --> E[PRC进一步↑]
    C --> F[HD进一步↓]
    D --> G[正常扫描]
    
    A --> H{交通复杂度}
    H --> I[低复杂度]
    H --> J[高复杂度]
    
    I --> K[VD正常]
    J --> L[VD↑]
    
    E --> M[综合效应:视线高度集中]
    L --> N[综合效应:垂直分散]

4. IMS开发启示

4.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
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
252
253
254
255
"""
IMS 认知分心检测模块
基于AutomotiveUI 2025研究成果

核心算法:
1. PRC周期性检测(集中-分散交替)
2. VD动态变化检测
3. 与视觉分心区分

Euro NCAP 2026要求:
- 检测认知分心(KSS > 7等效)
- 与疲劳区分
- 与视觉分心区分
"""

import numpy as np
from typing import List, Tuple, Optional
from dataclasses import dataclass
from enum import Enum

class DistractionType(Enum):
"""分心类型"""
NONE = "正常"
VISUAL = "视觉分心"
COGNITIVE = "认知分心"
COMBINED = "混合分心"

@dataclass
class CognitiveDistractionState:
"""认知分心状态"""
distraction_type: DistractionType
prc_value: float
vd_value: float
hd_value: float
cycle_detected: bool # 是否检测到周期性
confidence: float

class CognitiveDistractionDetector:
"""
认知分心检测器

基于眼动指标的动态分析:
1. PRC周期性:集中-分散交替 → 认知分心
2. VD增加:垂直分散 → 认知分心间隙
3. HD正常:水平扫描未减少 → 区分视觉分心
"""

def __init__(
self,
prc_threshold_high: float = 80.0,
prc_threshold_low: float = 60.0,
vd_threshold_high: float = 7.0,
hd_threshold_low: float = 6.0,
window_seconds: int = 30,
fps: int = 30
):
"""
Args:
prc_threshold_high: PRC高阈值(过度集中)
prc_threshold_low: PRC低阈值(分散)
vd_threshold_high: VD高阈值(垂直分散)
hd_threshold_low: HD低阈值(水平集中)
window_seconds: 分析窗口秒数
fps: 采样帧率
"""
self.prc_high = prc_threshold_high
self.prc_low = prc_threshold_low
self.vd_high = vd_threshold_high
self.hd_low = hd_threshold_low
self.window_size = window_seconds * fps

def detect_cognitive_cycle(
self,
prc_sequence: np.ndarray,
vd_sequence: np.ndarray
) -> Tuple[bool, float]:
"""
检测认知分心的周期性特征

Args:
prc_sequence: PRC时间序列
vd_sequence: VD时间序列

Returns:
cycle_detected: 是否检测到周期
cycle_strength: 周期强度(0-1)

方法:
1. 计算PRC和VD的变化频率
2. 检测集中-分散交替模式
3. 计算周期强度
"""
if len(prc_sequence) < self.window_size:
return False, 0.0

# 计算PRC变化
prc_changes = np.diff(prc_sequence)

# 检测集中-分散交替
# PRC增加 → 集中(计算期间)
# PRC减少 → 分散(间隙期间)

concentration_events = np.sum(prc_changes > 5)
dispersion_events = np.sum(prc_changes < -5)

# 周期性:集中和分散事件交替出现
if concentration_events > 0 and dispersion_events > 0:
# 计算交替比例
alternation_ratio = min(
concentration_events, dispersion_events
) / max(concentration_events, dispersion_events)

cycle_strength = alternation_ratio
cycle_detected = alternation_ratio > 0.5

return cycle_detected, cycle_strength

return False, 0.0

def classify_distraction(
self,
prc_value: float,
vd_value: float,
hd_value: float,
cycle_detected: bool
) -> DistractionType:
"""
分类分心类型

Args:
prc_value: 当前PRC值
vd_value: 当前VD值
hd_value: 当前HD值
cycle_detected: 是否检测到周期

Returns:
distraction_type: 分心类型

分类逻辑:
1. PRC<60% + HD↑ → 视觉分心
2. 周期性 + VD↑ → 认知分心
3. 两者都有 → 混合分心
"""
# 视觉分心特征:视线偏离道路中心
visual_indicators = (
prc_value < self.prc_low and
hd_value > 8.0 # 水平扫描增加
)

# 认知分心特征:周期性集中-分散
cognitive_indicators = (
cycle_detected and
vd_value > self.vd_high
)

if visual_indicators and cognitive_indicators:
return DistractionType.COMBINED
elif visual_indicators:
return DistractionType.VISUAL
elif cognitive_indicators:
return DistractionType.COGNITIVE
else:
return DistractionType.NONE

def detect(
self,
gaze_angles: np.ndarray
) -> CognitiveDistractionState:
"""
完整检测流程

Args:
gaze_angles: 视线角度序列

Returns:
state: 认知分心状态
"""
# 计算眼动指标
road_center = determine_road_center(gaze_angles)

# 分窗口计算PRC
window_size = min(self.window_size, len(gaze_angles))
prc_values = []
vd_values = []
hd_values = []

for i in range(0, len(gaze_angles) - window_size, window_size // 10):
window = gaze_angles[i:i+window_size]
prc = calculate_prc(window, road_center)
hd, vd = calculate_gaze_dispersion(window)
prc_values.append(prc)
vd_values.append(vd)
hd_values.append(hd)

prc_sequence = np.array(prc_values)
vd_sequence = np.array(vd_values)
hd_sequence = np.array(hd_values)

# 当前值
current_prc = np.mean(prc_sequence[-5:])
current_vd = np.mean(vd_sequence[-5:])
current_hd = np.mean(hd_sequence[-5:])

# 检测周期性
cycle_detected, cycle_strength = self.detect_cognitive_cycle(
prc_sequence, vd_sequence
)

# 分类
distraction_type = self.classify_distraction(
current_prc, current_vd, current_hd, cycle_detected
)

# 置信度
confidence = cycle_strength if cycle_detected else 0.5

return CognitiveDistractionState(
distraction_type=distraction_type,
prc_value=current_prc,
vd_value=current_vd,
hd_value=current_hd,
cycle_detected=cycle_detected,
confidence=confidence
)


# 测试
if __name__ == "__main__":
detector = CognitiveDistractionDetector()

# 模拟认知分心数据(周期性)
np.random.seed(42)
gaze_sequence = []

for cycle in range(10):
# 计算期间:集中
concentrated = np.random.randn(90, 2) * 3
gaze_sequence.extend(concentrated.tolist())

# 间隙期间:分散(垂直)
dispersed = np.random.randn(150, 2) * 6
dispersed[:, 1] *= 1.5 # 垂直更分散
gaze_sequence.extend(dispersed.tolist())

gaze_angles = np.array(gaze_sequence)

# 检测
state = detector.detect(gaze_angles)

print(f"分心类型: {state.distraction_type.value}")
print(f"PRC: {state.prc_value:.1f}%")
print(f"VD: {state.vd_value:.2f}°")
print(f"HD: {state.hd_value:.2f}°")
print(f"周期检测: {state.cycle_detected}")
print(f"置信度: {state.confidence:.2f}")

4.2 Euro NCAP 2026场景对应

Euro NCAP场景 IMS检测方法 阈值
D-01 长分心 PRC持续<60% + HD>10° 3-4秒
D-02 短分心(VATS) 累计偏离时间 30秒窗口10秒累计
认知分心 周期性+VD>7° KSS>7等效

4.3 开发优先级

优先级 开发项 技术路线 周期
🔴 P0 PRC计算模块 20°×15°矩形区域 1周
🔴 P0 VD动态分析 标准差+时序 2周
🔴 P0 周期性检测 集中-分散交替 2周
🟡 P1 认知vs视觉区分 HD辅助判断 1周
🟡 P1 ACC状态融合 ACC ON/OFF补偿 1周
🟢 P2 交通复杂度自适应 动态阈值调整 2周

5. 与竞品方案对比

方案 检测方法 认知分心准确率 Euro NCAP得分
传统视觉检测 PRC<阈值 ❌ 失效(视线集中) 部分得分
本文方案 周期性+VD ✅ 有效(动态变化) 满分
Seeing Machines 多模态融合 ✅ 有效 满分
Smart Eye 同上 ✅ 有效 满分

6. 总结

AutomotiveUI 2025这篇论文是认知分心检测的突破性研究

关键发现

  1. 推翻传统假设:认知分心 ≠ 视线分散
  2. 动态变化规律:计算期间集中,间隙期间分散
  3. 周期性特征:集中-分散交替是认知分心的核心信号
  4. ACC补偿效应:ACC使用时视线更集中,需补偿判断
  5. 交通复杂度影响:高复杂度增加VD,需自适应阈值

IMS应用价值

  • 首个可落地的认知分心检测方案
  • 基于现有DMS摄像头,无需额外硬件
  • 符合Euro NCAP 2026 DSM要求
  • 与视觉分心明确区分,避免误判

参考链接:


AutomotiveUI 2025 论文解读:眼动指标检测认知分心的突破——ACC与交通复杂度影响研究
https://dapalm.com/2026/07/05/2026-07-05-cognitive-distraction-gaze-indicators-automotiveui-2025-zh/
作者
Mars
发布于
2026年7月5日
许可协议