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
| class FuzzyDrowsinessClassifier: """ 模糊疲劳分类器 基于模糊逻辑的三阶段判定 """ def __init__(self): self.perclos_thresholds = { 'low': 0.15, 'high': 0.40 } self.blink_thresholds = { 'low': 15, 'high': 30 } self.fuzzy_rules = self.define_fuzzy_rules() def classify(self, perclos, blink_rate, yawn_duration): """ 模糊分类 Args: perclos: PERCLOS值 (0-1) blink_rate: 眨眼频率 (次/分钟) yawn_duration: 打哈欠持续时间 (秒) Returns: state: 疲劳状态 ('low', 'medium', 'high') confidence: 置信度 """ perclos_low = self.triangle_mf(perclos, 0, 0.15, 0.30) perclos_medium = self.triangle_mf(perclos, 0.15, 0.30, 0.45) perclos_high = self.triangle_mf(perclos, 0.30, 0.45, 0.60) blink_low = self.triangle_mf(blink_rate, 5, 15, 25) blink_medium = self.triangle_mf(blink_rate, 15, 25, 35) blink_high = self.triangle_mf(blink_rate, 25, 35, 45) high_drowsy = min(perclos_high, blink_high) medium_drowsy = min(perclos_medium, blink_medium) low_drowsy = min(perclos_low, blink_low) max_membership = max(high_drowsy, medium_drowsy, low_drowsy) if max_membership == high_drowsy: return 'high', high_drowsy elif max_membership == medium_drowsy: return 'medium', medium_drowsy else: return 'low', low_drowsy @staticmethod def triangle_mf(x, a, b, c): """三角隶属函数""" if x <= a or x >= c: return 0 elif a < x <= b: return (x - a) / (b - a) else: return (c - x) / (c - b)
|