前言一、项目环境配置1、pytorch安装(gpu版本和cpu版本的安装)2、pycocotools的安装3、其他包的安装
二、玩手机、抽烟、喝水三种行为的检测算法及代码解读1、YOLOv5介绍(YOLOv8/YOLOv7/YOLOv5版本均可提供)2、算法实现3、效果展示3.1玩手机行为检测效果展示3.2抽烟行为检测效果展示3.3喝水行为检测效果展示
三、基于Dlib库进行闭眼、打哈欠疲劳检测算法及代码解读1、Dlib库人脸关键点检测库2、算法流程3、核心代码4、效果展示
四、使用Perclos模型计算疲劳程度算法及代码解读1、算法流程2、核心代码3、效果展示
五、总结及源码获取1、总结2、项目资源获取(YOLOv8/YOLOv7/YOLOv5版本均可提供)
前言
1、本项目通过YOLOv8/YOLOv7/YOLOv5、Dlib和PySide2实现了一个疲劳驾驶检测系统,可为一些同学的课设、大作业等提供参考。该项目分为两个检测部分,疲劳检测和分心行为检测。疲劳检测部分,使用Dlib进行人脸关键点检测,然后通过计算眼睛和嘴巴的开合程度来判断是存在否闭眼或者打哈欠,并使用Perclos模型计算疲劳程度。分心行为检测部分,使用YOLOv8/YOLOv7/YOLOv5检测是否存在玩手机、抽烟、喝水这三种行为。最终检测效果如图所示。
2、本项目提供玩手机、抽烟、喝水这三种行为的xml格式目标检测数据集,共3547张图片,如图所示。可用于自己训练,可将YOLOv8/YOLOv7/YOLOv5版本的项目均可提供。
一、项目环境配置
condaconfig--remove-keychannels
condaconfig--setshow_channel_urlsyes
首先创建python3.8的虚拟环境,请在命令行中执行下列操作:
condacreate-nyolov8python==3.8.5
condaactivateyolov8
1、pytorch安装(gpu版本和cpu版本的安装)
condainstallpytorch==1.8.0torchvisiontorchaudiocudatoolkit=10.2#注意这条命令指定Pytorch的版本和cuda的版本
condainstallpytorch==1.8.0torchvision==0.9.0torchaudio==0.8.0cpuonly#CPU的小伙伴直接执行这条命令即可
安装完毕之后,我们来测试一下GPU是否可以有效调用:
2、pycocotools的安装
pipinstallpycocotools-windows
3、其他包的安装
另外的话大家还需要安装程序其他所需的包,包括opencv,matplotlib这些包,不过这些包的安装比较简单,直接通过pip指令执行即可,我们cd到yolov8代码的目录下,直接执行下列指令即可完成包的安装。
pipinstall-rrequirements.txt
pipinstallpyqt5
pipinstalllabelme
二、玩手机、抽烟、喝水三种行为的检测算法及代码解读
1、YOLOv5介绍(YOLOv8/YOLOv7/YOLOv5版本均可提供)
YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度与精度都得到了极大的性能提升。主要的改进思路如下:1、输入端:在模型训练阶段,提出了一些改进思路,主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放;2、基准网络:融合其它检测算法中的一些新思路,主要包括:Focus结构与CSP结构;3、Neck网络:目标检测网络在BackBone与最后的Head输出层之间往往会插入一些层,YOLOv5中添加了FPN+PAN结构;4、Head输出层:输出层的锚框机制与YOLOv4相同,主要改进的是训练时的损失函数GIOU_Loss,以及预测框筛选的DIOU_nms。YOLOv5的模型整体结构如图所示,在本项目算法中,YOLOv5用于目标检测,即检测face、drink、phone、smoke四个目标类别。从而判断驾驶员是否存在玩手机、抽烟、喝水这三种行为,并将检测出来的驾驶员人脸进行框出。
2、算法实现
#如果检测到分心行为
#将信息返回到前端ui,使用红色字体来体现
foriinlab:
if(i=="phone"):
window.label_6.setText("正在用手机")
window.label_9.setText("请不要分心")
ifActionCOUNTER>0:
ActionCOUNTER-=1
elif(i=="smoke"):
window.label_7.setText("正在抽烟")
elif(i=="drink"):
window.label_8.setText("正在喝水")
3、效果展示
3.1玩手机行为检测效果展示
若检测到玩手机行为,则在界面的右边以红色字体提示“正在用手机”、“请不要分心”,对驾驶员起到警示提醒的作用。并在左侧的实时显示画面中对手机进行框出,同时显示手机目标的置信度。
3.2抽烟行为检测效果展示
同理,若在摄像头采集的实时画面中检测到抽烟的行为,则使用“smoke”对烟进行框出,并显示烟的目标置信度。同时在显示窗口的右侧以红色字体提示驾驶人员“正在抽烟”、“请不要分心”。
3.3喝水行为检测效果展示
喝水行为的检测与抽烟、玩手机行为检测类似,可以看到,本文算法也能够对喝水行为进行有效检测。
三、基于Dlib库进行闭眼、打哈欠疲劳检测算法及代码解读
1、Dlib库人脸关键点检测库
2、算法流程
在本算法中首先创建一个人脸检测器对象frontal_face_detector来检测图像中是否存在人脸,若存在人脸,则使用detector对象检测图像中的人脸,并返回人脸位置信息。然后再创建一个关键点检测器对象shape_predictor,并读取本项目中已训练好的模型文件。最后,对于每个人脸使用shape_predictor对象检测出其关键点,输出的shape对象即为检测到的关键点信息。对于闭眼疲劳检测而言,首先基于dlib人脸识别的68个特征点、分别获取左右眼面部标志的索引,通过opencv对视频流进行灰度化处理,检测出人眼的位置信息。然后计算眼睛长宽比EAR,当人眼睁开时,EAR在某个值上下波动,当人眼闭合时,EAR迅速下降,理论上会接近于零。当前帧两双眼睛宽高比与前一帧的差值的绝对值(EAR)大于0.2,则认为是疲劳。对于打哈欠疲劳检测而言,只要产生打哈欠的动作即归类为“疲劳”。主要取人脸六个参考点来计算嘴巴的张开度,检测到嘴巴张开度超过一定阈值,则判为打哈欠疲劳。
3、核心代码
本项目将眨眼、打哈欠的疲劳检测写到了myfatigue.py脚本里面,有详细注释,调用即可。在main.py中进行疲劳判断的核心代码如下:
#疲劳判断
#眨眼判断
ifeye
#如果眼睛开合程度小于设定好的阈值
COUNTER+=1
Rolleye+=1
else:
#如果连续2次都小于阈值,则表示进行了一次眨眼活动
ifCOUNTER>=EYE_AR_CONSEC_FRAMES:
TOTAL+=1
window.label_3.setText("眨眼次数:"+str(TOTAL))
#重置眼帧计数器
COUNTER=0
#哈欠判断,同上
ifmouth>MAR_THRESH:
mCOUNTER+=1
Rollmouth+=1
#如果连续3次都小于阈值,则表示打了一次哈欠
ifmCOUNTER>=MOUTH_AR_CONSEC_FRAMES:
mTOTAL+=1
window.label_4.setText("哈欠次数:"+str(mTOTAL))
#重置嘴帧计数器
mCOUNTER=0
4、效果展示
将检测出的左右眼部、嘴部区域关键点使用椭圆形绿色线框进行绘制,并在界面右侧的第一行文本提醒区域“疲劳检测”使用红色字体提示“疲劳!!!”,从而对存在眨眼、打哈欠疲劳行为的驾驶人员进行提示警告。另外,在界面右侧的第二行文本中统计当前摄像头画面中驾驶人员的眨眼次数和打哈欠次数,并进行实时显示。
四、使用Perclos模型计算疲劳程度算法及代码解读
1、算法流程
2、核心代码
本项目中疲劳判断以150帧作为一个周期,计算出的Perclos模型得分超过0.38时,判为疲劳状态。核心判断代码如下:
#疲劳模型
#以150帧为一个循环
#每一帧Roll加1
Roll+=1
#当检测满150帧时,计算模型得分
ifRoll==150:
#计算Perclos模型得分
perclos=(Rolleye/Roll)+(Rollmouth/Roll)*0.2
#在前端UI输出perclos值
Ui_MainWindow.printf(window,"过去150帧中,Perclos得分为"+str(round(perclos,3)))
#当过去的150帧中,Perclos模型得分超过0.38时,判断为疲劳状态
ifperclos>0.38:
Ui_MainWindow.printf(window,"当前处于疲劳状态")
window.label_10.setText("疲劳!!!")
Ui_MainWindow.printf(window,"")
Ui_MainWindow.printf(window,"当前处于清醒状态")
window.label_10.setText("清醒")
本项目在显示控件里设置了一个窗口,用于实时显示疲劳分数计算结果和判断结果。如图所示,当循环判断150帧中Perclos模型得分超过0.38时,判为疲劳状态,并显示字符串“当前处于疲劳状态”进行提醒。否则,输出字符串“当前处于清醒状态”。该阈值预设为0.38,可根据不同的需求进行手动调节,以使算法获得不同的疲劳判断灵敏度。
五、总结及源码获取
1、总结
2、项目资源获取(YOLOv8/YOLOv7/YOLOv5版本均可提供)
项目内容:包含完整word版本说明文档,可用于写论文、课设报告的参考。资源获取:
获取整套代码、测试视频、训练好的权重、说明文档和相应的目标检测数据集(有偿)
上交硕士,技术够硬,也可以指导深度学习毕设、大作业等。