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
| class EuroNCAP_DMS_Scenarios: """ Euro NCAP DMS场景库 对齐Euro NCAP 2026评估协议 """ def __init__(self): self.scenarios = self._define_scenarios() def _define_scenarios(self) -> Dict: """定义Euro NCAP场景""" return { 'distraction': { 'D-01': { 'name': '短暂视线偏离1-2秒', 'trigger': 'gaze_off_road_1-2s', 'warning': 'LEVEL_1', 'variations': ['left', 'right', 'down', 'up'] }, 'D-02': { 'name': '视线偏离2-3秒', 'trigger': 'gaze_off_road_2-3s', 'warning': 'LEVEL_1', 'variations': ['left', 'right', 'down', 'up'] }, 'D-03': { 'name': '视线偏离>3秒', 'trigger': 'gaze_off_road_>3s', 'warning': 'LEVEL_2', 'variations': ['left', 'right', 'down', 'up'] }, 'D-04': { 'name': '手持手机(腿上)', 'trigger': 'phone_in_lap', 'warning': 'LEVEL_1', 'variations': ['texting', 'browsing', 'calling'] }, 'D-05': { 'name': '手持手机(视野内)', 'trigger': 'phone_in_view', 'warning': 'LEVEL_1', 'variations': ['texting', 'browsing', 'calling'] } }, 'drowsiness': { 'F-01': { 'name': 'KSS=7轻度疲劳', 'trigger': 'perclos_15%', 'warning': 'LEVEL_1', 'indicators': ['eye_closure', 'yawning'] }, 'F-02': { 'name': 'KSS=8中度疲劳', 'trigger': 'perclos_25%', 'warning': 'LEVEL_2', 'indicators': ['eye_closure', 'head_nodding'] }, 'F-03': { 'name': 'KSS=9重度疲劳', 'trigger': 'perclos_40%', 'warning': 'LEVEL_3', 'indicators': ['eye_closure', 'head_nodding', 'microsleep'] } }, 'impairment': { 'I-01': { 'name': '酒精损伤', 'trigger': 'behavior_anomaly_alcohol', 'warning': 'LEVEL_2', 'indicators': ['gaze_instability', 'erratic_steering'] }, 'I-02': { 'name': '药物损伤', 'trigger': 'behavior_anomaly_drug', 'warning': 'LEVEL_2', 'indicators': ['delayed_response', 'gaze_fixation'] } } } def generate_scenario_dataset(self, scenario_id: str, num_variations: int = 100) -> List[Dict]: """ 生成场景数据集 Args: scenario_id: 场景ID(如D-01) num_variations: 变体数量 Returns: dataset: 数据集 """ dataset = [] category = scenario_id.split('-')[0] if category == 'D': category_key = 'distraction' elif category == 'F': category_key = 'drowsiness' elif category == 'I': category_key = 'impairment' else: return dataset scenario = self.scenarios[category_key].get(scenario_id) if not scenario: return dataset for i in range(num_variations): sample = { 'scenario_id': scenario_id, 'variation': i, 'name': scenario['name'], 'trigger': scenario['trigger'], 'warning_level': scenario['warning'], 'parameters': self._randomize_parameters(scenario) } dataset.append(sample) return dataset def _randomize_parameters(self, scenario: Dict) -> Dict: """随机化场景参数""" params = { 'driver_age': np.random.randint(18, 75), 'driver_gender': np.random.choice(['male', 'female']), 'driver_ethnicity': np.random.choice(['asian', 'caucasian', 'african', 'hispanic']), 'lighting': np.random.choice(['day', 'night', 'twilight', 'tunnel']), 'occlusion': np.random.choice(['none', 'sunglasses', 'mask', 'hat']), 'vehicle_motion': np.random.choice(['static', 'straight', 'turn', 'brake']), 'camera_angle': np.random.uniform(-15, 15) } if 'variations' in scenario: params['action_variation'] = np.random.choice(scenario['variations']) return params
if __name__ == "__main__": scenarios = EuroNCAP_DMS_Scenarios() dataset = scenarios.generate_scenario_dataset('D-01', num_variations=10) print("Euro NCAP DMS场景数据集:") print(f" 场景数量: {len(dataset)}") print(f" 示例: {dataset[0]['scenario_id']} - {dataset[0]['name']}")
|