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
| import numpy as np from typing import Tuple
class MultiModalOccupantClassifier: """ 多模态乘员分类器 融合三路传感器: 1. 座椅压力传感器 - 重量+分布 2. IR 摄像头 - 视觉分类 3. UWB 雷达 - 存在+呼吸 冗余设计:任一传感器失效仍可工作 """ def __init__(self): self.weights = { 'pressure': 0.3, 'camera': 0.4, 'uwb': 0.3 } self.sensor_health = { 'pressure': 1.0, 'camera': 1.0, 'uwb': 1.0 } self.classes = [ 'empty', 'infant_seat', 'child_seat', 'child', 'adult_normal', 'adult_oop', ] def classify(self, pressure_data: dict, camera_data: dict, uwb_data: dict) -> Tuple[str, float]: """ 多模态乘员分类 Args: pressure_data: {'weight_kg': float, 'dist': np.ndarray} camera_data: {'class_probs': np.ndarray, 'confidence': float} uwb_data: {'presence': bool, 'breath_rate': float, 'motion': float} Returns: (classification, confidence) """ if self.sensor_health['pressure'] < 0.5: self.weights['pressure'] = 0 self.weights['camera'] = 0.6 self.weights['uwb'] = 0.4 pressure_result = self._classify_pressure(pressure_data) camera_result = self._classify_camera(camera_data) uwb_result = self._classify_uwb(uwb_data) all_probs = {} for cls in self.classes: prob = (self.weights['pressure'] * pressure_result.get(cls, 0) + self.weights['camera'] * camera_result.get(cls, 0) + self.weights['uwb'] * uwb_result.get(cls, 0)) all_probs[cls] = prob total = sum(all_probs.values()) if total > 0: all_probs = {k: v/total for k, v in all_probs.items()} best_class = max(all_probs, key=all_probs.get) confidence = all_probs[best_class] return best_class, confidence def _classify_pressure(self, data): """压力传感器分类""" w = data.get('weight_kg', 0) if w < 5: return {'empty': 0.9, 'infant_seat': 0.05} elif w < 20: return {'child': 0.5, 'infant_seat': 0.3} elif w < 40: return {'child': 0.3, 'adult_normal': 0.3} else: return {'adult_normal': 0.6, 'adult_oop': 0.1} def _classify_camera(self, data): """摄像头分类""" probs = data.get('class_probs', np.zeros(6)) return {cls: probs[i] for i, cls in enumerate(self.classes)} def _classify_uwb(self, data): """UWB 雷达分类""" if not data.get('presence', False): return {'empty': 0.8} br = data.get('breath_rate', 0) if 20 <= br <= 40: return {'infant_seat': 0.4, 'child': 0.3} elif 12 <= br <= 20: return {'adult_normal': 0.5} else: return {'empty': 0.3, 'adult_normal': 0.3}
if __name__ == "__main__": classifier = MultiModalOccupantClassifier() classifier.sensor_health['pressure'] = 0.0 result, conf = classifier.classify( pressure_data={'weight_kg': 0}, camera_data={'class_probs': np.array([0.01, 0.02, 0.05, 0.1, 0.7, 0.12]), 'confidence': 0.85}, uwb_data={'presence': True, 'breath_rate': 16, 'motion': 0.3} ) print(f"压力传感器故障 → 分类: {result}, 置信度: {conf:.1%}")
|