Sürücü güvenliği · Yüz noktaları (Face Mesh)
🥱 Yorgunluk ve esneme tespiti
Sürücü izleme sistemleri: gözler kapanırsa ya da esnersen uyar.
Yeni araçlarda zorunlu hâle gelen sürücü dikkat izleme sistemlerinin temeli: gözün açıklığını tek bir sayıyla ölçmek. Göz en-boy oranı (EAR), göz kapakları arasındaki dikey mesafelerin göz genişliğine oranıdır; göz kapanınca sıfıra yaklaşır. Aynı fikir ağız için esnemeyi verir.
Not: Eğitim amaçlıdır; gerçek araç sistemleri kızılötesi kamera, baş pozu ve çok daha fazla doğrulama kullanır.
Durum: …
Örnek sahne: sentetik bir sürücü yüzü; normal göz kırpar, sonra gözleri uzun süre kapanır ve esner. Göz ve ağız noktaları sahne üreticisinden gelir.
Nasıl çalışıyor?
- Nokta bulma: MediaPipe Face Mesh ile 478 yüz noktası. Her göz için 6 nokta (sol: 362, 385, 387, 263, 373, 380; sağ: 33, 160, 158, 133, 153, 144), ağız için köşeler (61, 291) ve üç iç dudak çifti.
- Özellik 1, EAR = (|p2 − p6| + |p3 − p5|) / (2 · |p1 − p4|), iki gözün ortalaması. Açık göz ≈ 0,25–0,35.
- Özellik 2, MAR = iç dudak aralıklarının ortalaması / ağız genişliği. Kapalı ağız < 0,1.
- Kural: EAR < 0,21 → göz kapalı. 0,8 sn'den kısa kapanma göz kırpmadır (dakikadaki sayısı tutulur); daha uzunsa UYUKLAMA alarmı. MAR > 0,6, 1,2 sn sürerse ESNEME.
- PERCLOS: son 30 sn'de gözlerin kapalı olduğu zamanın oranı; yorgunluk araştırmalarında kullanılan ölçü.
Kendin dene
Kamera modunda kendi açık göz EAR değerine bak; eşik ondan ne kadar düşük olmalı? Gözlüklüysen eşiği ayarlaman gerekebilir. 1 saniye gözlerini kapat, sonra esner gibi ağzını aç. Uyuklama süresini 0,3 sn yap: göz kırpmaların alarma dönüştüğünü gör.
Python karşılığı (OpenCV / MediaPipe)
import cv2, math, time, mediapipe as mpface = mp.solutions.face_mesh.FaceMesh(max_num_faces=1, refine_landmarks=True)L_EYE, R_EYE = [362, 385, 387, 263, 373, 380], [33, 160, 158, 133, 153, 144]EAR_T, CLOSED_S, MAR_T, YAWN_S = 0.21, 0.8, 0.6, 1.2closed_since = yawn_since = Nonecap = cv2.VideoCapture(0)def ear(p): # göz en-boy oranıreturn (math.dist(p[1], p[5]) + math.dist(p[2], p[4])) / (2 * math.dist(p[0], p[3]))while cap.isOpened():ok, frame = cap.read()if not ok: breakh, w = frame.shape[:2]; now = time.time()res = face.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))if res.multi_face_landmarks:lm = [(p.x * w, p.y * h) for p in res.multi_face_landmarks[0].landmark]e = (ear([lm[i] for i in L_EYE]) + ear([lm[i] for i in R_EYE])) / 2mar = sum(math.dist(lm[a], lm[b]) for a, b in [(13, 14), (81, 178), (311, 402)]) / 3 / math.dist(lm[61], lm[291])closed_since = (closed_since or now) if e < EAR_T else Noneyawn_since = (yawn_since or now) if mar > MAR_T else Noneif closed_since and now - closed_since > CLOSED_S:cv2.putText(frame, "UYUKLAMA!", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 3) # DROWSY!elif yawn_since and now - yawn_since > YAWN_S:cv2.putText(frame, "ESNEME", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 165, 255), 3) # YAWNcv2.imshow("fatigue", frame)if cv2.waitKey(1) == 27: break
🔒 Kamera görüntüsü yalnız bu cihazda işlenir; hiçbir yere gönderilmez ve kaydedilmez. Sekmeden ya da sayfadan çıkınca kamera kapanır.
