文章目录
本系统功能强大!支持对图片、视频、视频流、摄像头中的口罩佩戴情况进行检测,支持多种数据数据源输入并且接入了AI实现了对当前分析结果的评估,欢迎了解!
@项目名称:基于PyQt+YOLO+DeepSeek的口罩佩戴检测系统
@仓库名称:yolov8-mask-detect
@作者:懷淰メ
@主页地址:https://blog.csdn.net/a1397852386
@定制:A1397852386
@开发日期:2026年4月

一.前言
在公共卫生安全需求不断提升与智慧城市建设加速推进的背景下,基于PyQt+YOLO+DeepSeek的口罩佩戴检测系统应运而生。该系统融合了深度学习目标检测技术与智能人机交互能力,利用YOLO模型实现对口罩佩戴状态的高效识别,结合PyQt构建直观友好的可视化界面,并借助DeepSeek模型增强系统在结果分析与智能辅助方面的能力。相较于传统依赖人工巡查的方式,该系统能够实现对公共场所口罩佩戴情况的实时监测与快速预警,不仅显著提升了管理效率,也降低了人为疏漏带来的风险。作为一种集检测、分析与交互于一体的智能化解决方案,它在提升公共安全水平的同时,也为相关领域的技术融合与应用拓展提供了有价值的参考。
二.核心技术&知识
在这章我将要介绍本系统的核心技术。
1.PyQt5
PyQt5 是一套用于创建跨平台桌面应用程序的 Python GUI 工具包,它是 Qt 应用框架的 Python 绑定。通过 PyQt5,开发者可以使用 Python 编写具有现代图形界面的应用程序,支持丰富的控件、信号与槽机制、窗口管理、事件处理等功能。它兼容主流操作系统(如 Windows、macOS 和 Linux),适用于开发各种规模的桌面软件,常与 Qt Designer 配合使用以加快开发效率。
2.YOLOv8
YOLOv8(You Only Look Once version 8)是由 Ultralytics 推出的最新一代实时目标检测模型,属于 YOLO 系列的改进版本。相比前代模型,YOLOv8 在精度、速度和灵活性上都有显著提升,支持目标检测、图像分割、姿态估计等多任务处理。它采用了更加高效的网络结构和训练策略,并提供开箱即用的 Python 接口和命令行工具,适用于边缘设备和云端部署,广泛应用于安防监控、自动驾驶、工业检测等场景。
3.DeepSeek
DeepSeek是由深度求索公司开发的AI大模型助手,作为纯文本模型,我擅长自然语言处理、文档分析和智能对话。当与YOLO(You Only Look Once)实时目标检测系统结合时,可以形成强大的多模态应用架构------YOLO系统负责实时视觉识别和目标检测,快速准确地识别图像或视频流中的物体;而我则对YOLO检测到的结果进行深度语义分析和上下文理解,提供物体属性的详细解读、场景描述、行为分析以及决策建议。这种结合使得计算机视觉的"看到"与AI的"理解"完美融合,可广泛应用于智能监控、自动驾驶、工业质检等领域,实现从视觉感知到智能决策的完整闭环。
4.Sqlite3
本系统使用Sqlite3进行数据的存储与管理。
SQLite3是一种轻量级的嵌入式关系型数据库管理系统,广泛应用于桌面软件、移动应用以及各类嵌入式设备中。与传统的客户端-服务器数据库(如MySQL、PostgreSQL)不同,SQLite3无需独立的数据库服务器进程,整个数据库以单一文件形式存储在本地,应用程序可直接通过库文件进行读写操作。这种架构使其具有部署简单、占用资源少、跨平台性强等显著优势。SQLite3遵循ACID事务特性,能够保证数据的一致性与可靠性,同时支持标准SQL语法,包括表的创建、查询、索引、触发器等常见功能,能够满足中小规模数据管理需求。在性能方面,SQLite3在读操作上表现高效,并通过锁机制实现多线程环境下的基本并发控制。由于其零配置特性和稳定性,SQLite3被广泛集成于Android、iOS等操作系统中,也常用于缓存数据存储、本地日志管理以及离线数据处理等场景。总体而言,SQLite3以其简洁高效的设计理念,在轻量级数据管理领域占据了重要地位。
5.多线程
QThread 是 PyQt5 提供的线程类,主要用于在图形界面程序中安全、高效地执行耗时任务,从而避免主线程阻塞导致界面卡顿或无响应的问题。在典型的GUI应用中,界面渲染与用户交互通常运行在主线程,一旦在该线程中直接执行诸如数据处理、深度学习模型推理、视频流分析或文件读写等耗时操作,就容易造成界面冻结,严重影响用户体验。QThread 的引入正是为了解决这一问题。
通过 QThread,开发者可以将这些计算密集型或IO密集型任务封装到子线程中独立运行,使主线程专注于界面更新与交互响应。同时,QThread 提供了基于信号与槽机制的线程间通信方式,能够在不同线程之间安全地传递数据与状态信息。例如,子线程在完成检测或处理任务后,可以通过发送信号将结果传递给主线程,由主线程负责更新界面控件,从而避免直接跨线程操作UI带来的风险。
此外,QThread 还支持线程的生命周期管理,包括启动、暂停、退出以及资源回收等,使得多线程程序结构更加清晰可控。合理使用 QThread 不仅可以显著提升应用程序的响应速度和运行效率,还能增强系统的稳定性与扩展能力。在涉及实时数据处理、视频监控或智能分析等复杂桌面应用开发场景中,QThread 已成为不可或缺的重要工具。
6.口罩的作用
口罩是一种佩戴于口鼻部位的覆盖物,通常由多层无纺布、熔喷布、棉布或活性炭等材料制成,设计上力求与面部轮廓贴合,同时保证呼吸顺畅。根据使用场景和防护需求,口罩分为多种类型,包括普通的棉布口罩、一次性医用口罩、医用外科口罩、N95/KN95口罩以及活性炭口罩等。它能够物理性地阻挡外界空气中的飞沫、粉尘、花粉、细菌及部分病毒等颗粒物进入呼吸道,同时也能减少佩戴者自身呼出的微生物向外界扩散。口罩的形状多样,常见的有平面折叠式、立体拱形杯式和带呼吸阀的款式,通过耳挂、头带或绑带固定在头部。自20世纪以来,口罩在医疗、工业、日常生活及公共卫生事件中扮演着重要角色,尤其在流感大流行、空气污染严重或传染病暴发期间,成为个人防护的常用装备。正确佩戴时,口罩需要覆盖口鼻并压紧鼻夹,以确保贴合度;使用后通常作为医疗废物或生活垃圾处理,不可随意清洗重复使用(除明确标明的可复用口罩外)。总而言之,口罩是一种结构简单、成本低廉但极为有效的防护用具,广泛应用于医院、工厂、建筑工地、公共交通及家庭等场所。
7.口罩佩戴检测的意义
口罩佩戴检测是计算机视觉在公共安全与健康管理领域中的重要应用之一,主要通过图像识别与深度学习技术,对人脸区域进行分析,从而判断个体是否正确佩戴口罩。该技术通常基于目标检测与分类模型实现,例如利用 YOLO 等算法对图像或视频流中的人脸进行快速定位,并进一步识别口罩的佩戴状态,如规范佩戴、未佩戴或佩戴不规范等。随着深度学习的发展,口罩检测在准确率和实时性方面均取得了显著提升,能够满足复杂环境下的应用需求。
在实际应用中,口罩佩戴检测系统常部署于车站、商场、医院、校园等公共场所,通过摄像头实时采集画面并进行分析,一旦发现异常情况即可发出预警或记录信息,从而辅助管理人员进行高效监管。相比传统人工巡查方式,该技术具有自动化程度高、响应速度快和覆盖范围广等优势。同时,结合智能分析与数据统计功能,还可以对佩戴情况进行趋势分析,为公共卫生决策提供数据支持。总体而言,口罩佩戴检测不仅提升了管理效率,也在降低疾病传播风险方面发挥了积极作用。
1.公共卫生安全防控的现实需求
在人员密集的公共环境中,如地铁、商场、医院等场所,口罩作为基础防护手段,对降低呼吸道疾病传播风险具有重要作用。然而,仅依赖人工监督往往存在覆盖不全面、执行不稳定的问题,难以及时发现未佩戴或佩戴不规范的情况。口罩佩戴检测系统通过引入基于 YOLO 等深度学习算法的视觉识别能力,可以实现对人群状态的实时监测与自动识别,大幅提升防控的持续性与准确性。系统能够在第一时间发现异常并进行提醒或记录,有助于形成更加规范化、常态化的公共卫生管理机制,从而在突发公共卫生事件或日常健康管理中发挥关键支撑作用。
2.提升管理效率与降低人力成本
传统的人工巡查方式在实际运行中存在明显局限,不仅需要大量人力投入,还容易受到疲劳、注意力分散等因素影响,导致监管效果不稳定。特别是在高人流场景下,人工难以实现全天候、高频次的精准监督。口罩佩戴检测系统能够通过自动化视频分析,对监控区域进行不间断检测,大幅减少人工参与程度。同时,系统可以自动记录违规行为、生成统计数据,并与管理平台联动,实现信息的集中管理与快速响应。这种方式不仅显著降低了运营成本,还提升了整体管理效率,使有限的人力资源可以投入到更高价值的工作中,从而实现管理模式的优化升级。
3.推动智能安防与智慧城市建设
口罩佩戴检测系统不仅是单一功能的应用,更是智能安防体系中的重要组成部分。通过与现有监控系统、门禁系统及数据平台的整合,可以构建更加智能化的城市管理网络。借助如 DeepSeek 等智能模型,系统还可以对检测结果进行分析与解释,生成报告并提供决策支持,进一步提升系统的智能化水平。这种多技术融合的应用模式,有助于推动城市治理向数字化、精细化方向发展。同时,该类系统具备良好的扩展性,可拓展至行为识别、人员统计等更多场景,为智慧城市建设提供持续的技术支撑与创新动力。
3.提升公众健康意识与社会治理水平
技术手段的引入不仅改变了管理方式,也在潜移默化中影响公众行为。口罩佩戴检测系统通过实时提醒与可视化反馈,使个体更容易意识到自身行为是否符合规范,从而逐步养成良好的公共卫生习惯。此外,系统所积累的数据还可用于分析不同区域、不同时段的佩戴情况,为政策制定与宣传引导提供依据。相比单纯依赖人工干预,这种"技术+引导"的方式更具持续性和影响力,有助于提升整体社会治理水平。在长期来看,该系统不仅服务于疫情防控,也为构建更加健康、安全、有序的公共环境提供了重要保障。

三.核心功能
1.登录注册
1.登录
软件启动后首先进入登录页面,用户需要输入正确的用户名和密码,经过系统验证后方可使用本系统的正式功能。登录页面整体采用垂直布局,使信息层次清晰、结构简洁,同时在局部区域辅以水平布局,以提升界面的灵活性与可读性。整体设计风格遵循"简约而不简单"的原则,在保证视觉美观的同时,也兼顾操作的直观性与易用性。
在功能实现方面,登录模块的后端采用sqlite3文件型数据库来存储用户信息,包括用户名、密码及相关基础数据。每次用户发起登录请求时,系统都会通过查询数据库进行身份校验,确保输入信息的准确性与安全性,从而实现规范化、标准化的登录流程。
同时,我们设计了统一风格的登录与注册界面,用于展示系统与用户交互所需的全部组件。界面顶部以醒目的标题形式展示系统名称,增强整体识别度与专业性。通过合理布局输入框、按钮及提示信息,使用户在使用过程中能够快速理解操作步骤,从而提升整体使用体验。

2.注册
对于尚未拥有账号的用户,需要先完成注册操作后才能使用系统功能。整体注册流程设计得较为简洁直观,用户只需在登录界面点击"注册"按钮,即可快速跳转至注册窗口,无需复杂的页面切换或额外步骤。在注册界面中,用户需要填写自定义的用户名,并输入两次一致的密码以完成身份信息的确认。这种双重密码输入机制可以有效避免因输入错误而导致的登录失败问题,从而提升系统的可靠性与用户体验。
在用户成功完成注册后,系统还提供了一项便捷的优化设计:自动将刚刚注册的用户名和密码填充到登录界面中。用户无需再次手动输入信息,即可直接进行登录操作。这一设计在一定程度上简化了登录流程路径,减少了重复操作,提高了整体使用效率。同时,该功能也体现了系统在交互细节上的人性化考虑,使用户在首次使用时能够获得更加顺畅和友好的体验。

