简介这是一套面向计算机相关专业学生与项目实战学习者的疲劳驾驶检测识别毕业设计资源基于YOLOv5目标检测框架实现可直接用于毕设、课程设计或期末大作业。项目经导师指导并通过评审评分达97分代码经过严格调试确保可运行。压缩包共93个文件约136.48MB以31个Python源码、24个YAML配置、14个编译文件为主另含模型权重、人脸关键点数据、演示视频、说明文档与依赖清单覆盖训练、测试、推理及可视化全流程。资源包含完整项目源码、预训练模型与使用说明目录中可见训练脚本、检测脚本、模型配置与工具模块便于读者理解YOLOv5工程结构、掌握数据配置与模型推理方法并在此基础上完成功能扩展或二次开发。目前已有974人学习下载适合需要快速搭建可运行疲劳驾驶检测系统、积累项目经验的学习者参考。1. 从一次翻车现场说起这套 YOLOv5 疲劳驾驶检测资源到底能干什么去年帮一个学弟看毕设他跑的是网上随便找的疲劳驾驶检测代码结果在答辩现场被老师问了一句「你这个闭眼判定阈值怎么来的」直接卡壳。后来我拆了这套基于 YOLOv5 的疲劳驾驶检测识别项目发现它把数据集标注、模型训练、推理判定、GUI 演示整条链路都串起来了不是那种只丢一个detect.py的半成品。它解决的核心问题是把「眼睛闭合、打哈欠、低头」这些疲劳特征用目标检测的方式做成可训练、可复现、可演示的完整工程。适合正在做毕业设计、课程设计或者想拿一个真实视觉项目练手 YOLOv5 全流程的人。你拿到的不只是权重文件而是一套能改、能训、能讲清楚原理的源码包。2. 拆开压缩包先看什么目录结构与技术栈选型理由2.1 资源里到底有什么别急着双击运行拿到一个 zip很多人的第一反应是找requirements.txt然后pip install这没错但更稳妥的做法是先花五分钟把目录结构过一遍。这套资源的典型组织方式大致是这样根目录下会有data、models、utils、weights、runs这几个文件夹外加train.py、detect.py、requirements.txt和一份使用说明文档。data里放的是数据集配置 yaml 和标注文件models里是 YOLOv5 的网络结构定义weights里通常已经附带了一个训练好的.pt权重runs是训练和推理的输出目录。先确认三件事权重文件在不在、数据集标注格式是不是 YOLO 格式、requirements.txt里锁的 torch 版本是多少。这三件事决定了你是「开箱能跑」还是「要重新训」。我一般会先执行一条命令看目录树比在文件管理器里点来点去快得多# 查看项目两级目录结构快速定位关键文件 find . -maxdepth 2 -type d | sort # 确认权重和配置文件是否存在 ls -lh weights/ data/ models/ 2/dev/null第一行find把两层目录列出来你能一眼看到有没有runs/train这种训练产物目录第二行ls确认权重文件大小正常 YOLOv5s 的权重在 14MB 左右如果只有几百 KB 那多半是没下完或者是个占位文件。这一步能帮你避开「以为有模型结果跑起来报找不到权重」的坑。2.2 为什么是 YOLOv5 而不是分类网络疲劳检测本质上可以拆成两个技术路线一种是分类把眼睛区域裁出来判断睁闭另一种是检测直接框出眼睛、嘴巴、人脸再基于框的状态做逻辑判定。这套资源选的是后者用 YOLOv5 做多类别目标检测。选型理由很实际分类网络需要你先做人脸关键点检测再裁剪链路长、误差会累积而检测模型一步到位把「睁眼、闭眼、张嘴、闭嘴」当成不同类别来训推理时直接拿到框和类别后处理逻辑清晰。YOLOv5 相比 v8 或更早的 v3在这个场景下的优势是工程成熟度高、配置文件直观、社区踩坑资料多。它的hyp.scratch-low.yaml超参数文件对新手友好学习率、动量、权重衰减都给了合理默认值。你要改的无非是类别数nc和类别名names以及数据集的路径。对于毕设这种时间紧、要求能演示的场景选一个「文档全、报错能搜到」的框架比选一个「论文新」的框架更划算。2.3 环境配置conda 建环境比裸 pip 稳热词里「yolov5环境配置」和「conda yolov5」出现频率很高说明环境这一步卡了不少人。我的建议是永远用 conda 建独立环境不要往 base 里装。原因很简单YOLOv5 对 torch 版本敏感不同版本之间 API 有变动裸 pip 装出来的依赖冲突排查起来是黑匣子。# 创建独立环境python 版本按 requirements 里的来一般 3.8 或 3.9 conda create -n fatigue python3.8 -y conda activate fatigue # 先装 torch注意 CUDA 版本要和显卡驱动匹配 pip install torch1.13.1 torchvision0.14.1 --index-url https://download.pytorch.org/whl/cu117 # 再装项目其余依赖 pip install -r requirements.txt这里torch单独装是因为requirements.txt里往往只写torch1.7pip 会给你拉最新版而最新版可能和你显卡驱动不匹配。--index-url指定 CUDA 11.7 的 wheel 源你要根据自己的nvidia-smi输出改。装完跑一句python -c import torch; print(torch.cuda.is_available())返回True才算环境通了。返回False的话要么是驱动太旧要么是装成了 CPU 版别急着往下走。3. 数据集准备与标注YOLO 格式转换和四个容易翻车的地方3.1 疲劳检测数据集长什么样这套资源配套的数据集一般包含两类场景白天正常光照和夜间红外或弱光。类别通常定义为open_eye、closed_eye、open_mouth、closed_mouth有的还会加face和yawn。标注格式是 YOLO 的 txt每行五个值class_id x_center y_center width height全部归一化到 0 到 1 之间。如果你要自己补充数据常见做法是用 labelImg 或 roboflow 标注后导出 YOLO 格式。这里有个血泪经验标注时框要贴紧目标边缘但不要框到眉毛或下巴否则模型会把「眉毛下垂」误判成闭眼。闭眼和睁眼的边界样本半睁半闭尽量少标或者单独归一类不然模型学出来的决策边界会很模糊。3.2 数据集配置文件怎么写YOLOv5 靠一个 yaml 文件告诉训练脚本去哪找图片、类别有几个、类别名叫什么。这个文件通常放在data目录下名字类似fatigue.yaml。# data/fatigue.yaml path: ../datasets/fatigue # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 nc: 4 # 类别数必须和标注里的 class_id 最大值对应 names: # 类别名顺序必须和标注时的 id 一致 0: open_eye 1: closed_eye 2: open_mouth 3: closed_mouthnc这个参数是最容易翻车的地方。如果你标注时用了 0 到 3 四个类别但nc写了 5训练不会报错但模型会多学一个永远没有正样本的类别导致 loss 异常。反过来nc写小了超出范围的标注会被忽略。改完 yaml 后我习惯用一段脚本快速校验标注文件和类别数是否对得上import os, glob # 统计所有标注文件里出现过的 class_id ids set() for txt in glob.glob(datasets/fatigue/labels/train/*.txt): with open(txt) as f: for line in f: if line.strip(): ids.add(int(line.split()[0])) print(标注中出现的类别 id:, sorted(ids)) print(yaml 中定义的类别数: 4) # 如果 ids 里有大于 3 的值说明标注和配置不一致必须先修这段脚本遍历训练集所有标注文件把出现过的class_id收集起来。如果输出里有 4 或更大的数字说明标注时类别 id 乱了得回去改标注或者调整nc。这个检查花不了十秒但能省掉一次几小时的无效训练。3.3 训练集验证集划分的坑很多人随手按 8:2 分结果同一段视频的连续帧被分到了训练集和验证集两边。这样验证集准确率会虚高因为模型在训练时见过几乎一样的画面。正确做法是按视频或按人划分同一个人或同一段视频的帧只能出现在一边。资源里如果已经分好了你至少要看一眼文件名确认不是简单的奇偶交替。4. 训练与推理超参数怎么调、模型怎么跑起来4.1 启动训练命令与关键参数YOLOv5 的训练入口是train.py最简命令就一行但里面每个参数都影响结果。# 基于预训练权重做迁移学习适合数据集不大的情况 python train.py \ --weights yolov5s.pt \ --data data/fatigue.yaml \ --epochs 100 \ --batch-size 16 \ --img-size 640 \ --cfg models/yolov5s.yaml \ --hyp data/hyps/hyp.scratch-low.yaml \ --name fatigue_exp--weights yolov5s.pt表示从官方预训练权重开始而不是随机初始化。疲劳检测数据集通常几千到几万张从零训很难收敛迁移学习是标配。--batch-size要根据显存调8G 显存跑 640 尺寸大概能上 16爆显存就降到 8。--img-size设 640 是 YOLOv5 的默认值如果你眼睛区域在画面里很小可以提到 1280但显存和速度会成倍变化。--hyp指定超参数文件hyp.scratch-low.yaml适合小数据集数据量大可以换hyp.scratch-high.yaml。训练过程中重点看三个指标box_loss、obj_loss、cls_loss。正常情况三个 loss 都应该是下降趋势。如果cls_loss一直不降多半是类别标注有问题如果obj_loss震荡剧烈可能是学习率太大或者 batch size 太小。训练日志会实时打印别训上就不管了前 10 个 epoch 盯一下曲线能提前发现大问题。4.2 推理脚本与疲劳判定逻辑训练完得到best.pt接下来是推理。资源里一般会提供一个封装好的检测脚本核心是加载模型、逐帧推理、根据检测框做疲劳判定。import cv2 import torch from models.experimental import attempt_load from utils.general import non_max_suppression # 加载训练好的权重 model attempt_load(runs/train/fatigue_exp/weights/best.pt, map_locationcpu) model.eval() # 疲劳判定计数器 closed_eye_frames 0 yawn_frames 0 EYE_THRESHOLD 15 # 连续闭眼帧数阈值 YAWN_THRESHOLD 10 # 连续张嘴帧数阈值 cap cv2.VideoCapture(0) # 0 表示摄像头也可以传视频路径 while cap.isOpened(): ret, frame cap.read() if not ret: break # 预处理resize、归一化、转 tensor img cv2.resize(frame, (640, 640)) img img[:, :, ::-1].transpose(2, 0, 1) # BGR 转 RGB 并调整维度 img torch.from_numpy(img.copy()).float() / 255.0 img img.unsqueeze(0) # 推理 NMS pred model(img)[0] pred non_max_suppression(pred, conf_thres0.4, iou_thres0.5) # 统计当前帧的闭眼和张嘴 has_closed_eye False has_yawn False for det in pred: if det is not None: for *xyxy, conf, cls in det: cls_id int(cls) if cls_id 1: # closed_eye has_closed_eye True if cls_id 2: # open_mouth张嘴持续即视为打哈欠 has_yawn True # 帧计数逻辑 closed_eye_frames closed_eye_frames 1 if has_closed_eye else 0 yawn_frames yawn_frames 1 if has_yawn else 0 # 触发报警 if closed_eye_frames EYE_THRESHOLD or yawn_frames YAWN_THRESHOLD: cv2.putText(frame, FATIGUE ALERT, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 3) cv2.imshow(Fatigue Detection, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()这段代码的关键在EYE_THRESHOLD和YAWN_THRESHOLD两个参数。它们不是拍脑袋定的而是根据摄像头帧率换算的。假设摄像头 30 帧每秒人正常眨眼一次闭眼大约 0.1 到 0.4 秒也就是 3 到 12 帧。如果你把阈值设成 5那正常眨眼就会报警这叫误报。设成 15 大约对应 0.5 秒持续闭眼更接近疲劳状态。张嘴同理打哈欠通常持续 1 秒以上。这两个值需要你用自己的摄像头实测调整没有万能数字。conf_thres0.4是置信度阈值低于这个值的框会被丢掉。调高会漏检调低会误检。iou_thres0.5是 NMS 的 IoU 阈值控制重叠框的合并程度。这两个参数在detect.py里也能通过命令行传不用改代码。4.3 用视频文件验证而不是只靠摄像头调试阶段我强烈建议先用一段录好的视频跑而不是直接开摄像头。原因是你没法控制摄像头前的人做什么动作而视频可以反复播放同一段疲劳片段来验证阈值。把cv2.VideoCapture(0)改成cv2.VideoCapture(test_fatigue.mp4)跑一遍看报警时机对不对。确认逻辑没问题了再切回摄像头做实时演示。这个顺序能帮你把「模型检测问题」和「判定逻辑问题」分开排查。5. 避坑与排查那些让毕设卡三天的常见问题5.1 报错No labels found或训练时nc不匹配现象是训练启动后立刻报找不到标签或者 loss 计算时维度对不上。原因通常是data/fatigue.yaml里的train路径写的是相对路径但训练脚本的工作目录和你以为的不一样。YOLOv5 的路径解析是相对于path字段的不是相对于 yaml 文件位置。解决方法是把path写成绝对路径或者用--data传参时确认当前终端所在目录。另一个可能是标注文件不是.txt而是.xmlYOLOv5 只认 YOLO 格式的 txt。5.2 显存爆了CUDA out of memory现象是训练跑几个 batch 后报显存不足。原因不一定是 batch size 太大也可能是--img-size设太高或者开了--cache把图片全缓存进内存。解决顺序是先把--batch-size减半不行再降--img-size到 416还不行就去掉--cache参数。另外检查是不是有其他进程占着显存nvidia-smi看一眼就清楚。5.3 推理时检测框乱飞或类别全错现象是模型能出框但类别明显不对比如睁眼被标成闭嘴。原因大概率是训练时的类别顺序和推理时读取的顺序不一致。YOLOv5 的类别名存在权重文件里但如果你推理脚本里自己写了一套names列表顺序必须和训练时 yaml 里的完全一致。解决方法是直接从模型里读model.names不要手写。另一个可能是权重文件加载错了比如加载了last.pt而不是best.ptlast.pt是最后一个 epoch 的可能过拟合。5.4 摄像头画面延迟高、卡顿现象是实时检测时画面一顿一顿的报警延迟明显。原因是每帧都在做完整推理而 CPU 推理速度跟不上。解决方法是确认torch.cuda.is_available()为True把模型和输入 tensor 都.to(cuda)。如果只能用 CPU那就把--img-size降到 320或者跳帧推理比如每三帧检测一次中间帧沿用上一次结果。毕设演示场景下跳帧是性价比最高的优化。5.5 疲劳报警太频繁或从来不报现象是正常眨眼就报警或者明明闭眼很久也不报。原因就是第 4 章说的阈值问题。解决方法是先用一段已知疲劳状态的视频跑打印每帧的closed_eye_frames和yawn_frames数值观察正常眨眼时计数到多少、真实疲劳时计数到多少然后在两者之间取一个值。这个过程没有捷径必须实测。我一般会把计数过程打到终端日志里方便回看。6. 进阶技巧把检测结果做成可解释的疲劳评分6.1 从二值报警到连续评分基础的疲劳检测只有「报警」和「不报警」两个状态答辩时容易被问「疲劳程度怎么量化」。一个实用的进阶做法是把帧计数转成连续评分。比如定义一个疲劳分数fatigue_score闭眼帧数每超过阈值一帧加 2 分张嘴帧数每超过阈值一帧加 1 分分数超过 100 触发报警。这样你能在界面上显示一个进度条直观展示疲劳累积过程。# 连续疲劳评分逻辑 fatigue_score 0 DECAY 0.95 # 每帧衰减系数防止分数只增不减 while True: # ... 前面的检测逻辑不变 ... if has_closed_eye: fatigue_score 2 if has_yawn: fatigue_score 1 # 没有疲劳特征时分数缓慢衰减 if not has_closed_eye and not has_yawn: fatigue_score * DECAY # 限制分数范围 fatigue_score min(fatigue_score, 150) # 显示评分 cv2.putText(frame, fScore: {int(fatigue_score)}, (50, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) if fatigue_score 100: cv2.putText(frame, FATIGUE ALERT, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 3)DECAY这个衰减系数是关键。如果不加衰减分数会一直累积最后永远报警。0.95 表示每帧乘以 0.95大约 14 帧后衰减到一半对应半秒左右的恢复时间。这个值可以根据你的帧率调帧率高就调小一点帧率低就调大。评分机制的好处是答辩时你能解释「为什么这个时刻报警」——因为分数累积超过了阈值而不是某个瞬间的误检。6.2 用验证集跑一遍 mAP 再交付训练完不要只看训练日志里的 loss一定要用验证集跑一次评估拿到 mAP0.5 和 mAP0.5:0.95 两个指标。命令是python val.py --weights best.pt --data data/fatigue.yaml --img-size 640。mAP0.5 反映的是框得准不准疲劳检测场景下 0.85 以上算可用。如果低于 0.7优先检查验证集标注质量而不是急着调模型。我见过太多人 mAP 低就换模型、加数据增强最后发现是验证集里有几张标注框全错的图片。6.3 导出 ONNX 做跨平台部署如果毕设要求部署到树莓派或边缘设备PyTorch 权重直接跑会很慢。常见做法是导出 ONNX 再用 ONNX Runtime 推理。YOLOv5 自带导出脚本python export.py --weights best.pt --include onnx --img-size 640。导出后在目标设备上装onnxruntime就能跑速度比 PyTorch CPU 推理快不少。注意导出时的--img-size要和推理时一致否则输入维度对不上会报错。从那以后我每次拿到一个新的检测项目都强制先跑一遍验证集评估再动任何代码因为数据问题永远比模型问题更常见。希望这套资源和这份拆解能帮你把毕设顺利跑通。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
Substrate框架解析:从核心设计到节点搭建实操指南 1. 从“substrate”这个词说起:它到底是什么,能解决什么问题第一次听到“substrate”这个词,很多人会以为是生物学里的“底物”或者材料学里的“基材”。但在技术圈,尤其是做系统开发、区块链底层、甚至云原生基础设施的人眼里&am… · 2026/9/26 5:02:16
LL(1)语法分析器C++实战实现与工程化改造 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 5:02:16
md文件怎么编辑?改个错字不用开一百兆的软件,三种方式按顺手排 现在,md文件,双击就能看了。如果发现第三段有个错字、表格里填错一个数,多数人的做法是:关掉阅读窗口,开Typora或VS Code,等加载,改两个字,保存,切回来再看排版对不对。 … · 2026/9/26 5:02:16
飞鸟云邀请码获取指南:从注册机制到激活避坑全解析 1. 从一枚邀请码说起:飞鸟云到底在火什么最近“飞鸟云邀请码”这个词的热度一路走高。说实话,做这个领域的内容这么久,我明显感觉到邀请码这种模式已经从小众圈子的“暗号”变成了大众眼里的“入场券”。飞鸟云不是第一个这么玩的,… · 2026/9/26 5:39:33
GIF制作零基础教程:视频转GIF到逐帧动画,参数调优与避坑指南 前几天有个朋友发来一段产品演示视频,问怎么发到工作群里最方便。我还没来得及说“直接传视频”这句话,他又跟了一句:“网上都说用GIF,但我感觉是不是得装PS啊?听着就麻烦。”我把那段视频丢进在线转换工具,… · 2026/9/26 5:39:33
JavaEE仓库管理系统实战:Servlet+Oracle从环境搭建到避坑指南 简介:这是一套面向高校学生与Java Web进阶学习者的仓库管理系统完整项目资料,可作为毕业设计、课程设计、大作业或工程实训的参考方案,帮助解决从需求分析到系统落地的全流程问题。系统基于JavaEE与Oracle实现,涵盖入库、出库、商… · 2026/9/26 5:39:33
Win10系统迁移实战:SSD与移动硬盘启动全指南 1. 这不是重装系统,是“系统搬家”——Win10迁移的本质与现实痛点你买了一块新SSD,想把旧电脑里用了三年、装满工作资料、调好所有软件、连输入法皮肤都配好的Win10系统原样搬过去?不是重装,不是重装,不是重装。重点来… · 2026/9/26 5:39:33
SISO LTE下行链路与系统级仿真:从BLER曲线到多小区调度 简介:本资源面向通信工程、无线网络方向的学习者与研究者,提供LTE下行链路系统级仿真的完整代码实现,帮助理解从eNodeB到UE的物理层处理、信道建模、资源分配与多用户调度等核心机制。压缩包共40个文件,全部为m脚本文件࿰… · 2026/9/26 5:39:15
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46