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
| import numpy as np import cv2
class AlcoholImpairmentVisualDetector: """基于视觉特征的酒精损伤检测(研究阶段)""" def __init__(self): self.saccade_velocity_threshold = 200 self.nystagmus_threshold = 5 def analyze_eye_movements(self, eye_tracking_data, duration_sec=60): """ 分析眼动特征 Args: eye_tracking_data: 眼动数据 (N, 4) [time, x, y, pupil_size] duration_sec: 分析时长 Returns: impairment_score: 损伤评分 (0-1) features: 提取的特征 """ saccades = self.detect_saccades(eye_tracking_data) saccade_velocities = self.calculate_saccade_velocities(saccades) avg_saccade_velocity = np.mean(saccade_velocities) nystagmus_detected, nystagmus_freq = self.detect_nystagmus(eye_tracking_data) eyelid_openness = self.analyze_eyelid_openness(eye_tracking_data) fixation_entropy = self.calculate_fixation_entropy(eye_tracking_data) impairment_score = self.calculate_impairment_score( saccade_velocity=avg_saccade_velocity, nystagmus_freq=nystagmus_freq, eyelid_openness=eyelid_openness, fixation_entropy=fixation_entropy ) features = { "saccade_velocity": avg_saccade_velocity, "nystagmus_detected": nystagmus_detected, "nystagmus_frequency": nystagmus_freq, "eyelid_openness": eyelid_openness, "fixation_entropy": fixation_entropy } return impairment_score, features def detect_saccades(self, eye_data): """检测扫视事件""" velocities = np.sqrt( np.diff(eye_data[:, 1])**2 + np.diff(eye_data[:, 2])**2 ) / np.diff(eye_data[:, 0]) saccade_indices = np.where(velocities > self.saccade_velocity_threshold)[0] return saccade_indices def detect_nystagmus(self, eye_data): """检测眼球震颤""" from scipy import signal x_signal = eye_data[:, 1] freqs = np.fft.fftfreq(len(x_signal)) fft_result = np.abs(np.fft.fft(x_signal)) nystagmus_band = (freqs > 5/len(eye_data)) & (freqs < 10/len(eye_data)) nystagmus_energy = np.sum(fft_result[nystagmus_band]) return nystagmus_energy > self.nystagmus_threshold, nystagmus_energy def calculate_impairment_score(self, **features): """ 计算损伤评分(研究算法) 注意:这是研究性质算法,实际应用需大量验证 """ score = 0.0 if features['saccade_velocity'] < 150: score += 0.3 elif features['saccade_velocity'] < 200: score += 0.15 if features['nystagmus_detected']: score += 0.25 if features['eyelid_openness'] < 0.7: score += 0.2 if features['fixation_entropy'] < 0.5: score += 0.25 return min(score, 1.0)
|