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
| """ 雷达+视觉传感器融合 CPD 决策框架 """
from dataclasses import dataclass from typing import Optional, List import numpy as np
@dataclass class RadarResult: has_target: bool distance_m: float rcs_db: float micro_motion_hz: Optional[float] confidence: float
@dataclass class VisionResult: has_child: bool has_adult: bool bbox: Optional[tuple] confidence: float
@dataclass class FusionResult: classification: str confidence: float source: str
def fuse_cpd(radar: RadarResult, vision: VisionResult) -> FusionResult: """ 雷达+视觉融合 CPD 决策 策略: 1. 雷达检测到活体微动 + 视觉确认 → 高置信度儿童 2. 雷达检测到活体微动 + 视觉无检测 → 中置信度儿童(遮挡场景) 3. 雷达无检测 + 视觉检测到儿童 → 低置信度(可能误检) 4. 两者均无检测 → 空座 """ if radar.has_target and radar.micro_motion_hz is not None: if vision.has_child: conf = min(radar.confidence + vision.confidence, 1.0) return FusionResult('child', conf, 'fusion') elif vision.has_adult: if radar.rcs_db < -15: return FusionResult('child', 0.6, 'fusion') return FusionResult('adult', 0.8, 'fusion') else: if radar.rcs_db < -20: return FusionResult('child', radar.confidence * 0.7, 'radar') return FusionResult('unknown', 0.5, 'radar') if radar.has_target: if vision.has_child: return FusionResult('child', 0.6, 'fusion') if vision.has_adult: return FusionResult('adult', 0.7, 'fusion') return FusionResult('unknown', 0.3, 'radar') if vision.has_child: return FusionResult('child', vision.confidence * 0.5, 'vision') if vision.has_adult: return FusionResult('adult', vision.confidence * 0.5, 'vision') return FusionResult('empty', 0.9, 'fusion')
if __name__ == "__main__": radar = RadarResult(True, 0.8, -25, 0.3, 0.85) vision = VisionResult(False, False, None, 0.0) result = fuse_cpd(radar, vision) print(f"场景1(遮挡儿童): {result.classification}, 置信度={result.confidence:.2f}, 源={result.source}") radar = RadarResult(True, 1.2, -18, 0.35, 0.9) vision = VisionResult(True, False, (100, 200, 50, 80), 0.85) result = fuse_cpd(radar, vision) print(f"场景2(双重确认): {result.classification}, 置信度={result.confidence:.2f}, 源={result.source}") radar = RadarResult(False, 0, 0, None, 0.95) vision = VisionResult(False, False, None, 0.95) result = fuse_cpd(radar, vision) print(f"场景3(空座): {result.classification}, 置信度={result.confidence:.2f}, 源={result.source}")
|