سیستم تشخیص خواب‌آلودگی رانندگان

پیاده‌سازی سیستم هوشمند تشخیص خواب‌آلودگی با استفاده از OpenCV و Pygame - تشخیص بسته بودن چشم و هشدار صوتی

پروژه ۴ دقیقه مطالعه
فهرست مطالب
این مطلب از سایت tool.hamidvalad.ir گرفته شده است

معرفی

این پروژه یک سیستم تشخیص خواب‌آلودگی رانندگان است که با استفاده از OpenCV و Pygame پیاده‌سازی شده. سیستم قادر به تشخیص بسته بودن چشم‌ها برای مدت زمان مشخص است و در صورت تشخیص خواب‌آلودگی، هشدار صوتی پخش می‌کند.

آدرس دسترسی این صفحه در برنامه: /ig/driver-drowsiness

پیش‌نیازها (کتابخانه‌ها و ابزارها)

  • Python 3.7+ (توصیه‌شده 3.8/3.9)
  • OpenCV (cv2) - کتابخانه بینایی کامپیوتر
  • Pygame - برای پخش هشدارهای صوتی
  • NumPy - برای محاسبات عددی
  • دوربین وب‌کم فعال
  • فایل صوتی برای هشدار (beep.mp3)
Terminal
pip install opencv-python pygame numpy

راه‌اندازی محیط مجازی (Virtual Environment)

برای مدیریت بهتر کتابخانه‌ها و جلوگیری از تداخل با پروژه‌های دیگر، استفاده از محیط مجازی توصیه می‌شود.

ایجاد محیط مجازی در ویندوز:

PowerShell
# ایجاد محیط مجازی
python -m venv drowsiness_env

# فعال‌سازی محیط مجازی
.\drowsiness_env\Scripts\Activate.ps1

# نصب کتابخانه‌ها در محیط مجازی
pip install opencv-python pygame numpy

ایجاد محیط مجازی در لینوکس/Mac:

Terminal
# ایجاد محیط مجازی
python3 -m venv drowsiness_env

# فعال‌سازی محیط مجازی
source drowsiness_env/bin/activate

# نصب کتابخانه‌ها در محیط مجازی
pip install opencv-python pygame numpy

ساختار پروژه با محیط مجازی:

Directory Structure
driver-drowsiness/
├── drowsiness_detection.py
├── beep.mp3
├── requirements.txt
└── drowsiness_env/

فایل requirements.txt:

Text
opencv-python==4.8.1.78
pygame==2.5.1
numpy==1.24.3

برای نصب از فایل requirements از دستور زیر استفاده کنید:

Terminal
pip install -r requirements.txt

راه‌اندازی گام‌به‌گام

  1. پوشه پروژه را ایجاد کرده و کد را در فایلی با نام drowsiness_detection.py ذخیره کنید.
  2. فایل صوتی هشدار (beep.mp3) را در همان پوشه قرار دهید.
  3. محیط مجازی را ایجاد و فعال کنید (مراحل بخش قبل).
  4. کتابخانه‌های مورد نیاز را در محیط مجازی نصب کنید.
  5. مطمئن شوید دوربین شما به درستی نصب شده و فعال است.

ساختار پروژه

این پروژه به یک فایل پایتون و یک فایل صوتی نیاز دارد. سیستم از دوربین برای نظارت بر چشم‌ها استفاده می‌کند.

چگونه سیستم را اجرا کنیم

  1. محیط مجازی را فعال کنید:
Terminal
# در ویندوز
.\drowsiness_env\Scripts\Activate.ps1

# در لینوکس/Mac
source drowsiness_env/bin/activate
  1. برنامه را اجرا کنید:
Terminal
python drowsiness_detection.py

پس از اجرا، پنجره‌ای با تصویر دوربین باز می‌شود. سیستم به طور خودکار شروع به نظارت بر چشم‌ها می‌کند و در صورت بسته بودن چشم‌ها برای بیش از 2 ثانیه، هشدار صوتی پخش می‌شود.

برای خروج از برنامه، کلید q را فشار دهید یا پنجره را ببندید.

پس از اتمام کار، برای غیرفعال کردن محیط مجازی از دستور deactivate استفاده کنید.

کد کامل پروژه (قابل کپی)

کد کامل سیستم تشخیص خواب‌آلودگی در بلوک زیر قرار دارد. می‌توانید آن را کپی کرده و در فایل پایتون ذخیره کنید.

Python
import cv2
import time
import pygame
import sys

pygame.mixer.init()
ALARM_SOUND = "beep.mp3"

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

cap = cv2.VideoCapture(0)
closed_since = None
CLOSED_THRESHOLD = 2.0
is_playing = False

window_name = "Eye Detection"
cv2.namedWindow(window_name)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    eyes_detected = False
    for (x, y, w, h) in faces:
        roi_gray = gray[y:y + h, x:x + w]
        eyes = eye_cascade.detectMultiScale(roi_gray, 1.1, 8)
        if len(eyes) > 0:
            eyes_detected = True
            for (ex, ey, ew, eh) in eyes:
                cv2.rectangle(frame, (x + ex, y + ey), (x + ex + ew, y + ey + eh), (0, 255, 0), 2)

    if not eyes_detected:
        if closed_since is None:
            closed_since = time.time()
        elif time.time() - closed_since > CLOSED_THRESHOLD:
            cv2.putText(frame, "⚠️ Eyes Closed!", (10, 50),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
            if not is_playing:
                pygame.mixer.music.load(ALARM_SOUND)
                pygame.mixer.music.play(-1)
                is_playing = True
    else:
        closed_since = None
        if is_playing:
            pygame.mixer.music.stop()
            is_playing = False

    cv2.imshow(window_name, frame)

    key = cv2.waitKey(1) & 0xFF

    # --- Break if user presses 'q' ---
    if key == ord('q'):
        break

    # --- Break if window is closed manually ---
    if cv2.getWindowProperty(window_name, cv2.WND_PROP_AUTOSIZE) < 0:
        break

# --- Cleanup ---
cap.release()
cv2.destroyAllWindows()
pygame.mixer.music.stop()
sys.exit()

شرح قسمت‌های مهم کد

  • Haar Cascades: از مدل‌های از پیش آموزش دیده برای تشخیص چهره و چشم استفاده می‌کند.
  • تشخیص چهره: با استفاده از haarcascade_frontalface_default.xml صورت را تشخیص می‌دهد.
  • تشخیص چشم: در ناحیه تشخیص داده شده صورت، به جستجوی چشم‌ها می‌پردازد.
  • زمان‌سنجی: مدت زمان بسته بودن چشم‌ها را اندازه‌گیری می‌کند.
  • هشدار صوتی: با استفاده از Pygame هشدار صوتی را به صورت تکرارشونده پخش می‌کند.
  • مدیریت پنجره: قابلیت بستن برنامه با کلید 'q' یا بستن پنجره را دارد.
  • مدیریت وضعیت: وضعیت پخش صدا را مدیریت کرده و از پخش همزمان چند هشدار جلوگیری می‌کند.

عیب‌یابی و نکات

  • مشکل در تشخیص چشم: مطمئن شوید نور محیط کافی باشد و صورت به وضوح دیده شود.
  • فایل صوتی پیدا نمی‌شود: مطمئن شوید فایل beep.mp3 در پوشه پروژه وجود دارد.
  • خطای Pygame: در صورت بروز مشکل، کتابخانه Pygame را مجدداً نصب کنید.
  • محیط مجازی: همیشه قبل از اجرا محیط مجازی را فعال کنید.
  • بهبود دقت: می‌توانید پارامترهای detectMultiScale را برای دقت بیشتر تنظیم کنید.

تنظیم پارامترها برای دقت بهتر:

Python
# برای تشخیص بهتر در شرایط نوری مختلف
faces = face_cascade.detectMultiScale(gray, 1.1, 4, minSize=(100, 100))
eyes = eye_cascade.detectMultiScale(roi_gray, 1.1, 6, minSize=(30, 30))

مشکلات رایج محیط مجازی:

Terminal
# اگر دستور activate کار نکرد:
# در ویندوز:
.\drowsiness_env\Scripts\activate.bat

# در PowerShell ممکن است نیاز به تغییر Execution Policy باشد:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser