大创项目推荐 深度学习驾驶行为状态检测系统(疲劳 抽烟 喝水 玩手机) - opencv python

文章目录

  • 1 前言
  • 1 课题背景
  • 2 相关技术
    • 2.1 Dlib人脸识别库
    • 2.2 疲劳检测算法
    • 2.3 YOLOV5算法
  • 3 效果展示
    • 3.1 眨眼
    • 3.2 打哈欠
    • 3.3 使用手机检测
    • 3.4 抽烟检测
    • 3.5 喝水检测
  • 4 最后

1 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 基于深度学习的驾驶行为状态检测系统

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:5分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 课题背景

为了有效监测驾驶员是否疲劳驾驶、避免交通事故的发⽣,本项目利⽤⼈脸特征点进⾏实时疲劳驾驶检测的新⽅法。对驾驶员驾驶时的⾯部图像进⾏实时监控,⾸先检测⼈脸,并利⽤ERT算法定位⼈脸特征点;然后根据⼈脸眼睛区域的特征点坐标信息计算眼睛纵横⽐EAR来描述眼睛张开程度,根据合适的EAR阈值可判断睁眼或闭眼状态;最后基于EAR实测值和EAR阈值对监控视频计算闭眼时间⽐例(PERCLOS)值度量驾驶员主观疲劳程度,将其与设定的疲劳度阈值进⾏⽐较即可判定是否疲劳驾驶。

2 相关技术

2.1 Dlib人脸识别库

简历
Dlib是一个基于c++开发的开源数据工具库,其中包含了不少的机器学习的成熟算法与模型,相对于tensorflow和PyTorch,它用于图像处理以及人脸面部特征提取、分类及对比这几个方面比较具有通用性和优越性,因此,Dlib正在越来越广泛地应用在人脸识别技术领域。
Dlib具有独立使用的可移植代码。Dlib中的代码使用c++语言进行开发而成,使用独立封装,在不借助第三方数据库的情况下,可以直接移植到自己所需要设计的项目中进行使用。

Dlib优点

  • Dlib拥有全面的文档说明。作为一个开源的人脸数据库训练集,Dlib中有很多功能齐全的程序和文件,从人性化的角度而言的,Dlib在这一点上做的是非常不错的,因为它为每一个程序文档和文件都做了相对应的注释,这样开发者就可以迅速准确的调集程序文档来完成自己所需要的项目功能。

  • Dlib涵盖了支持功能完备的深度学习以及图像处理的各类算法。Dlib为开发者提供了机器深度学习的各类成熟的完备算法,并且在图像处理方面也为开发者带来了能够解决大多数实质问题的优良算法。例如基于SVM的递归和分类算法,以及专门用于面对大规模分类和递归的降维算法。当然还有能够对未知函数进行预分类和预测的相关向量机,其分类和预测训练是基于贝叶斯框架。

相关代码

import` `matplotlib.pyplot as plt
import` `dlib
import` `numpy as np
import` `glob
import` `re
 
#正脸检测器
detector``=``dlib.get_frontal_face_detector()
#脸部关键形态检测器
sp``=``dlib.shape_predictor(r``"D:LBJAVAscriptshape_predictor_68_face_landmarks.dat"``)
#人脸识别模型
facerec ``=` `dlib.face_recognition_model_v1(r``"D:LBJAVAscriptdlib_face_recognition_resnet_model_v1.dat"``)
 
#候选人脸部描述向量集
descriptors``=``[]
 
photo_locations``=``[]
 
for` `photo ``in` `glob.glob(r``'D:LBJAVAscriptfaces*.jpg'``):
 ``photo_locations.append(photo)
 ``img``=``plt.imread(photo)
 ``img``=``np.array(img)
 
 ``#开始检测人脸
 ``dets``=``detector(img,``1``)
 
 ``for` `k,d ``in` `enumerate``(dets):
  ``#检测每张照片中人脸的特征
  ``shape``=``sp(img,d)
  ``face_descriptor``=``facerec.compute_face_descriptor(img,shape)
  ``v``=``np.array(face_descriptor)
  ``descriptors.append(v)
    
