文章目录
0 前言
🔥 优质竞赛项目系列,今天要分享的是
🚩 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统
该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 更多资料, 项目分享:
https://gitee.com/dancheng-senior/postgraduate
1 课题背景
为了有效监测驾驶员是否疲劳驾驶、避免交通事故的发⽣,本项目利⽤⼈脸特征点进⾏实时疲劳驾驶检测的新⽅法。对驾驶员驾驶时的⾯部图像进⾏实时监控,⾸先检测⼈脸,并利⽤ERT算法定位⼈脸特征点;然后根据⼈脸眼睛区域的特征点坐标信息计算眼睛纵横⽐EAR来描述眼睛张开程度,根据合适的EAR阈值可判断睁眼或闭眼状态;最后基于EAR实测值和EAR阈值对监控视频计算闭眼时间⽐例(PERCLOS)值度量驾驶员主观疲劳程度,将其与设定的疲劳度阈值进⾏⽐较即可判定是否疲劳驾驶。
2 Dlib人脸识别
2.1 简介
Dlib是一个基于c++开发的开源数据工具库,其中包含了不少的机器学习的成熟算法与模型,相对于tensorflow和PyTorch,它用于图像处理以及人脸面部特征提取、分类及对比这几个方面比较具有通用性和优越性,因此,Dlib正在越来越广泛地应用在人脸识别技术领域。
Dlib具有独立使用的可移植代码。Dlib中的代码使用c++语言进行开发而成,使用独立封装,在不借助第三方数据库的情况下,可以直接移植到自己所需要设计的项目中进行使用。
2.2 Dlib优点
-
Dlib拥有全面的文档说明。作为一个开源的人脸数据库训练集,Dlib中有很多功能齐全的程序和文件,从人性化的角度而言的,Dlib在这一点上做的是非常不错的,因为它为每一个程序文档和文件都做了相对应的注释,这样开发者就可以迅速准确的调集程序文档来完成自己所需要的项目功能。
-
Dlib涵盖了支持功能完备的深度学习以及图像处理的各类算法。Dlib为开发者提供了机器深度学习的各类成熟的完备算法,并且在图像处理方面也为开发者带来了能够解决大多数实质问题的优良算法。例如基于SVM的递归和分类算法,以及专门用于面对大规模分类和递归的降维算法。当然还有能够对未知函数进行预分类和预测的相关向量机,其分类和预测训练是基于贝叶斯框架。
2.3 相关代码
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.4 人脸数据库
本项目中将识别到的人脸保存的.db文件中,相关代码如下:
class CoreUI(QMainWindow):
database = './FaceBase.db'
trainingData = './recognizer/trainingData.yml'
cap = cv2.VideoCapture()
captureQueue = queue.Queue() # 图像队列
alarmQueue = queue.LifoQueue() # 报警队列,后进先出
logQueue = multiprocessing.Queue() # 日志队列
receiveLogSignal = pyqtSignal(str) # LOG信号
def __init__(self):
super(CoreUI, self).__init__()
loadUi('./ui/Core.ui', self)
self.setWindowIcon(QIcon('./icons/icon.png'))
#self.setFixedSize(1161, 620)
'''self.pushButton = QPushButton('rush', self)
layout = QVBoxLayout()
layout.addWidget(self.pushButton)
self.setLayout(layout)'''
#self.pushButton.clicked.connect(self.open)=
# 图像捕获
self.isExternalCameraUsed = False
self.useExternalCameraCheckBox.stateChanged.connect(
lambda: self.useExternalCamera(self.useExternalCameraCheckBox))
self.faceProcessingThread = FaceProcessingThread()
self.startWebcamButton.clicked.connect(self.startWebcam)
#A\B功能开关
# 数据库
self