โปรแกรมตรวจจับการหลับตา Closed eye Detection

ผู้เขียน นาย ธนภัทร สงเหมือน CoE#063

คณะวิศวกรรมศาสตร์ สาขาวิศวกรรมคอมพิวเตอร์

วิชา:04-513-201 การโปรแกรมคอมพิวเตอร์ขั้นสูง 1/2566

1.ความเป็นมา

เนื่องจากการใช้รถใช้ถนนในประเทศไทยมีเหตุการอุบัติเหตุเกิดขึ้นบ่อยครั้ง และเหตุหารที่ทำให้เป็นสาเหตุในการเกิดคือการหลับในขณะขับรถ เพื่อป้องกันและลดโอกาสที่ผู้ขับขี่จะหลับขณะขับรถจึงทำให้สร้างระบบตรวจจับการหลับตา(Closed Eye Detection) เป็นระบบตรวจจับการหลับตาโดยจะมีกรอบขึ้นอยู่บริเวณดวงตา และจะตรวจจับการหลับตาโดยการคำนวนโดยอัตโนมัติ และหากมีหารหลับตาระบบจะมีการข้อมความแจ้งเตือนละเพื่อจะช่วยลดอัตราการเกิดอุบัติเหตุจากการเผลอหลับขณะขับรถมากขึ้น

  ระบบการตรวจจับการหลับตาหรือ Closed Eye Detection นี้สร้างขึ้นมาเพื่อแก้ปัญหาดังกล่าวที่ได้กล่าวมาแล้วข้างต้น สามารถที่จะช่วยลดจำนวนการเกิดอุบัติเหตุ เป็นการตรวจจับด้วยระบบเพื่อความสะดวก และรวดเร็วในการตรวจจับเพื่อจะได้มีการแจ้งเตือนรวดเร็วที่สุด

2.วัตถุประสงค์

   1.เพื่อตรวจจับและแจ้งเตือนหากมีการหลับตาขณะขับรถ

   2.เพื่อป้องกันและลดอัตราการเกิดอุบัตเหตุจากการขับขี่

   3.เพื่อนําเทคนิคการประมวลผลภาพมาประยุกต์ใช้งานด้านความปลอดภัยในการขับขี่

4.เพื่อนำความรู้การเขียนโปรแกรมภาษา python ไปประยุกต์ได้จริง

3.ขอบเขต

  1.โปรแกรมสามารถตรวจจับการหลับตา-ลืมตาได้

  2.สามารถคำนวนและวิเคราะห์การหลับตาโดยมีการแจ้งเตือนได้

3.โปรแกรมสามารถรับเข้าข้อมูลที่เป็นวิดีโอได้

4.โปรแกรมพัฒนาด้วย python

4.ประโยชน์ที่คาดว่าจะได้รับ

1.สามารถใช้โปรแกรมเพื่อลดอุบัติเหตุจากการหลับขณะขับรถ

2.สามารถนำความรู้ด้านpython มาใช้ประโยชน์ได้จริง

3.สามารถที่จะนำระบบไปต่อยอดหรือประยุกต์ในการพัฒนาต่อได้

5.ความรู้ที่เกี่ยวข้อง

จุดตรวจจับบนใบหน้าของ dlib

Python คือ

Python เป็นภาษาการเขียนโปรแกรมที่ใช้อย่างแพร่หลายในเว็บแอปพลิเคชัน การพัฒนาซอฟต์แวร์ วิทยาศาสตร์ข้อมูล และแมชชีนเลิร์นนิง (ML) นักพัฒนาส่วนใหญ่ใช้ Python เนื่องจากมีประสิทธิภาพ เรียนรู้ง่าย และสามารถทำงานบนแพลตฟอร์มต่างๆ ได้มากมาย ทั้งนี้ซอฟต์แวร์ Python สามารถดาวน์โหลดได้ฟรี ผสานการทำงานร่วมกับระบบทุกประเภท และเพิ่มความเร็วในการพัฒนา

การใช้งาน Python

ภาษา Python มีกรณีการใช้งานหลายอย่างในการพัฒนาแอปพลิเคชัน ซึ่งรวมถึงตัวอย่างดังต่อไปนี้

การพัฒนาเว็บฝั่งเซิร์ฟเวอร์

การพัฒนาเว็บฝั่งเซิร์ฟเวอร์ประกอบด้วยฟังก์ชันแบ็คเอนด์ที่ซับซ้อนซึ่งเว็บไซต์ดำเนินการเพื่อแสดงข้อมูลต่อผู้ใช้ ตัวอย่างเช่น เว็บไซต์ต้องโต้ตอบกับฐานข้อมูล สื่อสารกับเว็บไซต์อื่น และปกป้องข้อมูลเมื่อส่งข้อมูลผ่านเครือข่าย 

Python มีประโยชน์สำหรับการเขียนโค้ดฝั่งเซิร์ฟเวอร์ เนื่องจากมีไลบรารีจำนวนมากที่ประกอบด้วยโค้ดที่เขียนไว้ล่วงหน้าสำหรับฟังก์ชันแบ็คเอนด์ที่ซับซ้อน นักพัฒนายังใช้เฟรมเวิร์ก Python ที่หลากหลายซึ่งมีเครื่องมือที่จำเป็นทั้งหมดเพื่อสร้างเว็บแอปพลิเคชันได้เร็วขึ้นและง่ายขึ้นอีกด้วย ตัวอย่างเช่น นักพัฒนาสามารถสร้างโครงสร้างเว็บแอปพลิเคชันได้ภายในไม่กี่วินาที เนื่องจากไม่จำเป็นต้องเขียนขึ้นใหม่ทั้งหมด จากนั้นนักพัฒนาสามารถทดสอบได้โดยใช้เครื่องมือทดสอบของเฟรมเวิร์ก โดยไม่ต้องพึ่งพาเครื่องมือทดสอบภายนอก

ระบบอัตโนมัติด้วยสคริปต์ Python

ภาษาการเขียนสคริปต์คือภาษาการเขียนโปรแกรมที่ทำให้งานที่มนุษย์ทำตามปกติเป็นไปโดยอัตโนมัติ โปรแกรมเมอร์จึงใช้สคริปต์ Python อย่างแพร่หลายเพื่อทำให้งานประจำวันหลายอย่างเป็นไปโดยอัตโนมัติ เช่น

  • การเปลี่ยนชื่อไฟล์จำนวนมากพร้อมกัน
  • การแปลงไฟล์เป็นไฟล์ประเภทอื่น
  • การลบคำที่ซ้ำกันในไฟล์ข้อความ
  • การดำเนินการทางคณิตศาสตร์ขั้นพื้นฐาน
  • การส่งข้อความอีเมล
  • การดาวน์โหลดเนื้อหา
  • การดำเนินการวิเคราะห์บันทึกพื้นฐาน
  • การค้นหาข้อผิดพลาดในหลายไฟล์

คุณสมบัติ Python

คุณสมบัติต่อไปนี้ทำให้ภาษาการเขียนโปรแกรม Python มีเอกลักษณ์ที่ไม่เหมือนใคร

ภาษาที่แปลผลแล้ว

Python เป็นภาษาที่แปลผลแล้ว ซึ่งหมายความว่าสามารถเรียกใช้โค้ดทีละบรรทัดได้โดยตรง หากมีข้อผิดพลาดในโค้ดโปรแกรม ก็จะหยุดทำงานทันที ดังนั้นโปรแกรมเมอร์จึงสามารถค้นหาข้อผิดพลาดในโค้ดได้อย่างรวดเร็ว

ภาษาที่ใช้งานง่าย

Python ใช้คำที่เหมือนในภาษาอังกฤษ ซึ่งแตกต่างจากภาษาการเขียนโปรแกรมอื่นๆ เนื่องจาก Python ไม่ใช้วงเล็บปีกกา แต่จะใช้การเยื้องแทน 

ภาษาที่ระบุประเภทแบบไดนามิก

โปรแกรมเมอร์ไม่ต้องระบุประเภทตัวแปรเมื่อเขียนโค้ดเนื่องจาก Python จะกำหนดไว้ที่รันไทม์ ด้วยเหตุนี้ คุณจึงสามารถเขียนโปรแกรม Python ได้รวดเร็วขึ้น

ภาษาระดับสูง

Python มีความใกล้เคียงกับภาษามนุษย์มากกว่าภาษาการเขียนโปรแกรมอื่นๆ ดังนั้นโปรแกรมเมอร์จึงไม่ต้องกังวลกับฟังก์ชันการทำงานพื้นฐานต่างๆ เช่น สถาปัตยกรรมและการจัดการหน่วยความจำ

ภาษาเชิงอ็อบเจกต์

Python ถือว่าทุกสิ่งเป็นอ็อบเจกต์ แต่ก็ยังรองรับการเขียนโปรแกรมประเภทอื่นๆ ด้วย เช่น การเขียนโปรแกรมเชิงโครงสร้างและเชิงฟังก์ชัน

ไลบรารี Python

ไลบรารีคือชุดของโค้ดที่ใช้บ่อยซึ่งนักพัฒนาสามารถใช้ในโปรแกรม Python เพื่อหลีกเลี่ยงการเขียนโค้ดขึ้นใหม่ทั้งหมด ตามค่าเริ่มต้นแล้ว Python จะมาพร้อมกับไลบรารีมาตรฐาน ซึ่งมีฟังก์ชันที่นำกลับมาใช้ใหม่ได้มากมาย นอกจากนี้ยังมีไลบรารี Python มากกว่า 137,000 รายการสำหรับการประยุกต์ใช้ต่างๆ รวมถึงการพัฒนาเว็บ วิทยาศาสตร์ข้อมูล และแมชชีนเลิร์นนิง (ML)

OpenCV

OpenCV (Open source Computer Vision) เป็นไลบรารีฟังก์ชันการเขียนโปรแกรม (Library of Programming Functions) โดยส่วนใหญ่จะมุ่งเป้าไปที่การแสดงผลด้วยคอมพิวเตอร์แบบเรียลไทม์ (Real-Time Computer Vision) เดิมทีแล้วถูกพัฒนาโดย Intel แต่ภายหลังได้รับการสนับสนุนโดย Willow Garage ตามมาด้วย Itseez (ซึ่งต่อมาถูกเข้าซื้อโดย Intel) OpenCV เป็นไลบรารีแบบข้ามแพลตฟอร์ม (Cross-Platform) และใช้งานได้ฟรีภายใต้ลิขสิทธิ์ของ BSD แบบโอเพ่นซอร์ส (Open-Source BSD License)

OpenCV ยังสนับสนุนเฟรมเวิร์กการเรียนรู้เชิงลึก (Deep Learning Frameworks) ได้แก่ TensorFlow, Torch/PyTorch และ Caffe

การใช้ประโยชน์

ตัวอย่างการประยุกต์ใช้งาน OpenCV มีดังนี้

  • ชุดเครื่องมือคุณลักษณะ 2 มิติและ 3 มิติ (2D and 3D feature toolkits)
  • การประมาณระยะในขณะเคลื่อนที่ (Egomotion Estimation)
  • ระบบรู้จำใบหน้า (Facial recognition system)
  • การจดจำท่าทาง (Gesture recognition)
  • ปฏิสัมพันธ์ระหว่างมนุษย์และคอมพิวเตอร์ (Human-Computer interaction; HCI)

OpenCV ถูกเขียนขึ้นด้วยภาษา C++ มีการรองรับ Python, Java และ MATLAB/OCTAVE — API

Scipy

imutils

imutils เป็น library เบื้องต้นของ image processing พวกหมุนภาพ กลับภาพ ปรับขนาด

pip

pip คือตัวติดตั้ง packages เสริมใน python ซึ่ง packages เสริมพวกนี้จะมีคนสร้างไว้อยู่แล้วใน pypi.org ซึ่งสามารถนำมาใช้กับโปรเจคได้โดยติดตั้ง packages ต่าง ๆ ผ่าน pip อย่างแรกก่อนที่จะติดตั้ง packages เสริมเราต้องมี pip ก่อน

ติดตั้ง pip

ในตัวของ python นั้นไม่ได้มี pip ติดมาด้วยเราต้องทำการติดตั้งมันขึ้นมาเองแต่ถ้าเราใช้ anaconda มันจะมีมาให้อยู่แล้ว สำหรับการลง pip นั้นสามารถลงได้หลายวิธีสำหรับวิธีที่จะใช้ก็เป็นเพียงแค่ส่วนหนึ่ง

ขั้นตอนแรกเราต้อง Dowload ไฟล์ get-pip จากhttps://bootstrap.pypa.io/get-pip.py

ถ้าขึ้นเป็นเว็บมาก็สามารถคลิกขวาแล้วบันทึกไฟล์ (Ctrl + s) ได้เลย

เมื่อ Dowload เสร็จแล้ว ให้เข้าไปที่โฟลเดอร์ดาวน์โหลดและเปิด cmd ขึ้นมาสั่ง python get-pip.py

สำหรับ mac มักจะมี python ติดมาอยู่กับเครื่องแล้วต้องใช้ sudo ด้วย sudo python get-pip.py

แต่ถ้ามี easy_install ก็สามารถใช้ได้sudo easy_install pip

สำหรับ Linux จะใช้ apt-get หรือ yum ในการติดตั้งเอง sudo apt-get install python3-pip
sudo yum install python3-pip

apt-get จะใช้ ubuntu, debian
yum ก็จะใช้ centOS, fedora

Upgrade pip

สำหรับคนที่มี pip อยู่แล้วแต่อาจจะยังไม่เวอร์ชั่นล่าสุดก็สามารถที่จะ upgrade มันได้เหมือนกันโดยใช้คำสั่ง

Linux หรือ macOSpip install -U pip

Windowspython -m pip install -U pip

การติดตั้ง packages

เราจะใช้ pip ในการติดตั้ง packages ของ Python โดยคำสั่งคือ pip install [ชื่อ packages]

นี้คือคำสั่งในการติดตั้ง packages ซึ่งถ้าเราต้องการติดตั้ง packages ชื่อว่า numpypip install numpy

แค่นี้ก็ได้ packages มาใช้งานได้แล้วแต่การ install แบบนี้มันจะเอา เวอร์ชั่นล่าสุดของ packages เรามาถ้าเราต้องการเวอร์ชั่นที่เก่ากว่านี้ก็สามารถกำหนดได้เหมือนกัน pip install numpy = 1.16.0

แต่ถ้าเราต้องการอัพเดทเวอร์ชั่นละทำอย่างไรเราสามารถใช้คำสั่ง install ได้เหมือนกันแค่เพิ่ม -U ไปเท่านั้น packages ก็จะอัพเดทเวอร์ชั่นใหม่ให้แล้ว pip install -U numpy

เราสามารถลง packages พร้อมกันหลายๆตัวได้โดยแค่พิมพ์ต่อๆกันไป เช่น pip install numpy pygal pycparser

เมื่อเราลง packages ที่ต้องการเสร็จแล้วเราสามารถเรียกดู packages ทั้งหมดที่เราติดตั้งไปได้ด้วยคำสั่ง listpip list

packages ทั้งหมดก็จะแสดงดังรูป

เราสามารถเรียกดู packages ทั้งหมดได้อีกคำสั่งคือคำสั่ง freezepip freeze

จะได้รูปแบบตามนี้

เราจะเห็นว่าในแต่ละโปรเจคบางครั้งเราติดตั้ง packages ไว้เยอะมาก ถ้าจะให้มานั้งพิมพ์ลงใหม่ทั้งหมดคงไม่ไหว pip เองก็มีวิธีลง packages แบบเป็นไฟล์เหมือนกันโดยให้เราสร้างไฟล์ที่เป็น .txt โดยใช้คำสั่งpip freeze > (ชื่อไฟล์).txt

แค่นี้ก็จะได้ไฟล์ .txt ที่บันทึก packages ของเราทั้งหมดไว้แล้ว

ถ้าเราจะต้องไปลงเครื่องอื่น แค่ดาวโหลดไฟล์ .txt ที่เราบันทึก packages ที่เราต้องการไว้แล้วก็สามารถลงได้แล้วครับ โดยใช้คำสั่งpip install -r (ชื่อไฟล์).txt

การลบ packages

คำสั่งลบ packages ของ pip นั้นคือ uninstallpip uninstall [ชื่อ packages]

ในทุกการลบระบบจะถามทุกรอบว่าต้องการจะลบจริงๆไหม เช่น

ถ้าเราจะลบก็ต้องพิมพ์ y แต่ถ้าเราไม่ต้องการให้มันถามแบบนี้เวลาเราลบก็ทำได้เหมือนกันครับแค่เพิ่มคำสั่งนิดหน่อยpip uninstall -y [ชื่อ packages]

แค่นี้ระบบก็ไม่ถามแล้ว และมันจะลบให้เลย ซึ่งเราต้องมั่นใจจริงๆว่าเราไม่ใช้ packages นี้ และแล้วต้องการลบมันจริงๆ

แล้วเราก็สามารถลบ packages พร้อมกันหลายๆตัวได้เหมือนกันpip uninstall [ชื่อ packages] [ชื่อ packages] [ชื่อ packages]

เรายังสามารถลบ packages โดยใช้ไฟล์ .txt ได้เหมือนกันครับโดยสั่งว่า pip uninstall -r (ชื่อไฟล์).txt

หรือไม่ต้องการตอบ y ตลอดก็ใช้pip uninstall -y -r (ชื่อไฟล์).txt

ดูรายระเอียดแต่ละ packages

เราสามารถดูรายละเอียดของแต่ละ packages ได้โดยใช้คำสั่งpip show [ชื่อ packages]

มันก็จะโชว์รายระเอียดของ packages ทั้งหมดให้เรา

6. ผลการดำเนินการ

หน้าต่างโปรแกรม Code ระบบตรวจจับการหลับตา

import pygame
from scipy.spatial import distance
from imutils import face_utils
import imutils
import dlib
import cv2
from datetime import datetime

pygame.mixer.init()
alert_sound = pygame.mixer.Sound("C:/project st/ClosedEye_Detection/111.mp3")

def eye_aspect_ratio(eye):
    A = distance.euclidean(eye[1], eye[5])
    B = distance.euclidean(eye[2], eye[4])
    C = distance.euclidean(eye[0], eye[3])
    ear = (A + B) / (2.0 * C)
    return ear

thresh = 0.25
frame_check = 20
detect = dlib.get_frontal_face_detector()
predict = dlib.shape_predictor("models/shape_predictor_68_face_landmarks.dat")

(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_68_IDXS["left_eye"]
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_68_IDXS["right_eye"]

cap = cv2.VideoCapture(0)
flag = 0
sound_playing = False

while True:
    ret, frame = cap.read()
    frame = imutils.resize(frame, width=450)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    subjects = detect(gray, 0)

    current_time = datetime.now().strftime("%H:%M:%S")

    for subject in subjects:
        shape = predict(gray, subject)
        shape = face_utils.shape_to_np(shape)
        leftEye = shape[lStart:lEnd]
        rightEye = shape[rStart:rEnd]
        leftEAR = eye_aspect_ratio(leftEye)
        rightEAR = eye_aspect_ratio(rightEye)
        ear = (leftEAR + rightEAR) / 2.0
        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)

        if ear < thresh:
            flag += 1
            if flag >= frame_check and not sound_playing:
                alert_sound.play()  # เล่นเสียงแจ้งเตือน
                sound_playing = True
                cv2.putText(frame, "****************ALERT!****************", (10, 30),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
                cv2.putText(frame, "*******wake up wake up wake up*******", (10, 325),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
                #print ("Drowsy")
        else:
            flag = 0
            sound_playing = False

    cv2.putText(frame, f"Time: {current_time}", (10, 60),
                cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2)

    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break

cv2.destroyAllWindows()
cap.release()

***********************************************************************

อธิบายการทำงานของโค้ด

import pygame
from scipy.spatial import distance
from imutils import face_utils
import imutils
import dlib
import cv2
from datetime import datetime

นำเข้าไลบรารีที่จำเป็นสำหรับสคริปต์นี้
pygame: ไลบรารีสำหรับจัดการเสียง
distance จาก scipy.spatial: ใช้สำหรับคำนวณระยะห่างระหว่างจุด
face_utils จาก imutils: มีฟังก์ชันที่ช่วยในการทำงานกับจุดสำคัญในใบหน้า
imutils: มีฟังก์ชันที่ทำให้ใช้ OpenCV ง่ายขึ้น
dlib: ใช้สำหรับตรวจจับใบหน้าและทำนายจุดสำคัญในใบหน้า
cv2: OpenCV สำหรับประมวลผลภาพ
datetime: สำหรับการทำงานกับวันที่และเวลา
pygame.mixer.init()
alert_sound = pygame.mixer.Sound("C:/project st/ClosedEye_Detection/111.mp3")

กำหนดการเริ่มต้นสำหรับ mixer ของ pygame และโหลดไฟล์เสียงที่จะใช้เตือน
def eye_aspect_ratio(eye):
    A = distance.euclidean(eye[1], eye[5])
    B = distance.euclidean(eye[2], eye[4])
    C = distance.euclidean(eye[0], eye[3])
    ear = (A + B) / (2.0 * C)
    return ear

กำหนดฟังก์ชัน eye_aspect_ratio ที่คำนวณอัตราส่วนของตาขึ้นอยู่กับระยะห่างระหว่างจุดที่กำหนด
thresh = 0.25
frame_check = 20

กำหนดค่าเกณฑ์และจำนวนเฟรมที่ต้องตรวจสอบ เพื่อกำหนดว่าต้องมีการปิดตาในเฟรมนั้นๆ กี่ครั้ง
detect = dlib.get_frontal_face_detector()
predict = dlib.shape_predictor("models/shape_predictor_68_face_landmarks.dat")

ทำการเริ่มต้นตัวตรวจจับใบหน้าและทำนายจุดสำคัญในใบหน้า โดยใช้โมเดลที่ฝึกไว้ล่วงหน้า
(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_68_IDXS["left_eye"]
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_68_IDXS["right_eye"]

กำหนดดัชนีสำหรับตาซ้ายและตาขวาโดยใช้ตำแหน่งที่ได้จาก 68 จุดสำคัญในใบหน้า
cap = cv2.VideoCapture(0)
flag = 0
sound_playing = False

เริ่มต้นการจับวิดีโอจากกล้องและกำหนดค่าในการตรวจสอบสถานะการปิดตา
while True:
    ret, frame = cap.read()
    frame = imutils.resize(frame, width=450)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    subjects = detect(gray, 0)
    current_time = datetime.now().strftime("%H:%M:%S")

เข้าสู่ลูปเพื่อดำเนินการจับเฟรมจากกล้องอย่างต่อเนื่อง ปรับขนาดภาพลงเพื่อให้ง่ายต่อการประมวลผล แปลงสีเป็นภาพขาวดำ และตรวจจับใบหน้าในเฟรม
for subject in subjects:
    shape = predict(gray, subject)
    shape = face_utils.shape_to_np(shape)
    leftEye = shape[lStart:lEnd]
    rightEye = shape[rStart:rEnd]
    leftEAR = eye_aspect_ratio(leftEye)
    rightEAR = eye_aspect_ratio(rightEye)
    ear = (leftEAR + rightEAR) / 2.0
    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)

    if ear < thresh:
        flag += 1
        if flag >= frame_check and not sound_playing:
            alert_sound.play()
            sound_playing = True
            cv2.putText(frame, "****************ALERT!****************", (10, 30),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
            cv2.putText(frame, "*******wake up wake up wake up*******", (10, 325),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
    else:
        flag = 0
        sound_playing = False

ประมวลผลทุกรายการในการตรวจจับใบหน้า
คำนวณอัตราส่วนของตาทั้งสองข้างและตรวจสอบว่ามีการปิดตาหรือไม่
หากตาปิดเป็นเวลานานเกินไปจะเล่นเสียงแจ้งเตือนและแสดงข้อความเตือนบนภาพ
cv2.putText(frame, f"Time: {current_time}", (10, 60),
            cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2)

cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
    break

แสดงเวลาปัจจุบันบนภาพ
แสดงเฟรมที่ประมวลผล
รอรับคีย์ 'q' เพื่อออกจากลูป
cv2.destroyAllWindows()
cap.release()

ปิดหน้าต่างทั้งหมดของ OpenCV และปล่อยวิดีโอ

วิธีการตรวจจับการหลับตา

ตาแต่ละข้างจะแสดงด้วยพิกัด 6 (x, y) โดยเริ่มจากมุมซ้ายของดวงตา (ราวกับว่าคุณกำลังมองบุคคลนั้น) จากนั้นจึงทำงานรอบดวงตาตามเข็มนาฬิกา

โดยจะตรวจสอบ 20 เฟรมติดต่อกัน และหากอัตราส่วน Eye Aspect น้อยกว่า 0.25 ระบบจะสร้างการแจ้งเตือน

หน้าต่างขณะใช้โปรแกรม

link สำหรับการนำเสนอ

https://youtu.be/siF3BVNql7I

7. ข้อเสนอแนะ

จากผลการดำเนินงาน จะเห็นได้ว่าโดยรวมของโปรแกรมถือว่ามีความแม่นยำไม่มากนัก เนื่องจากบางพื้นที่และบางมุมยังไม่สามารถจับได้ และบางช่วงยังมีค้างอยู่บ้าง เพื่อให้ระบบสามารถใช้งานได้อย่างหลากหลาย ยังต้องมีการพัฒนาระบบอยู่อีกมาก เพื่อให้ระบบสามารถใช้งาน ควรนำวิธีที่ใช้การประมวลผลค่อนข้างสูง นำไปพัฒนาด้วยโปรแกรมที่มีการประมวลผลที่รวดเร็ว เช่น โปรแกรมด้วยภาษาซี เพื่อให้สามารถคำนวณและแสดงผลการตรวจจับการหลับตาทำงานได้อย่างแม่นยำและมีประสิทภาพมากขึ้น

8. ข้อมูลอ้างอิง

ติดตั้ง Library ใน python
https://www.youtube.com/watch?v=iNmrsrwjzvE

การใช้ pip ติดตั้ง packages ใน python

https://stackpython.medium.com/%E0%B9%83%E0%B8%8A%E0%B9%89-pip-%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B8%B1%E0%B9%89%E0%B8%87-packages-%E0%B9%83%E0%B8%99-python-8a466590a682

open cv

https://medium.com/@nnatchunn/opencv-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-8771e2a4c414

scipy

https://python3.wannaphong.com/2014/10/scipy.html

code program ต้นแบบ

https://github.com/akshaybahadur21/Drowsiness_Detection

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *