Euro NCAP 2026评分体系详解:DMS/OMS得分策略

Euro NCAP 2026评分体系详解:DMS/OMS得分策略

评分架构变革

Euro NCAP 2026引入全新的四阶段安全评估体系,每个阶段满分100分,最终星级由综合得分决定。

四阶段安全评估

阶段 名称 权重 内容
Stage 1 Safe Driving 25% DSM + 速度辅助
Stage 2 Crash Avoidance 30% AEB + LSS
Stage 3 Crash Protection 30% 碰撞保护
Stage 4 Post Crash 15% 救援 + eCall

DMS/OMS在Stage 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
class EuroNCAP2026Scoring:
"""
Euro NCAP 2026评分体系

Stage 1: Safe Driving
- DSM (Driver State Monitoring): 最多25分
- SBR (Seat Belt Reminder): 最多10分
- SS (Speed Support): 最多15分
- OM (Occupant Monitoring): 最多10分
"""

STAGE1_MAX_SCORE = 100

# DSM评分项目
DSM_SCORING = {
'distraction_detection': {
'max_points': 8,
'scenarios': ['D-01', 'D-02', 'D-03', 'D-04', 'D-05'],
'requirements': {
'detection_time_sec': 3,
'warning_sequence': True,
'default_on': True
}
},
'fatigue_detection': {
'max_points': 8,
'scenarios': ['F-01', 'F-02', 'F-03', 'F-04', 'F-05'],
'requirements': {
'perclos_threshold': 30,
'warning_levels': 2,
'default_on': True
}
},
'unresponsive_driver': {
'max_points': 6,
'scenarios': ['UD-01', 'UD-02'],
'requirements': {
'detection_time_sec': 10,
'intervention': 'controlled_stop'
}
},
'impairment_detection': {
'max_points': 3,
'scenarios': ['I-01'],
'requirements': {
'alcohol_detection': True,
'warning_strategy': True
}
}
}

# OM评分项目
OM_SCORING = {
'child_presence_detection': {
'max_points': 5,
'scenarios': ['CPD-01', 'CPD-02', 'CPD-03', 'CPD-04'],
'requirements': {
'detection_time_sec': 60,
'vital_signs': True,
'warning': 'visual_audible'
}
},
'out_of_position': {
'max_points': 3,
'scenarios': ['OOP-01', 'OOP-02', 'OOP-03'],
'requirements': {
'feet_dashboard': True,
'body_lean': True,
'warning_time_sec': 30
}
},
'seatbelt_misuse': {
'max_points': 2,
'scenarios': ['SM-01', 'SM-02'],
'requirements': {
'wrong_position': True,
'warning': True
}
}
}

def calculate_dsm_score(self, test_results: dict) -> dict:
"""
计算DSM得分

Args:
test_results: 测试结果 {scenario_id: pass/fail, ...}

Returns:
{total_score, breakdown, compliance_rate}
"""
total_score = 0
breakdown = {}

for category, config in self.DSM_SCORING.items():
category_score = 0
passed_scenarios = 0

for scenario_id in config['scenarios']:
if test_results.get(scenario_id, False):
passed_scenarios += 1

# 按通过比例计分
pass_rate = passed_scenarios / len(config['scenarios'])
category_score = config['max_points'] * pass_rate

breakdown[category] = {
'score': category_score,
'max_points': config['max_points'],
'pass_rate': pass_rate
}

total_score += category_score

max_total = sum(c['max_points'] for c in self.DSM_SCORING.values())

return {
'total_score': total_score,
'max_score': max_total,
'breakdown': breakdown,
'compliance_rate': total_score / max_total
}

def calculate_om_score(self, test_results: dict) -> dict:
"""计算OM得分"""
total_score = 0
breakdown = {}

for category, config in self.OM_SCORING.items():
category_score = 0
passed_scenarios = 0

for scenario_id in config['scenarios']:
if test_results.get(scenario_id, False):
passed_scenarios += 1

pass_rate = passed_scenarios / len(config['scenarios'])
category_score = config['max_points'] * pass_rate

breakdown[category] = {
'score': category_score,
'max_points': config['max_points'],
'pass_rate': pass_rate
}

total_score += category_score

max_total = sum(c['max_points'] for c in self.OM_SCORING.values())

return {
'total_score': total_score,
'max_score': max_total,
'breakdown': breakdown,
'compliance_rate': total_score / max_total
}

def determine_star_rating(self, total_percentage: float) -> int:
"""确定星级"""
if total_percentage >= 80:
return 5
elif total_percentage >= 70:
return 4
elif total_percentage >= 60:
return 3
elif total_percentage >= 50:
return 2
else:
return 1

DSM评分细则

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
class DistractionScoring:
"""
分心检测评分细则

Euro NCAP DSM测试场景
"""

# 分心场景定义
DISTRACTION_SCENARIOS = {
'D-01': {
'name': '手机使用(打电话)',
'description': '驾驶员手持电话至耳边',
'duration_sec': 10,
'detection_requirements': {
'max_latency_sec': 3,
'min_confidence': 0.8,
'warning_type': 'level_1' # 视觉警告
},
'points': 1.6
},
'D-02': {
'name': '手机使用(发短信)',
'description': '驾驶员低头操作手机',
'duration_sec': 10,
'detection_requirements': {
'max_latency_sec': 3,
'min_confidence': 0.8,
'warning_type': 'level_1'
},
'points': 1.6
},
'D-03': {
'name': '手机使用(手持)',
'description': '驾驶员手持手机但未使用',
'duration_sec': 10,
'detection_requirements': {
'max_latency_sec': 3,
'min_confidence': 0.7,
'warning_type': 'level_2' # 视觉+听觉
},
'points': 1.6
},
'D-04': {
'name': '操作中控',
'description': '驾驶员伸手操作中控',
'duration_sec': 5,
'detection_requirements': {
'max_latency_sec': 3,
'min_confidence': 0.7,
'warning_type': 'level_2'
},
'points': 1.6
},
'D-05': {
'name': '视线偏离',
'description': '驾驶员视线偏离道路>3秒',
'duration_sec': 5,
'detection_requirements': {
'max_latency_sec': 3,
'gaze_deviation_deg': 30,
'warning_type': 'level_2'
},
'points': 1.6
}
}

def evaluate_scenario(self, scenario_id: str, system_response: dict) -> dict:
"""
评估单个场景

Args:
scenario_id: 场景ID
system_response: {
'detected': bool,
'detection_latency_sec': float,
'confidence': float,
'warning_type': str
}

Returns:
{passed: bool, score: float, details: dict}
"""
scenario = self.DISTRACTION_SCENARIOS[scenario_id]
reqs = scenario['detection_requirements']

passed = True
details = {}

# 检查检测延迟
if system_response['detection_latency_sec'] > reqs['max_latency_sec']:
passed = False
details['latency_fail'] = f"延迟{system_response['detection_latency_sec']}s > {reqs['max_latency_sec']}s"

# 检查置信度
if system_response['confidence'] < reqs['min_confidence']:
passed = False
details['confidence_fail'] = f"置信度{system_response['confidence']:.2f} < {reqs['min_confidence']}"

# 检查警告类型
if system_response['warning_type'] != reqs['warning_type']:
details['warning_mismatch'] = f"警告等级不匹配"

score = scenario['points'] if passed else 0

return {
'passed': passed,
'score': score,
'details': details
}

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
class FatigueScoring:
"""
疲劳检测评分细则
"""

FATIGUE_SCENARIOS = {
'F-01': {
'name': 'PERCLOS超标',
'description': '60秒窗口内PERCLOS ≥ 30%',
'points': 1.6,
'requirements': {
'perclos_threshold': 30,
'window_sec': 60,
'warning_level': 2
}
},
'F-02': {
'name': '频繁眨眼',
'description': '眨眼频率异常增高',
'points': 1.6,
'requirements': {
'blink_rate_threshold': 25, # 次/分钟
'warning_level': 1
}
},
'F-03': {
'name': '微睡眠',
'description': '单次闭眼时长 > 2秒',
'points': 1.6,
'requirements': {
'eye_closure_sec': 2,
'warning_level': 2
}
},
'F-04': {
'name': '打哈欠',
'description': '检测到打哈欠行为',
'points': 1.6,
'requirements': {
'mouth_open_ratio': 0.7,
'warning_level': 1
}
},
'F-05': {
'name': '头部下垂',
'description': '头部姿态异常下垂',
'points': 1.6,
'requirements': {
'head_pitch_deg': 20,
'warning_level': 2
}
}
}

3. 无响应驾驶员评分

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
class UnresponsiveScoring:
"""
无响应驾驶员评分

这是2026年新增的强制性要求
"""

UNRESPONSIVE_SCENARIOS = {
'UD-01': {
'name': '医疗紧急情况',
'description': '驾驶员突发医疗状况失去意识',
'points': 3,
'requirements': {
'detection_time_sec': 10,
'warning_escalation': True,
'controlled_stop': True,
'ecall': True
}
},
'UD-02': {
'name': '深度睡眠',
'description': '驾驶员进入深度睡眠状态',
'points': 3,
'requirements': {
'detection_time_sec': 15,
'warning_escalation': True,
'controlled_stop': True
}
}
}

def evaluate_controlled_stop(self, system_response: dict) -> dict:
"""
评估安全停车功能

关键指标:
- 减速曲线是否平稳
- 车道保持是否有效
- 危险报警灯是否开启
- eCall是否触发
"""
checklist = {
'lane_keeping': system_response.get('lane_keeping', False),
'smooth_deceleration': system_response.get('deceleration_rate', 10) < 3, # m/s²
'hazard_lights': system_response.get('hazard_lights', False),
'ecall': system_response.get('ecall', False)
}

passed = all(checklist.values())

return {
'passed': passed,
'checklist': checklist
}

OM评分细则

1. CPD评分

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
class CPDScoring:
"""
CPD儿童存在检测评分

Euro NCAP 2026新增要求
"""

CPD_SCENARIOS = {
'CPD-01': {
'name': '婴儿后向座椅',
'description': '后向儿童座椅中的婴儿',
'points': 1.25,
'requirements': {
'detection_time_sec': 60,
'vital_signs': True,
'false_alarm_rate': 0.05
}
},
'CPD-02': {
'name': '幼儿前向座椅',
'description': '前向儿童座椅中的幼儿',
'points': 1.25,
'requirements': {
'detection_time_sec': 60,
'vital_signs': True
}
},
'CPD-03': {
'name': '儿童增高座椅',
'description': '增高座椅上的儿童',
'points': 1.25,
'requirements': {
'detection_time_sec': 60
}
},
'CPD-04': {
'name': '单独儿童',
'description': '无成人陪同的儿童',
'points': 1.25,
'requirements': {
'detection_time_sec': 30,
'warning': 'external_alert' # 外部警报
}
}
}

2. 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
class OOPScoring:
"""
OOP异常姿态检测评分
"""

OOP_SCENARIOS = {
'OOP-01': {
'name': '脚放仪表盘',
'description': '乘客将脚放在仪表盘上',
'points': 1,
'requirements': {
'positions': ['inboard', 'centerline', 'outboard'],
'detection_time_sec': 5,
'warning_time_sec': 30
}
},
'OOP-02': {
'name': '身体前倾',
'description': '乘客身体过于靠近仪表盘',
'points': 1,
'requirements': {
'distance_threshold_cm': 20,
'warning_time_sec': 30
}
},
'OOP-03': {
'name': '非正常坐姿',
'description': '其他危险坐姿',
'points': 1,
'requirements': {
'continuous_monitoring': True,
'warning_repeat_min': 15
}
}
}

得分策略建议

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
class ScoringStrategy:
"""
得分策略建议

目标:5星评级 (≥80%)
"""

# 优先级排序
PRIORITY_ORDER = [
# P0: 必须满分
('D-01', '手机打电话检测', 1.6),
('D-02', '手机发短信检测', 1.6),
('F-01', 'PERCLOS疲劳检测', 1.6),
('F-03', '微睡眠检测', 1.6),
('UD-01', '无响应检测+安全停车', 3.0),

# P1: 高优先级
('D-03', '手机手持检测', 1.6),
('F-02', '频繁眨眼检测', 1.6),
('CPD-01', '婴儿座椅检测', 1.25),
('CPD-02', '幼儿座椅检测', 1.25),

# P2: 中优先级
('D-05', '视线偏离检测', 1.6),
('OOP-01', '脚放仪表盘检测', 1.0),
('OOP-02', '身体前倾检测', 1.0),

# P3: 加分项
('I-01', '酒精损伤检测', 1.5),
('CPD-04', '单独儿童检测', 1.25)
]

def calculate_minimum_requirements(self) -> dict:
"""
计算达到5星的最小要求

DSM满分: 25分
OM满分: 10分
总计需要: ≥28分 (80% of 35)
"""
required_points = 28

accumulated = 0
required_scenarios = []

for scenario_id, name, points in self.PRIORITY_ORDER:
if accumulated >= required_points:
break

required_scenarios.append({
'id': scenario_id,
'name': name,
'points': points
})
accumulated += points

return {
'required_points': required_points,
'accumulated_points': accumulated,
'scenarios': required_scenarios
}

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
COMPLIANCE_CHECKLIST = """
## Euro NCAP 2026 DSM/OMS 合规检查表

### 强制性要求 (必须满足)

#### DSM
- [ ] 系统默认开启
- [ ] 无法通过单次按键关闭
- [ ] 眼动追踪持续工作
- [ ] 分心检测 ≤3秒
- [ ] 疲劳检测二级警告
- [ ] 无响应安全停车

#### OM
- [ ] CPD检测 ≤60秒
- [ ] 生命体征检测
- [ ] OOP检测 ≤30秒警告
- [ ] 安全带误用检测

### 加分项

- [ ] 酒精损伤检测
- [ ] 认知分心检测
- [ ] 宠物检测
- [ ] 乘员计数

### 技术要求

- [ ] IR摄像头 ≥25fps
- [ ] 检测准确率 ≥95%
- [ ] 误报率 ≤1%
- [ ] 墨镜条件工作
- [ ] 口罩条件工作
"""

开发启示

1. 评分权重分析

功能 满分 权重 建议
分心检测 8 23% 必须满分
疲劳检测 8 23% 必须满分
无响应干预 6 17% 必须满分
CPD检测 5 14% 高优先级
OOP检测 3 9% 中优先级
酒精检测 3 9% 加分项

2. 关键决策点

  1. 眼动追踪:5星必备,需持续工作
  2. 安全停车:无响应干预的核心
  3. CPD雷达融合:提高检测可靠性
  4. OOP警告策略:30秒警告窗口

3. 测试准备清单

  • DSM Dossier准备
  • 测试场景文档
  • 警告策略说明
  • 系统架构图
  • 性能数据表

参考资料:

  1. Euro NCAP Assessment Protocol SA Safe Driving v1.0 (June 2025)
  2. Euro NCAP Protocol Safe Driving Occupant Monitoring v1.1 (October 2025)
  3. ETSC: “Euro NCAP 2026 Protocols Target Distraction, Impairment”
  4. Smart Eye: “Driver Monitoring 2.0: Euro NCAP 2026”

Euro NCAP 2026评分体系详解:DMS/OMS得分策略
https://dapalm.com/2026/06/16/2026-06-16-Euro-NCAP-2026-Scoring-System-DMS-OMS-Strategy/
作者
Mars
发布于
2026年6月16日
许可协议