博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅

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、核心代码

#主函数
import sys
import os
from glob import glob
from PySide2 import QtWidgets,QtCore,QtGui
from PySide2.QtWidgets import QMainWindow, QFileDialog, QMessageBox
from PySide2.QtCore import QDir, QTimer,Slot
from PySide2.QtGui import QPixmap,QImage
from ui_mainwindow import Ui_MainWindow
import cv2
import myframe

# 定义变量

# 眼睛闭合判断
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.2
Roll = 0                    #整个循环内的帧技术
Rolleye = 0                 #循环内闭眼帧数
Rollmouth = 0               #循环内打哈欠数

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        # 打开文件类型,用于类的定义
        self.f_type = 0

    def window_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)

# 定义摄像头类
class CamConfig:
    def __init__(self):
        Ui_MainWindow.printf(window,"正在打开摄像头请稍后...")
        # 设置时钟
        self.v_timer = QTimer()
        # 打开摄像头
        self.cap = cv2.VideoCapture(0)
        if not self.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("正在使用摄像头...")
    def show_pic(self):
        # 全局变量
        # 在函数中引入定义的全局变量
        global EYE_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()
        if success:
            # 检测
            # 将摄像头读到的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,以延长循环时间
            for i in lab:
                if(i == "phone"):
                    window.label_6.setText("<font color=red>正在用手机</font>")
                    window.label_9.setText("<font color=red>请不要分心</font>")
                    if ActionCOUNTER > 0:
                        ActionCOUNTER -= 1
                elif(i == "smoke"):
                    window.label_7.setText("<font color=red>正在抽烟</font>")
                    window.label_9.setText("<font color=red>请不要分心</font>")
                    if ActionCOUNTER > 0:
                        ActionCOUNTER -= 1
                elif(i == "drink"):
                    window.label_8.setText("<font color=red>正在喝水</font>")
                    window.label_9.setText("<font color=red>请不要分心</font>")
                    if ActionCOUNTER > 0:
                        ActionCOUNTER -= 1

            # 如果超过15帧未检测到分心行为,将label修改为平时状态
            if ActionCOUNTER == 15:
                window.label_6.setText("手机")
                window.label_7.setText("抽烟")
                window.label_8.setText("喝水")
                window.label_9.setText("")
                ActionCOUNTER = 0
    
            # 疲劳判断
            # 眨眼判断
            if eye < EYE_AR_THRESH:
                # 如果眼睛开合程度小于设定好的阈值
                # 则两个和眼睛相关的计数器加1
                COUNTER += 1
                Rolleye += 1
            else:
                # 如果连续2次都小于阈值,则表示进行了一次眨眼活动
                if COUNTER >= EYE_AR_CONSEC_FRAMES:  
                    TOTAL += 1
                    window.label_3.setText("眨眼次数:" + str(TOTAL))
                    # 重置眼帧计数器
                    COUNTER = 0

            # 哈欠判断,同上
            if mouth > MAR_THRESH: 
                mCOUNTER += 1
                Rollmouth += 1
            else:
                # 如果连续3次都小于阈值,则表示打了一次哈欠
                if mCOUNTER >= MOUTH_AR_CONSEC_FRAMES:  
                    mTOTAL += 1
                    window.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加1
            Roll += 1
            # 当检测满150帧时,计算模型得分
            if Roll == 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时,判断为疲劳状态
                if perclos > 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 = 0
                Rolleye = 0
                Rollmouth = 0
                Ui_MainWindow.printf(window,"重新开始执行疲劳检测...")

def CamConfig_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、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅

点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