多模态接管就绪信号:fNIRS+驾驶行为在不同危险与认知负荷条件下的融合检测(论文解读)

论文信息

  • 标题: When Context Dominates: Multimodal Signatures of Takeover Readiness Under Varying Hazard and Cognitive Load Conditions
  • 作者: Shiva Azimi, Yasaman Hakiminejad, Luis Gomero, Elizabeth Pantesco, Irene P. Kan, Meltem Izzetoglu, Arash Tavakoli
  • 发表: arXiv(2026年7月)
  • 核心贡献: 系统揭示了认知负荷与危险等级对接管就绪性的交互影响,提出基于 fNIRS 脑血流+驾驶行为的多模态融合检测框架

1. 论文核心创新

1.1 研究背景

半自动驾驶系统中,驾驶员需要在长时间被动监控后快速接管控制权。 prolonged passive monitoring 会导致:

  • 警觉性退化(vigilance decrement)
  • 反应延迟(delayed reactions)
  • 接管风险增加(takeover risk)

但现有研究很少同时考察认知负荷和危险等级对接管就绪性的交互影响。

1.2 核心问题

问题 传统假设 本文挑战
分心一定降低接管质量? 是 不一定,取决于危险等级
认知负荷越高越危险? 是 低危险场景下适度负荷反而提升警觉
单一信号足够判断就绪? 是 上下文(context)主导信号有效性

核心论点: 接管就绪性不是固定状态,而是认知负荷×危险等级的交互函数。Context dominates — 上下文决定了哪些生理和行为信号有效。

2. 方法详解

2.1 实验设计

2.2 多模态信号采集

信号类型 传感器 采集参数 特征
脑血流 fNIRS(近红外光谱) 前额叶 PFC,10Hz HbO/HbR 浓度变化
驾驶行为 模拟器日志 60Hz 方向盘、油门、刹车
眼动 眼动仪 60Hz 注视点、瞳孔直径
环境 模拟器场景 — 危险等级标记

2.3 fNIRS 数据处理链路

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
import numpy as np
from scipy import signal as sig
from typing import Tuple

class fNIRSProcessor:
"""
fNIRS 近红外光谱信号处理器
用于提取前额叶血流动力学响应
"""

def __init__(self, sample_rate: float = 10.0):
"""
Args:
sample_rate: 采样率 (Hz), fNIRS 通常 10-20 Hz
"""
self.fs = sample_rate

# fNIRS 滤波参数
self.hbO_lowcut = 0.01 # Hz, 去除基线漂移
self.hbO_highcut = 0.5 # Hz, 去除心跳(~1Hz)

def preprocess(self, raw_hbO: np.ndarray, raw_hbR: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
"""
fNIRS 预处理链路

Args:
raw_hbO: 原始氧合血红蛋白信号, shape=(n_samples, n_channels)
raw_hbR: 原始脱氧血红蛋白信号, shape=(n_samples, n_channels)

Returns:
hbO_filtered, hbR_filtered: 滤波后信号
"""
nyquist = self.fs / 2

# 带通滤波 0.01-0.5 Hz
b, a = sig.butter(
4,
[self.hbO_lowcut/nyquist, self.hbO_highcut/nyquist],
btype='band'
)

hbO_filtered = sig.filtfilt(b, a, raw_hbO, axis=0)
hbR_filtered = sig.filtfilt(b, a, raw_hbR, axis=0)

# 运动伪影去除(基于方差的自适应阈值)
for ch in range(hbO_filtered.shape[1]):
# 计算滑动窗口方差
window = 50 # 5秒 @ 10Hz
var = np.convolve(
np.var(hbO_filtered[:, ch:ch+1], axis=0),
np.ones(window)/window,
mode='same'
)
# 高方差段视为运动伪影,插值替换
mask = var > np.median(var) * 3
if np.any(mask):
hbO_filtered[mask, ch] = np.interp(
np.where(mask)[0],
np.where(~mask)[0],
hbO_filtered[~mask, ch]
)

return hbO_filtered, hbR_filtered

def extract_features(self, hbO: np.ndarray, hbR: np.ndarray) -> dict:
"""
从 fNIRS 信号提取认知负荷特征

Args:
hbO: 预处理后 HbO 信号
hbR: 预处理后 HbR 信号

Returns:
features: 认知负荷特征字典
"""
features = {}

# 1. HbO 均值(前额叶激活指标)
features['hbO_mean'] = np.mean(hbO, axis=0)

# 2. HbO 方差(认知负荷波动)
features['hbO_std'] = np.std(hbO, axis=0)

# 3. HbO/HbR 比值(氧合代谢率)
features['hbO_hbR_ratio'] = np.mean(hbO) / (np.mean(hbR) + 1e-6)

# 4. 前额叶左右不对称性(情绪/压力指标)
n_channels = hbO.shape[1]
left = np.mean(hbO[:, :n_channels//2])
right = np.mean(hbO[:, n_channels//2:])
features['frontal_asymmetry'] = left - right

# 5. 频域特征(0.01-0.1Hz 为认知负荷频带)
freqs = np.fft.rfftfreq(len(hbO), 1/self.fs)
fft_hbO = np.abs(np.fft.rfft(hbO, axis=0))
mask = (freqs >= 0.01) & (freqs <= 0.1)
features['cognitive_band_power'] = np.mean(fft_hbO[mask], axis=0)

return features


class TakeoverReadinessFusion:
"""
多模态接管就绪性融合评估器

论文核心:认知负荷×危险等级的交互效应
"""

def __init__(self):
# 上下文权重矩阵(论文核心发现)
# [低危险, 高危险] × [低负荷, 高负荷]
self.context_weights = {
'fnirs': {
('low', 'low'): 0.3, # 低危险低负荷:fNIRS 信号弱
('low', 'high'): 0.7, # 低危险高负荷:fNIRS 信号强
('high', 'low'): 0.5, # 高危险低负荷:中等
('high', 'high'): 0.8, # 高危险高负荷:最强
},
'driving': {
('low', 'low'): 0.7, # 低危险低负荷:行为信号主导
('low', 'high'): 0.5,
('high', 'low'): 0.8, # 高危险低负荷:行为变化大
('high', 'high'): 0.6,
},
'eye': {
('low', 'low'): 0.5,
('low', 'high'): 0.6,
('high', 'low'): 0.7,
('high', 'high'): 0.5,
}
}

def assess(self, fnirs_feat: dict, driving_feat: dict, eye_feat: dict,
hazard_level: str, cognitive_load: str) -> dict:
"""
评估接管就绪性

Args:
fnirs_feat: fNIRS 特征
driving_feat: 驾驶行为特征
eye_feat: 眼动特征
hazard_level: 'low' or 'high'
cognitive_load: 'low' or 'high'

Returns:
assessment: 就绪性评估结果
"""
context = (hazard_level, cognitive_load)

# 上下文自适应权重
w_fnirs = self.context_weights['fnirs'][context]
w_driving = self.context_weights['driving'][context]
w_eye = self.context_weights['eye'][context]

# 归一化
total = w_fnirs + w_driving + w_eye
w_fnirs /= total
w_driving /= total
w_eye /= total

# 各模态就绪性分数(简化)
fnirs_score = self._fnirs_readiness(fnirs_feat)
driving_score = self._driving_readiness(driving_feat)
eye_score = self._eye_readiness(eye_feat)

# 融合
fused_score = (
w_fnirs * fnirs_score +
w_driving * driving_score +
w_eye * eye_score
)

return {
'readiness_score': fused_score,
'context': context,
'fnirs_score': fnirs_score,
'driving_score': driving_score,
'eye_score': eye_score,
'weights': {
'fnirs': w_fnirs,
'driving': w_driving,
'eye': w_eye
},
'recommendation': 'ready' if fused_score > 0.6 else 'not_ready'
}

def _fnirs_readiness(self, feat: dict) -> float:
"""fNIRS 就绪性评分"""
# 高 HbO + 低不对称 = 高就绪
score = 0.5 + 0.3 * np.tanh(feat.get('hbO_mean', 0)) \
- 0.2 * np.tanh(abs(feat.get('frontal_asymmetry', 0)))
return np.clip(score, 0, 1)

def _driving_readiness(self, feat: dict) -> float:
"""驾驶行为就绪性评分"""
score = 0.5 + 0.3 * feat.get('steering_activity', 0) \
+ 0.2 * feat.get('speed_consistency', 0)
return np.clip(score, 0, 1)

def _eye_readiness(self, feat: dict) -> float:
"""眼动就绪性评分"""
score = 0.5 + 0.3 * feat.get('gaze_road_ratio', 0) \
- 0.2 * feat.get('pupil_diameter_var', 0)
return np.clip(score, 0, 1)


# 测试
if __name__ == "__main__":
proc = fNIRSProcessor(sample_rate=10.0)

# 模拟 fNIRS 数据(48通道,120秒)
np.random.seed(42)
raw_hbO = np.random.randn(1200, 48) * 0.1 + 0.5
raw_hbR = np.random.randn(1200, 48) * 0.1 + 0.3

hbO, hbR = proc.preprocess(raw_hbO, raw_hbR)
features = proc.extract_features(hbO, hbR)

print("fNIRS 特征:")
for k, v in features.items():
if isinstance(v, np.ndarray):
print(f" {k}: mean={v.mean():.4f}, std={v.std():.4f}")
else:
print(f" {k}: {v:.4f}")

# 融合评估
fusion = TakeoverReadinessFusion()

# 场景1: 高危险 + 高认知负荷
result = fusion.assess(
fnirs_feat=features,
driving_feat={'steering_activity': 0.7, 'speed_consistency': 0.6},
eye_feat={'gaze_road_ratio': 0.8, 'pupil_diameter_var': 0.3},
hazard_level='high',
cognitive_load='high'
)
print(f"\n场景: 高危险 + 高认知负荷")
print(f" 就绪性分数: {result['readiness_score']:.3f}")
print(f" 权重分配: fNIRS={result['weights']['fnirs']:.2f}, "
f"驾驶={result['weights']['driving']:.2f}, "
f"眼动={result['weights']['eye']:.2f}")
print(f" 建议: {result['recommendation']}")

3. 核心发现

3.1 上下文主导效应

论文最核心的发现是 context dominates:

场景 fNIRS 有效性 驾驶行为有效性 最佳融合策略
低危险 + 低负荷 弱 强 行为主导
低危险 + 高负荷 强 中 fNIRS 主导
高危险 + 低负荷 中 强 行为主导
高危险 + 高负荷 最强 中 fNIRS 主导

3.2 认知负荷对接管就绪性的非线性影响

发现 说明 IMS 启示
低危险+低负荷 → 警觉性最低 过度信任自动化,反应慢 需要主动唤醒机制
低危险+高负荷 → 警觉性提升 适度认知活动保持清醒 可以用非驾驶任务提升警觉
高危险+低负荷 → 行为反应快 危险刺激自然唤醒 行为信号最可靠
高危险+高负荷 → 认知资源不足 过载导致判断错误 fNIRS 可检测过载

4. 对 IMS 开发的启示

4.1 fNIRS 在座舱中的可行性评估

维度 实验室方案 车载可行性方案
传感器 头戴式 fNIRS 额头贴片式 fNIRS(集成到头枕)
通道数 48 通道 4-8 通道(前额叶 PFC)
采样率 10 Hz 10 Hz(可保持)
信号质量 实验室可控 振动/运动伪影严重
实时性 离线分析 需 <2s 延迟
成本 $20K+ 目标 <$200

4.2 车载 fNIRS 集成路线

4.3 替代方案:无 fNIRS 的认知负荷推断

如果 fNIRS 无法车载化,论文结论可用于指导纯视觉/行为方案:

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
class VisionBasedCognitiveLoadEstimator:
"""
基于论文发现的无 fNIRS 认知负荷推断器
用眼动+驾驶行为替代脑信号
"""

def __init__(self):
# 从论文迁移的上下文权重(去掉 fNIRS 后重新分配)
# 低危险时行为信号权重高,高危险时眼动权重高
self.weights = {
('low', 'low'): {'driving': 0.6, 'eye': 0.4},
('low', 'high'): {'driving': 0.4, 'eye': 0.6},
('high', 'low'): {'driving': 0.7, 'eye': 0.3},
('high', 'high'): {'driving': 0.3, 'eye': 0.7},
}

def estimate(self, driving_feat: dict, eye_feat: dict,
hazard_level: str) -> dict:
"""
估算认知负荷等级

Args:
driving_feat: 方向盘/油门/刹车特征
eye_feat: 眼动特征(注视、瞳孔)
hazard_level: 当前危险等级

Returns:
result: 认知负荷评估
"""
# 瞳孔直径是认知负荷的可靠 proxy
pupil_load = self._pupil_based_load(eye_feat)
steering_load = self._steering_based_load(driving_feat)

# 简单规则推断负荷等级
raw_load = 0.5 * pupil_load + 0.5 * steering_load
cognitive_load = 'high' if raw_load > 0.6 else 'low'

# 上下文权重
context = (hazard_level, cognitive_load)
w = self.weights.get(context, {'driving': 0.5, 'eye': 0.5})

# 就绪性评估
readiness = (
w['driving'] * (1 - steering_load) +
w['eye'] * eye_feat.get('gaze_road_ratio', 0.5)
)

return {
'cognitive_load': cognitive_load,
'raw_load_score': raw_load,
'readiness': readiness,
'recommendation': 'alert' if readiness < 0.5 else 'normal'
}

def _pupil_based_load(self, eye_feat: dict) -> float:
"""瞳孔直径推断认知负荷"""
# 认知负荷↑ → 瞳孔直径↑(0.1-0.5mm 变化)
return np.clip(eye_feat.get('pupil_diameter_var', 0.3), 0, 1)

def _steering_based_load(self, driving_feat: dict) -> float:
"""方向盘微修正频率推断负荷"""
# 认知负荷↑ → 方向盘微修正↓(注意力被占用)
corrections = driving_feat.get('steering_corrections_per_min', 30)
return np.clip(1 - corrections / 60, 0, 1)


# 测试
if __name__ == "__main__":
est = VisionBasedCognitiveLoadEstimator()

# 场景: 高速公路,高危险
result = est.estimate(
driving_feat={'steering_corrections_per_min': 15},
eye_feat={'pupil_diameter_var': 0.6, 'gaze_road_ratio': 0.7},
hazard_level='high'
)
print(f"认知负荷: {result['cognitive_load']}")
print(f"就绪性: {result['readiness']:.3f}")
print(f"建议: {result['recommendation']}")

5. IMS 开发优先级

优先级 任务 时间 依赖
P0 实现瞳孔直径认知负荷推断(替代 fNIRS) 2026 Q4 DMS 摄像头已有
P0 实现上下文自适应融合权重(危险等级×负荷等级) 2026 Q4 场景分类器
P1 方向盘微修正频率认知负荷特征 2027 Q1 CAN 信号接入
P1 接管就绪性评分模型训练 2027 Q1 模拟器数据采集
P2 车载 fNIRS 可行性 PoC(额头贴片) 2027 Q2 fNIRS 开发套件

6. 总结

核心洞察

  1. 上下文主导:接管就绪性评估没有”一刀切”的最优信号,必须根据危险等级和认知负荷动态调整融合权重
  2. 认知负荷×危险交互:低危险+低负荷(过度信任)和高危险+高负荷(认知过载)是两个最危险的接管场景
  3. fNIRS 是认知负荷金标准:但车载化挑战大,瞳孔直径+方向盘微修正是可行替代方案

对 Euro NCAP 2026 认知分心检测的启示

Euro NCAP 2026 要求 DMS 检测认知分心,但未规定具体技术路线。本文的发现提示:

  • 纯视觉方案可行:瞳孔直径 + 眼动模式 + 方向盘行为可推断认知负荷
  • 上下文自适应是关键:不同危险等级下需要不同的检测阈值和信号权重
  • 过载检测 > 分心检测:高认知负荷(过载)比低认知负荷(无聊)更危险

参考来源:

  • Azimi et al., arXiv(2026-07),”When Context Dominates: Multimodal Signatures of Takeover Readiness”
  • fNIRS 信号处理参考 Izzetoglu 实验室方法
  • Euro NCAP 2026 DSM Protocol