#输入的待识别的人脸处理方法相同
img``=``plt.imread(r``'D:test_photo10.jpg'``)
img``=``np.array(img)
dets``=``detector(img,``1``)
#计算输入人脸和已有人脸之间的差异程度(比如用欧式距离来衡量)
differences``=``[]
for` `k,d ``in` `enumerate``(dets):
 ``shape``=``sp(img,d)
 ``face_descriptor``=``facerec.compute_face_descriptor(img,shape)
 ``d_test``=``np.array(face_descriptor)
 
 ``#计算输入人脸和所有已有人脸描述向量的欧氏距离
 ``for` `i ``in` `descriptors:
  ``distance``=``np.linalg.norm(i``-``d_test)
  ``differences.append(distance)
 
#按欧式距离排序 欧式距离最小的就是匹配的人脸
candidate_count``=``len``(photo_locations)
candidates_dict``=``dict``(``zip``(photo_locations,differences))
candidates_dict_sorted``=``sorted``(candidates_dict.items(),key``=``lambda` `x:x[``1``])
 
#matplotlib要正确显示中文需要设置
plt.rcParams[``'font.family'``] ``=` `[``'sans-serif'``]
plt.rcParams[``'font.sans-serif'``] ``=` `[``'SimHei'``]
 
plt.rcParams[``'figure.figsize'``] ``=` `(``20.0``, ``70.0``)
 
ax``=``plt.subplot(candidate_count``+``1``,``4``,``1``)
ax.set_title(``"输入的人脸"``)
ax.imshow(img)
 
for` `i,(photo,distance) ``in` `enumerate``(candidates_dict_sorted):
 ``img``=``plt.imread(photo)
 
 ``face_name``=``""
 ``photo_name``=``re.search(r``'([^\]*).jpg$'``,photo)
 ``if` `photo_name:
  ``face_name``=``photo_name[``1``]
  
 ``ax``=``plt.subplot(candidate_count``+``1``,``4``,i``+``2``)
 ``ax.set_xticks([])
 ``ax.set_yticks([])
 ``ax.spines[``'top'``].set_visible(``False``)
 ``ax.spines[``'right'``].set_visible(``False``)
 ``ax.spines[``'bottom'``].set_visible(``False``)
 ``ax.spines[``'left'``].set_visible(``False``)
 
 ``if` `i``=``=``0``:
  ``ax.set_title(``"最匹配的人脸nn"``+``face_name``+``"nn差异度:"``+``str``(distance))
 ``else``:
  ``ax.set_title(face_name``+``"nn差异度:"``+``str``(distance))
 ``ax.imshow(img)
 
plt.show()

2.2 疲劳检测算法

该系统采用Dlib库中人脸68个关键点检测shape_predictor_68_face_landmarks.dat的dat模型库及视频中的人脸,之后返回人脸特征点坐标、人脸框及人脸角度等。本系统利用这68个关键点对驾驶员的疲劳状态进行检测,算法如下:

  1. 初始化Dlib的人脸检测器(HOG),然后创建面部标志物预测;
  2. 使用dlib.get_frontal_face_detector() 获得脸部位置检测器;
  3. 使用dlib.shape_predictor获得脸部特征位置检测器;
  4. 分别获取左、右眼面部标志的索引;
  5. 打开cv2本地摄像头。

Dlib库68个特征点模型如图所示:

眼睛检测算法

基于EAR算法的眨眼检测,当人眼睁开时,EAR在某个值域范围内波动,当人眼闭合时,EAR迅速下降,理论上接近于0。当EAR低于某个阈值时,眼睛处于闭合状态;当EAR由某个值迅速下降至小于该阈值,再迅速上升至大于该阈值,则判断为一次眨眼。为检测眨眼次数,需要设置同一次眨眼的连续帧数。眨眼速度较快,一般1~3帧即可完成眨眼动作。眼部特征点如图:
在这里插入图片描述
EAR计算公式如下:
在这里插入图片描述
当后帧眼睛宽高比与前一帧差值的绝对值(EAR)大于0.2时,认为驾驶员在疲劳驾驶。(68点landmark中可以看到37-42为左眼,43-48为右眼)
在这里插入图片描述
右眼开合度可以通过以下公式:
在这里插入图片描述
眼睛睁开度从大到小为进入闭眼期,从小到大为进入睁眼期,计算最长闭眼时间(可用帧数来代替)。闭眼次数为进入闭眼、进入睁眼的次数。通过设定单位时间内闭眼次数、闭眼时间的阈值判断人是否已经疲劳了。

相关代码:

# 疲劳检测,检测眼睛和嘴巴的开合程度

from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np  # 数据处理的库 numpy
import argparse
import imutils
import time
import dlib
import cv2
import math
import time
from threading import Thread

def eye_aspect_ratio(eye):
    # 垂直眼标志(X,Y)坐标
    A = dist.euclidean(eye[1], eye[5])  # 计算两个集合之间的欧式距离
    B = dist.euclidean(eye[2], eye[4])
    # 计算水平之间的欧几里得距离
    # 水平眼标志(X,Y)坐标
    C = dist.euclidean(eye[0], eye[3])
    # 眼睛长宽比的计算
    ear = (A + B) / (2.0 * C)
    # 返回眼睛的长宽比
    return ear

打哈欠检测算法

基于MAR算法的哈欠检测,利用Dlib提取嘴部的6个特征点,通过这6个特征点的坐标(51、59、53、57的纵坐标和49、55的横坐标)来计算打哈欠时嘴巴的张开程度。当一个人说话时,点51、59、53、57的纵坐标差值增大,从而使MAR值迅速增大,反之,当一个人闭上嘴巴时,MAR值迅速减小。

嘴部主要取六个参考点,如下图:
在这里插入图片描述
计算公式:
在这里插入图片描述
通过公式计算MAR来判断是否张嘴及张嘴时间,从而确定驾驶员是否在打哈欠。阈值应经过大量实验,能够与正常说话或哼歌区分开来。为提高判断的准确度,采用双阈值法进行哈欠检测,即对内轮廓进行检测:结合张口度与张口时间进行判断。Yawn为打哈欠的帧数,N为1
min内总帧数,设双阈值法哈欠检测的阈值为10%,当打哈欠频率Freq>10%时,则认为驾驶员打了1个深度哈欠或者至少连续2个浅哈欠,此时系统进行疲劳提醒。

相关代码:

# 疲劳检测,检测眼睛和嘴巴的开合程度

from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np  # 数据处理的库 numpy
import argparse
import imutils
import time
import dlib
import cv2
import math
import time
from threading import Thread

def mouth_aspect_ratio(mouth):  # 嘴部
    A = np.linalg.norm(mouth[2] - mouth[10])  # 51, 59
    B = np.linalg.norm(mouth[4] - mouth[8])  # 53, 57
    C = np.linalg.norm(mouth[0] - mouth[6])  # 49, 55
    mar = (A + B) / (2.0 * C)
    return mar

点头检测算法

基于HPE算法的点头检测:算法步骤:2D人脸关键点检测,3D人脸模型匹配,求解3D点和对应2D点的转换关系,根据旋转矩阵求解欧拉角。检测过程中需要使用世界坐标系(UVW)、相机坐标系(XYZ)、图像中心坐标系(uv)和像素坐标系(xy)。一个物体相对于相机的姿态可以使用旋转矩阵和平移矩阵来表示。

  • 平移矩阵:物体相对于相机的空间位置关系矩阵,用T表示。
  • 旋转矩阵:物体相对于相机的空间姿态关系矩阵,用R表示。

因此必然少不了坐标系转换。如图所示:
在这里插入图片描述
于是世界坐标系(UVW)、相机坐标系(XYZ)、图像中心坐标系(uv)和像素坐标系(xy)四兄弟闪亮登场。相对关系如:
世界坐标系转换到相机坐标:在这里插入图片描述
相机坐标系转换到像素坐标系:
在这里插入图片描述
像素坐标系与世界坐标系的关系为:
在这里插入图片描述
图像中心坐标系转换到像素坐标系:
在这里插入图片描述

得到旋转矩阵后,求欧拉角:
在这里插入图片描述
设定参数阈值为0.3,在一个时间段,如10
s内,当低头欧拉角|Pitch|≥20°或者头部倾斜欧拉角|Roll|≥20°的时间比例超过0.3时,则认为驾驶员处于瞌睡状态,发出预警。

2.3 YOLOV5算法

简介
我们选择当下YOLO最新的卷积神经网络YOLOv5来进行检测是否存在玩手机、抽烟、喝水这三种行为。6月9日,Ultralytics公司开源了YOLOv5,离上一次YOLOv4发布不到50天。而且这一次的YOLOv5是完全基于PyTorch实现的!在我们还对YOLOv4的各种高端操作、丰富的实验对比惊叹不已时,YOLOv5又带来了更强实时目标检测技术。按照官方给出的数目,现版本的YOLOv5每个图像的推理时间最快0.007秒,即每秒140帧(FPS),但YOLOv5的权重文件大小只有YOLOv4的1/9。

目标检测架构分为两种,一种是two-stage,一种是one-stage,区别就在于 two-stage 有region
proposal过程,类似于一种海选过程,网络会根据候选区域生成位置和类别,而one-stage直接从图片生成位置和类别。今天提到的 YOLO就是一种
one-stage方法。YOLO是You Only Look Once的缩写,意思是神经网络只需要看一次图片,就能输出结果。YOLO
一共发布了五个版本,其中 YOLOv1 奠定了整个系列的基础,后面的系列就是在第一版基础上的改进,为的是提升性能。

YOLOv5有4个版本性能如图所示:
在这里插入图片描述
网络架构图
在这里插入图片描述

3 效果展示

3.1 眨眼

在这里插入图片描述

3.2 打哈欠

在这里插入图片描述

3.3 使用手机检测

在这里插入图片描述

3.4 抽烟检测

在这里插入图片描述

3.5 喝水检测

在这里插入图片描述

4 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/334451.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【不用找素材】ECS 游戏Demo制作教程(3) 1.17

一、生成墓碑 新建脚本如下: using Unity.Entities; using Unity.Mathematics;namespace ECSdemo {public struct GraveyardRandom : IComponentData{public Random Value;}}扩充GraveyardMono如下: using Unity.Entities; using Unity.Mathematics; …

代码随想录算法训练营day13|239.滑动窗口最大值、347.前K个高频元素

239. 滑动窗口最大值 347.前 K 个高频元素 239. 滑动窗口最大值 (一刷至少需要理解思路) 之前讲的都是栈的应用,这次该是队列的应用了。 本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。 题目链接/文…

linux磁盘,分区,挂载等等

1. 修改磁盘分区的标签 例如:733be18b-7baf-d84c-879d-ca3db465f179太长了,修改一下。 linuxchenxiao:/media/linux/733be18b-7baf-d84c-879d-ca3db465f179$ 先 sudo blkid sudo blkid 找到你想修改的UUID(唯一标识符) /dev/sda1: UUID"733be…

C++_Lambda表达式的完整介绍

目录 1. 什么是Lambda表达式 1.1 四种表达式的含义 1.2 lambda表达式各个成员的解释 2. 捕获列表 3. 编译器如何看待Lambda表达式 参考文章 参考: C Lambda表达式的完整介绍 - 知乎 c在c11标准中引入了lambda表达式,一般用于定义匿名函数,使得代码…

ChatGPT正确打开方式与GPT-4.5的key最新获取方式

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

基于SpringBoot的乡村特产推广管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

根据基因名批量查找它的Uniprot编号

背景: 前几天老师交给我一个任务,给我一个基因列表,让我查找它们所编码的蛋白质的蛋白质序列。我上了一下uniprot数据库,发现这个任务可以分成两步: 找到这个基因在Uniprot数据库中所对应的蛋白质编码根据蛋白质编码…

SQL SERVER无法连接到服务器解决过程记录

