视线稳定性与注意力:从眼动神经科学到认知分心检测的生理基础

注意力不是心理学概念,是生物学过程。视线稳定性、平滑追踪和扫视控制在神经层面与注意力网络高度重叠。这意味着眼动指标不只是疲劳检测的PERCLOS——它们可以作为认知分心的客观生理标记。ADHD和自闭症研究已证实:眼动控制差异反映注意力网络功能。

来源

项目 内容
来源 Dr. David Traster, Neurologic Wellness Institute
发表 2026-08, Substack
领域 神经科学 / 眼动学 / 注意力障碍
关键词 凝视稳定性, 平滑追踪, 扫视, 注意力, ADHD, 自闭症

核心理论

注意力与眼动的神经重叠

1
2
3
4
5
6
7
8
注意力网络 = 眼动控制网络(部分共享)

前额叶眼区 (FEF) → 自主眼动 + 注意定向
顶叶皮层 → 空间注意分配
上丘 → 眼/头朝向重要刺激
基底神经节 → 运动选择/抑制
小脑 → 时序/预测/校准/纠错
前额叶皮层 → 执行控制/抑制不当反应

三种眼动模式

眼动类型 功能 神经网络 IMS检测指标
凝视固定 维持视线在目标上 视网膜+脑干+小脑+丘脑+基底节 注视时长/位置稳定性
平滑追踪 跟随移动物体 视觉皮层+顶叶+额叶+小脑 追踪增益/延迟
扫视 快速切换视线 FEF+顶叶+上丘+基底节 扫视频率/幅度/潜伏期

对认知分心检测的启示

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
"""
反扫视任务 (Antisaccade Task) → 驾驶员认知分心检测

ADHD研究发现:反扫视错误率高 = 抑制控制差 = 注意力网络功能降低

迁移到驾驶场景:
正常驾驶:出现路边刺激 → 自动看向(prosaccade)
分心驾驶:出现路边刺激 → 应抑制但无法抑制 → 反扫视错误

认知分心 = 抑制能力下降 = 扫视控制异常
"""

import numpy as np

class CognitiveDistractionEyeMetrics:
"""
基于眼动神经科学的认知分心检测

核心假设:
认知分心 → 注意力网络功能降低 → 眼动控制指标变化

指标:
1. 凝视稳定性(微扫视频率/幅度)
2. 扫视抑制(非目标方向扫视次数)
3. 追踪增益(平滑追踪精度)
4. 扫视潜伏期(反应时间)
"""

def __init__(self, fps: int = 30):
self.fps = fps

def compute_gaze_stability(
self,
gaze_x: np.ndarray,
gaze_y: np.ndarray,
fixation_threshold: float = 50 # 像素
) -> dict:
"""
凝视稳定性分析

正常:微扫视幅度小、频率稳定
认知分心:微扫视增多、幅度增大、稳定性下降
"""
# 速度
dx = np.diff(gaze_x)
dy = np.diff(gaze_y)
speed = np.sqrt(dx**2 + dy**2)

# 微扫视(小幅快速运动)
microsaccades = np.sum((speed > 5) & (speed < fixation_threshold))

# 凝视稳定性(位置离散度)
fixation_stability = np.std(gaze_x) + np.std(gaze_y)

# 注视时长分布
fixation_periods = self._detect_fixations(gaze_x, gaze_y, fixation_threshold)
mean_fixation_duration = np.mean(fixation_periods) if fixation_periods else 0

return {
'microsaccade_count': microsaccades,
'microsaccade_rate': microsaccades / (len(gaze_x) / self.fps / 60), # per min
'fixation_stability': fixation_stability,
'mean_fixation_duration_ms': mean_fixation_duration * 1000 / self.fps,
'gaze_entropy': self._compute_entropy(gaze_x, gaze_y)
}

def compute_saccade_inhibition(
self,
gaze_x: np.ndarray,
gaze_y: np.ndarray,
road_center: tuple = (0, 0)
) -> dict:
"""
扫视抑制分析

正常驾驶:偶尔看向后视镜/仪表盘(自主扫视)
认知分心:非目标方向扫视增多(抑制能力下降)

类比反扫视任务:
刺激出现 → 应保持注视道路 → 但无法抑制 → 扫向刺激
"""
# 偏离道路中心的扫视
dist_from_road = np.sqrt(
(gaze_x - road_center[0])**2 +
(gaze_y - road_center[1])**2
)

# 非目标扫视(偏离>阈值且不是后视镜/仪表盘区域)
off_road_threshold = 100 # 像素
off_road_count = np.sum(dist_from_road > off_road_threshold)

# 扫视潜伏期(从刺激到扫回道路)
saccade_latencies = self._compute_saccade_latencies(
gaze_x, gaze_y, road_center
)

return {
'off_road_count': off_road_count,
'off_road_ratio': off_road_count / len(gaze_x),
'mean_saccade_latency_ms': np.mean(saccade_latencies) if saccade_latencies else 0,
'inhibition_failure_rate': off_road_count / (len(gaze_x) / self.fps / 60)
}

def compute_pursuit_gain(
self,
gaze_x: np.ndarray,
target_x: np.ndarray
) -> dict:
"""
平滑追踪增益

正常:追踪增益~1.0(眼睛跟随目标)
认知分心:追踪增益下降(眼睛跟不上目标)

驾驶场景:跟随前方车辆/弯道
"""
# 追踪增益 = 眼动速度 / 目标速度
eye_vel = np.diff(gaze_x) * self.fps
target_vel = np.diff(target_x) * self.fps

# 仅分析有运动的段
moving = np.abs(target_vel) > 10
if np.sum(moving) == 0:
return {'pursuit_gain': 1.0, 'pursuit_error': 0}

gain = np.mean(eye_vel[moving] / (target_vel[moving] + 1e-8))
error = np.mean(np.abs(gaze_x[1:][moving] - target_x[1:][moving]))

return {
'pursuit_gain': gain,
'pursuit_error': error,
'cognitive_load_indicator': 1.0 - min(gain, 1.0) # 越高越分心
}

def _detect_fixations(self, x, y, threshold):
"""检测注视期"""
fixations = []
start = 0
for i in range(1, len(x)):
dist = np.sqrt((x[i]-x[start])**2 + (y[i]-y[start])**2)
if dist > threshold:
fixations.append(i - start)
start = i
return fixations

def _compute_entropy(self, x, y, n_bins=10):
"""二维熵"""
hist, _, _ = np.histogram2d(x, y, bins=n_bins)
hist = hist / hist.sum()
hist = hist[hist > 0]
return -np.sum(hist * np.log2(hist))

def _compute_saccade_latencies(self, x, y, center):
"""计算扫视潜伏期"""
latencies = []
dist = np.sqrt((x - center[0])**2 + (y - center[1])**2)

off_road = dist > 100
for i in range(1, len(off_road)):
if off_road[i] and not off_road[i-1]:
# 开始偏离
start = i
for j in range(i, min(i+150, len(off_road))): # 最多5秒
if not off_road[j]:
latencies.append((j - start) * 1000 / self.fps)
break
return latencies


# 测试
if __name__ == "__main__":
np.random.seed(42)
n_frames = 30 * 60 # 60秒

detector = CognitiveDistractionEyeMetrics(fps=30)

# 模拟正常驾驶(稳定注视道路)
alert_x = np.random.normal(0, 10, n_frames)
alert_y = np.random.normal(0, 8, n_frames)

# 模拟认知分心(注视不稳定,扫视增多)
distracted_x = np.random.normal(0, 25, n_frames)
distracted_y = np.random.normal(0, 20, n_frames)
# 添加随机扫视
for _ in range(15):
idx = np.random.randint(0, n_frames)
distracted_x[idx:idx+10] += np.random.uniform(-80, 80)

print("=== 正常驾驶 ===")
stability = detector.compute_gaze_stability(alert_x, alert_y)
inhibition = detector.compute_saccade_inhibition(alert_x, alert_y)
for k, v in {**stability, **inhibition}.items():
print(f" {k}: {v:.2f}")

print("\n=== 认知分心 ===")
stability_d = detector.compute_gaze_stability(distracted_x, distracted_y)
inhibition_d = detector.compute_saccade_inhibition(distracted_x, distracted_y)
for k, v in {**stability_d, **inhibition_d}.items():
print(f" {k}: {v:.2f}")

2. 从ADHD研究到驾驶分心

ADHD发现 驾驶分心对应 检测方法
反扫视错误率高 非目标方向扫视增多 off_road_ratio
扫视抑制差 抑制不当刺激能力下降 inhibition_failure_rate
注视稳定性下降 凝视离散度增大 fixation_stability
微扫视异常 微扫视频率/幅度变化 microsaccade_rate

3. 自闭症研究启示

自闭症发现 驾驶场景对应 检测方法
面部注视模式异常 看人 vs 看路的时间比 gaze_zone_ratio
社交场景注视差异 与乘客交谈时视线偏离 off_road_during_conversation
注意分配差异 道路 vs 仪表盘 vs 后视镜分配 gaze_entropy

IMS 开发启示

认知分心检测三层架构

分心类型分类

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
# 认知分心类型分类
distraction_types = {
"visual_distraction": {
"indicators": ["off_road_ratio > 15%", "mean_off_duration > 2s"],
"example": "看手机/看乘客/看窗外"
},
"cognitive_distraction": {
"indicators": [
"fixation_stability下降但off_road_ratio正常",
"pursuit_gain下降",
"microsaccade_rate异常升高",
"gaze_entropy降低(隧道视野)"
],
"example": "走神/内部思考/情绪波动",
"key_insight": "认知分心时眼睛可能看着道路但'没在看'——追踪和稳定性下降"
},
"motor_distraction": {
"indicators": ["hand_off_wheel", "posture_change"],
"example": "调节设备/吃东西/抽烟"
},
"auditory_distraction": {
"indicators": ["gaze_shift_to_sound", "head_turn"],
"example": "乘客说话/电话铃响"
}
}

参考文献

  1. 原文: Dr. David Traster, Substack
  2. ADHD反扫视研究: Hutton & Ettinger, 2006
  3. 自闭症眼动: Pierce et al., 2017
  4. 注意力网络: Posner & Petersen, 1990
  5. 平滑追踪神经通路: Newsome et al., 1985

发布时间: 2026-08-26 00:35
标签: 眼动神经科学, 认知分心, 凝视稳定性, 反扫视, 平滑追踪, ADHD, 注意力网络, IMS