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
| import numpy as np from typing import List, Tuple
class InstrumentScanAnalysis: """ 仪表扫描模式分析 航空领域成熟技术,迁移到汽车座舱 分析驾驶员对仪表/中控屏/道路的注意力分配 """ ROI_AVIATION = { 'ADI': '姿态指示器', 'HSI': '水平态势指示器', 'altimeter': '高度表', 'airspeed': '空速表', 'engine': '发动机仪表', 'outside': '外部场景', } ROI_AUTOMOTIVE = { 'road_ahead': '前方道路', 'dashboard': '仪表盘', 'center_display': '中控屏', 'left_mirror': '左后视镜', 'right_mirror': '右后视镜', 'rear_mirror': '车内后视镜', 'steering': '方向盘区域', 'passenger': '副驾区域', } def analyze_scan_pattern( self, gaze_sequence: List[Tuple[float, str]], total_duration: float = 60.0 ) -> dict: """ 分析注视序列的扫描模式 Args: gaze_sequence: [(timestamp, roi_name), ...] total_duration: 总时长(秒) Returns: analysis: 扫描模式分析结果 """ roi_durations = {} for i in range(len(gaze_sequence) - 1): roi = gaze_sequence[i][1] duration = gaze_sequence[i+1][0] - gaze_sequence[i][0] roi_durations[roi] = roi_durations.get(roi, 0) + duration attention_distribution = { roi: dur / total_duration for roi, dur in roi_durations.items() } transitions = sum(1 for i in range(1, len(gaze_sequence)) if gaze_sequence[i][1] != gaze_sequence[i-1][1]) scan_rate = transitions / (total_duration / 60) fixations = [] for i in range(len(gaze_sequence) - 1): duration = gaze_sequence[i+1][0] - gaze_sequence[i][0] fixations.append(duration) avg_fixation = np.mean(fixations) if fixations else 0 road_attention = attention_distribution.get('road_ahead', 0) + \ attention_distribution.get('outside', 0) if scan_rate > 30 and avg_fixation < 0.5: cognitive_state = 'high_workload' elif scan_rate < 10 and avg_fixation > 2.0: cognitive_state = 'fatigue_risk' elif road_attention < 0.6: cognitive_state = 'distraction_risk' else: cognitive_state = 'normal' return { 'attention_distribution': attention_distribution, 'road_attention_ratio': road_attention, 'scan_rate_per_min': scan_rate, 'avg_fixation_sec': avg_fixation, 'cognitive_state': cognitive_state, 'total_transitions': transitions, 'safety_assessment': self._assess_safety( road_attention, scan_rate, avg_fixation ) } def _assess_safety( self, road_attn: float, scan_rate: float, avg_fix: float ) -> str: if road_attn < 0.5: return "⚠️ 危险:道路注意力不足50%" elif avg_fix > 2.0 and road_attn < 0.7: return "⚠️ 疲劳风险:注视时间过长" elif scan_rate > 40: return "⚠️ 高负荷:扫视频率过高" else: return "✅ 正常"
if __name__ == "__main__": analyzer = InstrumentScanAnalysis() np.random.seed(42) rois = ['road_ahead', 'dashboard', 'center_display', 'left_mirror', 'right_mirror', 'rear_mirror'] timestamps = np.cumsum(np.random.exponential(1.5, 40)) gaze_seq = [(t, np.random.choice(rois, p=[0.7, 0.1, 0.08, 0.04, 0.04, 0.04])) for t in timestamps] result = analyzer.analyze_scan_pattern(gaze_seq, total_duration=60) print("仪表扫描模式分析") print("=" * 50) print(f"道路注意力: {result['road_attention_ratio']:.1%}") print(f"扫视频率: {result['scan_rate_per_min']:.1f}次/分") print(f"平均注视: {result['avg_fixation_sec']:.2f}秒") print(f"认知状态: {result['cognitive_state']}") print(f"安全评估: {result['safety_assessment']}") print(f"\n各区域注意力分配:") for roi, ratio in sorted(result['attention_distribution'].items(), key=lambda x: -x[1]): print(f" {roi:20s}: {ratio:.1%}")
|