Okullar için Robotik ve Mühendislik · anaokulundan liseye

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: …

Eşikler

Ö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?

  1. 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.
  2. Özellik 1, EAR = (|p2 − p6| + |p3 − p5|) / (2 · |p1 − p4|), iki gözün ortalaması. Açık göz ≈ 0,25–0,35.
  3. Özellik 2, MAR = iç dudak aralıklarının ortalaması / ağız genişliği. Kapalı ağız < 0,1.
  4. 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.
  5. 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)

yorgunluk.py
  1. import cv2, math, time, mediapipe as mp
  2. face = mp.solutions.face_mesh.FaceMesh(max_num_faces=1, refine_landmarks=True)
  3. L_EYE, R_EYE = [362, 385, 387, 263, 373, 380], [33, 160, 158, 133, 153, 144]
  4. EAR_T, CLOSED_S, MAR_T, YAWN_S = 0.21, 0.8, 0.6, 1.2
  5. closed_since = yawn_since = None
  6. cap = cv2.VideoCapture(0)
  7. def ear(p): # göz en-boy oranı
  8. return (math.dist(p[1], p[5]) + math.dist(p[2], p[4])) / (2 * math.dist(p[0], p[3]))
  9. while cap.isOpened():
  10. ok, frame = cap.read()
  11. if not ok: break
  12. h, w = frame.shape[:2]; now = time.time()
  13. res = face.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
  14. if res.multi_face_landmarks:
  15. lm = [(p.x * w, p.y * h) for p in res.multi_face_landmarks[0].landmark]
  16. e = (ear([lm[i] for i in L_EYE]) + ear([lm[i] for i in R_EYE])) / 2
  17. mar = sum(math.dist(lm[a], lm[b]) for a, b in [(13, 14), (81, 178), (311, 402)]) / 3 / math.dist(lm[61], lm[291])
  18. closed_since = (closed_since or now) if e < EAR_T else None
  19. yawn_since = (yawn_since or now) if mar > MAR_T else None
  20. if closed_since and now - closed_since > CLOSED_S:
  21. cv2.putText(frame, "UYUKLAMA!", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 3) # DROWSY!
  22. elif yawn_since and now - yawn_since > YAWN_S:
  23. cv2.putText(frame, "ESNEME", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 165, 255), 3) # YAWN
  24. cv2.imshow("fatigue", frame)
  25. 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.

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç