معرفی
این پروژه یک سیستم تشخیص خوابآلودگی رانندگان است که با استفاده از OpenCV و Pygame پیادهسازی شده. سیستم قادر به تشخیص بسته بودن چشمها برای مدت زمان مشخص است و در صورت تشخیص خوابآلودگی، هشدار صوتی پخش میکند.
پیشنیازها (کتابخانهها و ابزارها)
- Python 3.7+ (توصیهشده 3.8/3.9)
- OpenCV (cv2) - کتابخانه بینایی کامپیوتر
- Pygame - برای پخش هشدارهای صوتی
- NumPy - برای محاسبات عددی
- دوربین وبکم فعال
- فایل صوتی برای هشدار (beep.mp3)
pip install opencv-python pygame numpy
راهاندازی محیط مجازی (Virtual Environment)
برای مدیریت بهتر کتابخانهها و جلوگیری از تداخل با پروژههای دیگر، استفاده از محیط مجازی توصیه میشود.
ایجاد محیط مجازی در ویندوز:
# ایجاد محیط مجازی
python -m venv drowsiness_env
# فعالسازی محیط مجازی
.\drowsiness_env\Scripts\Activate.ps1
# نصب کتابخانهها در محیط مجازی
pip install opencv-python pygame numpy
ایجاد محیط مجازی در لینوکس/Mac:
# ایجاد محیط مجازی
python3 -m venv drowsiness_env
# فعالسازی محیط مجازی
source drowsiness_env/bin/activate
# نصب کتابخانهها در محیط مجازی
pip install opencv-python pygame numpy
ساختار پروژه با محیط مجازی:
driver-drowsiness/
├── drowsiness_detection.py
├── beep.mp3
├── requirements.txt
└── drowsiness_env/
فایل requirements.txt:
opencv-python==4.8.1.78
pygame==2.5.1
numpy==1.24.3
برای نصب از فایل requirements از دستور زیر استفاده کنید:
pip install -r requirements.txt
راهاندازی گامبهگام
- پوشه پروژه را ایجاد کرده و کد را در فایلی با نام
drowsiness_detection.pyذخیره کنید. - فایل صوتی هشدار (
beep.mp3) را در همان پوشه قرار دهید. - محیط مجازی را ایجاد و فعال کنید (مراحل بخش قبل).
- کتابخانههای مورد نیاز را در محیط مجازی نصب کنید.
- مطمئن شوید دوربین شما به درستی نصب شده و فعال است.
ساختار پروژه
این پروژه به یک فایل پایتون و یک فایل صوتی نیاز دارد. سیستم از دوربین برای نظارت بر چشمها استفاده میکند.
چگونه سیستم را اجرا کنیم
- محیط مجازی را فعال کنید:
# در ویندوز
.\drowsiness_env\Scripts\Activate.ps1
# در لینوکس/Mac
source drowsiness_env/bin/activate
- برنامه را اجرا کنید:
python drowsiness_detection.py
پس از اجرا، پنجرهای با تصویر دوربین باز میشود. سیستم به طور خودکار شروع به نظارت بر چشمها میکند و در صورت بسته بودن چشمها برای بیش از 2 ثانیه، هشدار صوتی پخش میشود.
برای خروج از برنامه، کلید q را فشار دهید یا پنجره را ببندید.
پس از اتمام کار، برای غیرفعال کردن محیط مجازی از دستور deactivate استفاده کنید.
کد کامل پروژه (قابل کپی)
کد کامل سیستم تشخیص خوابآلودگی در بلوک زیر قرار دارد. میتوانید آن را کپی کرده و در فایل پایتون ذخیره کنید.
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را برای دقت بیشتر تنظیم کنید.
تنظیم پارامترها برای دقت بهتر:
# برای تشخیص بهتر در شرایط نوری مختلف
faces = face_cascade.detectMultiScale(gray, 1.1, 4, minSize=(100, 100))
eyes = eye_cascade.detectMultiScale(roi_gray, 1.1, 6, minSize=(30, 30))
مشکلات رایج محیط مجازی:
# اگر دستور activate کار نکرد:
# در ویندوز:
.\drowsiness_env\Scripts\activate.bat
# در PowerShell ممکن است نیاز به تغییر Execution Policy باشد:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser