VLM 汽车感知认证:当大语言模型遇见安全驾驶

arXiv 2609.25945 论文解读 — VLM 幻觉检测与安全认证

论文信息

  • 标题: Towards Systematic Qualification of Vision-Language Models for Automotive Perception Systems
  • 作者: Malsha Ashani Mahawatta Dona et al.
  • 会议: ICTSS 2026(第38届国际测试软件与系统会议)
  • arXiv: 2609.25945
  • 发布日期: 2026年9月22日
  • 页数: 820 KB
  • 来源: https://arxiv.org/abs/2609.25945

核心问题

VLM(Vision-Language Model)正在被探索用于汽车感知系统,但它们存在幻觉问题:

幻觉 (Hallucination): VLM 可能检测到不存在的交通物体(假阳性),也可能遗漏实际存在的物体(假阴性)。这在安全关键场景中是致命的。

两类幻觉风险

幻觉类型 描述 驾驶风险
假阳性 VLM 报告不存在的物体 不必要的紧急制动
假阴性 VLM 遗漏实际存在的物体 碰撞风险

座舱场景的 VLM 幻觉风险

虽然本文聚焦外部感知,但 VLM 幻觉问题对座舱同样重要:

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
"""
VLM 在座舱感知中的幻觉风险分析

场景1: VLM 用于 DMS
- 假阳性: 报告驾驶员疲劳但实际正常 → 不必要警告
- 假阴性: 遗漏疲劳状态 → 安全风险

场景2: VLM 用于 OMS
- 假阳性: 报告后座有儿童但实际空座 → 不必要 CPD 告警
- 假阴性: 遗漏后座儿童 → 致命安全风险

场景3: VLM 用于行为识别
- 假阳性: 误判正常行为为危险行为 → 干扰驾驶
- 假阴性: 遗漏危险行为 → 安全风险
"""

VLM_CABIN_HALLUCINATION_RISKS = {
'DMS 疲劳检测': {
'false_positive': ('报告疲劳但实际清醒',
'不必要警告,降低用户信任'),
'false_negative': ('遗漏疲劳状态',
'安全风险,可能导致事故'),
'tolerance': '假阳性 < 5%, 假阴性 < 1%'
},
'DMS 分心检测': {
'false_positive': ('误判正常行为为分心',
'频繁误报,用户体验差'),
'false_negative': ('遗漏分心状态',
'安全风险'),
'tolerance': '假阳性 < 10%, 假阴性 < 2%'
},
'OMS CPD': {
'false_positive': ('空座报告有儿童',
'不必要紧急呼叫'),
'false_negative': ('遗漏后座儿童',
'致命风险!'),
'tolerance': '假阳性 < 1/1000, 假阴性 = 0%'
},
'OMS 乘员分类': {
'false_positive': ('物体误判为乘员',
'安全气囊错误部署'),
'false_negative': ('乘员遗漏',
'安全气囊不部署'),
'tolerance': '假阳性 < 1%, 假阴性 < 0.1%'
},
'行为识别': {
'false_positive': ('正常行为误判为异常',
'不必要干预'),
'false_negative': ('异常行为遗漏',
'安全风险'),
'tolerance': '假阳性 < 5%, 假阴性 < 5%'
}
}

for scenario, risks in VLM_CABIN_HALLUCINATION_RISKS.items():
print(f"\n=== {scenario} ===")
print(f" 假阳性: {risks['false_positive']}")
print(f" 假阴性: {risks['false_negative']}")
print(f" 容忍度: {risks['tolerance']}")

论文方法

设计时认证工作流

论文提出了一个 设计时 VLM 认证工作流,与运行时监控互补:

本体驱动的结构化标注

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
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
"""
VLM 认证工作流核心逻辑复现

步骤:
1. 定义安全相关本体(ontology)
2. 使用结构化标注系统
3. 同义词评估处理语言变化
4. 统计量化幻觉率
5. 模型对比与部署决策
"""

from dataclasses import dataclass
from typing import List, Dict, Set
from enum import Enum


class SafetyCategory(Enum):
"""安全相关本体类别"""
PEDESTRIAN = "行人"
VEHICLE = "车辆"
CYCLIST = "骑行者"
TRAFFIC_SIGN = "交通标志"
TRAFFIC_LIGHT = "交通灯"
ROAD_MARKING = "道路标线"
OBSTACLE = "障碍物"


@dataclass
class OntologyNode:
"""本体节点"""
category: SafetyCategory
canonical_name: str
synonyms: List[str]
safety_critical: bool # 是否安全关键


@dataclass
class VLMResponse:
"""VLM 模型响应"""
model_name: str
image_id: str
detected_objects: List[str] # VLM 报告的物体
ground_truth: List[str] # 真值
confidence: float


class VLMQualifier:
"""VLM 设计认证工作流"""

def __init__(self, ontology: List[OntologyNode]):
self.ontology = ontology
self.synonym_map = self._build_synonym_map()

def _build_synonym_map(self) -> Dict[str, str]:
"""构建同义词映射"""
mapping = {}
for node in self.ontology:
mapping[node.canonical_name.lower()] = \
node.canonical_name
for syn in node.synonyms:
mapping[syn.lower()] = node.canonical_name
return mapping

def normalize_response(self,
response: List[str]) -> Set[str]:
"""
将 VLM 响应规范化为本体标准名

示例:
- "a person walking" → "Pedestrian"
- "a car" → "Vehicle"
- "someone on a bike" → "Cyclist"
"""
normalized = set()
for obj in response:
obj_lower = obj.lower()
matched = False
for syn, canonical in self.synonym_map.items():
if syn in obj_lower:
normalized.add(canonical)
matched = True
break
if not matched:
normalized.add(f"UNKNOWN:{obj}")
return normalized

def evaluate_hallucination(
self, response: VLMResponse
) -> Dict:
"""
评估 VLM 响应的幻觉

假阳性: VLM 报告但真值中没有
假阴性: 真值中有但 VLM 未报告
"""
predicted = self.normalize_response(
response.detected_objects
)
truth = self.normalize_response(
response.ground_truth
)

false_positives = predicted - truth
false_negatives = truth - predicted
true_positives = predicted & truth

# 计算关键指标
precision = len(true_positives) / max(
len(predicted), 1
)
recall = len(true_positives) / max(
len(truth), 1
)
f1 = 2 * precision * recall / max(
precision + recall, 1e-10
)

# 安全关键遗漏
safety_critical_misses = [
obj for obj in false_negatives
if self._is_safety_critical(obj)
]

return {
'model': response.model_name,
'image': response.image_id,
'true_positives': true_positives,
'false_positives': false_positives,
'false_negatives': false_negatives,
'precision': precision,
'recall': recall,
'f1': f1,
'safety_critical_misses': safety_critical_misses
}

def _is_safety_critical(self, obj_name: str) -> bool:
"""判断是否安全关键物体"""
for node in self.ontology:
if (node.canonical_name == obj_name and
node.safety_critical):
return True
return False

def aggregate_results(
self, results: List[Dict]
) -> Dict:
"""聚合多个评估结果"""
n = len(results)
avg_precision = sum(
r['precision'] for r in results
) / max(n, 1)
avg_recall = sum(
r['recall'] for r in results
) / max(n, 1)
avg_f1 = sum(
r['f1'] for r in results
) / max(n, 1)
total_fp = sum(
len(r['false_positives']) for r in results
)
total_fn = sum(
len(r['false_negatives']) for r in results
)
total_safety_misses = sum(
len(r['safety_critical_misses']) for r in results
)

return {
'num_evaluations': n,
'avg_precision': avg_precision,
'avg_recall': avg_recall,
'avg_f1': avg_f1,
'total_false_positives': total_fp,
'total_false_negatives': total_fn,
'total_safety_critical_misses': total_safety_misses,
'hallucination_rate': (total_fp + total_fn) / max(
n, 1
)
}


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

if __name__ == "__main__":
# 定义安全相关本体
ontology = [
OntologyNode(
SafetyCategory.PEDESTRIAN, "Pedestrian",
["person", "walker", "pedestrian"],
safety_critical=True
),
OntologyNode(
SafetyCategory.VEHICLE, "Vehicle",
["car", "truck", "bus", "vehicle"],
safety_critical=True
),
OntologyNode(
SafetyCategory.CYCLIST, "Cyclist",
["bicycle", "bike", "cyclist"],
safety_critical=True
),
OntologyNode(
SafetyCategory.TRAFFIC_LIGHT, "TrafficLight",
["traffic light", "traffic signal"],
safety_critical=True
),
]

qualifier = VLMQualifier(ontology)

# 模拟 VLM 响应
responses = [
VLMResponse(
model_name="VLM-A",
image_id="img_001",
detected_objects=[
"a person walking", "a car", "a traffic light"
],
ground_truth=[
"person", "vehicle", "traffic light"
],
confidence=0.85
),
VLMResponse(
model_name="VLM-A",
image_id="img_002",
detected_objects=[
"a car", "a truck", "someone on a bike"
],
ground_truth=[
"vehicle", "cyclist"
],
confidence=0.90
),
VLMResponse(
model_name="VLM-A",
image_id="img_003",
detected_objects=[
"a person", "a car"
],
ground_truth=[
"person", "vehicle", "cyclist"
],
confidence=0.75
),
]

# 评估
results = []
for resp in responses:
result = qualifier.evaluate_hallucination(resp)
results.append(result)
print(f"\n=== {resp.model_name} @ {resp.image_id} ===")
print(f" 预测: {result['true_positives']}")
print(f" 假阳性: {result['false_positives']}")
print(f" 假阴性: {result['false_negatives']}")
print(f" 精确率: {result['precision']:.2f}")
print(f" 召回率: {result['recall']:.2f}")
print(f" F1: {result['f1']:.2f}")
if result['safety_critical_misses']:
print(f" ⚠️ 安全关键遗漏: "
f"{result['safety_critical_misses']}")

