Euro NCAP In-Cabin 测试全解析:如何准备 DSM/OMS/CPD 认证

发布时间: 2026-04-14
关键词: Euro NCAP、DSM、OMS、CPD、测试认证、合成数据


测试体系概览

Euro NCAP In-Cabin 测试涵盖三大系统:

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
┌─────────────────────────────────────────────────────┐
│ Euro NCAP In-Cabin 测试架构 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ DSM (Driver Status Monitoring) │ │
│ │ • 分心检测 │ │
│ │ • 疲劳检测 │ │
│ │ • 无响应检测 │ │
│ │ 得分:Safety Assist 中的一部分 │ │
│ └─────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ OMS (Occupant Monitoring System) │ │
│ │ • 安全带状态 │ │
│ │ • 乘员分类 │ │
│ │ • 异常姿态检测 │ │
│ │ 得分:2026 年新增 │ │
│ └─────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ CPD (Child Presence Detection) │ │
│ │ • 儿童遗留检测 │ │
│ │ • 警告时效 │ │
│ │ • 干预功能 │ │
│ │ 得分:最多 5 分 │ │
│ └─────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘

DSM 测试详解

测试场景清单

Euro NCAP TB-039 DSM Spot Testing Guidance v1.1 定义了 DSM 测试场景:

场景类别 场景编号 测试内容
分心检测 D-01 视线偏离道路 > 3 秒
D-02 手持手机至耳边
D-03 手持手机打字操作
D-04 操作中控屏幕
D-05 低头捡物
疲劳检测 F-01 PERCLOS ≥ 30%
F-02 频繁打哈欠
F-03 眼睛闭合 > 2 秒
无响应检测 U-01 无方向盘操作
U-02 无踏板操作
U-03 对警告无反应

测试流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌─────────────────────────────────────────────────────┐
│ DSM 测试流程 │
├─────────────────────────────────────────────────────┤
│ │
│ 1. Dossier 提交 │
│ ───────────────── │
│ • 系统技术规格 │
│ • 传感器配置 │
│ • 算法描述 │
│ • 内部测试报告 │
│ │
│ 2. Spot Testing(现场测试) │
│ ───────────────────────── │
│ • Euro NCAP 指定测试场景 │
│ • 在测试车辆上实际执行 │
│ • 记录检测延迟和警告时机 │
│ │
│ 3. 评分计算 │
│ ──────────── │
│ • 检测准确率 │
│ • 警告时效 │
│ • ADAS 协同 │
│ │
└─────────────────────────────────────────────────────┘

检测时限要求

场景 检测时限 警告时机
分心 D-01 ≤ 3 秒 一级警告(视觉+听觉)
分心 D-02/D-03 ≤ 3 秒 一级警告
疲劳 F-01 PERCLOS ≥ 30% 持续 5 秒 二级警告
无响应 U-01 10-15 秒无操作 ADAS 干预

OMS 测试详解

2026 年新增测试项

测试项 检测内容 得分
安全带状态 正确/错误佩戴 最多 5 分
乘员分类 成人/儿童/婴儿 2-3 分
异常姿态 OOP(Out-of-Position) 2-3 分
安全气囊自适应 根据乘员调整 2-3 分

异常姿态(OOP)检测

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
┌─────────────────────────────────────────────────────┐
│ OOP 检测场景 │
├─────────────────────────────────────────────────────┤
│ │
│ 正常坐姿 ─────────────────────────────────────── │
│ ┌─────────────────────┐ │
│ │ ┌─────────────┐ │ │
│ │ │ ○ │ │ ← 头部在正常位置 │
│ │ │ ╱│╲ │ │ ← 背部贴靠座椅 │
│ │ │ ╱ │ ╲ │ │ │
│ │ └─────────────┘ │ │
│ └─────────────────────┘ │
│ │
│ 异常姿态 1:靠门 ─────────────────────────────── │
│ ┌─────────────────────┐ │
│ │ ┌─────────────┐ │ │
│ │ │ ○ │ │ ← 头部偏向一侧 │
│ │ │ ╱ │ │ ← 身体倾斜 │
│ │ │ ╱ │ │ (侧气囊风险) │
│ │ └─────────────┘ │ │
│ └─────────────────────┘ │
│ │
│ 异常姿态 2:前倾 ─────────────────────────────── │
│ ┌─────────────────────┐ │
│ │ ┌─────────────┐ │ │
│ │ │ ○ │ │ ← 头部前倾 │
│ │ │ ╱│ │ │ ← 上半身远离座椅 │
│ │ │ ╱ │ │ │ (正面气囊风险) │
│ │ └─────────────┘ │ │
│ └─────────────────────┘ │
│ │
│ 异常姿态 3:腿翘起 ───────────────────────────── │
│ ┌─────────────────────┐ │
│ │ ┌─────────────┐ │ │
│ │ │ ○ │ │ │
│ │ │ ╱│╲ │ │ │
│ │ │ ╱ │ ╲ │ │ │
│ │ │ ───────── │ │ ← 腿部翘起 │
│ │ └─────────────┘ │ (气囊部署异常) │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘

乘员分类测试

分类 检测要求
成人 体重 > 50kg,身高 > 150cm
儿童 体重 15-50kg,身高 100-150cm
婴儿 体重 < 15kg,需儿童座椅
儿童座椅 检测座椅类型(后向/前向)

CPD 测试详解

测试场景

场景 测试内容
场景 1 儿童被遗留在锁定车辆
场景 2 儿童进入未锁定车辆被困
场景 3 不同年龄段儿童(0-6 岁)
场景 4 不同座椅位置
场景 5 遮挡场景(毛毯覆盖)

时效要求(详细)

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
# CPD 警告时序逻辑

class CPDAlertSequence:
"""CPD 警告序列管理"""

def __init__(self):
self.state = 'IDLE'
self.child_detected_time = None
self.initial_alert_time = None
self.delay_used = False

def on_child_detected(self, is_locked: bool):
"""检测到儿童"""
self.child_detected_time = time.time()

if is_locked:
# 锁定车辆:15 秒内发出警告
self.initial_alert_time = self.child_detected_time + 15
else:
# 未锁定车辆:10 分钟内发出警告
self.initial_alert_time = self.child_detected_time + 600

self.state = 'MONITORING'

def on_delay_requested(self):
"""驾驶员请求延迟"""
if not self.delay_used:
# 只能延迟一次,最多 10 分钟
self.initial_alert_time += 600
self.delay_used = True

def get_alert_level(self) -> str:
"""获取当前警告级别"""
now = time.time()

if self.state == 'IDLE':
return 'NONE'

elif self.state == 'MONITORING':
if now >= self.initial_alert_time:
return 'INITIAL_ALERT'

elif self.state == 'INITIAL_ALERT':
# 初始警告持续 3 秒以上
if now >= self.initial_alert_time + 3:
return 'ESCALATION_READY'

elif self.state == 'ESCALATION':
# 升级警告:每分钟重复,持续 ≥ 15 秒
# 持续至少 20 分钟
return 'ESCALATION'

return 'NONE'

测试数据需求

DSM 数据需求

数据类型 数量 说明
分心场景 500+ 视频 D-01 ~ D-05
疲劳场景 300+ 视频 F-01 ~ F-03
无响应场景 200+ 视频 U-01 ~ U-03
不同肤色 6 类 Fitzpatrick 确保公平性
不同光线 白天/夜晚/逆光 鲁棒性验证
遮挡场景 太阳镜/口罩/帽子 边缘情况

OMS 数据需求

数据类型 数量 说明
安全带正确佩戴 500+ 各座椅位置
安全带错误佩戴 300+ 背后/仅腰部/手臂下
乘员分类 300+ 成人/儿童/婴儿
OOP 姿态 200+ 靠门/前倾/腿翘起
儿童座椅 200+ 后向/前向

CPD 数据需求

数据类型 数量 说明
不同年龄段儿童 0-6 岁 各年龄段
不同座椅位置 所有座椅 含脚坑
遮挡场景 100+ 毛毯/玩具覆盖
不同光线 白天/夜晚 IR 增强验证

合成数据应用

为什么需要合成数据?

挑战 真实数据局限 合成数据优势
边缘情况 难以采集(如儿童被困) 可模拟任意场景
多样性和公平性 采集成本高 可控制所有变量
标注准确性 人工标注错误 自动生成真值
隐私合规 人脸隐私问题 无隐私风险

Anyverse InCabin 合成数据

核心能力

  • 摄像头仿真(RGB、IR、深度)
  • 雷达仿真(60GHz mmWave)
  • 多人场景、不同姿态
  • 光照、遮挡可控制

合成数据使用示例

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
# 使用合成数据训练 DMS 模型

class SyntheticDataPipeline:
"""合成数据训练流水线"""

def __init__(self, anyverse_api: str):
self.api = anyverse_api

def generate_distraction_data(self,
scenario: str,
num_samples: int,
variations: dict) -> list:
"""生成分心场景数据

Args:
scenario: 'D-01' ~ 'D-05'
num_samples: 样本数量
variations: 变化参数
{
'drivers': ['male_30', 'female_25', ...],
'skin_tones': [1, 2, 3, 4, 5, 6],
'lighting': ['day', 'night', 'backlight'],
'occlusion': ['none', 'sunglasses', 'mask'],
}
"""
samples = []

for i in range(num_samples):
# 随机选择变化参数
driver = random.choice(variations['drivers'])
skin_tone = random.choice(variations['skin_tones'])
lighting = random.choice(variations['lighting'])
occlusion = random.choice(variations['occlusion'])

# 调用 Anyverse API 生成场景
scene_config = {
'scenario': scenario,
'driver': driver,
'skin_tone': skin_tone,
'lighting': lighting,
'occlusion': occlusion,
'camera': 'DMS_IR',
}

image, annotations = self.api.generate(scene_config)

samples.append({
'image': image,
'annotations': annotations,
'metadata': scene_config
})

return samples

def train_model(self, real_data: list, synthetic_data: list):
"""混合真实数据和合成数据训练"""
# 合并数据集
all_data = real_data + synthetic_data

# 训练模型
model = self._create_model()
model.train(all_data)

return model

测试认证流程

准备阶段(12-18 月)

阶段 任务 时间
1 确定传感器配置 M1-M3
2 算法开发与验证 M3-M9
3 内部测试(对标 Euro NCAP) M9-M12
4 准备 Dossier 材料 M12-M15
5 预测试与调优 M15-M18

认证阶段(3-6 月)

阶段 任务 时间
1 提交 Dossier Week 1
2 Euro NCAP 审核 Week 2-4
3 预约 Spot Testing Week 4-8
4 现场测试 Week 8-12
5 结果公布 Week 12-16

常见失败原因

DSM 常见问题

问题 原因 解决方案
深肤色检测率低 训练数据不平衡 增加深肤色数据
夜间检测失败 光照适应性差 使用 IR 摄像头
太阳镜遮挡 无法检测眼睛 使用头部姿态推断
检测延迟过长 算法效率低 模型优化/硬件加速

OMS 常见问题

问题 原因 解决方案
安全带误检 与衣物混淆 改进分割算法
儿童座椅分类错误 训练数据不足 增加合成数据
OOP 检测漏报 姿态变化大 3D 姿态估计

CPD 常见问题

问题 原因 解决方案
遮挡场景漏检 无法穿透毛毯 使用毫米波雷达
动物误报 与儿童混淆 改进分类算法
警告延迟过长 系统响应慢 优化警告逻辑

参考资源

Euro NCAP 官方文档

文档 链接
TB-039 DSM Spot Testing Guidance v1.1 PDF
TB-036 DSM Dossier Guidance v1.0 PDF
CPD Test and Assessment Protocol v1.3 PDF
Safe Driving & Occupant Monitoring Protocol v0.9 PDF

合成数据工具

工具 链接
Anyverse InCabin https://anyverse.ai/in-cabin-monitoring/
Unity Automotive https://unity.com/solutions/automotive
NVIDIA DRIVE Sim https://developer.nvidia.com/drive/simulation

总结

Euro NCAP In-Cabin 测试是一项系统工程,需要:

  1. 深入理解协议:TB-039、TB-036、CPD Protocol
  2. 高质量训练数据:真实数据 + 合成数据混合
  3. 鲁棒算法设计:适应多样化场景
  4. 充分内部验证:对标 Euro NCAP 标准
  5. 完善 Dossier 准备:技术规格、测试报告

关键成功因素

  • 传感器选型(IR 摄像头 + 雷达)
  • 数据多样性(肤色、光线、遮挡)
  • 算法效率(满足实时性要求)
  • ADAS 协同(警告 + 干预)