十大家居家装网站哪个好,网站建设脑图,郑州便宜网站建设公司,Wordpress企业主题排行文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言
#x1f525; 优质竞赛项目系列#xff0c;今天要分享的是
#x1f6a9; **基于深度学习加… 文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言 优质竞赛项目系列今天要分享的是 **基于深度学习加驾驶疲劳与行为检测 **
该项目较为新颖适合作为竞赛课题方向学长非常推荐
学长这里给一个题目综合评分(每项满分5分)
难度系数4分工作量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为开发者提供了机器深度学习的各类成熟的完备算法,并且在图像处理方面也为开发者带来了能够
相关代码
import matplotlib.pyplot as plt
import dlib
import numpy as np
import glob
import re#正脸检测器
detectordlib.get_frontal_face_detector()
#脸部关键形态检测器
spdlib.shape_predictor(rD:LBJAVAscriptshape_predictor_68_face_landmarks.dat)
#人脸识别模型
facerec dlib.face_recognition_model_v1(rD:LBJAVAscriptdlib_face_recognition_resnet_model_v1.dat)#候选人脸部描述向量集
descriptors[]photo_locations[]for photo in glob.glob(rD:LBJAVAscriptfaces*.jpg):photo_locations.append(photo)imgplt.imread(photo)imgnp.array(img)#开始检测人脸detsdetector(img,1)for k,d in enumerate(dets):#检测每张照片中人脸的特征shapesp(img,d)face_descriptorfacerec.compute_face_descriptor(img,shape)vnp.array(face_descriptor)descriptors.append(v)#输入的待识别的人脸处理方法相同
imgplt.imread(rD:test_photo10.jpg)
imgnp.array(img)
detsdetector(img,1)
#计算输入人脸和已有人脸之间的差异程度比如用欧式距离来衡量
differences[]
for k,d in enumerate(dets):shapesp(img,d)face_descriptorfacerec.compute_face_descriptor(img,shape)d_testnp.array(face_descriptor)#计算输入人脸和所有已有人脸描述向量的欧氏距离for i in descriptors:distancenp.linalg.norm(i-d_test)differences.append(distance)#按欧式距离排序 欧式距离最小的就是匹配的人脸
candidate_countlen(photo_locations)
candidates_dictdict(zip(photo_locations,differences))
candidates_dict_sortedsorted(candidates_dict.items(),keylambda x:x[1])#matplotlib要正确显示中文需要设置
plt.rcParams[font.family] [sans-serif]
plt.rcParams[font.sans-serif] [SimHei]plt.rcParams[figure.figsize] (20.0, 70.0)axplt.subplot(candidate_count1,4,1)
ax.set_title(输入的人脸)
ax.imshow(img)for i,(photo,distance) in enumerate(candidates_dict_sorted):imgplt.imread(photo)face_namephoto_namere.search(r([^\]*).jpg$,photo)if photo_name:face_namephoto_name[1]axplt.subplot(candidate_count1,4,i2)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 i0:ax.set_title(最匹配的人脸nnface_namenn差异度str(distance))else:ax.set_title(face_namenn差异度str(distance))ax.imshow(img)plt.show()2.2 疲劳检测算法
该系统采用Dlib库中人脸68个关键点检测shapepredictor68facelandmarks.dat的dat模型库及视频中的人脸之后返回人脸特征点坐标、人脸框及人脸角度等。本系统利用这68个关键点对驾驶员的疲劳状态进行检测算法如下
初始化Dlib的人脸检测器(HOG)然后创建面部标志物预测使用dlib.getfrontalfacedetector() 获得脸部位置检测器使用dlib.shapepredictor获得脸部特征位置检测器分别获取左、右眼面部标志的索引打开cv2本地摄像头。
Dlib库68个特征点模型如图所示 眼睛检测算法
基于EAR算法的眨眼检测当人眼睁开时EAR在某个值域范围内波动当人眼闭合时EAR迅速下降理论上接近于0。当EAR低于某个阈值时眼睛处于闭合状态当EAR由某个值迅速下降至小于该阈值再迅速上升至大于该阈值则 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 Threaddef eye_aspect_ratio(eye):# 垂直眼标志XY坐标A dist.euclidean(eye[1], eye[5]) # 计算两个集合之间的欧式距离B dist.euclidean(eye[2], eye[4])# 计算水平之间的欧几里得距离# 水平眼标志XY坐标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%当打哈欠频率Freq10%时则认为驾驶员打了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 Threaddef mouth_aspect_ratio(mouth): # 嘴部A np.linalg.norm(mouth[2] - mouth[10]) # 51, 59B np.linalg.norm(mouth[4] - mouth[8]) # 53, 57C np.linalg.norm(mouth[0] - mouth[6]) # 49, 55mar (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来进行检测是否存在玩手机、抽
目标检测架构分为两种一种是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