# 聚合
summary = qualifier.aggregate_results(results)
print(f"\n=== 聚合结果 ({summary['num_evaluations']} 次) ===")
print(f" 平均精确率: {summary['avg_precision']:.2f}")
print(f" 平均召回率: {summary['avg_recall']:.2f}")
print(f" 平均 F1: {summary['avg_f1']:.2f}")
print(f" 总假阳性: {summary['total_false_positives']}")
print(f" 总假阴性: {summary['total_false_negatives']}")
print(f" 幻觉率: {summary['hallucination_rate']:.2f}")
print(f" 安全关键遗漏: "
f"{summary['total_safety_critical_misses']}")

运行结果

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
=== VLM-A @ img_001 ===
预测: {'Pedestrian', 'TrafficLight', 'Vehicle'}
假阳性: set()
假阴性: set()
精确率: 1.00
召回率: 1.00
F1: 1.00

=== VLM-A @ img_002 ===
预测: {'Cyclist', 'Vehicle'}
假阳性: set()
假阴性: set()
精确率: 1.00
召回率: 1.00
F1: 1.00

=== VLM-A @ img_003 ===
预测: {'Pedestrian', 'Vehicle'}
假阳性: set()
假阴性: {'Cyclist'}
精确率: 1.00
召回率: 0.67
F1: 0.80
⚠️ 安全关键遗漏: ['Cyclist']

=== 聚合结果 (3 次) ===
平均精确率: 1.00
平均召回率: 0.89
平均 F1: 0.93
总假阳性: 0
总假阴性: 1
幻觉率: 0.33
安全关键遗漏: 1

对 IMS 开发的启示

1. VLM 在座舱中的安全认证需求

如果 IMS 要使用 VLM(如 Minieye BamBam),必须建立幻觉检测机制:

IMS 场景 VLM 用途 幻觉风险 认证要求
DMS 疲劳 “驾驶员看起来很困” 误报疲劳 假阳性 < 5%
OMS CPD “后座有儿童” 空座误报 假阳性 < 1/1000
行为识别 “驾驶员在打电话” 误判行为 假阳性 < 5%
情绪识别 “驾驶员很愤怒” 误判情绪 假阳性 < 10%
紧急事件 “驾驶员需要医疗救助” 误报紧急 假阳性 < 1%

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
"""
IMS VLM 认证工作流适配

将论文的外部感知认证方法迁移到座舱感知
"""

class IMS_VLM_Qualification:
"""IMS VLM 认证框架"""

def __init__(self):
# 座舱安全相关本体
self.cabin_ontology = {
'人员': {
'types': ['驾驶员', '副驾乘客', '后座乘客', '儿童', '宠物'],
'safety_critical': True
},
'状态': {
'types': ['疲劳', '分心', '酒驾', '突发疾病', '情绪异常'],
'safety_critical': True
},
'行为': {
'types': ['打电话', '抽烟', '喝水', '转头', '闭眼'],
'safety_critical': True
},
'姿态': {
'types': ['正常坐姿', '前倾', '后仰', '侧倾', '异常OOP'],
'safety_critical': True
},
'设备': {
'types': ['安全带已系', '安全带未系', '安全带误用'],
'safety_critical': True
}
}

def qualification_checklist(self):
"""认证检查清单"""
checklist = {
'假阳性测试': [
'空座 → 不报告乘员',
'正常驾驶 → 不报告疲劳/分心',
'正常坐姿 → 不报告OOP',
'物体 → 不报告为乘员'
],
'假阴性测试': [
'疲劳状态 → 必须检测',
'分心状态 → 必须检测',
'后座儿童 → 必须检测',
'异常姿态 → 必须检测',
'安全带未系 → 必须检测'
],
'鲁棒性测试': [
'不同光照条件',
'不同人员特征',
'不同遮挡程度',
'不同舱内布局'
],
'边缘案例': [
'墨镜遮挡眼睛',
'口罩遮挡面部',
'安全带遮挡胸部',
'婴儿安全座椅',
'宠物在座位上'
]
}

for category, items in checklist.items():
print(f"\n=== {category} ===")
for item in items:
print(f" □ {item}")

return checklist


# 运行认证检查
qualifier = IMS_VLM_Qualification()
qualifier.qualification_checklist()

3. 设计时 + 运行时双重保障

论文的核心贡献是提出设计时认证 + 运行时监控的双重保障策略:

阶段 方法 目标
设计时 本体标注 + 同义词评估 量化幻觉率
运行时 置信度监控 + 回退机制 检测实时幻觉
两者结合 统计模型对比 + 部署决策 选择安全模型

对 IMS 的建议:

  1. 设计时: 建立座舱本体和测试集
  2. 运行时: VLM 输出后加安全规则验证层
  3. 回退: VLM 不确定时回退到传统 DMS 算法

结论

VLM 正在进入汽车感知系统(包括座舱),但幻觉问题是安全致命的。本文提出的本体驱动认证工作流为 VLM 在安全关键场景的部署提供了量化评估框架。

对 IMS 开发而言,如果引入 VLM(如 Minieye BamBam),必须建立幻觉检测机制:设计时量化测试 + 运行时安全规则验证 + 不确定时回退到传统算法。


参考链接: