Để khắc phục ảnh hưởng của ánh sáng phản chiếu lên kính ta có thể áp dụng một số biện pháp như sau:
- Sử dụng màn che để hạn chế ánh sáng chiếu trực tiếp vào mắt trong trường hợp tài xế đeo kính.
- Sử dụng loại kính ít bị phản chiếu, điều chình góc camera phù hợp.
Lắp đặt thêm hệ thống đèn hồng ngoại chiếu sáng vừa đủ để tăng kết quả nhận diện chính xác vào ban đêm.
Để khắc phục lỗi không thể nhận diện 2 người cùng một lúc ta có thể thu hẹp góc camera để trách việc người khác xuất hiện trong khung hình làm nhiễu kết quả. 6.2.2 Hướng phát triển
Ta có thể phát triển đề tài theo một số hướng sau:
- Nghiên cứu cải thiện khả năng nhận diện khi đeo kính, cải tiến những giải thuật phát hiện, nhận diện hiệu quả, chính xác và tối ưu hơn.
- Tích hợp thêm chương trình phát hiện say xỉn, phát hiện đột quỵ khi lái xe cho hệ thống.
TÀI LIỆU THAM KHẢO
[1] ThS. Nguyễn Trần Minh Nguyệt và KS. Phạm Huy Quang, “XỬ LÝ ẢNH VỚI ARDUINO VÀ RASPBERRY”, Nhà xuất THANH NIÊN, 2020.
[2] “Real-time facial landmark detection with OpenCV, Python and dlib” [Online]. Available:https://www.pyimagesearch.com/2017/04/17/real-time-facial-landmark- detection-opencv-python-dlib/
61 [3] Tereza Soukupova and Jan Čech, “Real-Time Eye Blink Detection using Facial
Landmarks”,https://vision.fe.uni-lj.si/cvww2016/proceedings/papers/05.pdf
[4] “Facial landmarks with dlib, OpenCV, and Python” [Online]. Available: https://www.pyimagesearch.com/2017/04/03/facial-landmarks-dlib-opencv-
python/
[5]F. Friedrichs, B. Yang, “Camera-based Drowsiness Reference for Driver State Classification under Real Driving Conditions” 2010 IEEE Intelligent Vehicles Symposium University of California, San Diego, CA, USA June 21-24, 2010. [6]M.J. Flores J. Ma Armingol A. de la Escalera, “Driver drowsiness detection
system under infrared illumination for an intelligent vehicle” Published in IET Intelligent Transport Systems Received on 13th October 2009 Revised on 1st April 2011.
[7]W. Zhang, B. Cheng, Y. Lin, “Driver drowsiness recognition based on computer vision technology”, Tsinghua Science and Technology, vol. 17, no. 3, pp. 354–362, 2012.
[8] R.O. Mbouna, S.G. Kong, M.G. Chun, “Visual Analysisof Eye State and Head Pose for Driver Alertness Monitoring”, IEEE Transactions On Intelligent
Transportation Systems, vol. 14, no. 3, September 2013.
[9]E. Tadesse, W. Sheng, M. Liu, “Driver Drowsiness Detection through HMM based Dynamic Modeling”, 2014 IEEE International Conference on Robotics & Automation (ICRA) Hong Kong Convention and Exhibition Center May 31 - June 7, 2014. Hong Kong, China.
[10] chisty, J. Gill, “A review: driver drowsiness detection system”, International
Journal of Computer Science Trends and Technology (IJCST), vol. 3, no. 4, Jul-
Aug 2015, ISSN: 2347-8578 www.ijcstjournal.org Page 243.
[11] Nguyễn Minh Sơn, Nguyễn Văn Bình & Nguyễn Ngọc Lâm, “Nghiên Cứu Thiết Kế Hệ Thống Giám Sát Trạng Thái Buồn Ngủ Của Lái Xe”, Tạp chí phát triển khoa học & công nghệ: chuyên san khoa học tự nhiên, tập 2, số 6, 2018. [12] Trương Quốc Định & Nguyễn Đăng Quang, “Hệ Thống Phát Hiện Tình Trạng
Ngủ Gật Của Lái Xe”, Tạp chí Khoa học Trường Đại học Cần Thơ, số chuyên đề: Công nghệ Thông tin (2015): 170-167.
62
PHỤ LỤC
# nhap cac goi can thiet
from imutils.video import VideoStream from imutils import face_utils
import imutils import numpy as np import time import dlib import cv2 import pygame def euclidean_dist(ptA, ptB):
# tinh toan va tra ve khoang cach euclide giua 2 diem return np.linalg.norm(ptA - ptB)
def ty_le_mat(eye):
# tinh khoang cach euclide giua cac toa do mat A = euclidean_dist(eye[1], eye[5])
B = euclidean_dist(eye[2], eye[4]) C = euclidean_dist(eye[0], eye[3]) # tinh ty le mat
63 # tra ve ty le mat
return ear
def ty_le_mieng(mouth):
# tinh toan khoang cach enclidean giua cac toa do mieng A = euclidean_dist(mouth[3], mouth[9]) B = euclidean_dist(mouth[2], mouth[10]) C = euclidean_dist(mouth[4], mouth[8]) D = euclidean_dist(mouth[0], mouth[6]) # tinh ty le mieng mar = (A+B+C)/3D # tra ve ty le mieng return mar
# xac dinh 2 hang so,1 cho ty le khung hinh cua mat de chi ra trang # thai nham mat, 1 cho so lan lien tiep cua khung ma mat o duoi # nguong da thiet lap
eye_threshold = 0.25 eye_frame = 10
# tuong tu nhu voi mat yawn_threshold = 0.8 yawn = 8
64 # khoi tao bo dem khung
blink_couter = 0 yawn_couter =0 total_yawn = 0
# load file am thanh canh bao pygame.init()
pygame.mixer.music.load("/home/pi/test/coi.mp3") # khoi tao bo phat hien khuon mat cua opencv (dua tren
# haar casdase) va bo du doan danh dau moc khuon mat cua dlib
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml') predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# lay cac chi so cua cac dau moc tren khuon mat cho mat trai # va mat phai
(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"] (rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"] # lay cac chi so cua cac dau moc tren khuon mat cho mieng
(mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS["mouth"]
# bat dau thu luong video vs = VideoStream(0).start() time.sleep(1.0)
65 # vong lap qua cac khung hinh tu luong video
while True:
# bat dau doc video frame = vs.read()
frame = imutils.resize(frame, width=450)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # phat hien khuon mat trong khung anh xam
rects = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
# vong lap tren phat hien khuon mat for (x, y, w, h) in rects:
rect = dlib.rectangle(int(x), int(y), int(x + w), int(y + h))
# xac dinh cac moc tren khuon mat, sau do chuyen doi cac moc # tren khuon mat toa do (x, y) thanh mot mang numpy
shape = predictor(gray, rect)
shape = face_utils.shape_to_np(shape)
# trich xuat toa do mat trai va mat phai, sau do su dung # toa do de tinh toan ty le co cua mat cho ca hai mat leftEye = shape[lStart:lEnd]
66 leftEAR = ty_le_mat(leftEye)
rightEAR = ty_le_mat(rightEye)
# tinh trung binh ty le co cua mat cho ca hai mat ear = (leftEAR + rightEAR) / 2.0
# tinh toan do loi cua mat trai va mat phai, sau đó # hinh dung tung mat va ve ra
leftEyeHull = cv2.convexHull(leftEye) rightEyeHull = cv2.convexHull(rightEye)
cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1) cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1) # trich xuat toa do vung mieng
mouth= shape[mStart:mEnd] # tinh toan ty le vung mieng mar= ty_le_mieng(mouth) # ve vung mieng
mouthHull = cv2.convexHull(mouth)
cv2.drawContours(frame, [mouthHull], -1, (0, 255, 0), 1)
# kiem tra ti le mat co nam duoi nguong hay khong # neu co thi cong bo dem them 1
if ear < eye_threshold: blink_couter += 1
67 # neu nham mat du so luong khung hinh da dat thi canh bao
if blink_couter >= eye_frame:
cv2.putText(frame, "NGU GAT!", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) pygame.mixer.music.play()
# neu ty le mat khong duoi nguong thi bo dem se bang 0 va # ngung canh bao
else:
blink_couter = 0
pygame.mixer.music.stop()
# kiem tra ty le mieng co tren nguong ngap hay khong # neu co thi cong bo dem them 1
if mar > yawn_threshold: yawn_couter += 1
# neu bo dem lon hon so lan da dat thi tinh la 1 lan ngap # neu so lan ngap tu 2 lan tro len se bat canh bao trong 2s if yawn_couter >= yawn:
cv2.putText(frame, "MAT TAP TRUNG", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) pygame.mixer.music.play()
68 # neu duoi nguong thi set bo dem ve 0
else:
yawn_couter =0
# hien thi cac ty le len khung hinh de tien cho viec kiem tra va sua loi cv2.putText(frame, "EAR: {:.3f}".format(ear), (300, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.putText(frame, "MAR: {:.2f}".format(mar), (300, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
# hien thi khung hinh
cv2.imshow("Frame", frame) # nhan "e" de thoat chuong trinh key = cv2.waitKey(10) & 0xFF if key == ord("e"):
break
# ngung thu video va dong tat ca cua so cv2.destroyAllWindows()