CPD 儿童检测:60GHz 雷达 vs 热成像传感器融合方案详解

Euro NCAP CPD 要求

1. 官方协议(v1.2)

核心要求:

“Going into 2025 and beyond, only direct sensing solutions will garner NCAP points.”

评分标准:

检测方法 Euro NCAP 状态 得分 备注
60GHz 雷达直接感知 ✅ 接受 满分 TI、Infineon方案
热成像摄像头 ✅ 接受 满分 Smart Eye方案
压力传感器 ❌ 2025后不再接受 0分 间接感知
车门开关逻辑 ❌ 不接受 0分 间接感知
重量传感器 ❌ 不接受 0分 不可靠

2. 测试场景

Euro NCAP CPD 场景:

场景 ID 场景名称 检测时限 干预措施
C-01 儿童独自留在车内 ≤90 秒 声光警告
C-02 儿童睡眠状态 ≤120 秒 声光警告 + 手机通知
C-03 儿童被遮挡(毛毯覆盖) ≤180 秒 声光警告
C-04 儿童在后排座椅 ≤90 秒 声光警告
C-05 多儿童检测 ≤90 秒 全部检测
C-06 儿童动态移动 ≤60 秒 实时跟踪

60GHz 雷达方案详解

1. TI 官方方案

TI Technical Article:

“Meet Euro NCAP Child Presence Detection Requirements with Low-power 60-GHz mmWave Radar Sensors.”

技术原理:

60GHz 毫米波雷达通过穿透性检测实现儿童检测:

  • 穿透毛毯、衣物、座椅
  • 检测呼吸、心跳等生命体征
  • 不受光照、温度影响

2. 雷达参数

TI IWR6843AOP 参数:

参数 规格 Euro NCAP要求
频率 60-64 GHz 60GHz频段
发射通道 4 TX ≥3 TX
接收通道 4 RX ≥3 RX
分辨率 <5 cm ≤10 cm
检测范围 2-5 m 车内覆盖
功耗 <500 mW 低功耗
穿透率 >95% 毛毯/衣物

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
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
"""
60GHz 雷达儿童检测原理

基于 TI IWR6843AOP

核心方法:
- 生命体征检测(呼吸、心跳)
- 穿透性检测(毛毯、衣物)
- 多目标跟踪

参考:TI Technical Article SSZT046
"""

import numpy as np
from scipy import signal


class ChildPresenceDetectionRadar:
"""
60GHz 雷达儿童检测系统

Euro NCAP CPD 场景 C-01 ~ C-06
"""

def __init__(self):
# 雷达参数(TI IWR6843AOP)
self.frequency = 60e9 # 60 GHz
self.tx_channels = 4
self.rx_channels = 4
self.range_resolution = 0.05 # 5 cm

# 检测阈值
self.breath_threshold = 0.3 # Hz(呼吸频率)
self.heartbeat_threshold = 1.0 # Hz(心跳频率)
self.movement_threshold = 0.1 # m/s

def detect_child_presence(self, radar_data: np.ndarray) -> dict:
"""
检测儿童存在

Args:
radar_data: 雷达数据, shape=(N_range_bins, N_time_samples)

Returns:
result: {'presence': bool, 'location': dict, 'vital_signs': dict}

Euro NCAP C-01:儿童独自留在车内
"""
# 距离-多普勒处理
range_profile = np.sum(radar_data, axis=1)

# FFT 处理
doppler_spectrum = np.fft.fft(radar_data, axis=1)

# 检测目标
targets = self._detect_targets(range_profile, doppler_spectrum)

# 检测生命体征
vital_signs = self._detect_vital_signs(radar_data)

# 判断儿童存在
is_child = self._classify_child(targets, vital_signs)

return {
'presence': is_child,
'location': targets,
'vital_signs': vital_signs
}

def detect_vital_signs(self, radar_data: np.ndarray) -> dict:
"""
检测生命体征(呼吸、心跳)

儿童特征:
- 呼吸频率:20-30 次/分钟(0.33-0.5 Hz)
- 心跳频率:80-120 次/分钟(1.33-2.0 Hz)

TI 方法:Phase-based detection
"""
# 相位提取
phase = np.angle(radar_data)

# 相位变化(呼吸、心跳引起的微小位移)
phase_diff = np.diff(phase, axis=1)

# 频谱分析
freq_spectrum = np.fft.fft(phase_diff, axis=1)
frequencies = np.fft.fftfreq(phase_diff.shape[1], d=1/30) # 30fps

# 呼吸检测(0.3-0.5 Hz)
breath_mask = (np.abs(frequencies) >= 0.3) & (np.abs(frequencies) <= 0.5)
breath_power = np.sum(np.abs(freq_spectrum[:, breath_mask]), axis=1)

# 心跳检测(1.0-2.0 Hz)
heartbeat_mask = (np.abs(frequencies) >= 1.0) & (np.abs(frequencies) <= 2.0)
heartbeat_power = np.sum(np.abs(freq_spectrum[:, heartbeat_mask]), axis=1)

return {
'breath_rate': np.argmax(breath_power) * 0.33, # Hz
'heartbeat_rate': np.argmax(heartbeat_power) * 1.33, # Hz
'breath_detected': np.max(breath_power) > self.breath_threshold,
'heartbeat_detected': np.max(heartbeat_power) > self.heartbeat_threshold
}

def detect_occluded_child(self, radar_data: np.ndarray, occlusion_type: str) -> dict:
"""
检测被遮挡儿童

Args:
radar_data: 雷达数据
occlusion_type: 遮挡类型('blanket', 'clothing', 'seat')

Returns:
result: {'detected': bool, 'penetration_rate': float}

Euro NCAP C-03:儿童被遮挡(毛毯覆盖)

TI 方案优势:60GHz 雷达穿透率 >95%
"""
# 雷达穿透检测(不受遮挡影响)
presence_result = self.detect_child_presence(radar_data)

# 穿透率评估
penetration_rate = 0.95 # TI IWR6843AOP 预估

return {
'detected': presence_result['presence'],
'penetration_rate': penetration_rate,
'occlusion_type': occlusion_type
}

def _detect_targets(self, range_profile: np.ndarray, doppler_spectrum: np.ndarray) -> dict:
"""检测目标位置"""
# 峰值检测
peaks = signal.find_peaks(np.abs(range_profile), height=0.5)

# 距离计算
distances = peaks[0] * self.range_resolution

return {
'num_targets': len(peaks[0]),
'distances': distances,
'positions': peaks[0]
}

def _classify_child(self, targets: dict, vital_signs: dict) -> bool:
"""分类儿童"""
# 儿童特征:
# 1. 存在生命体征(呼吸、心跳)
# 2. 目标尺寸较小
# 3. 呼吸频率较高(儿童特征)

has_vital_signs = vital_signs['breath_detected'] or vital_signs['heartbeat_detected']

# 儿童呼吸频率特征(20-30次/分钟)
child_breath_range = (0.33 <= vital_signs['breath_rate'] <= 0.5)

return has_vital_signs and child_breath_range


# 实际测试
if __name__ == "__main__":
radar = ChildPresenceDetectionRadar()

# 模拟雷达数据(儿童存在)
np.random.seed(42)
radar_data_child = np.random.randn(100, 300) + 0.5

# 模拟雷达数据(儿童被遮挡)
radar_data_occluded = np.random.randn(100, 300) * 0.8 + 0.3

# 检测儿童
result = radar.detect_child_presence(radar_data_child)
print(f"儿童检测: {result['presence']}")
print(f"生命体征: 呼吸={result['vital_signs']['breath_detected']}, 心跳={result['vital_signs']['heartbeat_detected']}")

# 检测遮挡儿童
occluded_result = radar.detect_occluded_child(radar_data_occluded, 'blanket')
print(f"\n遮挡儿童检测: {occluded_result['detected']}")
print(f"穿透率: {occluded_result['penetration_rate']:.1%}")

热成像摄像头方案

1. Smart Eye 方案

Smart Eye 官方:

“What Euro NCAP 2026 Says About Child Presence Detection.”

技术优势:

  • 温度检测(儿童体温 vs 环境温度)
  • 高分辨率成像
  • 与 DMS 摄像头融合

2. 热成像参数

热成像摄像头参数:

参数 规格 Euro NCAP要求
分辨率 640×512 ≥320×240
温度分辨率 <0.1°C ≤0.2°C
波长范围 8-14 μm 长波红外
帧率 25 fps ≥10 fps
检测范围 2-5 m 车内覆盖
功耗 <2 W 低功耗

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
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
"""
热成像儿童检测原理

基于 Smart Eye 方案

核心方法:
- 温度检测(儿童体温 vs 环境温度)
- 红外成像
- 与 DMS 摄像头融合

参考:Smart Eye Blog
"""

import numpy as np


class ChildPresenceDetectionThermal:
"""
热成像儿童检测系统

Smart Eye 方案
"""

def __init__(self):
# 热成像参数
self.resolution = (640, 512)
self.temp_resolution = 0.1 # °C

# 检测阈值
self.child_temp_min = 36.0 # °C(儿童体温)
self.child_temp_max = 37.5
self.env_temp_threshold = 35.0 # °C(环境温度)

def detect_child_presence(self, thermal_image: np.ndarray) -> dict:
"""
检测儿童存在

Args:
thermal_image: 热成像数据, shape=(H, W), 温度值

Returns:
result: {'presence': bool, 'temp_map': dict, 'location': dict}
"""
# 温度分析
temp_stats = self._analyze_temperature(thermal_image)

# 检测热源(儿童体温特征)
hotspots = self._detect_hotspots(thermal_image)

# 分类儿童
is_child = self._classify_child_by_temp(hotspots, temp_stats)

return {
'presence': is_child,
'temp_map': temp_stats,
'location': hotspots
}

def detect_sleeping_child(self, thermal_image: np.ndarray) -> dict:
"""
检测睡眠儿童

Euro NCAP C-02:儿童睡眠状态

睡眠儿童特征:
- 体温略低(36.0-36.5°C)
- 呼吸均匀
- 无明显动作
"""
# 温度检测
presence_result = self.detect_child_presence(thermal_image)

# 睡眠特征检测
is_sleeping = self._detect_sleep_pattern(thermal_image)

return {
'detected': presence_result['presence'],
'sleeping': is_sleeping,
'confidence': 0.85 if is_sleeping else 0.70
}

def fuse_with_dms(self, thermal_result: dict, dms_result: dict) -> dict:
"""
与 DMS 摄像头融合

Smart Eye 方案:热成像 + DMS 融合

融合优势:
- 提高检测准确率
- 减少误报
- 实现乘员分类
"""
# 融合判断
thermal_presence = thermal_result['presence']
dms_presence = dms_result.get('child_detected', False)

# 融合逻辑
fused_presence = thermal_presence or dms_presence

# 置信度计算
confidence = 0.95 if thermal_presence and dms_presence else 0.85

return {
'presence': fused_presence,
'confidence': confidence,
'thermal_source': thermal_presence,
'dms_source': dms_presence
}

def _analyze_temperature(self, thermal_image: np.ndarray) -> dict:
"""分析温度分布"""
mean_temp = np.mean(thermal_image)
max_temp = np.max(thermal_image)
min_temp = np.min(thermal_image)

return {
'mean': mean_temp,
'max': max_temp,
'min': min_temp,
'std': np.std(thermal_image)
}

def _detect_hotspots(self, thermal_image: np.ndarray) -> dict:
"""检测热源(儿童体温特征)"""
# 温度阈值
child_temp_mask = (thermal_image >= self.child_temp_min) & (thermal_image <= self.child_temp_max)

# 热源位置
hotspots = np.where(child_temp_mask)

return {
'num_hotspots': len(hotspots[0]),
'positions': hotspots,
'temps': thermal_image[child_temp_mask]
}

def _classify_child_by_temp(self, hotspots: dict, temp_stats: dict) -> bool:
"""根据温度分类儿童"""
# 儿童特征:存在体温范围的热源
has_child_temp = hotspots['num_hotspots'] > 0

# 温度差异(儿童 vs 环境)
temp_diff = temp_stats['max'] - temp_stats['mean']

return has_child_temp and temp_diff > 1.0

def _detect_sleep_pattern(self, thermal_image: np.ndarray) -> bool:
"""检测睡眠模式"""
# 简化判断:温度稳定
temp_std = np.std(thermal_image)

# 睡眠时温度分布稳定
return temp_std < 0.5


# 实际测试
if __name__ == "__main__":
thermal = ChildPresenceDetectionThermal()

# 模拟热成像数据(儿童存在)
np.random.seed(42)
thermal_image_child = np.random.normal(36.5, 0.3, (640, 512))

# 模拟热成像数据(儿童睡眠)
thermal_image_sleeping = np.random.normal(36.2, 0.2, (640, 512))

# 检测儿童
result = thermal.detect_child_presence(thermal_image_child)
print(f"儿童检测: {result['presence']}")
print(f"温度统计: 平均={result['temp_map']['mean']:.1f}°C")

# 检测睡眠儿童
sleeping_result = thermal.detect_sleeping_child(thermal_image_sleeping)
print(f"\n睡眠儿童检测: {sleeping_result['detected']}")
print(f"睡眠状态: {sleeping_result['sleeping']}")

雷达 + 热成像融合方案

1. 融合优势

方案 优势 局限性
60GHz 雷达 穿透性强、不受光照影响 无法成像、分辨率低
热成像 高分辨率成像、温度检测 受遮挡影响、功耗较高
融合方案 穿透+成像、高准确率 成本较高、复杂度高

2. 融合架构

graph TB
    A1[60GHz雷达] --> B1[生命体征检测]
    A2[热成像摄像头] --> B2[温度检测]
    B1 --> C[融合判断]
    B2 --> C
    C --> D1[儿童存在]
    C --> D2[位置定位]
    C --> D3[状态判断]

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
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
"""
雷达 + 热成像融合儿童检测

融合方案优势:
- 雷达:穿透检测、生命体征
- 热成像:温度检测、成像
- 融合:提高准确率、减少误报

参考:TI + Smart Eye 融合方案
"""

import numpy as np


class ChildPresenceDetectionFusion:
"""
雷达 + 热成像融合儿童检测系统

Euro NCAP CPD 最佳方案
"""

def __init__(self):
self.radar = ChildPresenceDetectionRadar()
self.thermal = ChildPresenceDetectionThermal()

# 融合权重
self.radar_weight = 0.6
self.thermal_weight = 0.4

def detect_child(self, radar_data: np.ndarray, thermal_image: np.ndarray) -> dict:
"""
融合检测儿童

Args:
radar_data: 雷达数据
thermal_image: 热成像数据

Returns:
result: {'presence': bool, 'confidence': float, 'sources': dict}
"""
# 雷达检测
radar_result = self.radar.detect_child_presence(radar_data)

# 热成像检测
thermal_result = self.thermal.detect_child_presence(thermal_image)

# 融合判断
fused_presence = self._fuse_results(radar_result, thermal_result)

# 置信度计算
confidence = self._calculate_confidence(radar_result, thermal_result)

return {
'presence': fused_presence,
'confidence': confidence,
'radar_result': radar_result,
'thermal_result': thermal_result
}

def detect_occluded_child(self, radar_data: np.ndarray, thermal_image: np.ndarray) -> dict:
"""
融合检测遮挡儿童

Euro NCAP C-03:儿童被遮挡

融合优势:雷达穿透 + 热成像温度检测
"""
# 雷达穿透检测(不受遮挡影响)
radar_result = self.radar.detect_occluded_child(radar_data, 'blanket')

# 热成像温度检测(可能受遮挡影响)
thermal_result = self.thermal.detect_child_presence(thermal_image)

# 融合判断(雷达权重更高)
fused_presence = radar_result['detected'] # 雷达穿透检测

return {
'presence': fused_presence,
'penetration_rate': radar_result['penetration_rate'],
'thermal_detected': thermal_result['presence'],
'confidence': 0.95 # 雷达穿透检测置信度高
}

def _fuse_results(self, radar_result: dict, thermal_result: dict) -> bool:
"""融合判断"""
radar_presence = radar_result['presence']
thermal_presence = thermal_result['presence']

# 逻辑:任一检测到即判定存在
return radar_presence or thermal_presence

def _calculate_confidence(self, radar_result: dict, thermal_result: dict) -> float:
"""计算置信度"""
radar_presence = radar_result['presence']
thermal_presence = thermal_result['presence']

# 双源检测置信度高
if radar_presence and thermal_presence:
return 0.98
elif radar_presence:
return 0.95 # 雷达穿透检测置信度高
elif thermal_presence:
return 0.90
else:
return 0.80


# 实际测试
if __name__ == "__main__":
fusion = ChildPresenceDetectionFusion()

# 模拟数据(儿童存在)
np.random.seed(42)
radar_data = np.random.randn(100, 300) + 0.5
thermal_image = np.random.normal(36.5, 0.3, (640, 512))

# 融合检测
result = fusion.detect_child(radar_data, thermal_image)

print(f"融合检测结果:")
print(f" 儿童存在: {result['presence']}")
print(f" 置信度: {result['confidence']:.2%}")
print(f" 雷达检测: {result['radar_result']['presence']}")
print(f" 热成像检测: {result['thermal_result']['presence']}")

# 遮挡儿童检测
occluded_result = fusion.detect_occluded_child(radar_data, thermal_image)

print(f"\n遮挡儿童检测:")
print(f" 检测结果: {occluded_result['presence']}")
print(f" 穿透率: {occluded_result['penetration_rate']:.1%}")

IMS 开发落地指南

1. 硬件选型

推荐方案:

方案 硬件 成本 Euro NCAP得分
雷达方案 TI IWR6843AOP $30 满分
热成像方案 FLIR Lepton 3.5 $150 满分
融合方案 TI + FLIR $180 满分(最佳)

2. 开发优先级

模块 Euro NCAP状态 优先级 开发周期
雷达生命体征检测 ✅ 接受 🔴 P0 2周
热成像温度检测 ✅ 接受 🟡 P1 3周
融合算法 ✅ 最佳方案 🟡 P1 4周
遮挡检测 ⚠️ C-03场景 🟡 P1 2周

3. Euro NCAP 测试场景验证

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
"""
Euro NCAP CPD 测试场景验证

场景 C-01 ~ C-06
"""

def run_cpd_test_scenario(scenario_id: str, fusion_system: ChildPresenceDetectionFusion):
"""
运行 CPD 测试场景

Args:
scenario_id: 场景编号
fusion_system: 融合检测系统

Returns:
result: {'passed': bool, 'details': dict}
"""
# 场景参数
scenarios = {
'C-01': {'name': '儿童独自留在车内', 'max_delay': 90},
'C-02': {'name': '儿童睡眠状态', 'max_delay': 120},
'C-03': {'name': '儿童被遮挡', 'max_delay': 180},
'C-04': {'name': '儿童在后排座椅', 'max_delay': 90},
'C-05': {'name': '多儿童检测', 'max_delay': 90},
'C-06': {'name': '儿童动态移动', 'max_delay': 60}
}

params = scenarios.get(scenario_id, {'max_delay': 90})

# 模拟测试数据
radar_data = np.random.randn(100, 300) + 0.5
thermal_image = np.random.normal(36.5, 0.3, (640, 512))

# 检测
if scenario_id == 'C-03':
result = fusion_system.detect_occluded_child(radar_data, thermal_image)
else:
result = fusion_system.detect_child(radar_data, thermal_image)

# 判定
passed = result['presence'] and result['confidence'] >= 0.85

return {
'passed': passed,
'scenario': params['name'],
'detection_delay': 45, # 模拟检测时间
'max_delay': params['max_delay']
}


# 实际测试
if __name__ == "__main__":
fusion = ChildPresenceDetectionFusion()

# 运行所有场景
for scenario_id in ['C-01', 'C-02', 'C-03', 'C-04']:
result = run_cpd_test_scenario(scenario_id, fusion)
print(f"{scenario_id} ({result['scenario']}): {result['passed']}")

总结

Euro NCAP 2026 CPD 核心要求:

  1. 直接感知强制 - 60GHz 雷达、热成像
  2. 穿透检测 - 雷达穿透率 >95%
  3. 生命体征检测 - 呼吸、心跳
  4. 多儿童检测 - 全部检测
  5. 遮挡检测 - C-03场景

IMS 开发启示:

  • 优先雷达方案(TI IWR6843AOP)
  • 热成像作为补充(与 DMS 融合)
  • 融合方案最佳(成本 vs 性能平衡)
  • 遮挡检测是关键难点

参考文献

  1. TI CPD Technical Article:https://www.ti.com/lit/SSZT046
  2. Euro NCAP CPD Protocol:https://www.euroncap.com/media/85787/sd-102-cpd-evaluation-v09.pdf
  3. Smart Eye CPD Blog:https://www.smarteye.se/blog/what-euro-ncap-2026-says-about-child-presence-detection/
  4. TI IWR6843AOP 数据手册:https://www.ti.com/product/IWR6843AOP

CPD 儿童检测:60GHz 雷达 vs 热成像传感器融合方案详解
https://dapalm.com/2026/07/07/2026-07-07-cpd-60ghz-radar-thermal-fusion-zh/
作者
Mars
发布于
2026年7月7日
许可协议