เรื่อง drowsiness detection with opencv จัดทำโดย

16
เรื ่อง Drowsiness detection with OpenCV จัดทำโดย นายพงศธร เนตรแสงศรี 59011211093 นายศิริพงค์ กอบัว 59011211124 นายศิวาเมษฐ์ เสริมทรัพย์ 59011211126 นายสุทธิพงษ์ นนตรี 59011211133 เสนอ ผศ.โอฬริก สุรินต๊ะ รยวิช Digital Image Processing ภคกรศึกษที่ 2 ปีกรศึกษ 2562 คณะวิทยกรสรสนเทศ มหวิทยลัยมหสรคม

Upload: others

Post on 10-Apr-2022

21 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

เรอง Drowsiness detection with OpenCV

จดทำ�โดยนายพงศธร เนตรแสงศร 59011211093นายศรพงค กอบว 59011211124นายศวาเมษฐ เสรมทรพย 59011211126นายสทธพงษ นนตร 59011211133

เสนอผศ.โอฬ�รก สรนตะ

ร�ยวช� Digital Image Processingภ�คก�รศกษ�ท 2 ปก�รศกษ� 2562

คณะวทย�ก�รส�รสนเทศ มห�วทย�ลยมห�ส�รค�ม

Page 2: เรื่อง Drowsiness detection with OpenCV จัดทำโดย
Page 3: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

Library ทจำ�เปนตอก�รใชง�นimport cv2import imutilsimport dlibimport scipyimport winsound

อธบ�ยโคด

import lib ตางๆเขามาใหครบ

คำานวน aspect ratio ของระยะทางระหวาง landmarks ตาแนวตงกบ ระยะทางระหวาง landmarks ตาแนวนอนคาท return ของ aspect

Page 4: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

ratio ของสายตาจะคงทเมอบคคลยงลมตา และคาจะลดลงอยางรวดเรวถง 0 ในระหวางทบคคลกระพรบตาบรรทดท 11 และ 12 คำานวณระยะทางของ euclidean ระหวาง 2 set ของพกดตาแนวตงท landmark(x,y) บรรทดท 14 คำานวณระยะทางของ euclidean ระหวางแนวนอนของจดพกดตาท landmark(x,y) บรรทดท 17 คำานวน aspect ratio ของสายตา บรรทดท 19 return คา aspect ratio ของสายตา

บรรทดท 22 หาก aspect ratio ของสายตาตำากวาเกณฑจะเรมนบ frame ทบคคลนนหลบตา บรรทดท 23 หากจำานวน frame ทบคคลหลบตาเกน frame_check จะทำาการแจงเตอน บรรทดท 25 กำาหนด detect เพอรบคาจากการตรวจจบใบหนาของ dlib โดยใชพนฐานของ HOG บรรทดท 27 นำาเขาตวทำานาย facial landmark

Page 5: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

ดงคาจากจด mark บนใบหนาทเราตองการ ในทนเราตองการคาจาก ตาขางซาย และ ตาขางขวาเรากเพยงใสคา array ทถกตองเพอดงตำาแหนงบนใบหนาทเราตองการออกมาบรรทดท 29 return ตำาแหนงจด mark ของจดเรมตนของตาขางซาย และจดสนสดของตาขางซาย บรรทดท 30 return ตำาแหนงจด mark ของจดเรมตนของตาขางขวา และจดสนสดของตาขางขวา บรรทดท 33 ประเภท input ทรบเขามา 0 คอ built webcam สวน 1 คอ external webcam

บรรทดท 36 กำาหนดตวเรมตนทนบ frame และใชเปนคาในการเชคในการแจงเตอน บรรทดท 39 ปรบขนาดความกวางของ frame เทากบ 450 px บรรทดท 40 แปลงภาพจาก frame ใหกลายเปนสเทา บรรทดท 41 ใชตวตรวจจบใบหนาของ dlib เพอคนหาใบหนาในภาพทแปลงมาเปนสเทา

Page 6: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

บรรทดท 44 ใบหนาทตรวจพบใชเครองมอจรวจบ landmark ใบหนาของ dlib บรรทดท 45 แปลงผลลพธเปน numpy อารเรย บรรทดท 47,48 ใช numpy array แยกพกด (x,y) ของตาซายและตาขวา บรรทดท 50,51 และคำานวน aspect ratio ของสายตาทงสองขาง บรรทดท 52 Soukupová and Čech แนะนำาให เฉลย aspect ratio ของสายตาทงสองขาง เพอใหไดการประมาณทดขน บรรทดท 54,55 คำานวนขอบตาซายและขอบตาขวา บรรทดท 57,58 ใชฟงกชน cv2.drawContours วาดขอบตาแตละสองขางลงใน frame ตรวจสอบเพอดวา aspect ratio ตำากวาคา thresh หรอไม บรรทดท 61 ถาเปนเชนนนแลวใหเพมคา flag ขนเรอยๆอยางตอเนองในขณะทบคคลนนกำาลงหลบตา

Page 7: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

บรรทดท 62 หากคา flag มคาเกนกวาคา frame_check ทเราตงไวจะถอวาบคคลนนกำาลงจะหลบ บรรทดท 63-66 แสดงขอความแจงเตอนไปทหนาจอเพอเตอนคนขบ บรรทดท 67 สงเสยงแจงเตอนบรรทดท 69 ถาไมเขาเงอนไขขางตนกให flag = 0 เพอเรมนบ frame ใหม

บรรทดท 71 แสดง frame บรรทดท 74 ตรวจสอบ ถาผใชกด q ใหออกจากโปรแกรม

ผลลพธ

Page 8: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

รปภ�พประกอบท 1 โปรแกรมทำ�ก�รตรวจจบจด mark บนใบหน� โดยในทนเลอกม�เฉพ�ะต�ด�นซ�ยและด�นขว�

รปภ�พประกอบท 2 โปรแกรมทำ�ก�รตรวจจบจด mark บนใบหน� โดยในทนเลอกม�เฉพ�ะต�ด�นซ�ยและด�นขว�

Page 9: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

รปภ�พประกอบท 3 จำ�ลองหลบต�ขณะขบรถ ซงโปรแกรมจะทำ�ก�รนบframe ตอนหลบต�

รปภ�พประกอบท 4 เมอเร�หลบต�เกนกว� frame ทเร�ตงไวโปรแกรมจะทำ�ก�รแจงเตอน และสงเสยงรองออกม�

Page 10: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

รปภ�พประกอบท 5 เมอเร�หลบต�เกนกว� frame ทเร�ตงไวโปรแกรมจะทำ�ก�รแจงเตอน และสงเสยงรองออกม�

คำ�ถ�มจ�กอ�จ�รย1.DLIB 68 Landmark

Page 11: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

Facial landmark indexes ของใบหนา ตว detect ของ Facial landmark ทำางานรวมกบ Dlib 68 (x,y) -coordinates จด landmark ทง68 จดเหลานไดรบการ training สำาหรบการทำานายดวย iBUG 300-W dataset. จากภาพดานบนเราสามารถเหนพกดทง 68 จดบนใบหนา

จากการภาพจด landmark ใบหนาทง 68 จดเราจะสามารถเขาถงไดอยางงายดวย index

สามารถเขาถงตำาแหนงของปากไดดวย points [48, 68]. สามารถเขาถงตำาแหนงของควขวาไดดวย points [17, 22]. สามารถเขาถงตำาแหนงของควซายไดดวย points [22, 27]. สามารถเขาถงตำาแหนงของตาขวาไดดวย points [36, 42]. สามารถเขาถงตำาแหนงของตาซายไดดวย points [42, 48]. สามารถเขาถงตำาแหนงของจมกไดดวย points [27, 35]. สามารถเขาถงตำาแหนงของกรามไดดวย points [0, 17]

Page 12: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

2.shape = predict(gray, subject) คา shape คออะไร

เมอทำาการ Print ขอมลออกมาดจะได shape: <dlib.full_object_detection object at 0x0000029654F0B1F0>dlib.full_object_detection คอ ทตงของวตถในภาพกบตำาแหนงของแตละสวนทเปนสวนประกอบpart(self: dlib.full_object_detection, idx: int) → dlib.point

Page 13: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

3.leftEyeHull = cv2.convexHull(leftEye) คา convexHull คออะไร

ฟงกชน convexHull ทำาการคนหา convex hull ของ 2D point

set โดยใชอลกอลทมของ Sklansky สรปไดวา Convex Hull ของ shape หรอ กลมของ point เปนขอบร

อบๆ points หรอ shape นนเอง

Page 14: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

Source Code1. from scipy.spatial import distance 2. from imutils import face_utils 3. import imutils 4. import dlib 5. import cv2 6. import winsound 7.

8. # คำ�นวน aspect ratio ของระยะท�งระหว�ง landmarks ต�แนวตงกบ ระยะท�งระหว�ง landmarks ต�แนวนอน

9. # ค�ท return ของ aspect ratio ของส�ยต�จะคงทเมอบคคลยงลมต� และค�จะลดลงอย�งรวดเรวถง 0 ในระหว�งทบคคลกระพรบต�

10. def eye_aspect_ratio(eye):

11. # คำ�นวณระยะท�งของ euclidean ระหว�ง 2 set ของพกดต�แนวตงท landmark(x,y) 12. A = distance.euclidean(eye[1], eye[5]) 13. B = distance.euclidean(eye[2], eye[4]) 14.

15. # คำ�นวณระยะท�งของ euclidean ระหว�งแนวนอนของจดพกดต�ท landmark(x,y) 16. C = distance.euclidean(eye[0], eye[3]) 17.

18. # คำ�นวน aspect ratio ของส�ยต� 19. ear = (A + B) / (2.0 * C)

20. # return ค� aspect ratio ของส�ยต� 21. return ear 22.

23. # ห�ก aspect ratio ของส�ยต�ตำ�กว�เกณฑจะเรมนบ frame ทบคคลนนหลบต� 24. thresh = 0.3

25. # ห�กจำ�นวน frame ทบคคลหลบต�เกน frame_check จะทำ�ก�รแจงเตอน

26. frame_check = 48

27. # กำ�หนด detect เพอรบค�จ�กก�รตรวจจบใบหน�ของ dlib โดยใชพนฐ�นของ HOG 28. detect = dlib.get_frontal_face_detector() 29.

30. # นำ�เข�ตวทำ�น�ย facial landmark 31. predict = dlib.shape_predictor("C:\\Users\\aitms\\Downloads\\

Drowsiness_Detection-master\\Drowsiness_Detection-master\\shape_predictor_68_face_landmarks.dat")# Dat file is the crux of the code

32. 33.

34. # ดงค�จ�กจด mark บนใบหน�ทเร�ตองก�ร ในทน เร�ตองก�รค�จ�ก ต�ข�งซ�ย และ ต�ข�งขว� 35. # เร�กเพยงใสค� array ทถกตองเพอดงตำ�แหนงบนใบหน�ทเร�ตองก�รออกม� 36.

37. # return ตำ�แหนงจด mark ของจดเรมตนของต�ข�งซ�ย และจดสนสดของต�ข�งซ�ย

38. (lStart, lEnd) = face_utils.FACIAL_LANDMARKS_68_IDXS["left_eye"]

39. # return ตำ�แหนงจด mark ของจดเรมตนของต�ข�งขว� และจดสนสดของต�ข�งขว� 40. (rStart, rEnd) = face_utils.FACIAL_LANDMARKS_68_IDXS["right_eye"] 41.

42. # ประเภท input ทรบเข�ม� 0 คอ built webcam สวน 1 คอ external webcam 43. cap=cv2.VideoCapture(1) 44.

Page 15: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

45. # กำ�หนดตวเรมตนทนบ frame และใชเปนค�ในก�รเชคในก�รแจงเตอน

46. flag=0 47. while True: 48. ret, frame=cap.read()

49. # ปรบขน�ดคว�มกว�งของ frame เท�กบ 450 px 50. frame = imutils.resize(frame, width=450)

51. # แปลงภ�พจ�ก frame ใหกล�ยเปนสเท� 52. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

53. # ใชตวตรวจจบใบหน�ของ dlib เพอคนห�ใบหน�ในภ�พทแปลงม�เปนสเท� 54. subjects = detect(gray, 0) 55. 56. for subject in subjects:

57. # ใบหน�ทตรวจพบใชเครองมอจรวจบ landmark ใบหน�ของ dlib 58. shape = predict(gray, subject) 59. #print("-----------")

60. # แปลงผลลพธเปน numpy อ�รเรย

61. shape = face_utils.shape_to_np(shape)#converting to NumPy Array 62. print("shape: ",shape) 63.

64. # ใช numpy array แยกพกด (x,y) ของต�ซ�ยและต�ขว� 65. leftEye = shape[lStart:lEnd] 66. rightEye = shape[rStart:rEnd] 67.

68. # และคำ�นวน aspect ratio ของส�ยต�ทงสองข�ง

69. leftEAR = eye_aspect_ratio(leftEye) 70. rightEAR = eye_aspect_ratio(rightEye) 71.

72. # Soukupová and Čech แนะนำ�ให เฉลย aspect ratio ของส�ยต�ทงสองข�ง เพอใหไดก�รประม�ณทดขน

73. ear = (leftEAR + rightEAR) / 2.0 74. 75. print("Ear: ",ear) 76.

77. # คำ�นวนขอบต�ซ�ยและขอบต�ขว� 78. leftEyeHull = cv2.convexHull(leftEye) 79. rightEyeHull = cv2.convexHull(rightEye) 80.

81. # ใชฟงกชน cv2.drawContours ว�ดขอบต�แตละสองข�งลงใน frame 82. cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1) 83. cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1) 84.

85. # ตรวจสอบเพอดว� aspect ratio ตำ�กว�ค� thresh หรอไม

86. if ear < thresh:

87. # ถ�เปนเชนนนแลวใหเพมค� flag ขนเรอยๆอย�งตอเนองในขณะทบคคลนนกำ�ลงหลบต� 88. flag += 1 89. print (flag) 90.

91. # ห�กค� flag มค�เกนกว�ค� frame_check ทเร�ตงไวจะถอว�บคคลนนกำ�ลงจะหลบ

92. if flag >= frame_check:

93. # แสเงขอคว�มแจงเตอนไปทหน�จอเพอเตอนคนขบ

94. cv2.putText(frame, "****************ALERT!****************", (10, 30),

95. cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)

Page 16: เรื่อง Drowsiness detection with OpenCV จัดทำโดย

96. cv2.putText(frame, "****************ALERT!****************", (10,325),

97. cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) 98. #print ("Drowsy") 99. winsound.Beep(500,100) 100. else: 101. flag = 0

102. # แสดง frame 103. cv2.imshow("Frame", frame)

104. # ตรวจสอบ ถ�ผใชกด q ใหออกจ�กโปรแกรม

105. key = cv2.waitKey(1) & 0xFF 106. if key == ord("q"): 107. break 108. cv2.destroyAllWindows() 109. cap.stop()