博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅点击查看作者主页,了解更多项目!
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅
2、最全计算机专业毕业设计选题大全(建议收藏)✅
1、项目介绍
技术栈:
python语言、YOLOv8/v7/v5、疲劳检测、分心检测、玩手机、抽烟、喝水检测、Dlib、PySide2、Perclos模型计算疲劳程度
疲劳驾驶检测系统-YOLOv8/YOLOv7/YOLOv5-疲劳检测、分心检测、玩手机、抽烟、喝水检测、眨眼、打哈欠检测提醒
人物专注性检测
该项目为人物专注性检测,分为两个检测部分,疲劳检测和分心行为检测。
疲劳检测部分,使用Dlib进行人脸关键点检测,然后通过计算眼睛和嘴巴的开合程度来判断是存在否闭眼或者打哈欠,并使用Perclos模型计算疲劳程度。
分心行为检测部分,使用Yolov5,检测是否存在玩手机、抽烟、喝水这三种行为。
2、项目界面
(1)使用手机检测提醒
(2)抽烟检测提醒
(3)喝水检测提醒
(4)眨眼、打哈欠检测提醒
3、项目说明
本项目聚焦人物专注性监测需求,核心落地场景为疲劳驾驶检测,通过多技术融合实现对疲劳状态与分心行为的精准识别、实时提醒,为驾驶安全等场景提供技术保障。项目技术栈以 Python 为开发基础,整合 YOLOv5/v7/v8 目标检测算法、Dlib 人脸关键点识别库、PySide2 界面开发框架及 Perclos 疲劳评估模型,可覆盖眨眼、打哈欠等疲劳状态检测,以及玩手机、抽烟、喝水等分心行为识别。
在核心功能实现上,项目分为两大检测模块。疲劳检测模块借助 Dlib 库精准定位人脸 68 个关键点,重点捕捉眼睛与嘴巴区域特征:通过计算眼睛开合度判断是否闭眼,结合嘴巴张合幅度识别打哈欠行为,再引入 Perclos 模型(单位时间内眼睛闭合时间占比)量化疲劳程度,当数值超过设定阈值时触发提醒。分心行为检测模块则基于 YOLOv5 算法,对实时采集的画面进行目标检测,快速识别 “玩手机”“抽烟”“喝水” 三类典型分心动作,检测精度与响应速度可满足实时监测需求。
项目通过 PySide2 搭建直观的可视化界面,界面功能与检测场景深度适配。从界面示例可见,当系统检测到 “玩手机” 行为时,会弹窗显示 “使用手机检测提醒”,同步标注检测目标位置;识别到 “抽烟”“喝水” 动作时,对应提醒弹窗会精准关联行为区域,确保用户快速知晓风险来源;针对 “眨眼、打哈欠” 等疲劳信号,界面会实时反馈检测结果,结合 Perclos 模型数据,让疲劳状态可视化。整体界面操作简洁,检测结果直观,可直接应用于驾驶舱等场景,通过实时预警帮助用户规避因疲劳或分心引发的安全隐患。
4、核心代码
#主函数importsysimportosfromglobimportglobfromPySide2importQtWidgets,QtCore,QtGuifromPySide2.QtWidgetsimportQMainWindow,QFileDialog,QMessageBoxfromPySide2.QtCoreimportQDir,QTimer,SlotfromPySide2.QtGuiimportQPixmap,QImagefromui_mainwindowimportUi_MainWindowimportcv2importmyframe# 定义变量# 眼睛闭合判断EYE_AR_THRESH=0.15# 眼睛长宽比EYE_AR_CONSEC_FRAMES=2# 闪烁阈值# 嘴巴开合判断MAR_THRESH=0.65# 打哈欠长宽比MOUTH_AR_CONSEC_FRAMES=3# 闪烁阈值# 定义检测变量,并初始化COUNTER=0# 眨眼帧计数器TOTAL=0# 眨眼总数mCOUNTER=0# 打哈欠帧计数器mTOTAL=0# 打哈欠总数ActionCOUNTER=0# 分心行为计数器器# 疲劳判断变量# Perclos模型# perclos = (Rolleye/Roll) + (Rollmouth/Roll)*0.2Roll=0#整个循环内的帧技术Rolleye=0#循环内闭眼帧数Rollmouth=0#循环内打哈欠数classMainWindow(QMainWindow,Ui_MainWindow):def__init__(self):super(MainWindow,self).__init__()self.setupUi(self)# 打开文件类型,用于类的定义self.f_type=0defwindow_init(self):# 设置控件属性# 设置label的初始值self.label.setText("请打开摄像头")self.label_2.setText("疲劳检测:")self.label_3.setText("眨眼次数:0")self.label_4.setText("哈欠次数:0")self.label_5.setText("行为检测:")self.label_6.setText("手机")self.label_7.setText("抽烟")self.label_8.setText("喝水")self.label_9.setText("是否存在分心行为")self.label_10.setText("是否为疲劳状态")self.menu.setTitle("打开摄像头")self.actionOpen_camera.setText("打开摄像头")# 菜单按钮 槽连接 到函数self.actionOpen_camera.triggered.connect(CamConfig_init)# 自适应窗口缩放self.label.setScaledContents(True)# 定义摄像头类classCamConfig:def__init__(self):Ui_MainWindow.printf(window,"正在打开摄像头请稍后...")# 设置时钟self.v_timer=QTimer()# 打开摄像头self.cap=cv2.VideoCapture(0)ifnotself.cap:Ui_MainWindow.printf(window,"打开摄像头失败")return# 设置定时器周期,单位毫秒self.v_timer.start(20)# 连接定时器周期溢出的槽函数,用于显示一帧视频self.v_timer.timeout.connect(self.show_pic)# 在前端UI输出提示信息Ui_MainWindow.printf(window,"载入成功,开始运行程序")Ui_MainWindow.printf(window,"")Ui_MainWindow.printf(window,"开始执行疲劳检测...")window.statusbar.showMessage("正在使用摄像头...")defshow_pic(self):# 全局变量# 在函数中引入定义的全局变量globalEYE_AR_THRESH,EYE_AR_CONSEC_FRAMES,MAR_THRESH,MOUTH_AR_CONSEC_FRAMES,COUNTER,TOTAL,mCOUNTER,mTOTAL,ActionCOUNTER,Roll,Rolleye,Rollmouth# 读取摄像头的一帧画面success,frame=self.cap.read()ifsuccess:# 检测# 将摄像头读到的frame传入检测函数myframe.frametest()ret,frame=myframe.frametest(frame)lab,eye,mouth=ret# ret和frame,为函数返回# ret为检测结果,ret的格式为[lab,eye,mouth],lab为yolo的识别结果包含'phone' 'smoke' 'drink',eye为眼睛的开合程度(长宽比),mouth为嘴巴的开合程度# frame为标注了识别结果的帧画面,画上了标识框# 分心行为判断# 分心行为检测以15帧为一个循环ActionCOUNTER+=1# 如果检测到分心行为# 将信息返回到前端ui,使用红色字体来体现# 并加ActionCOUNTER减1,以延长循环时间foriinlab:if(i=="phone"):window.label_6.setText("<font color=red>正在用手机</font>")window.label_9.setText("<font color=red>请不要分心</font>")ifActionCOUNTER>0:ActionCOUNTER-=1elif(i=="smoke"):window.label_7.setText("<font color=red>正在抽烟</font>")window.label_9.setText("<font color=red>请不要分心</font>")ifActionCOUNTER>0:ActionCOUNTER-=1elif(i=="drink"):window.label_8.setText("<font color=red>正在喝水</font>")window.label_9.setText("<font color=red>请不要分心</font>")ifActionCOUNTER>0:ActionCOUNTER-=1# 如果超过15帧未检测到分心行为,将label修改为平时状态ifActionCOUNTER==15:window.label_6.setText("手机")window.label_7.setText("抽烟")window.label_8.setText("喝水")window.label_9.setText("")ActionCOUNTER=0# 疲劳判断# 眨眼判断ifeye<EYE_AR_THRESH:# 如果眼睛开合程度小于设定好的阈值# 则两个和眼睛相关的计数器加1COUNTER+=1Rolleye+=1else:# 如果连续2次都小于阈值,则表示进行了一次眨眼活动ifCOUNTER>=EYE_AR_CONSEC_FRAMES:TOTAL+=1window.label_3.setText("眨眼次数:"+str(TOTAL))# 重置眼帧计数器COUNTER=0# 哈欠判断,同上ifmouth>MAR_THRESH:mCOUNTER+=1Rollmouth+=1else:# 如果连续3次都小于阈值,则表示打了一次哈欠ifmCOUNTER>=MOUTH_AR_CONSEC_FRAMES:mTOTAL+=1window.label_4.setText("哈欠次数:"+str(mTOTAL))# 重置嘴帧计数器mCOUNTER=0# 将画面显示在前端UI上show=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)showImage=QImage(show.data,show.shape[1],show.shape[0],QImage.Format_RGB888)window.label.setPixmap(QPixmap.fromImage(showImage))# 疲劳模型# 疲劳模型以150帧为一个循环# 每一帧Roll加1Roll+=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("<font color=red>疲劳!!!</font>")Ui_MainWindow.printf(window,"")else:Ui_MainWindow.printf(window,"当前处于清醒状态")window.label_10.setText("清醒")Ui_MainWindow.printf(window,"")# 归零# 将三个计数器归零# 重新开始新一轮的检测Roll=0Rolleye=0Rollmouth=0Ui_MainWindow.printf(window,"重新开始执行疲劳检测...")defCamConfig_init():window.f_type=CamConfig()if__name__=='__main__':app=QtWidgets.QApplication(sys.argv)window=MainWindow()window.window_init()window.show()sys.exit(app.exec_())5、项目获取
(绿色聊天软件)yuanmazhiwu 或 biyesheji0005🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅
感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