实时驾驶员状态检测(毕业设计+代码)

简介: 实时驾驶员状态检测(毕业设计+代码)

环境要求


使用Python,结合OpenCV和Dlib库,基于实时的网络摄像头视频流,实现驾驶员注意力状态检测和监测。

安装


该项目在Python 3.9上运行,需要以下库:


  • numpy OpenCV(opencv-python)
  • Dlib
  • 和cmake


面部关键点的Dlib预测器已包含在“predictor”文件夹中。


  1. 重要提示:Dlib的需求和库安装
  2. Dlib是一个需要安装C/C++编译器和Cmake库的库。请按照此指南在您的计算机上正确安装dlib。
  3. 如果您的计算机已经具备安装dlib和cmake的所有先决条件,您可以使用存储库中提供的requirements.txt文件:


image.gif


算法


这个脚本首先寻找驾驶员的面部,然后使用dlib库来预测68个面部关键点。所有面部关键点的枚举和位置可以在这里看到。


根据这些关键点,计算以下得分:


**EAR(眼睛纵横比):**标准化后的平均眼孔口径,用于判断眼睛的张开程度

**Gaze Score(注视得分):**眼睛中心和瞳孔之间的L2范数(欧几里得距离),用于判断驾驶员是否看向其他地方

**Head Pose(头部姿态):**驾驶员头部的滚转、俯仰和偏航角。这些角度用于判断驾驶员是否没有看向前方或头部姿态不正(可能是昏迷状态)

**PERCLOS(闭眼时间百分比):**一分钟内闭眼时间的百分比。在此情况下,采用0.2的阈值(一分钟的20%),并利用EAR得分来估计闭眼时间。


驾驶员状态可以分类为:


正常:不会打印任何信息。

疲劳:当PERCLOS得分> 0.2时,在屏幕上会打印一个警告信息。

**睡着了:**当眼睛闭合(EAR < closure_threshold)一段时间时,在屏幕上会打印一个警告信息。

**看向其他地方:**当注视得分高于某个阈值并持续一段时间时,在屏幕上会打印一个警告信息。

分心:当头部姿态得分高于某个阈值并持续一段时间时,在屏幕上会打印一个警告信息。


眼睛模型


眼睛纵横比(EAR)是一个标准化得分,有助于了解眼睛的张开程度。使用每只眼睛的dlib关键点(每个眼睛都有6个关键点),估计眼睛的长度和宽度,并使用这些数据计算EAR得分,如下图所示:


image.png


结果:

计算注视得分的处理方法有更新:

a6479a5cbe0edb7250a1622dba20705f_3f802b2d46a648128d0b6c2d53cfd654.png

在第一个版本中,使用自适应阈值处理来帮助Hough变换检测瞳孔位置。在更新的版本中,经过双边滤波器去除一些噪声后,仅使用Hough变换,并且将眼睛的ROI区域大小缩小了。


使用方法和代码


class HeadPoseEstimator:
    def __init__(self, camera_matrix=None, dist_coeffs=None, show_axis: bool = False):
        """
        Head Pose estimator class that contains the get_pose method for computing the three euler angles
        (roll, pitch, yaw) of the head. It uses the image/frame, the dlib detected landmarks of the head and,
        optionally the camera parameters
        Parameters
        ----------
        camera_matrix: numpy array
            Camera matrix of the camera used to capture the image/frame
        dist_coeffs: numpy array
            Distortion coefficients of the camera used to capture the image/frame
        show_axis: bool
            If set to True, shows the head pose axis projected from the nose keypoint and the face landmarks points
            used for pose estimation (default is False)
        """
        self.show_axis = show_axis
        self.camera_matrix = camera_matrix
        self.dist_coeffs = dist_coeffs
    def get_pose(self, frame, landmarks):
        """
        Estimate head pose using the head pose estimator object instantiated attribute
        Parameters
        ----------
        frame: numpy array
            Image/frame captured by the camera
        landmarks: dlib.rectangle
            Dlib detected 68 landmarks of the head
        Returns
        --------
        - if successful: image_frame, roll, pitch, yaw (tuple)
        - if unsuccessful: None,None,None,None (tuple)
        """
        self.keypoints = landmarks  # dlib 68 landmarks
        self.frame = frame  # opencv image array
        self.axis = np.float32([[200, 0, 0],
                                [0, 200, 0],
                                [0, 0, 200]])
        # array that specify the length of the 3 projected axis from the nose
        if self.camera_matrix is None:
            # if no camera matrix is given, estimate camera parameters using picture size
            self.size = frame.shape
            self.focal_length = self.size[1]
            self.center = (self.size[1] / 2, self.size[0] / 2)
            self.camera_matrix = np.array(
                [[self.focal_length, 0, self.center[0]],
                 [0, self.focal_length, self.center[1]],
                 [0, 0, 1]], dtype="double"
            )
        if self.dist_coeffs is None:  # if no distorsion coefficients are given, assume no lens distortion
            self.dist_coeffs = np.zeros((4, 1))
        # 3D Head model world space points (generic human head)
        self.model_points = np.array([
            (0.0, 0.0, 0.0),  # Nose tip
            (0.0, -330.0, -65.0),  # Chin
            (-225.0, 170.0, -135.0),  # Left eye left corner
            (225.0, 170.0, -135.0),  # Right eye right corner
            (-150.0, -150.0, -125.0),  # Left Mouth corner
            (150.0, -150.0, -125.0)  # Right mouth corner
        ])


运行

python main.py
``
#驾驶状态检测
检测到闭眼睛就会警报
```bash
python main.py --ear_time_tresh 5


5秒闭眼则在屏幕显示

在这里插入图片描述

36c4d5d1a41727b4e5bdf09dacf7622f_0db23382863d4c5c8510a8affec68f6e.png


相关文章
|
7月前
|
监控 安全 自动驾驶
基于python的室内老人实时摔倒智能监测系统-跌倒检测系统(康复训练检测+代码)
基于python的室内老人实时摔倒智能监测系统-跌倒检测系统(康复训练检测+代码)
|
2月前
|
传感器
基于Arduino的植物状态监测系统
基于Arduino的植物状态监测系统
54 1
|
4月前
|
存储 JavaScript 前端开发
看过来!准确直观显示手机充电信息的充电统计软件!
基于自制充电统计App,多设备用户可远程查看各设备充电数据。在软件内可以查看预估充电容量等信息
|
7月前
|
数据采集 运维 监控
LabVIEW发开发电状态监测系统
LabVIEW发开发电状态监测系统
48 5
|
7月前
|
小程序 JavaScript Java
居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)
居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)
89 0
|
7月前
|
传感器 数据采集 监控
LabVIEW 开发在不确定路况下自动速度辅助系统
LabVIEW 开发在不确定路况下自动速度辅助系统
31 0
|
7月前
|
传感器 数据采集 IDE
LabVIEW编程开发天气监测系统
LabVIEW编程开发天气监测系统
63 0
|
7月前
|
传感器 定位技术 决策智能
变量施药与施肥系统实时监测
变量施药与施肥系统实时监测
94 2
|
传感器 安全
基于振弦传感器的岩土工程在线监测系统案例分析
河北稳控科技岩土工程在线监测系统是一种非常重要的监测系统,它可以实时监测岩土体的变形、应力、应变等数据,帮助工程师及时掌握工程的变化情况,为工程的安全可靠提供有效的数据支持。其中,振弦传感器是一种常用的传感器,它能够实时监测结构体的振动情况,是岩土工程在线监测系统中不可或缺的一部分。
基于振弦传感器的岩土工程在线监测系统案例分析
|
算法 计算机视觉
【OpenCV图像处理11】车辆统计项目
【OpenCV图像处理11】车辆统计项目
182 0