基于 YOLOv8 的口罩佩戴检测系统(全套源码+数据集)
@开发日期:2026年
项目简介
本项目以深度学习目标检测为核心,完整覆盖「数据集构建与处理 → 模型训练与调优 → 系统集成与功能开发」的全流程,最终交付一套可直接部署使用的口罩佩戴检测系统。系统基于 YOLOv8 实现实时口罩状态识别,支持图片、视频、摄像头三种输入来源,并提供美观的 PyQt6 图形界面。
目录
一、数据集说明


1.1 数据集概览
| 项目 | 数值 |
|---|---|
| 总图片数 | 577 张 |
| 有效标注图片 | 479 张 |
| 无目标图片(负样本) | 98 张 |
| 总标注框数 | 1259 个 |
| 数据集大小 | 约 61.4 MB |
1.2 类别定义
| class_id | 类别名称 | 含义 | 标注数 | 占比 |
|---|---|---|---|---|
| 0 | with_mask |
已佩戴口罩 | 529 | 42.0% |
| 1 | without_mask |
未佩戴口罩 | 730 | 58.0% |
类别轻微不均衡(未戴口罩略多),训练时通过数据增强与样本权重策略缓解。
1.3 标注格式
采用标准 YOLO 格式,每行一个目标框:
<class_id> <x_center> <y_center> <width> <height>
所有坐标均为相对图片尺寸的归一化值(0~1),图片与标注文件同名配对。
1.4 数据集特点
- 场景多样:室内外、不同光照、人群密度均有覆盖
- 目标尺度差异大:单人特写到多人群体,单张最多含 41 个标注框
- 含负样本:约 17% 的图片为纯背景,有效降低误检率
- 平均密度:有效图片平均每张含 2.63 个目标
1.5 数据集划分
训练前将原始数据集按 8 : 1 : 1 比例划分,固定随机种子保证可复现:
| 子集 | 比例 | 数量(约) |
|---|---|---|
| 训练集 (train) | 80% | 461 张 |
| 验证集 (val) | 10% | 58 张 |
| 测试集 (test) | 10% | 58 张 |
划分结果自动保存至 train_result/data/,并生成 data.yaml 配置文件。
二、模型训练与调优
2.1 深度学习开发流程
原始数据集
↓ 数据清洗 & 格式验证
标注文件审查(过滤空标注、异常框)
↓ 数据集划分(8:1:1)
train / val / test 子集
↓ 生成 data.yaml
YOLOv8 训练配置
↓ 预训练权重迁移学习
模型训练(88 Epoch)
↓ 指标监控 & 早停
最优权重 best.pt
↓ 系统集成
PyQt6 图形化检测应用
2.2 基础模型
采用 YOLOv8n(Nano 轻量级版本)作为基础网络,在 ImageNet 预训练权重基础上进行迁移学习,针对口罩检测二分类任务进行微调。YOLOv8 采用无锚点(Anchor-Free)设计,解耦检测头提升分类与定位精度。
2.3 训练超参数
| 参数 | 值 | 说明 |
|---|---|---|
| 预训练权重 | yolov8n.pt |
ImageNet 预训练,迁移学习 |
| 输入分辨率 | 640 × 640 | 标准输入尺寸 |
| 训练轮数 | 100(实际 88 轮早停) | 早停耐心值 20 |
| 批次大小 | 16 | 适配 12GB 显存 |
| 优化器 | AdamW | 自适应学习率 + 权重衰减 |
| 初始学习率 | 0.01 | |
| 学习率调度 | 余弦退火(Cosine LR) | 平滑收敛 |
| 预热轮数 | 3 | Warmup 阶段 |
| 权重衰减 | 0.0005 | L2 正则化 |
| 混合精度训练 | FP16(AMP) | 加速训练、节省显存 |
| 训练设备 | NVIDIA RTX 3060 12GB |
2.4 训练过程描述
- Warmup 阶段(Epoch 1-3):学习率从极小值线性增大至初始值,防止梯度爆炸
- 快速收敛阶段(Epoch 4-30):损失快速下降,mAP 从接近 0 提升至 0.67+
- 稳定优化阶段(Epoch 30-68):模型精细调整,mAP50 持续提升至 0.86+
- 早停触发(Epoch 88):验证集 mAP 连续 20 轮无显著提升,训练自动停止
三、训练指标说明
3.1 最终性能指标
| 指标 | 最优值 | 达到轮次 |
|---|---|---|
| mAP@0.5 | 0.8684 | Epoch 82 |
| mAP@0.5:0.95 | 0.4960 | Epoch 68 |
| Precision(精确率) | 0.8824 | Epoch 74 |
| Recall(召回率) | 0.8840 | Epoch 81 |
3.2 指标含义
| 指标 | 含义 |
|---|---|
| Precision(精确率) | 预测为某类别的结果中,真正正确的比例。精确率高表示误检少 |
| Recall(召回率) | 所有真实目标中,被成功检测出的比例。召回率高表示漏检少 |
| mAP@0.5 | 在 IoU 阈值 = 0.5 时的平均精度均值,是目标检测的核心指标 |
| mAP@0.5:0.95 | 在 IoU 阈值从 0.5 到 0.95(步长 0.05)取平均,评估定位精度更严格 |
| Box Loss | 边界框回归损失,衡量预测框与真实框的位置偏差 |
| Cls Loss | 分类损失,衡量类别预测的误差 |
| DFL Loss | Distribution Focal Loss,YOLOv8 特有的分布式焦点损失,提升边界框定位精度 |
四、可视化图含义
4.1 独立图表(visualize.py 生成)
训练结束后,运行 python visualize.py 可在 train_result/train/charts/ 生成以下 8 张图表:
| 文件名 | 内容 | 解读要点 |
|---|---|---|
loss_box.png |
Box Loss(训练集 vs 验证集) | 两条线持续下降且趋势接近,说明模型定位能力稳定提升,无过拟合 |
loss_cls.png |
Classification Loss(训练集 vs 验证集) | 验证集分类损失下降并趋于平稳,表明模型对两类口罩状态的区分能力良好 |
loss_dfl.png |
DFL Loss(训练集 vs 验证集) | YOLOv8 特有损失,反映分布式边界框精度,收敛说明定位分布预测趋于准确 |
metric_precision.png |
Precision 变化曲线 | 精确率从低到高逐渐提升并趋于稳定,最终达到 0.882 |
metric_recall.png |
Recall 变化曲线 | 召回率随训练增大,最终达到 0.884,说明漏检率持续降低 |
metric_mAP50.png |
mAP@0.5 变化曲线 | 目标检测核心指标,最终收敛至 0.868,是评估模型综合性能的主要依据 |
metric_mAP50_95.png |
mAP@0.5:0.95 变化曲线 | 严格精度指标,最终达到 0.496,反映模型对精确定位的能力 |
lr_schedule.png |
学习率调度曲线 | 展示余弦退火策略:Warmup 预热后从峰值逐步平滑衰减至接近 0,有助于模型后期精细收敛 |
各图均标注最优点位,并展示原始曲线与平滑曲线,便于排除随机噪声干扰、观察真实趋势。








4.2 系统内嵌可视化(指标展示页)
系统界面的「指标展示」页内嵌三个可交互的可视化 Tab,无需额外运行脚本,启动系统后即可查看:
| Tab | 图表类型 | 内容说明 |
|---|---|---|
| 📈 训练曲线 | 四联子图(折线) | 训练损失、验证损失(带平滑)、mAP 双线、Precision/Recall 双线,完整还原训练全过程 |
| 📊 指标汇总 | 统计卡片 + 柱状图 | 4 个大卡片展示最优 mAP@0.5、mAP@0.5:0.95、Precision、Recall,下方柱状图直观对比四项指标 |
| 🎯 性能雷达 | 雷达图 + 面积折线图 | 左侧:以 Precision、Recall、mAP@0.5、F1 Score、mAP@0.5:0.95 五个维度绘制综合性能雷达图,多层发光填充直观反映模型综合水平;右侧:四条指标进化曲线(含面积填充与原始噪声线),展示各指标随训练轮次的动态演变,最优点以高亮圆点标注 |
五、系统功能介绍
5.1 登录 / 注册模块
- 渐变深色背景登录界面,支持账号注册与密码验证
- 用户信息以 JSON 文件本地持久化,默认账号
admin / admin123

5.2 图片识别
- 支持 JPG / PNG / BMP / WebP 等格式图片的本地导入
- 运行 YOLOv8 推理,在图片上绘制检测框与置信度标签
- 展示统计摘要(总检测数、类别数、平均/最高置信度)
- 提供置信度分布直方图
- 支持导出标注结果图片与 CSV 明细

5.3 视频识别
- 支持 MP4 / AVI / MOV / MKV 等格式视频文件
- 多线程逐帧检测,可设置「每 N 帧检测一次」降低计算压力
- 实时显示标注画面与当前帧统计,累计统计各类别目标数
- 支持导出当前帧截图
5.4 摄像头识别
- 支持选择本地摄像头设备(索引 0~10)
- 实时采集画面并叠加检测结果,检测功能可随时开关
- 支持截图保存(自动保存至
train_result/screenshots/) - 会话结束后可一键将统计数据归档至检测历史
5.5 检测历史
- 所有检测结果自动以 SQLite 数据库持久化
- 支持按类型(图片 / 视频 / 摄像头)筛选与关键词搜索
- 点击记录查看完整详情,支持导出 CSV 与一键清空

5.6 模型管理
- 默认加载训练产物
train_result/train/weights/best.pt - 支持手动选择任意
.pt/.onnx模型文件 - 可调节置信度阈值(Conf)、IoU 阈值、最大检测数
- 模型加载状态实时反馈,展示类别列表与模型信息

5.7 指标展示
- 自动读取
train_result/train/results.csv,支持随时重新加载 - 训练曲线:4 个子图(训练损失、验证损失平滑、mAP 双线、Precision/Recall)
- 指标汇总:4 个大卡片展示最优指标 + 柱状图四项对比
- 性能雷达:左侧五维雷达图综合评估模型性能;右侧指标进化面积曲线展示各指标随训练轮次的动态演变,最优点高亮标注



六、技术栈
| 层次 | 技术 | 用途 |
|---|---|---|
| 深度学习框架 | ultralytics(YOLOv8) |
目标检测模型训练与推理 |
| UI 框架 | PyQt6 |
图形界面开发 |
| 计算机视觉 | opencv-python |
图像/视频读写、绘制检测框 |
| 数值计算 | numpy |
数组运算、图像数据处理 |
| 数据分析 | pandas |
训练日志读取与指标统计 |
| 可视化 | matplotlib |
训练曲线图表、置信度直方图 |
| 数据存储 | SQLite(内置) |
检测历史持久化 |
| 配置文件 | PyYAML |
数据集配置文件生成与读取 |
| 开发语言 | Python 3.9 | 全项目统一语言 |
七、项目结构
口罩检测/
│
├── main.py # 程序入口,启动登录窗口
├── login_window.py # 登录 / 注册窗口
├── main_window.py # 主窗口(侧边栏 + 页面路由)
├── train.py # 模型训练脚本
├── visualize.py # 训练结果可视化脚本
│
├── pages/ # 各功能页面模块
│ ├── image_page.py # 图片识别页
│ ├── video_page.py # 视频识别页
│ ├── camera_page.py # 摄像头识别页
│ ├── history_page.py # 检测历史页
│ ├── model_page.py # 模型管理页
│ └── metrics_page.py # 指标展示页
│
├── utils/ # 工具模块
│ ├── styles.py # QSS 全局样式表
│ ├── detector.py # YOLOv8 检测引擎封装
│ ├── db.py # SQLite 历史数据库管理
│ ├── data_prepare.py # 数据集划分与 YAML 生成
│ └── users.json # 用户账号存储(自动生成)
│
├── datasets/ # 原始数据集(图片 + YOLO 标注)
│ ├── 0.jpg / 0.txt
│ ├── 1.jpg / 1.txt
│ └── ...(577 组)
│
├── yolov8n.pt # YOLOv8 预训练权重
│
├── train_result/ # 训练产物(自动生成)
│ ├── data/ # 划分后的数据集
│ │ ├── train/images|labels
│ │ ├── val/images|labels
│ │ ├── test/images|labels
│ │ └── data.yaml
│ ├── train/ # 训练输出
│ │ ├── weights/
│ │ │ ├── best.pt ← 最优权重(系统默认加载)
│ │ │ └── last.pt
│ │ ├── results.csv ← 训练日志
│ │ ├── charts/ ← 可视化图表(8 张)
│ │ └── ...(混淆矩阵、PR 曲线等)
│ ├── screenshots/ # 摄像头截图(自动生成)
│ └── detection_history.db # SQLite 历史数据库(自动生成)
│
├── 数据集说明.md # 数据集详细说明文档
├── README.md # 本文件
└── requirements.txt # 依赖列表
八、启动教程
8.1 环境要求
- Python 3.9
- CUDA 兼容 GPU(推荐显存 ≥ 8GB,本项目使用 RTX 3060 12GB)
- Windows 10 / 11
8.2 安装依赖
pip install -r requirements.txt
8.3 一键训练(可选,已提供训练权重)
若需自行训练,运行:
python train.py
训练完成后所有产物保存至 train_result/ 目录,最优权重为 train_result/train/weights/best.pt。
8.4 生成可视化图表(可选)
python visualize.py
图表保存至 train_result/train/charts/。
8.5 启动系统
python main.py
- 默认账号:
admin,密码:admin123 - 首次登录后系统自动加载
best.pt模型,即可开始使用
本项目为个人原创,结构清晰,功能完整,适合计算机视觉方向课程设计、毕业设计和项目演示使用。有定制化需求可以评论或私信作者。
作者原创项目地址:michael-jay.pages.dev/projects.html
浙公网安备 33010602011771号