2.主界面
用户通过输入自己的用户名和密码登录到本系统后进入主界面,主界面内容十分丰富,我来一一介绍:首先软件整体是垂直布局,顶部是系统的标题,从左到右依次展示了系统的作者信息、系统名称、当前时间以及CPU内存占用情况,下方为水平布局,左侧是系统的导航区域,我们设计了windows风格支持展开与收缩的内容导航区域,右侧是内容核心区域,通过点击导航按钮切换展示内容,主界面主要展示了以日期为维度统计的数据、用户信息操作按钮、系统信息、系统环境信息以及实时CPU、内存可视化折线图

3.图像检测界面
1.检测结果展示
用户通过点击左侧导航栏按钮切换到图像检测界面,在此界面支持选择图像进行输入,用户选择完之后被选择的图像会展示在左侧并且展示图像绝对路径信息,用户可以通过点击右侧的"进行检测"按钮对输入的图像数据进行检测,系统会自动调用YOLOv8相关算法根据指定的参数对输入图像内容进行检测,最后将检测结果展示到右侧,这样用户可以通过比对左右图像的区别得到直观的检测结果,系统自动使用红色边框框选出目标区域并且使用红色文字展示出目标类别以及它的置信度,这些参数和展示效果都可以在设置页面进行详细设置。

2.导出检测结果
我们在界面中专门设置了检测结果展示区域,用于集中呈现系统输出的信息。该区域不仅包含检测目标数量的统计展示,还提供了结构清晰的详细检测结果表格。通过这种方式,用户可以直观地查看每一条检测数据,包括目标类别、置信度以及对应位置信息等内容,从而更全面地了解检测情况。整体布局兼顾信息密度与可读性,使数据展示既完整又不显杂乱。
此外,在检测任务完成之后,界面右侧的三个功能按钮会自动由不可用状态切换为可点击状态,避免用户在未生成结果前进行误操作。这三个按钮分别承担不同的功能,其中"导出结果"按钮允许用户将检测数据保存到本地。系统支持多种导出格式,包括Excel、CSV以及TXT,用户可以根据实际需求灵活选择合适的文件类型,以便后续分析或归档使用。以Excel格式为例,导出的文件通常采用表格结构,对应字段清晰排列,便于用户进一步查看与处理数据。

3.可视化展示
然后就是可视化展示,用户可以点击进行可视化按钮,查看对于本次检测的可视化效果,系统内置了四种可视化效果:分别是:目标位置热力图、目标面积占比、置信度分布直方图、检测能力柱状图,这些图标通过不同维度对当前数据进行了可视化展示,更便于用户理解,这里指的一体的是,支持可视化图表进行导出操作,用户可以点击紫色的导出按钮,对当前的可视化效果图表进行导出,生成一张本地的PNG图像文件。

4.AI(DeepSeek)智能分析
在每次检测任务完成并展示检测结果之后,系统为用户提供了一种便捷且智能的交互方式:用户只需点击界面右下角悬浮的机器人图标,即可触发对当前检测结果的深度AI分析功能。系统会自动将本次检测所得到的所有关键信息------包括检测到的目标类别、置信度分数、目标位置坐标、数量统计以及可能存在的异常或遮挡情况等------完整地作为输入传递给后端AI大模型。AI模型接收到这些数据后,会基于其强大的语义理解与逻辑推理能力,对本次检测结果进行多维度的智能评估。评估内容可以包括:检测结果的准确性与可靠性判断、识别结果中可能存在的误检或漏检风险提示、针对当前场景的优化建议、对异常情况的详细解释,甚至能够根据历史检测数据的模式给出趋势分析或预警信息。这一设计不仅使用户无需手动复制或整理检测数据就能获得即时的专业分析反馈,更重要的是,它实现了一种通用化的AI能力接入机制:检测模块与分析模块实现了解耦,任何检测结果都可以以统一格式传递给AI进行分析,而AI的具体分析逻辑可以根据需要灵活替换、升级或定制。这使得系统在未来可以轻松扩展更多智能功能,例如接入不同的大模型、增加多模态分析能力、实现检测策略的自适应调整等,极大地提升了整个系统的可扩展性与智能化水平。
这里是软件的另外一个核心:AI智能分析,我们的目标检测系统接入了DeepSeek大模型,支持对当前检测结果数据进行AI分析,AI会通过不同维度对当前检测结果进行多角度分析,最后生成检测结果分析报告,用户可以根据这个结果对系统进行调整,不断完善系统功能和目标检测准确度!
在AI分析结束后下方会展示一些按钮,用户可以方便地复制结果、导出文本内容、生成PDF报告、重新生成以及关闭,多重的操作方式给于用户了多种选择!

4.视频检测界面
1.视频文件检测
我们的系统支持视频内容中的球体检测,支持输入的视频类型包括:视频文件、视频流以及摄像头,通过识别视频画面的内容对内容中的目标球体进行检测,试试标注与展示,通过相关帧率控制保证了视频的流畅性,用户可以通过比对左右两侧的画面使用肉眼评估当前检测结果,我们的视频检测界面拥有图像检测界面相同的操作功能,这里不多赘述。

2.摄像头内容检测
用户点击"进行检测"按钮之后系统会自动调用摄像头,打开摄像头展示摄像头画面,实时检测目标画面中的球体,通过左右画面比对让用户看到检测结果,这里本人就不露脸啦~
5.系统设置界面
我们的系统是支持简单的参数设置的,具体可以设置目标检测模型、置信度阈值(Conf)、交并比阈值(IOU)、还有一些检测结果控制参数,比如检测框展示、目标类别展示、目标置信度展示,用户可以点击绿色的刷新按钮刷新可用模型,亦可通过点击退出按钮退出系统或者退出登录,本设置页面实现了目标检测参数的灵活配置!

6.关于软件界面
我们使用富文本html的形式展示了软件相关的信息,包括系统用到的相关技术,对于二维的数据使用二维表进行了展示,最底部放置了四个按钮,分别是:关于YOLO、关于软件、关于作者、关于QT,点击之后都会弹出对应的信息提示框,这个页面的作用是让用户更多的了解软件和创作者信息,跨过技术的鸿沟!

四.数据集
本系统所使用的数据集围绕老鼠目标的多场景、多角度、多状态采集构建而成,旨在提升模型在真实环境中的适应性与鲁棒性。数据来源涵盖实验室、仓储区、地下室、户外夜间监控、粮仓、食品加工车间等多类复杂场景,结合不同光照条件、摄像头分辨率、遮挡程度与背景干扰,使模型能够学习到多样化的外观特征与环境变化。图像中包含站立、奔跑、觅食、半遮挡、远距离、小尺寸目标等多种姿态,并覆盖不同体型、颜色与运动模糊情况下的老鼠样本。数据集中不仅包含清晰标注的边界框,还对类别与置信度进行了严格校验,以确保训练时标签可信度和质量的一致性。经过清洗、去重、增强与格式化处理后,最终数据集能够满足 YOLOv8 等高性能检测模型的训练需求,使模型在实际部署中具备更强的泛化能力,即便在光照不足、目标部分遮挡或背景复杂的情况下,也能保持稳定识别效果。该数据集为系统实现高精度、高实时性的老鼠检测奠定了坚实基础。
1.数据准备
本系统附带1200张口罩佩戴and未佩戴的图像和1200个数据标注文件,大家可以根据自己的情况自行训练数据自己的模型!


我们使用VOC的格式存储数据标注文件,单数据标注文件内容如下:
bash
<annotation>
<folder>set7</folder>
<filename>000b7b75-1600.jpg</filename>
<path>G:\MaskDetect\datasets\set7\000b7b75-1600.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>1600</width>
<height>900</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>mask</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1</xmin>
<ymin>263</ymin>
<xmax>104</xmax>
<ymax>373</ymax>
</bndbox>
</object>
<object>
<name>mask</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>74</xmin>
<ymin>183</ymin>
<xmax>176</xmax>
<ymax>291</ymax>
</bndbox>
</object>
<object>
<name>nomask</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>301</xmin>
<ymin>151</ymin>
<xmax>416</xmax>
<ymax>243</ymax>
</bndbox>
</object>
<object>
<name>mask</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>514</xmin>
<ymin>146</ymin>
<xmax>591</xmax>
<ymax>218</ymax>
</bndbox>
</object>
<object>
<name>mask</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>614</xmin>
<ymin>133</ymin>
<xmax>726</xmax>
<ymax>208</ymax>
</bndbox>
</object>
<object>
<name>mask</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>601</xmin>
<ymin>256</ymin>
<xmax>719</xmax>
<ymax>356</ymax>
</bndbox>
</object>
<object>
<name>mask</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>201</xmin>
<ymin>256</ymin>
<xmax>376</xmax>
<ymax>423</ymax>
</bndbox>
</object>
<object>
<name>mask</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>779</xmin>
<ymin>253</ymin>
<xmax>909</xmax>
<ymax>368</ymax>
</bndbox>
</object>
<object>
<name>mask</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1236</xmin>
<ymin>306</ymin>
<xmax>1374</xmax>
<ymax>448</ymax>
</bndbox>
</object>
<object>
<name>nomask</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1024</xmin>
<ymin>178</ymin>
<xmax>1131</xmax>
<ymax>276</ymax>
</bndbox>
</object>
</annotation>
2.数据集处理
1.数据集标注文件类型转换
直接使用VOC格式的数据标注文件进行训练是不行的,需要我们将xml转成txt文件,
这段代码的作用是将指定文件夹中的 Pascal VOC 格式的 XML 标注文件批量转换为 YOLO 格式的 TXT 标注文件。它会先遍历所有 XML 自动统计有效类别并生成类别到 ID 的映射表,忽略类别名为 "not" 的标注,然后读取对应图片的尺寸,将 XML 中的边界框坐标转换为 YOLO 的归一化格式(class_id x_center y_center width height),最后将生成的 TXT 文件保存到指定目录中,便于直接用于 YOLO 训练。
大家首先执行step1_yolo_to_txt.py
python
import os
import xml.etree.ElementTree as ET
from PIL import Image
# 原始路径
xml_dir = r"F:\thunder_download\mask_detect\datasets\train\Annotations"
img_dir = r"F:\thunder_download\mask_detect\datasets\train\JPEGImages"
# YOLO标签输出路径
yolo_txt_dir = r"F:\thunder_download\mask_detect\datasets\train\labels"
os.makedirs(yolo_txt_dir, exist_ok=True)
# ===== 自动生成类别映射 =====
class_map = {}
next_class_id = 0
# 支持的图像扩展
img_exts = [".jpg", ".jpeg", ".png", ".bmp"]
# 遍历 XML 文件
for xml_file in os.listdir(xml_dir):
if not xml_file.endswith(".xml"):
continue
xml_path = os.path.join(xml_dir, xml_file)
tree = ET.parse(xml_path)
root = tree.getroot()
# --- 以 XML 文件名匹配图像 ---
base = os.path.splitext(xml_file)[0]
img_path = None
for ext in img_exts:
candidate = os.path.join(img_dir, base + ext)
if os.path.exists(candidate):
img_path = candidate
break
if img_path is None:
print(f"Warning: 图像文件与 {xml_file} 同名的图片不存在,跳过")
continue
# 获取图像尺寸
try:
with Image.open(img_path) as img:
w, h = img.size
except Exception as e:
print(f"无法打开图片 {img_path}: {e}")
continue
txt_lines = []
# 遍历目标
for obj in root.findall("object"):
name_node = obj.find("name")
if name_node is None:
continue
label = name_node.text.strip()
# === 自动分配 class_id ===
if label not in class_map:
class_map[label] = next_class_id
next_class_id += 1
class_id = class_map[label]
bndbox = obj.find("bndbox")
if bndbox is None:
continue
xmin = float(bndbox.find("xmin").text)
ymin = float(bndbox.find("ymin").text)
xmax = float(bndbox.find("xmax").text)
ymax = float(bndbox.find("ymax").text)
x_center = ((xmin + xmax) / 2) / w
y_center = ((ymin + ymax) / 2) / h
box_width = (xmax - xmin) / w
box_height = (ymax - ymin) / h
txt_lines.append(
f"{class_id} {x_center:.6f} {y_center:.6f} {box_width:.6f} {box_height:.6f}"
)
# 保存 YOLO txt
txt_file_path = os.path.join(yolo_txt_dir, base + ".txt")
with open(txt_file_path, "w") as f:
f.write("\n".join(txt_lines))
# ===== 输出类别映射 =====
print("\n类别映射 class_map:")
for k, v in class_map.items():
print(f"{v}: {k}")
print(f"\n转换完成!YOLO TXT 文件已保存在: {yolo_txt_dir}")
2.数据集拆分
YOLO 推荐训练集和测试集按 8:2 划分,主要是因为目标检测对样本量非常依赖,需要尽可能多的训练数据来学习特征,同时又必须保留足够的独立测试数据来评估模型的真实泛化能力。8:2 被证明在"训练数据够多"与"测试评估足够稳定"之间取得了较好平衡,因此成为默认且通用的实践比例。
这个脚本的作用是从已有的图片和 YOLO 标注文件中随机抽取 200 张图片,并将它们按照训练集和验证集的比例进行划分,然后将对应的图片和 TXT 标注文件复制到新的数据集目录中,方便直接用于训练 YOLO 模型。脚本会先创建训练集和验证集的图片、标签子目录,然后随机选择 指定数量的张图片,其中 五分之一作为验证集,其余 五分之四作为训练集,复制过程中会保证每张图片对应的标注文件也被同步复制,如果标注文件不存在,会生成一个空的 TXT 文件,以保持文件结构完整。运行完成后,新的数据集就整理好了,可以直接用于训练和验证。。最终会在目标目录下生成:

执行脚本step2_auto_part.py
bash
import os
import random
import shutil
# 原始数据路径
img_dir = r"F:\thunder_download\mask_detect\datasets\train\JPEGImages"
label_dir = r"F:\thunder_download\mask_detect\datasets\train\labels"
# 新数据集路径
dataset_dir = r"F:\thunder_download\mask_detect\datasets\train\dataset"
train_img_dir = os.path.join(dataset_dir, "train", "images")
train_label_dir = os.path.join(dataset_dir, "train", "labels")
val_img_dir = os.path.join(dataset_dir, "val", "images")
val_label_dir = os.path.join(dataset_dir, "val", "labels")
# 创建目录
for dir_path in [train_img_dir, train_label_dir, val_img_dir, val_label_dir]:
os.makedirs(dir_path, exist_ok=True)
# 获取所有图片文件
all_images = [f for f in os.listdir(img_dir) if f.lower().endswith((".jpg", ".png", ".jpeg"))]
# 随机抽取200张
if len(all_images) < 200:
raise ValueError(f"图片数量不足200张,当前数量: {len(all_images)}")
selected_images = random.sample(all_images, 200)
# 分割训练集和验证集
random.shuffle(selected_images)
val_images = selected_images[:40]
train_images = selected_images[40:]
def copy_files(image_list, target_img_dir, target_label_dir):
for img_file in image_list:
# 复制图片
src_img_path = os.path.join(img_dir, img_file)
dst_img_path = os.path.join(target_img_dir, img_file)
shutil.copy(src_img_path, dst_img_path)
# 对应的txt
label_file = os.path.splitext(img_file)[0] + ".txt"
src_label_path = os.path.join(label_dir, label_file)
if os.path.exists(src_label_path):
dst_label_path = os.path.join(target_label_dir, label_file)
shutil.copy(src_label_path, dst_label_path)
else:
# 如果没有对应txt文件,创建一个空文件
open(os.path.join(target_label_dir, label_file), "w").close()
# 复制训练集
copy_files(train_images, train_img_dir, train_label_dir)
# 复制验证集
copy_files(val_images, val_img_dir, val_label_dir)
print(f"随机抽取完成!训练集: {len(train_images)} 张,验证集: {len(val_images)} 张")
print(f"数据集路径: {dataset_dir}")
3.模型训练
数据集准备好之后就可以开始模型训练了,我们首先准备一个训练的配置文件,比如说是data.yaml

然后就可以开始模型训练了,直接执行我们准备好的train.bat文件,内容就是下面的内容
bash
yolo task=detect mode=train model=../data/model/yolov8n.pt data=./data.yaml epochs=30 imgsz=640 batch=16 lr0=0.01
用户亦可执行step3_train_model.py脚本进行模型训练
python
from ultralytics import YOLO
def main():
# 加载模型
model = YOLO("../data/model/yolov8n.pt")
# 开始训练
model.train(
data="./data.yaml", # 数据集配置
epochs=50, # 训练轮数
imgsz=640, # 输入尺寸
batch=16, # batch size
lr0=0.01, # 初始学习率
task="detect" # 任务类型
)
if __name__ == "__main__":
main()
然后模型就开始训练了
这里我贴一些训练验证结果截图


最后的results.png见下图,训练效果还是可以的!
本次 YOLOv8 摔倒检测模型的训练过程整体呈现稳定收敛趋势,从整体训练过程来看,本次模型收敛趋势较为明显且稳定。前10个epoch中,train各项loss(box、cls、dfl)快速下降,说明模型已初步学习到目标特征,但precision与mAP较低且波动较大,表明早期预测不稳定、误检较多。第6轮开始precision突然升高但recall偏低,说明模型趋于保守,存在漏检问题。随着训练推进(约epoch 15之后),recall与mAP持续提升,尤其mAP50从0.28提升至0.71以上,mAP50-95稳定在0.28~0.32区间,说明检测框质量和定位精度逐步改善。后期(30 epoch以后)loss下降趋缓,val_loss同步降低且与train_loss差距不大,未出现明显过拟合,泛化能力尚可。学习率呈典型先升后降策略,与性能提升趋势基本匹配。最终precision约0.80、recall约0.63,说明模型在准确率与召回率之间取得一定平衡,但召回仍有提升空间。总体来看训练效果良好,模型已基本收敛,但若需进一步提升性能,可考虑增加数据多样性或优化阈值与损失权重配置。
bash
整体来看,这次训练是"有效收敛且中后期性能提升明显"的一类典型曲线,但也夹杂了一些值得注意的波动信号。
先从**收敛质量(loss 维度)**看,train 侧三项 loss(box / cls / dfl)基本是单调下降的,尤其是 `train/cls_loss` 从 4.21 → 0.79,下降非常充分,说明分类学习是成功的;`train/box_loss` 从 2.46 → 1.08、`train/dfl_loss` 从 1.82 → 0.95,也都稳定收敛,没有出现震荡或发散。这说明模型容量、学习率调度和数据基本匹配。从 val 侧看,`val/box_loss` 和 `val/cls_loss` 也是整体下降(虽然有波动),并没有出现明显"训练降、验证升"的背离,因此**没有明显过拟合**,这一点是比较好的信号。
再看**检测性能指标(核心价值)**,可以明显分为三个阶段:
前 1--5 epoch 基本是"冷启动期",mAP50-95 几乎接近 0;第 6 epoch 出现一个异常点(precision 突然到 0.82,但 recall 很低),这是典型的预测框极少但非常"保守"的状态,不具备实际意义,可以忽略。从第 10 epoch 之后进入稳定提升区间,尤其是 13→20 epoch,mAP50-95 从 0.19 → 0.22+,说明模型开始学到有效结构。真正的"高质量阶段"在 30 epoch 之后,mAP50-95 稳定在 0.26→0.32 区间,最终在 **epoch 45 达到峰值 0.32089**,这是本次训练最关键的指标点。
如果从**泛化能力(precision / recall 平衡)**来看,中后期表现是比较健康的。precision 从早期不稳定(甚至异常高或极低)逐渐稳定在 0.78--0.83 区间,而 recall 稳定在 0.60--0.65 左右,说明模型既不是"乱检"(低 precision),也不是"只检很少"(低 recall),属于一个比较均衡的检测器。尤其是 epoch 44--46 这一段,precision 和 recall 同时处在较高水平,对应 mAP 也达到最高区间,这是一个典型的"最佳权重窗口"。
从**mAP50 vs mAP50-95 的关系**来看,mAP50 最终在 ~0.71 左右,而 mAP50-95 在 ~0.28--0.32,这个差距说明:模型在 IoU=0.5 下检测已经不错,但在高 IoU(定位精度)上还有提升空间,本质是**框回归精度还有优化余地**(常见于数据标注不够精细或 box loss 权重不足)。
再结合**学习率调度(lr)**来看,前期是 warmup 上升到 ~0.0013,然后缓慢衰减到 5e-5,整个过程中没有出现 loss 抖动或性能崩溃,说明学习率策略是合理的。值得注意的是,**性能峰值出现在 lr 已经明显下降之后(约 2e-4 左右)**,这符合"后期低学习率精细拟合"的预期,也说明训练轮数是够用的。
从**稳定性角度**看,中后期(30 epoch 之后)虽然整体上升,但 mAP 存在小幅震荡(0.26--0.32 来回),同时 val loss 也有轻微反复,这通常意味着:
一方面数据规模或难度有限,另一方面模型已经接近当前数据上限,没有持续单调提升空间,但也没有明显退化,因此可以认为已经进入"平台期"。
如果总结"本次训练真正好的指标点",其实核心就三个信号:
一是 loss 全面收敛且 train/val 一致,没有过拟合;二是 mAP50-95 从几乎 0 提升到 0.32,且在 40 epoch 后稳定高位运行;三是 precision / recall 达到较好的平衡,没有偏科,这比单纯 mAP 高更重要。
最后给一个偏实战的判断:如果这是一个实际项目,这次训练已经是**"可以交付但还有优化空间"**的状态;如果要继续提升,重点不会再是训练轮数或学习率,而更可能在数据质量(标注精度、难样本)和模型结构/输入分辨率上。

我们的检测系统可以用在的应用场景:
-
公共交通场景
在地铁、公交、火车站等人流密集的公共交通环境中,该系统可通过摄像头实时采集视频流,利用YOLOv8进行目标检测与口罩识别,自动判断乘客是否规范佩戴口罩。结合PyQt5界面展示与报警提示,可辅助工作人员快速发现未佩戴人员,提高防疫管理效率,减少人工巡检压力,同时通过DeepSeek模型优化识别策略,提升复杂环境下的准确率与鲁棒性。
-
医院与医疗机构
在医院门诊、候诊区及住院部等重点区域,该系统能够持续监控人员口罩佩戴情况,尤其适用于疫情防控或传染病高发时期。系统可自动记录违规行为并生成统计数据,帮助管理人员分析防护执行情况。借助DeepSeek进行语义分析,还可以对异常行为进行辅助判断,从而提升医疗环境的安全性,降低交叉感染风险。
-
校园与教育机构
在学校教室、食堂及宿舍区域,该系统可用于监督学生在特定时期的口罩佩戴情况。通过PyQt5可视化界面,管理人员可以直观查看各区域实时状态,并对未佩戴行为进行提醒或记录。系统还可结合数据分析功能,为学校制定防疫策略提供依据,保障师生健康,尤其在流感季节或特殊公共卫生事件中具有重要作用。
-
企业与办公场所
在写字楼、工厂车间等办公环境中,该系统可部署于入口或公共区域,对员工口罩佩戴情况进行自动检测。系统不仅能减少人工检查成本,还可与考勤或安防系统结合,实现智能化管理。DeepSeek的引入可以帮助分析员工行为模式,从而优化管理策略,在特殊时期保障企业正常运转与员工健康安全。
-
商场与零售场景
在大型商场、超市等消费场所,系统可用于入口安检或全场巡检,自动识别顾客是否佩戴口罩,并通过提示屏或语音提醒进行干预。该系统能够在不打扰顾客体验的前提下提升公共卫生管理水平,同时通过数据统计分析客流与防疫执行情况,为商场运营提供决策支持,提升整体服务质量与安全形象。
五.关于项目
1.开发环境
本系统是在 Windows 11 操作系统上进行开发的,Python 环境采用的是 Python 3.8 版本,硬件方面使用的是 AMD 处理器 ,未配备独立显卡,开发工具为 PyCharm 2021.3 版本。在整个开发与测试过程中,我们严格遵循了上述环境配置,确保了系统的稳定运行。在此特别建议所有使用者:为了避免出现因版本过新而导致的"不兼容"情况,请大家尽量不要使用过高的 Python 版本(如 Python 3.11 及以上),也不要使用最新的 PyCharm 或操作系统版本。因为较新的环境可能对部分依赖库或语法特性支持不佳,容易引发意外的报错或功能异常。遵循本项目所推荐的版本配置,能够最大程度地保证系统的顺利部署与稳定运行。
2.项目部署
1.项目依赖
博主是在Windows电脑上使用Python3.8开发的本系统,建议大家使用的Python版本别太高。
其中项目依赖为:
bash
PyQt5==5.15.11
QtAwesome==1.3.1
torch==2.4.1
torchvision==0.19.1
Pillow==9.3.0
pyqtgraph===0.13.3
PyQtWebEngine==5.15.5
opencv-python==4.10.0.82
ultralytics==8.3.234
Requests==2.32.5
pandas==2.0.3
numpy==1.24.4
Markdown==3.4.4
我已经整理到了requirements.txt,大家直接使用命令
pip install -r requirements.txt
即可一键安装项目依赖,其中的torch和torchvision只要匹配即可,不一定非要和博主开发环境的版本一致。
2.项目结构
很多小伙伴担心拿到代码后项目看不懂,这个大家不必担心,我们采用文件+类名对相关功能进行了模块化定义,大家见名知意。
下图博主采用tree命令生成了文件、目录树
bash
tree "D:\projects\gitee\2026\yolo_projects\yolov8-mask-detect" /f /a
bash
D:\PROJECTS\GITEE\2026\YOLO_PROJECTS\YOLOV8-MASK-DETECT
| main.py(系统入口)
| requirements.txt(项目依赖)
|
+---data(数据目录)
| +---database(数据库)
| | data.db
| |
| |
| +---font(字体目录)
| | hanyi_yahei.ttf
| |
| \---model(模型目录)
| best.pt
| yolov8n.pt
|
+---model_train(模型训练脚本目录)
| | data.yaml
| | step1_yolo_to_txt.py
| | step2_auto_part.py
| | step3_train_model.py
| | step4_test_model.py
| | train.bat
| |
| +---runs
| | \---detect
| | \---train
| | | args.yaml
| | | confusion_matrix.png
| | | confusion_matrix_normalized.png
| | | events.out.tfevents.1776169070.Admin.10148.0
| | | F1_curve.png
| | | labels.jpg
| | | labels_correlogram.jpg
| | | PR_curve.png
| | | P_curve.png
| | | results.csv
| | | results.png
| | | R_curve.png
| | | train_batch0.jpg
| | | train_batch1.jpg
| | | train_batch2.jpg
| | | train_batch400.jpg
| | | train_batch401.jpg
| | | train_batch402.jpg
| | | val_batch0_labels.jpg
| | | val_batch0_pred.jpg
| | | val_batch1_labels.jpg
| | | val_batch1_pred.jpg
| | |
| | \---weights
| | best.pt
| | last.pt
| |
| \---test_images
| train_5.jpg
|
+---script
| create_qrc.py
|
\---src(项目源码目录)
+---conf(配置目录)
| icon_conf.py
| style_conf.py
| system_conf.py
| test_data.py
| __init__.py
|
+---engine(引擎目录)
| engines.py
| __init__.py
|
+---resource(资源目录)
| | resource.qrc
| | resource_rc.py
| | __init__.py
| |
| +---imgs
| | ai.gif
| | ai.svg
| | bg.jpeg
| | login_gif.gif
| |
| \---js
| echarts.min.js
|
+---threads(线程目录)
| main_threads.py
| signal_bus.py
| __init__.py
|
+---utils(工具目录)
| custom_utils.py
| user_manager.py
| __init__.py
|
\---widgets(核心组件目录)
base_widgets.py
custom_pages.py
custom_widgets.py
main_page.py
unique_widgets.py
__init__.py

3.项目启动
本系统的项目启动十分简单:在安装好所有相关依赖之后,直接执行 main.py 文件,即可自动打开系统的登录注册页面。用户进入该页面后,通过输入匹配的用户名和密码完成登录操作。为方便初次体验,系统内置了一个默认账号,用户名为 admin,密码也为 admin,用户可以直接使用这组账号进行快速登录。当用户成功登录后,系统主界面会完整展示出来,而之前的登录注册页面则会自动隐藏,从而为用户提供清晰、流畅的操作体验。
4.往期优秀作品
六.总结
基于PyQt+YOLO+DeepSeek的口罩佩戴检测系统的提出,源于公共卫生安全与智能安防需求持续提升的时代背景。随着城市人口密度增加以及公共场所管理压力加大,口罩佩戴规范性成为疫情防控与日常健康管理中的重要一环。然而,传统依赖人工巡查或简单监控的方式不仅效率低下,而且难以及时、准确地识别未规范佩戴口罩的行为,亟需更加智能化的技术手段加以支撑。
与此同时,计算机视觉技术在深度学习的推动下取得了显著进展,尤其是以YOLO系列为代表的目标检测模型,在实时性与检测精度方面表现突出,能够高效识别人脸及口罩佩戴状态;PyQt在桌面应用开发领域成熟稳定,为系统提供了良好的图形化交互界面和清晰的业务逻辑组织方式,使得系统具备较强的可用性与扩展性;而DeepSeek类语言模型的引入,使系统在异常行为解释、检测结果分析报告生成以及智能参数配置等方面具备更高层次的智能化能力。三者的融合,使口罩检测从单一的视频识别功能,升级为集检测、分析、交互与智能辅助于一体的综合系统。
该系统的意义体现在多个层面:在公共安全层面,它能够在商场、车站、医院等场景中实现对口罩佩戴情况的实时监测与预警,提高防控效率;在技术层面,它体现了深度学习视觉算法与智能交互技术的有机融合;在产业层面,它为智慧安防与智慧城市建设提供了更加高效、智能的解决方案;在社会价值层面,它有助于提升公众健康意识、降低传播风险,为构建更加安全有序的公共环境提供技术支撑。
总体来看,该系统不仅是多种前沿技术融合的成果,更是面向现实需求的创新实践,具有良好的应用前景与推广价值。
本次给大家介绍了我使用PyQt5+YOLOv8+DeepSeek的摔倒行为检测系统,本系统功能强大,支持多种数据源输入,包含多种用户交互按钮以及模式,内置数据可视化方案、大模型AI加持,是您学习、工作使用的不错选择!
需要代码的朋友可以点击箭头下方的二维码加我好友,欢迎您了解!

如需帮助请私聊博主!






