疲劳检测-闭眼检测(详细代码教程)

这篇具有很好参考价值的文章主要介绍了疲劳检测-闭眼检测(详细代码教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

瞌睡经常发生在汽车行驶的过程中,该行为害人害己,如果有一套能识别瞌睡的系统,那么无疑该系统意义重大!

疲劳检测-闭眼检测(详细代码教程),疲劳检测,瞌睡检测,疲劳驾驶,闭眼检测

实现步骤

思路:疲劳驾驶的司机大部分都有打瞌睡的情形,所以我们根据驾驶员眼睛闭合的频率和时间来判断驾驶员是否疲劳驾驶(或嗜睡)。

详细实现步骤

【1】眼部关键点检测。

疲劳检测-闭眼检测(详细代码教程),疲劳检测,瞌睡检测,疲劳驾驶,闭眼检测

我们使用Face Mesh来检测眼部关键点,Face Mesh返回了468个人脸关键点:
由于我们专注于驾驶员睡意检测,在468个点中,我们只需要属于眼睛区域的标志点。眼睛区域有 32 个标志点(每个 16 个点)。为了计算 EAR,我们只需要 12 个点(每只眼睛 6 个点)。

以上图为参考,选取的12个地标点如下:

对于左眼: [362, 385, 387, 263, 373, 380]

对于右眼:[33, 160, 158, 133, 153, 144]

选择的地标点按顺序排列:P 1、 P 2、 P 3、 P 4、 P 5、 P 6

```bash

```bash
import cv2
import numpy as np
import matplotlib.pyplot as plt
import mediapipe as mp

mp_facemesh = mp.solutions.face_mesh
mp_drawing  = mp.solutions.drawing_utils
denormalize_coordinates = mp_drawing._normalized_to_pixel_coordinates

%matplotlib inline
获取双眼的地标(索引)点。

`


```bash
# Landmark points corresponding to left eye
all_left_eye_idxs = list(mp_facemesh.FACEMESH_LEFT_EYE)
# flatten and remove duplicates
all_left_eye_idxs = set(np.ravel(all_left_eye_idxs)) 

# Landmark points corresponding to right eye
all_right_eye_idxs = list(mp_facemesh.FACEMESH_RIGHT_EYE)
all_right_eye_idxs = set(np.ravel(all_right_eye_idxs))

# Combined for plotting - Landmark points for both eye
all_idxs = all_left_eye_idxs.union(all_right_eye_idxs)

# The chosen 12 points:   P1,  P2,  P3,  P4,  P5,  P6
chosen_left_eye_idxs  = [362, 385, 387, 263, 373, 380]
chosen_right_eye_idxs = [33,  160, 158, 133, 153, 144]
all_chosen_idxs = chosen_left_eye_idxs + chosen_right_eye_idx
图片

【2】检测眼睛是否闭合——计算眼睛纵横比(EAR)。

要检测眼睛是否闭合,我们可以使用眼睛纵横比(EAR) 公式:

EAR 公式返回反映睁眼程度的单个标量:

  1. 我们将使用 Mediapipe 的 Face Mesh 解决方案来检测和检索眼睛区域中的相关地标(下图中的点P 1 - P 6)。
  2. 检索相关点后,会在眼睛的高度和宽度之间计算眼睛纵横比 (EAR)。
    当眼睛睁开并接近零时,EAR 几乎是恒定的,而闭上眼睛是部分人,并且头部姿势不敏感。睁眼的纵横比在个体之间具有很小的差异。它对于图像的统一缩放和面部的平面内旋转是完全不变的。由于双眼同时眨眼,所以双眼的EAR是平均的。
    疲劳检测-闭眼检测(详细代码教程),疲劳检测,瞌睡检测,疲劳驾驶,闭眼检测

上图:检测到地标P i的睁眼和闭眼。

底部:为视频序列的几帧绘制的眼睛纵横比 EAR。存在一个闪烁。

首先,我们必须计算每只眼睛的 Eye Aspect Ratio:

|| 表示L2范数,用于计算两个向量之间的距离。

为了计算最终的 EAR 值,作者建议取两个 EAR 值的平均值。

疲劳检测-闭眼检测(详细代码教程),疲劳检测,瞌睡检测,疲劳驾驶,闭眼检测

一般来说,平均 EAR 值在 [0.0, 0.40] 范围内。在“闭眼”动作期间 EAR 值迅速下降。

现在我们熟悉了 EAR 公式,让我们定义三个必需的函数:distance(…)、get_ear(…)和calculate_avg_ear(…)。

def distance(point_1, point_2):
    """Calculate l2-norm between two points"""
    dist = sum([(i - j) ** 2 for i, j in zip(point_1, point_2)]) ** 0.5
    return dist
get_ear ()函数将.landmark属性作为参数。在每个索引位置,我们都有一个NormalizedLandmark对象。该对象保存标准化的x、y和z坐标值。
def get_ear(landmarks, refer_idxs, frame_width, frame_height):
    """
    Calculate Eye Aspect Ratio for one eye.

    Args:
        landmarks: (list) Detected landmarks list
        refer_idxs: (list) Index positions of the chosen landmarks
                            in order P1, P2, P3, P4, P5, P6
        frame_width: (int) Width of captured frame
        frame_height: (int) Height of captured frame

    Returns:
        ear: (float) Eye aspect ratio
    """
    try:
        # Compute the euclidean distance between the horizontal
        coords_points = []
        for i in refer_idxs:
            lm = landmarks[i]
            coord = denormalize_coordinates(lm.x, lm.y, 
                                             frame_width, frame_height)
            coords_points.append(coord)

        # Eye landmark (x, y)-coordinates
        P2_P6 = distance(coords_points[1], coords_points[5])
        P3_P5 = distance(coords_points[2], coords_points[4])
        P1_P4 = distance(coords_points[0], coords_points[3])

        # Compute the eye aspect ratio
        ear = (P2_P6 + P3_P5) / (2.0 * P1_P4)

    except:
        ear = 0.0
        coords_points = None

    return ear, coords_points

最后定义了calculate_avg_ear(…)函数:

def calculate_avg_ear(landmarks, left_eye_idxs, right_eye_idxs, image_w, image_h):
    """Calculate Eye aspect ratio"""

    left_ear, left_lm_coordinates = get_ear(
                                      landmarks, 
                                      left_eye_idxs, 
                                      image_w, 
                                      image_h
                                    )
    right_ear, right_lm_coordinates = get_ear(
                                      landmarks, 
                                      right_eye_idxs, 
                                      image_w, 
                                      image_h
                                    )
    Avg_EAR = (left_ear + right_ear) / 2.0

    return Avg_EAR, (left_lm_coordinates, right_lm_coordinates)

让我们测试一下 EAR 公式。我们将计算先前使用的图像和另一张眼睛闭合的图像的平均 EAR 值。

image_eyes_open  = cv2.imread("test-open-eyes.jpg")[:, :, ::-1]
image_eyes_close = cv2.imread("test-close-eyes.jpg")[:, :, ::-1]

for idx, image in enumerate([image_eyes_open, image_eyes_close]):
   
    image = np.ascontiguousarray(image)
    imgH, imgW, _ = image.shape

    # Creating a copy of the original image for plotting the EAR value
    custom_chosen_lmk_image = image.copy()

    # Running inference using static_image_mode
    with mp_facemesh.FaceMesh(refine_landmarks=True) as face_mesh:
        results = face_mesh.process(image).multi_face_landmarks

        # If detections are available.
        if results:
            for face_id, face_landmarks in enumerate(results):
                landmarks = face_landmarks.landmark
                EAR, _ = calculate_avg_ear(
                          landmarks, 
                          chosen_left_eye_idxs, 
                          chosen_right_eye_idxs, 
                          imgW, 
                          imgH
                      )

                # Print the EAR value on the custom_chosen_lmk_image.
                cv2.putText(custom_chosen_lmk_image, 
                            f"EAR: {round(EAR, 2)}", (1, 24),
                            cv2.FONT_HERSHEY_COMPLEX, 
                            0.9, (255, 255, 255), 2
                )                
             
                plot(img_dt=image.copy(),
                     img_eye_lmks_chosen=custom_chosen_lmk_image,
                     face_landmarks=face_landmarks,
                     ts_thickness=1, 
                     ts_circle_radius=3, 
                     lmk_circle_radius=3
                )

结果:

疲劳检测-闭眼检测(详细代码教程),疲劳检测,瞌睡检测,疲劳驾驶,闭眼检测

如您所见,睁眼时的 EAR 值为0.28,闭眼时(接近于零)为 0.08。

【3】设计一个实时检测系统。

疲劳检测-闭眼检测(详细代码教程),疲劳检测,瞌睡检测,疲劳驾驶,闭眼检测

首先,我们声明两个阈值和一个计数器。

  • EAR_thresh: 用于检查当前EAR值是否在范围内的阈值。
  • D_TIME:一个计数器变量,用于跟踪当前经过的时间量EAR < EAR_THRESH.
  • WAIT_TIME:确定经过的时间量是否EAR < EAR_THRESH超过了允许的限制。
  • 当应用程序启动时,我们将当前时间(以秒为单位)记录在一个变量中t1并读取传入的帧。

接下来,我们预处理并frame通过Mediapipe 的 Face Mesh 解决方案管道。文章来源地址https://www.toymoban.com/news/detail-677155.html

  • 如果有任何地标检测可用,我们将检索相关的 ( Pi )眼睛地标。否则,在此处重置t1 和重置以使算法一致)。D_TIME (D_TIME
  • 如果检测可用,则使用检索到的眼睛标志计算双眼的平均EAR值。
  • 如果是当前时间,则加上当前时间和to之间的差。然后将下一帧重置为。EAR < EAR_THRESHt2t1D_TIMEt1 t2
  • 如果D_TIME >= WAIT_TIME,我们会发出警报或继续下一帧。

到了这里,关于疲劳检测-闭眼检测(详细代码教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的疲劳驾驶检测系统(Python+PySide6界面+训练代码)

    摘要:本研究详述了一种采用深度学习技术的疲劳驾驶检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别疲劳驾驶行为。文章深入阐述

    2024年04月24日
    浏览(76)
  • 疲劳驾驶检测系统-YOLOv5-疲劳检测、分心检测、玩手机、抽烟、喝水检测(毕业设计)

    本项目效果展示视频: https://www.bilibili.com/video/BV1bj411S7rA/?share_source=copy_webvd_source=138d2e7f294c3405b6ea31a67534ae1a 1、本项目通过YOLOv8/YOLOv7/YOLOv5、Dlib和PySide2实现了一个疲劳驾驶检测系统,可为一些同学的课设、大作业等提供参考。该项目分为两个检测部分,疲劳检测和分心行为检测

    2024年02月10日
    浏览(29)
  • 毕设 深度学习疲劳驾驶检测 opencv python

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年01月17日
    浏览(34)
  • 疲劳驾驶检测系统-YOLOv8/YOLOv7/YOLOv5-疲劳检测、分心检测、玩手机、抽烟、喝水检测(毕业设计)

    本项目效果展示视频: https://www.bilibili.com/video/BV1bj411S7rA/?share_source=copy_webvd_source=138d2e7f294c3405b6ea31a67534ae1a 1、本项目通过YOLOv8/YOLOv7/YOLOv5、Dlib和PySide2实现了一个疲劳驾驶检测系统,可为一些同学的课设、大作业等提供参考。该项目分为两个检测部分,疲劳检测和分心行为检测

    2024年02月05日
    浏览(40)
  • 计算机设计大赛 疲劳驾驶检测系统 python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https:/

    2024年03月12日
    浏览(45)
  • 计算机设计大赛 深度学习疲劳检测 驾驶行为检测 - python opencv cnn

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习加驾驶疲劳与行为检测 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.com

    2024年03月14日
    浏览(53)
  • [数据集][目标检测]疲劳驾驶数据集VOC格式4类别-4362张

    数据集格式:Pascal VOC格式(不包含分割的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):4362 标注数量(xml文件个数):4362 标注类别数:4 标注类别名称:[\\\"closed_eye\\\",\\\"closed_mouth\\\",\\\"open_eye\\\",\\\"open_mouth\\\"] 每个类别标注的框数: closed_eye count = 2485 closed_mouth count = 3343 open_eye

    2024年02月11日
    浏览(30)
  • 深度学习毕设项目 深度学习疲劳检测 驾驶行为检测 - python opencv cnn

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月03日
    浏览(33)
  • 基于opencv的疲劳检测系统(UI界面,附下载链接和安装部署步骤,代码含详细注释)

    疲劳现象出现在日常生活的各种场合,在驾驶环境中对于疲劳的检测尤为重要。 本文基于opencv和dlib模型及头部姿态估计的方法实现实时疲劳检测,采用摄像头实时采集头部视频资料,利用OperCV实现人脸检测,通过dlib模型可以提取出人脸的68个器官特征点,先利用EAR算法和AR算

    2024年01月17日
    浏览(46)
  • 机器视觉毕业设计 深度学习驾驶人脸疲劳检测系统 - python opencv

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月07日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包