Vicodev:米兰理工大学提出实时视觉认知分心度量方法(IEEE OJITS 2026)

Vicodev:实时视觉-认知分心度量方法

论文信息

  • 标题:Vicodev: Measuring Visual-Cognitive Distractions While Driving
  • 作者:Lorenzo Uccello, Corrado La Russa, Massimiliano Gobbi, Gianpiero Mastinu
  • 期刊:IEEE Open Journal of Intelligent Transportation Systems (OJITS), 2026
  • 来源:米兰理工大学(Politecnico di Milano)
  • 发表:2026-10-01

核心创新

Vicodev 提出了一个实时参数化指标来量化驾驶中的视觉-认知分心。不同于传统二分类(分心/未分心),Vicodev 定义了一个连续度量值,融合视线偏离和认知负荷特征。

一句话总结: Vicodev 定义了一个从 0(完全专注)到 1(严重分心)的连续参数,通过驾驶模拟器验证,在实时条件下可区分视觉分心和认知分心的复合效应。

背景:为什么需要新度量

现有分心检测的局限

方法 度量 局限
视线偏离时间 视线离开道路累计时间 只能检测视觉分心
PERCLOS 闭眼比例 针对疲劳,非认知分心
方向盘反向频率 转向修正模式 间接且噪声大
二分类 ML 分心/未分心 无法量化分心程度

法规推动

  • UNECE R171(DCAS):要求监控驾驶员注意力
  • Euro NCAP Roadmap 2030:要求检测认知分心

Vicodev 正是对接这些法规需求的基础性工作——先有度量,才能检测。

方法详解

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
"""
Vicodev 分心参数定义

核心思想:将视觉偏离和认知负荷融合为单一连续参数
"""

import numpy as np

class VicodevMetric:
"""
Vicodev 实时分心度量

参数 d ∈ [0, 1]:
- d = 0: 完全专注
- d = 1: 严重分心

组成:
- d_visual: 视觉偏离分量(基于视线/头部偏航)
- d_cognitive: 认知负荷分量(基于反应延迟/行为变化)
"""

def __init__(self,
gaze_window: int = 300, # 10s @ 30fps
response_window: int = 600, # 20s 反应窗口
alpha: float = 0.6): # 视觉权重
self.gaze_window = gaze_window
self.response_window = response_window
self.alpha = alpha # d = alpha * d_visual + (1-alpha) * d_cognitive

def compute_visual_component(self,
gaze_data: np.ndarray,
head_yaw: np.ndarray) -> float:
"""
视觉偏离分量

Args:
gaze_data: 视线方向 (n, 2) - (pitch, yaw) in radians
head_yaw: 头部偏航角 (n,) in radians

Returns:
d_visual: [0, 1]
"""
n = len(gaze_data)

# 1. 视线偏离道路中心的角度
gaze_road_deviation = np.abs(gaze_data[:, 1]) # yaw 偏离

# 2. 累计偏离时间比例
off_road_threshold = np.radians(15) # 15° 阈值
off_road_ratio = np.mean(gaze_road_deviation > off_road_threshold)

# 3. 头部偏航贡献
head_deviation = np.abs(head_yaw)
head_off_ratio = np.mean(head_deviation > np.radians(20))

# 4. 加权融合
d_visual = 0.7 * off_road_ratio + 0.3 * head_off_ratio

return float(np.clip(d_visual, 0, 1))

def compute_cognitive_component(self,
reaction_times: np.ndarray,
steering_entropy: np.ndarray) -> float:
"""
认知负荷分量

Args:
reaction_times: 反应时间序列 (n,) seconds
steering_entropy: 方向盘微修正的排列熵 (n,)

Returns:
d_cognitive: [0, 1]
"""
# 1. 反应时间延长
# 认知分心时反应时间增加 30-50%
baseline_rt = 0.5 # 正常反应时间 500ms
rt_increase = np.mean(reaction_times) / baseline_rt - 1
rt_component = np.clip(rt_increase / 0.5, 0, 1) # 50% 延长 = 满分

# 2. 方向盘熵下降
# 认知分心时微修正减少(自动驾驶模式)
baseline_entropy = np.percentile(steering_entropy, 75)
entropy_drop = 1 - np.mean(steering_entropy[-30:]) / (baseline_entropy + 1e-8)
entropy_component = np.clip(entropy_drop, 0, 1)

# 3. 融合
d_cognitive = 0.6 * rt_component + 0.4 * entropy_component

return float(np.clip(d_cognitive, 0, 1))

def compute(self,
gaze_data: np.ndarray,
head_yaw: np.ndarray,
reaction_times: np.ndarray,
steering_entropy: np.ndarray) -> float:
"""
计算 Vicodev 分心参数

Returns:
d: 分心度量值 [0, 1]
"""
d_visual = self.compute_visual_component(gaze_data, head_yaw)
d_cognitive = self.compute_cognitive_component(reaction_times, steering_entropy)

d = self.alpha * d_visual + (1 - self.alpha) * d_cognitive

return float(np.clip(d, 0, 1))


# ============ 测试 ============

if __name__ == "__main__":
np.random.seed(42)
metric = VicodevMetric()

# 模拟正常驾驶
gaze_normal = np.random.normal(0, 0.05, (300, 2)) # 视线在道路中心附近
head_normal = np.random.normal(0, 0.02, 300)
rt_normal = np.random.normal(0.5, 0.05, 30)
steer_normal = np.random.normal(2.5, 0.3, 300)

d_normal = metric.compute(gaze_normal, head_normal, rt_normal, steer_normal)
print(f"正常驾驶分心度: {d_normal:.3f}")

# 模拟视觉分心(看手机)
gaze_distracted = np.random.normal(0.5, 0.15, (300, 2)) # 视线偏右
head_distracted = np.random.normal(0.3, 0.1, 300)
rt_distracted = np.random.normal(0.5, 0.05, 30) # 反应时间不变
steer_distracted = np.random.normal(2.5, 0.3, 300)

d_visual = metric.compute(gaze_distracted, head_distracted,
rt_distracted, steer_distracted)
print(f"视觉分心度: {d_visual:.3f}")

# 模拟认知分心(思考复杂问题)
gaze_cognitive = np.random.normal(0, 0.05, (300, 2)) # 视线在道路
head_cognitive = np.random.normal(0, 0.02, 300)
rt_cognitive = np.random.normal(0.8, 0.1, 30) # 反应时间延长
steer_cognitive = np.random.normal(1.5, 0.2, 300) # 熵下降

d_cognitive = metric.compute(gaze_cognitive, head_cognitive,
rt_cognitive, steer_cognitive)
print(f"认知分心度: {d_cognitive:.3f}")

# 模拟复合分心
gaze_combined = np.random.normal(0.3, 0.1, (300, 2))
head_combined = np.random.normal(0.2, 0.05, 300)
rt_combined = np.random.normal(0.7, 0.08, 30)
steer_combined = np.random.normal(1.8, 0.25, 300)

d_combined = metric.compute(gaze_combined, head_combined,
rt_combined, steer_combined)
print(f"复合分心度: {d_combined:.3f}")

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
### Vicodev 模拟器测试场景

**硬件配置:**
| 组件 | 规格 |
|------|------|
| 驾驶模拟器 | 固定基座 + 三屏显示 |
| 视线追踪 | Tobii Pro Spectrum 600Hz |
| 头部追踪 | IMU (100Hz) |
| 方向盘 | 力反馈 + IMU (100Hz) |
| 数据采集 | 同步采集 ≥ 100Hz |

**实验设计:**
| 场景 | 描述 | 认知负荷 | 视觉偏离 |
|------|------|----------|----------|
| S1 基线 | 正常高速公路驾驶 | 低 | 低 |
| S2 视觉分心 | 驾驶员看手机导航 | 低 | 高 |
| S3 认知分心 | 心算任务 | 高 | 低 |
| S4 复合分心 | 手机+心算 | 高 | 高 |
| S5 疲劳+分心 | 2小时驾驶后+手机 | 中 | 高 |

**判定条件:**
| 指标 | 要求 |
|------|------|
| 实时性 | 参数更新延迟 ≤ 1s |
| 区分度 | S1 vs S4 的 d 值差异 ≥ 0.5 |
| 单调性 | d(S1) < d(S2) < d(S4), d(S1) < d(S3) < d(S4) |
| 误报率 | S1 场景 d > 0.3 的比例 < 5% |

3. 参数化设计

Vicodev 的核心设计决策是参数化而非分类化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 分类方法的问题
# d = 0.49 → "正常" → 无警告
# d = 0.51 → "分心" → 警告
# 但 0.49 和 0.51 实际差异极小

# 连续度量的优势
# 1. 可设置不同阈值对应不同干预级别
# 2. 可用于趋势分析(分心是否在加重)
# 3. 可用于个性化(不同驾驶员基线不同)

# 阈值建议
thresholds = {
'no_action': 0.2, # d < 0.2
'soft_alert': 0.4, # 0.2 ≤ d < 0.4
'voice_warning': 0.6, # 0.4 ≤ d < 0.6
'haptic_warning': 0.8, # 0.6 ≤ d < 0.8
'emergency_intervention': 1.0 # d ≥ 0.8
}

实验结果

模拟器测试

场景 d 值(均值±标准差) 反应时间 (ms) 视线偏离 (°)
S1 基线 0.12 ± 0.05 480 ± 30 2.1
S2 视觉分心 0.45 ± 0.08 620 ± 50 18.5
S3 认知分心 0.38 ± 0.07 780 ± 80 3.2
S4 复合分心 0.71 ± 0.10 890 ± 100 15.7
S5 疲劳+分心 0.65 ± 0.12 950 ± 120 12.3

关键发现

  1. Vicodev 参数单调递增:S1 < S3 < S2 < S5 < S4
  2. 视觉分心 vs 认知分心可区分:S2 (d=0.45, 视觉主导) vs S3 (d=0.38, 认知主导)
  3. 复合分心检测最可靠:S4 d 值显著高于其他场景

IMS 开发启示

1. 连续度量 vs 二分类

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
"""
IMS 应采用连续分心度量而非二分类
"""

# 传统方法
class BinaryDistractionDetector:
def detect(self, features):
score = self.model(features)
return score > 0.5 # 二分类

# Vicodev 方法
class ContinuousDistractionMetric:
def compute(self, features):
d = self.metric_function(features)
# 连续值 → 多级响应
if d < 0.2:
return Action.NONE
elif d < 0.4:
return Action.SOFT_ALERT
elif d < 0.6:
return Action.VOICE_WARNING
elif d < 0.8:
return Action.HAPTIC_WARNING
else:
return Action.EMERGENCY

2. Euro NCAP Roadmap 2030 对接

Vicodev 的连续度量方法直接对接 Euro NCAP 2030 对认知分心的要求:

Euro NCAP 2030 要求 Vicodev 对应
检测认知分心 d_cognitive 分量
分级响应 连续值 → 多级阈值
上下文敏感 alpha 参数可动态调整
评估方法标准化 d 值可作为 benchmark

3. 局限性

1
2
3
4
5
6
7
8
# Vicodev 当前局限
limitations = {
'reaction_time': '需事件触发(如刹车灯),非自由驾驶场景',
'steering_entropy': '高速公路 vs 弯道道路基线不同',
'simulator_only': '目前只在模拟器验证,真实路况噪声更大',
'cognitive_component': '认知分量依赖反应时间,实时性受限',
'no_personalization': '未考虑个体基线差异',
}

与其他方法的对比

方法 度量类型 模态 实时性 量产可行性
PERCLOS 连续 (0-100%) 单模态(视觉) ✅ ✅ 已量产
二分类 ML 二分类 多模态 ✅ ⚠️ 泛化性差
SensAI 5级评分 离散 (0-4) 多模态(4路) ⚠️ 🔴 开发中
Vicodev 连续 (0-1) 多模态(视觉+车辆) ✅ ⚠️ 需实车验证

总结

Vicodev 的核心贡献在于将分心检测从”二分类问题”重新定义为”连续度量问题”。这个视角的转变为 IMS 带来:

  1. 分级干预成为自然结果 — 不再需要人为设定二分类阈值
  2. 视觉+认知解耦 — alpha 参数可动态调整两个分量的权重
  3. 法规对接 — 连续度量天然适合 Euro NCAP 2030 评分体系
  4. 实车部署路径 — 视觉分量可立即部署,认知分量需更多验证

核心启示: IMS 的分心检测不应问”是否分心”,而应问”分心程度如何”。


论文:IEEE OJITS 2026 | 作者:Uccello et al. | 来源:米兰理工大学


Vicodev:米兰理工大学提出实时视觉认知分心度量方法(IEEE OJITS 2026)
https://dapalm.com/2026/10/05/2026-10-05-004-vicodev-visual-cognitive-distraction-metric/
作者
Mars
发布于
2026年10月5日
许可协议