很久没用sql server了,这几天打算更新SQL SERVER数据库:SQL看这一篇就看够了(附详细代码及截图) 这篇文章,发现连接不上服务器。 找一下解决办法。 一、打开服务界面 在键盘上按“WINR”快捷键,打开运行…

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统

实验五 实验名称 温室盆栽灌溉系统 软件设计: 1. 定义对应的引脚和端口的别名。 2. 编写延时函数,用于控制程序的执行速度。 3. 编写LCD控制函数,包括发送命令和发送数据两种操作。 4. 编写显示函数,用于在LCD上显示字符串…

C# dataGridView 列的勾选框改变事件

dataGridView 增加一列 DataGridViewCheckBoxColumn 然后设置复选框值如下图: dataGridView增加两个事件 private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e){//提交改变,触发dataGridView1_CellValueChanged事件&…

3Dmax灯光学习(Vray灯光应用)

渲染效果图可以用渲染100哦,最高支持max2024,cr11,vr6.2,支持LUT和Acescg工作流等常用插件,同时森林插件7.43也进行了支持,注册填邀请码【7788】即可免费测试! 灯光应用 普通灯光/标准灯光(外景…

Unity vs Godot :哪个游戏引擎更适合你?

Unity vs Godot :哪个游戏引擎更适合你? 游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有…

mac PyCharm 上传文件到远程服务器+远程服务器下载到本地

1 部署配置 选择SFTP name:test6 输入ssh账号和密码。保存密码和30s心跳。 2 目录映射 Local path(本地mac机器):/Users/clevercode/PycharmProjects/test6 Root path(远程服务机器):/home/…

Debian 10.13.0 安装图解

引导和开始安装 这里直接回车确认即可,选择图形化安装方式。 选择语言 这里要区分一下,当前选中的语言作为安装过程中安装器所使用的语言,这里我们选择中文简体。不过细心的同学可能发现,当你选择安装器语言之后,后续安…

关于运维·关于Zabbix监控平台的面试点

目录 引言:明人不说暗话,今天分享几个在面试的时候常被问到关于Zabbix监控平台的面试点 1、zabbix的优点 2、zabbix的缺点 3、zabbix的监控模式 4、zabbix自定义监控怎么做 5、zabbix的自动发现功能 6、zabbix分布式监控有什么特点 引言&#xff1…

找不到mfc100.dll的解决方法,怎么修复mfc100.dll文件

当我们在使用电脑时,时常可能会遇到各类系统提示的错误信息。"找不到mfc100.dll" 就是这些错误之一,该错误提示会妨碍我们执行一些应用程序或特定代码。为了帮助读者克服这个技术障碍,本篇文章将详尽阐明导致该问题的根本原因&…

技术硬实力,阿里巴巴为什么要开源Spring Cloud Alibaba?

Spring Cloud Alibaba是阿里巴巴开源的一款高性能的微服务RPC框架,关于Spring Cloud Alibaba的详细介绍我这里就不啰嗦了,大家可以参考官网及相关源码,我这里只是想聊的是“阿里巴巴为什么要开源Spring Cloud Alibaba”,只要追根朔…

日常生活小技巧 -- Wireshark显示过滤器语法规则

抓包工具 Wireshark 过滤器使用还是用的比较少的。看一下怎么用的。 一、显示过滤器: 显示过滤表达示在工具栏下方的“显示过滤器”输入框输入即可生效。 点击管理显示过滤: 可以看到还是有一些示例的: 比如: 只显示80端口&am…

员工工作效率提高妙招

通过实际的工作量纪实,大量的基础数据得以充分有效地运用,客户对华恒智信顾问团队的认真工作态度以及细致的工作方法表示认同与肯定,认为这为企业提供了一种量化的定编模式以及管理的量化依据,非常值得推广运用。 一、现存问题 某…

工作中使用Redis的10种场景

前言 Redis作为一种优秀的基于key/value的缓存,有非常不错的性能和稳定性,无论是在工作中,还是面试中,都经常会出现。 今天这篇文章就跟大家一起聊聊,我在实际工作中使用Redis的10种场景,希望对你会有所帮助…