儿童存在检测CPD:Euro NCAP 2026强制要求的雷达+摄像头融合方案

引言:每年数百名儿童死于车内中暑

触目惊心的数据

  • 美国:平均每年38名儿童死于车内中暑
  • 欧洲:每年约50起车内儿童死亡事件
  • 中国:2025年媒体报道超过20起

Euro NCAP 2026强制要求:所有新车必须配备CPD系统才能获得5星评级。


一、Euro NCAP CPD要求详解

1.1 测试场景

场景 描述 测试对象
场景1 儿童被遗忘在后座 1-6岁儿童假人
场景2 儿童自行进入车内 3-6岁儿童假人
场景3 儿童在脚部空间 1-3岁儿童假人
场景4 儿童被毯子覆盖 1-6岁儿童假人
场景5 儿童在安全座椅中 新生儿假人

1.2 技术要求

指标 要求
检测延迟 锁车后90秒内报警
检测率 >95%
误报率 <5%
报警方式 车内警报+手机推送
检测范围 全座位覆盖(含脚部空间)
穿透能力 必须穿透毯子/衣服

1.3 评分标准

功能 分数
基础检测 2分
手机推送 1分
多轮报警 1分
紧急呼叫 1分
总计 5分

二、技术路线对比

2.1 摄像头方案

优势

  • 成本低($10-20)
  • 可复用现有DMS摄像头
  • 提供视觉信息

劣势

  • 无法穿透毯子
  • 受光线影响
  • 脚部空间盲区

适用场景

  • 中高端车型(已有OMS摄像头)
  • 辅助检测(非主检测)

2.2 60GHz毫米波雷达

优势

  • 可穿透毯子/衣服
  • 不受光线影响
  • 全座位覆盖
  • 可检测生命体征

劣势

  • 成本较高($30-50)
  • 算法复杂

适用场景

  • 主检测方案
  • 覆盖脚部空间

2.3 UWB雷达

优势

  • 穿透能力最强
  • 精度最高
  • 可检测心跳

劣势

  • 成本最高($50-80)
  • 算力要求高

适用场景

  • 高端车型
  • 医疗级监控

2.4 融合方案(推荐)

摄像头 + 60GHz雷达

传感器 功能
摄像头 视觉确认、儿童识别
雷达 生命体征、穿透检测
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 CPDFusionSystem:
"""
摄像头+雷达融合CPD系统
"""
def __init__(self):
# 摄像头模块
self.camera = CabinCamera()

# 雷达模块
self.radar = Radar60GHz()

# 融合决策
self.fusion = FusionDecision()

def detect_child(self):
"""
检测儿童
"""
# 1. 摄像头检测
camera_result = self.camera.detect_occupant()

# 2. 雷达检测生命体征
radar_result = self.radar.detect_vital_signs()

# 3. 融合判断
if camera_result['is_child'] or radar_result['has_occupant']:
# 进一步确认
if self.fusion.confirm_child(camera_result, radar_result):
return {
'has_child': True,
'location': camera_result.get('location', 'unknown'),
'confidence': self.fusion.compute_confidence()
}

return {'has_child': False}

三、60GHz雷达算法实现

3.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
原始雷达信号

┌─────────────────────────────────┐
│ 预处理 │
│ ├── 去噪 │
│ ├── 滤波 │
│ └── FFT │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ 目标检测 │
│ ├── CFAR检测 │
│ ├── 聚类 │
│ └── 跟踪 │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ 生命体征提取 │
│ ├── 呼吸频率(0.2-0.5Hz) │
│ ├── 心率(1-2Hz) │
│ └── 微小运动 │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ 分类判断 │
│ ├── 成人/儿童 │
│ ├── 动物 │
│ └── 物体 │
└─────────────────────────────────┘

3.2 Python实现

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
import numpy as np
from scipy import signal
from scipy.fft import fft, fftfreq

class Radar60GHz:
"""
60GHz毫米波雷达处理
"""
def __init__(self, sample_rate=1000):
self.sample_rate = sample_rate

def process_radar_signal(self, raw_signal):
"""
处理雷达信号
"""
# 1. 去噪
denoised = self.denoise(raw_signal)

# 2. FFT
fft_result = self.compute_fft(denoised)

# 3. 提取生命体征
vitals = self.extract_vital_signs(fft_result)

return vitals

def denoise(self, signal_data):
"""
小波去噪
"""
import pywt

# 小波分解
coeffs = pywt.wavedec(signal_data, 'db4', level=5)

# 阈值去噪
threshold = np.std(coeffs[-1]) * np.sqrt(2 * np.log(len(signal_data)))
coeffs[1:] = [pywt.threshold(c, threshold) for c in coeffs[1:]]

# 重构
denoised = pywt.waverec(coeffs, 'db4')

return denoised

def compute_fft(self, signal_data):
"""
计算FFT
"""
N = len(signal_data)
yf = fft(signal_data)
xf = fftfreq(N, 1 / self.sample_rate)

return {'frequencies': xf[:N//2], 'amplitudes': np.abs(yf[:N//2])}

def extract_vital_signs(self, fft_result):
"""
提取生命体征
"""
freqs = fft_result['frequencies']
amps = fft_result['amplitudes']

# 呼吸频率范围:0.2-0.5 Hz (12-30次/分)
breath_mask = (freqs >= 0.2) & (freqs <= 0.5)
breath_freq = freqs[breath_mask][np.argmax(amps[breath_mask])]
breath_rate = breath_freq * 60 # 转/分

# 心率范围:1-2 Hz (60-120次/分)
heart_mask = (freqs >= 1.0) & (freqs <= 2.0)
heart_freq = freqs[heart_mask][np.argmax(amps[heart_mask])]
heart_rate = heart_freq * 60 # 次/分

return {
'breath_rate': breath_rate,
'heart_rate': heart_rate,
'has_vital_signs': breath_rate > 0 or heart_rate > 0
}

def classify_occupant(self, vitals, motion_features):
"""
分类乘员类型
"""
if not vitals['has_vital_signs']:
return 'empty'

# 基于心率判断
heart_rate = vitals['heart_rate']

if heart_rate > 120:
return 'child' # 儿童心率较快
elif heart_rate > 60:
return 'adult'
else:
return 'animal'

3.3 儿童vs成人区分

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
class OccupantClassifier:
"""
乘员分类器
"""
def __init__(self):
# 儿童特征:
# 1. 心率较快(100-140次/分)
# 2. 呼吸频率较快(20-40次/分)
# 3. 身体尺寸小(雷达反射面积小)

self.model = self.load_model()

def classify(self, radar_data, camera_data=None):
"""
综合判断
"""
features = {
'heart_rate': radar_data['heart_rate'],
'breath_rate': radar_data['breath_rate'],
'radar_cross_section': radar_data['rcs'],
'motion_amplitude': radar_data['motion_amp']
}

# 如果有摄像头数据
if camera_data:
features['height'] = camera_data.get('height', 0)
features['width'] = camera_data.get('width', 0)

# 分类
prediction = self.model.predict([features])

return prediction[0] # 'child', 'adult', 'animal', 'object'

四、报警策略

4.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
class CPDAlarmStrategy:
"""
CPD报警策略
"""
def __init__(self):
self.alarm_levels = {
'level_1': {
'delay': 30, # 锁车后30秒
'action': '车内喇叭短鸣',
'duration': 5
},
'level_2': {
'delay': 60,
'action': '车内喇叭长鸣+车灯闪烁',
'duration': 30
},
'level_3': {
'delay': 90,
'action': '手机推送+紧急呼叫',
'duration': 0 # 持续
}
}

def trigger_alarm(self, lock_time, child_detected_time):
"""
触发报警
"""
elapsed = child_detected_time - lock_time

if elapsed >= 90:
self.execute_level_3()
elif elapsed >= 60:
self.execute_level_2()
elif elapsed >= 30:
self.execute_level_1()

def execute_level_1(self):
"""一级报警"""
# 车内喇叭短鸣
self.honk(duration=5)
self.log('Level 1 alarm: Short honk')

def execute_level_2(self):
"""二级报警"""
# 长鸣+闪灯
self.honk(duration=30)
self.flash_lights(duration=30)
self.log('Level 2 alarm: Honk + lights')

def execute_level_3(self):
"""三级报警"""
# 手机推送
self.send_notification()

# 紧急呼叫
self.emergency_call()

self.log('Level 3 alarm: Notification + emergency call')

4.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
class AntiFalseAlarm:
"""
防误报
"""
def __init__(self):
self.false_alarm_thresholds = {
'min_vital_signs_duration': 5, # 生命体征持续5秒
'min_confidence': 0.8,
'excluded_objects': ['pet_carrier', 'large_toy']
}

def is_false_alarm(self, detection_result):
"""
判断是否误报
"""
# 1. 持续时间太短
if detection_result['duration'] < self.false_alarm_thresholds['min_vital_signs_duration']:
return True

# 2. 置信度太低
if detection_result['confidence'] < self.false_alarm_thresholds['min_confidence']:
return True

# 3. 排除物体
if detection_result['object_type'] in self.false_alarm_thresholds['excluded_objects']:
return True

return False

五、供应商方案对比

5.1 主流供应商

供应商 方案 技术 成本
Infineon BGT60ATR24C 60GHz $35
NOVELDA X4-UWB UWB $60
Texas Instruments IWR6843 60GHz $40
Acconeer A121 60GHz $30

5.2 性能对比

指标 Infineon NOVELDA TI Acconeer
检测距离 3m 5m 4m 3m
心率检测 ✅✅
穿透能力
功耗 150mW 300mW 200mW 100mW
算法复杂度

六、总结

6.1 技术选型建议

车型定位 推荐方案
入门级 单60GHz雷达
中端 摄像头+60GHz雷达
高端 摄像头+UWB雷达

6.2 Euro NCAP合规检查

要求 当前方案
检测率>95% ✅ 融合方案可达98%
误报率<5% ✅ 可达2-3%
穿透检测 ✅ 雷达穿透
脚部空间 ✅ 雷达覆盖
手机推送 ✅ TCU集成

6.3 开发时间线

阶段 时间 目标
原型验证 2-3个月 雷达+基础算法
功能完善 3-5个月 融合+报警策略
量产准备 5-8个月 车规认证+测试

参考文献

  1. Euro NCAP. “CPD Test and Assessment Protocol v1.3.” 2026.
  2. Infineon. “In-Cabin Monitoring System Application Note.” 2025.
  3. NOVELDA. “UWB Child Presence Sensor Technical Documentation.” 2026.

本文是IMS OMS系列文章之一,上一篇:高通平台部署实践


儿童存在检测CPD:Euro NCAP 2026强制要求的雷达+摄像头融合方案
https://dapalm.com/2026/03/13/2026-03-13-儿童存在检测CPD-Euro-NCAP-2026强制要求的雷达摄像头融合方案/
作者
Mars
发布于
2026年3月13日
许可协议