☰
基于YOLOv8的实时人脸口罩识别系统实战
2026/10/17 12:19:40 网站建设 项目流程

这两年做过不少目标检测项目,口罩检测算是需求量最大、也最容易被低估的一类。门禁闸机、园区出入口、工地通道、学校门口,到处都需要"认出谁没戴口罩"的能力。看起来就是"检测人脸+判断有没有口罩",但真要从零搭一套Python+YOLOv8+PyTorch的实时人脸口罩识别系统,还要带上可视化监控界面,中间的技术点远不是跑通一个模型那么简单。

这个项目我完整做过一遍,核心能力可以拆成三块:一是对视频流逐帧做人脸口罩状态识别,二是把识别结果落到实时监控界面上,三是解决"真要用起来"时遇到的性能、稳定性、部署问题。整个技术栈选的是当前目标检测社区里最主流的一套:YOLOv8负责检测回归,PyTorch作为底层深度学习框架,Python串联全部工程逻辑。如果你已经掌握了目标检测的基础概念,想完整走一遍"数据处理-模型训练-实时检测-可视化部署"的全流程,这篇内容值得你照着做一遍。

1. 项目思路拆解:先想清楚"检测"还是"分类"

1.1 口罩检测的技术本质

很多人第一次接触口罩检测,直觉就是要训练一个模型去"识别口罩这个物体",这个理解方向错了。

我在设计这个项目时,明确把检测目标定为人脸区域,而不是口罩区域。逻辑很简单:系统要回答的问题是"这个人有没有正确戴口罩",而不是"画面里有没有口罩物体"。如果模型检测的目标是口罩,一个人侧身站着、兜里露出半只口罩,系统就会误判为"已佩戴口罩",这显然不可接受。

所以整个检测任务的本质是:先定位人脸,再对人脸区域内的佩戴状态做分类。常见的做法是设置三类标签:

  • with_mask:人脸被口罩正确覆盖,鼻子和嘴都在口罩内
  • without_mask:面部完全暴露,没有任何遮挡物
  • mask_weared_incorrect:口罩佩戴不规范,比如口罩挂在下巴上、只罩住嘴露出鼻子、口罩明显松垮

把不规范佩戴单独拉出来成一类,是实际项目落地时的关键决策。很多公开demo只做二分类,放到真实场景里基本没法用,因为"露鼻子"这个状态特别常见,如果模型把它归到"正确佩戴",统计数字就失真了。

1.2 为什么最终选定YOLOv8 + PyTorch组合

选型时我对比过几个方向:YOLOv5、YOLOv8、YOLOv9、以及一部分基于Transformer的检测模型。最后定在YOLOv8,核心原因有四点。

第一,YOLOv8的训练、验证、预测、模型导出被整合成了统一入口,命令行和Python API都能直接调用,对一个要接可视化界面的工程来说,省去了大量二次封装的工作。第二,它延续了YOLO系列的实时性优势,在消费级GPU上跑640分辨率输入,轻量模型能达到几十FPS,满足监控场景的实时性要求。第三,框架内置了Mosaic增强、自适应锚框等机制,对中小规模数据集更友好。第四,社区资料足够丰富,遇到问题能快速找到解决方案,这一点在项目工期紧的时候特别重要。

底层框架用PyTorch而不是TensorFlow,理由也很实在。PyTorch在科研和工业落地社区的占有率更高,部署方案成熟,动态图调试模型结构非常直观,而且YOLOv8本身就是基于PyTorch实现的,不存在跨框架的兼容成本。

在处理实时监控时,模型推理和界面显示天然是异步关系。我用了一个生产者消费者模型:视频采集线程读取摄像头帧并往队列里塞数据,推理线程从队列取帧做检测,主界面只负责接收结果并刷新画面。这样即使某帧处理慢了,也不会让界面直接卡死。

2. 数据准备:决定模型上限的关键步骤

2.1 数据从哪来:公开数据集与自采方案怎么搭

口罩检测模型的精度上限,在数据采集那一刻就决定了,后面调参只是把数据里已有的信息榨干。我建数据集时采用的是"公开数据+自采补充"的组合方案。

公开的口罩检测数据集网上有不少,大多是科研机构或者社区开发者整理后放出来的。我选了其中一个人脸已经标注好的数据集,重点关注三件事:图片分辨率不能太低、口罩遮挡状态下的人脸占比要足够多、标签类别最好覆盖"不规范佩戴"而不是只有二分类。如果公开数据只提供"戴口罩/未戴口罩"两类,我会做一个预处理脚本,把部分戴上口罩的样本手工重新标注为"不规范佩戴"。

自采部分我建议别省。我自己用手机在办公室、走廊、电梯、地下车库拍了大概2000张人脸照片,覆盖不同角度、不同光照、不同距离。为什么非要用手机拍?因为监控摄像头的视角偏高、人脸通常是俯视状态,而公开数据集中大量是平视的证件照或生活照,直接用会让模型在真实监控视角下明显掉点。拍摄时要注意获得对方同意,也不要在私密场合采集,这个数据合规问题从一开始就要重视。

采集阶段还有一个容易踩的坑:不要只拍"戴了口罩"和"没带口罩"两种状态。实际监控画面里,口罩挂在下巴、拿在手里、从口袋漏出一角的情况远比想象中多,这些"边缘状态"恰恰是判断逻辑容易混淆的地方。

2.2 标注规则与数据增强,一个都不能省

数据标注我用的手工标注方式,大概花了三天时间,标注了接近8000张图。工具选择上,你用市面上任何一种常见的图形化标注工具都可以,关键是格式能导出为YOLO格式的txt文件,也就是每个目标占一行,记录"类别id 中心点x 中心点y 宽度 高度",坐标都是归一化到0到1之间的比例值。

这里必须强调标注的边界规则。我在复检过程中发现,很多刚上手的人标注"人脸框"时会把整个头、脖子甚至肩膀框进去,导致模型学到的特征不是"脸被口罩覆盖",而是"一个大面积的头部区域"。正确做法是:框住人脸可见区域,口罩覆盖的区域就是人脸区域的主体,不要刻意扩大边界。

标注规范建议如下:

  • 遮挡不是问题,人脸被手、刘海、围巾挡住一部分时,按可见脸部的最小外接矩形标注
  • 戴口罩状态下,口罩边缘是人脸框的自然边界
  • 佩戴不规范的状态,按真实可见脸部区域标注,不因为口罩存在就标成"正确佩戴"
  • 目标非常模糊时,宁可丢弃这张图也不勉强标注

数据增强方面,我开了YOLOv8自带的Mosaic增强,同时手动叠加了随机旋转(±30度)、随机HSV扰动、亮度对比度变化、以及轻微高斯模糊。目的很明确:让模型对监控画面里的弱光、逆光、运动模糊更鲁棒。但要注意,旋转增强不要开太大角度,超过45度的旋转会让"人脸"这个语义本身失真,反而干扰训练。

2.3 训练集/验证集的划分与目录结构

数据划分我用了8:2的比例,训练集和验证集分开目录存放,并且严格保证同一个人不出现在两个集合里。如果同一个人的正脸照既进了训练集又进了验证集,验证指标会虚高,号称mAP95,一上真实摄像头立即被打回原形。

YOLOv8需要的目录结构很固定,我建议按下面这样组织:

mask_dataset/ ├── images/ │ ├── train/ │ ├── val/ ├── labels/ │ ├── train/ │ └── val/ ├── data.yaml

images和labels子目录名必须一一对应,同一张图的图片文件和标签txt文件要使用完全相同的文件名。我吃过一次亏:从公开数据集下载后,图片是.jpg,标注文件是.jpeg同名,文件名对不上,模型训了半天,发现所有样本都没加载进去。建议在训练前写个小脚本,遍历一遍所有图片和标签,检查文件名匹配情况。

data.yaml的写法也顺手给出来,注意我用了path字段指向数据集根目录,后续训练命令只需要关注这一个配置文件:

path: mask_dataset train: images/train val: images/val nc: 3 names: 0: with_mask 1: without_mask 2: mask_weared_incorrect

还有一点要注意类别顺序。如果没有特殊原因,不用把"without_mask"放在第一位,因为YOLOv8默认class 0会影响置信度阈值的行为,实际使用中把"正确佩戴口罩"放到类0更符合直觉,也方便后续在可视化界面里按类别做颜色映射。

3. 模型训练全流程:从环境搭建到验证迭代

3.1 环境搭建:Python、PyTorch与GPU选型参考

训练环境的版本组合,我建议用Python 3.9或3.10、PyTorch 2.x、CUDA 11.8以上。如果你在Windows上开发,优先考虑在WSL2里跑,Linux环境在很多底层依赖编译上能少踩一半的坑。

安装依赖的方式很简单,核心就是用pip把YOLOv8对应的Python包装进去,它会自动把PyTorch、OpenCV这些一并带上来。真正要注意的是版本一致性,我的建议是先装PyTorch再装YOLO相关包。PyTorch有CPU和GPU之分,安装之前先确认GPU的Conda或pip源选对了,否则跑起来才发现用的是CPU推理,一套流程白等。

GPU选型方面的经验:显存是最重要的指标。YOLOv8s模型、640输入分辨率、batch为16时,6GB显存勉强能跑,12GB以上就比较从容。如果手里只有4GB显存的卡,把batch降到4、模型换成YOLOv8n,也能完成训练,只是收敛速度和最终精度会受影响。我自己主力用的是一块显存12GB的中端卡,整个训练过程没有因为显存问题中断过。

3.2 数据校验与快速跑通基线

正式开训之前,我强烈建议先跑一个最简单的冒烟测试。不要直接拿完整数据集训练,先复制20张图、10条标注,用2个epoch跑通整个pipeline,确认数据加载没问题、模型能正常收敛、输出目录能生成文件。

这一步看起来很傻,但特别管用。我见过很多人在正式训练跑了两小时后才报错,原因是标注文件里有非法字符,或者label的类别id超出了配置文件里的nc值。冒烟测试能把这些低级错误控制在5分钟内暴露出来。

跑通基线之后,我习惯先不调任何超参数,直接训50个epoch看曲线走势。基线的意义在于验证数据质量:如果训练集loss一路下降、验证集loss也跟着降,说明数据可学;如果验证集loss前几个epoch就震荡上升,赶紧回头检查标注,大概率是把某一类的标注搞混了。

3.3 训练命令与参数:不是一把梭,每个参数都要有依据

我最终的训练命令大致是这样的:

yolo detect train data=mask_dataset/data.yaml model=yolov8s.pt \ epochs=120 imgsz=640 batch=16 \ patience=20 lr0=0.001 cos_lr=True \ device=0 workers=4 save_period=10

逐项说下我的考虑:

  • model=yolov8s.pt:加载YOLOv8s的预训练权重。用预训练权重做迁移学习,收敛速度比随机初始化快很多,尤其是数据量不够大的时候,效果差异非常明显。想追求速度可以换yolov8n.pt,想要更高精度可以换yolov8m.pt。
  • epochs=120:口罩检测不是特别复杂的任务,数据集干净的情况下,100轮左右足够收敛。关键不是轮数多,而是配合patience做早停。
  • imgsz=640:这个值直接决定模型的输入分辨率。640是速度和精度的平衡点,如果画面里人脸占比很小、有很多远距离小人脸,可以试试768甚至896,代价是推理变慢、显存占用变大。
  • batch=16:显存决定的参数,不是越高越好。大batch的训练更稳定,但超过显存直接报错。显存不足时优先减小batch,不要动imgsz。
  • lr0=0.001:这是YOLOv8默认学习率附近的经验值。学习率过高loss会炸,过低收敛太慢。如果你优化器选SGD,可以适当降到0.0005,动能项能帮模型跨过局部极小点。
  • cos_lr=True:开启余弦退火调度,后期学习率逐渐降低,让权重收敛得更精细。实测对mAP的提升有帮助,基本没有副作用。
  • patience=20:训练了20个epoch验证指标都没有提升就提前停止。这条必须开,否则后30轮常常是白跑的。
  • workers=4:数据加载线程数,Windows上建议设0,否则偶尔会出现数据加载报错。

训练日志是宝贵资料。我训完一轮会把runs/目录里的结果曲线都保留下来,重点关注训练集loss和验证集loss的gap。gap过大意味着过拟合,这时候不是盲目加epoch,而是考虑加数据增强、加大数据量,或者换更轻量的模型。

3.4 训练结果怎么看:指标不是越高越好

训练完成后,YOLOv8会输出一系列指标,新手最容易盯着mAP看,但实际更值得关注的是每一个类别各自的recall值和混淆矩阵。

指标的含义我用一个表格理清楚:

指标作用说明
mAP50判断模型的整体精度框与真实框的IoU超过0.5就算命中,是目标检测最常用的指标
mAP50-95更严格的综合分数IoU从0.5到0.95取平均,衡量定位精度和分类精度的综合表现
Precision预测结果的准确率预测为某个类别的目标里,有多少是真的
Recall真实目标的召回率真实存在的目标里,有多少被检测出来了

我训出来的模型mAP50大概在0.94左右,mAP50-95在0.75左右。但真实场景一跑,发现不规范佩戴类别的召回率明显偏低,很多半挂口罩被漏检了。回头一查,问题出在数据上:不规范佩戴的样本只占全部的8%,模型对这个类别的"印象"自然不够深。解决办法不是盲目调参,而是去补充那类样本,把比例拉到25%以上,再训一轮,指标立刻好转。

所以我的观点是:单个指标的绝对值不重要,重要的是类间均衡。mask_weared_incorrect这一类如果召回率低,系统在真实场景里就会把"露鼻子"的人当成"已戴口罩",这个bug比低mAP更隐蔽也更致命。

4. 实时监控系统与可视化界面实现

4.1 实时视频流的稳定读取:别让界面卡死在IO上

模型训练好之后,"怎么用"就成了主要矛盾。实时监控系统的第一个难点不是检测算法,而是视频流的读取稳定性。

我建议把视频采集和模型推理放在独立的后台线程里,不要占用UI主线程。一个典型的结构是这样:

摄像头采集线程 -> 帧队列 -> 推理线程 -> 结果信号 -> UI刷新

用Python的queue.Queue作为帧缓冲区,采集线程不断往队列里塞帧,推理线程从队列取帧做检测。队列长度需要限制,我用的是maxsize=2,如果消费速度跟不上,直接丢弃最旧的帧。这么做的原因很简单:实时监控追求的是"当前这一刻"的检测结果,如果画面延迟超过一两秒,已经错过最佳响应时间,那丢掉它反而更合理。

摄像头来源上,支持三个渠道就够了:本地USB摄像头(cv2.VideoCapture(0))、IP摄像头(RTSP地址)、视频文件回放。RTSP地址读取要设置超时参数,否则摄像头掉线时OpenCV会卡住不动。我的处理方式是设置读超时,连续读不到帧就自动释放资源,等待几秒后重新连接。

4.2 检测逻辑与结果显示:让人一眼看懂

单帧检测的核心代码很简单,YOLOv8的Python接口把流程封装得很干净:

import cv2 from ultralytics import YOLO model = YOLO("runs/detect/train2/weights/best.pt") results = model(frame, conf=0.5, iou=0.45, verbose=False) annotated = results[0].plot()

detect返回的results[0]里包含boxes、names、probs等属性,annotated是已经画好框的帧。但真实系统里很少直接用默认的画框结果,因为默认的标签文本和颜色不够直观。我建议自己遍历检测框,按类别自定义显示逻辑:

  • with_mask:绿色框,标签显示"Mask OK"
  • without_mask:红色框,标签显示"No Mask",同时可以做强调标记
  • mask_weared_incorrect:黄色框,标签显示"Bad Mask"

颜色和文案不是小事。监控人员每天盯着屏幕,能不能在一瞬间扫出"有问题的人",完全取决于可视化设计。我后来在现场测试时,把红色边框的线粗改到3像素,又在检测框左上角加了小图标提示,误看概率明显下降。

4.3 可视化看板:不只是画框,还要有统计

实时监控界面我用PyQt5实现,主要分三个区域:主画面区、统计面板、事件记录区。

主画面区显示实时视频流和检测框;统计面板实时刷新总人数、正确佩戴口罩人数、未佩戴口罩人数、不规范佩戴人数;事件记录区只记录异常情况,比如检测到未佩戴口罩时,截取当前帧缩略图,连同时间戳一起写入列表。

在实现界面的刷新逻辑时,有一个重要的设计原则:UI更新频率不需要和帧率一致。我做了节流处理,每200毫秒刷新一次统计面板,每500毫秒检查一次事件队列。理由是PyQt的界面刷新本身有开销,如果每帧都触发信号,CPU占用会高出一截,界面还可能出现闪烁。

执行检测的线程通过pyqtSignal把结果传递回主线程。这里必须注意:不要在子线程里直接操作UI组件,Qt的界面控件只能在主线程修改,跨线程操作轻则刷新异常,重则导致程序崩溃。信号槽机制天然把线程边界处理好了,用上就行。

整个界面代码我写得比较保守,没有引入复杂的画布控件,而是用一个QLabel贴QImage的方式显示画面。对实时视频来说,这种方式虽然传统,但最稳定,传输效率也足够。

5. 系统集成与性能优化实践

5.1 CPU与GPU推理性能对比:知道自己需要什么

我先给一张大致的性能参考表,数据是我在实际机器上跑出来的相对值,不同机器有差异,但量级可以参考:

部署方式模型推理帧率(640分辨率)
普通CPU(i5级别)YOLOv8n8~12 FPS
普通CPU(i5级别)YOLOv8s3~5 FPS
中端GPU(12GB显存)YOLOv8n60~90 FPS
中端GPU(12GB显存)YOLOv8s35~50 FPS

结论很清楚:要实现真正流畅的实时监控,GPU是必须的。CPU不是不能用,但只能承载一路低分辨率、低帧率的小场面,一旦现场人多、画面复杂,帧率就会掉到没法用的程度。

如果目标机器没有GPU,也不是完全没招。可以把YOLOv8n配合TensorRT/OpenVINO这类加速推理方案,在部分CPU上能跑到15帧上下,勉强可以支撑单路720p画面。但我的建议是:既然是实时监控系统,至少在预算内留出一块有6GB以上显存的GPU给推理,这会省掉一大批后续优化工作。

5.2 推理瓶颈分析与优化三板斧

当一路摄像头跑起来了,下一步就是性能和稳定性调优。我在实际项目里用的优化手段主要是三板斧。

第一板斧是把模型导出成加速格式。YOLOv8训练好的best.pt是PyTorch权重,直接推理有框架开销。我把它导出为ONNX格式,再转成GPU平台专用的加速推理引擎,推理速度能提升2到3倍。导出命令很简单:

yolo export model=runs/detect/train2/weights/best.pt format=onnx imgsz=640

导出之后用ONNX Runtime加载运行。这一步不需要改业务代码,封装一个推理接口就可以了。

第二板斧是跳帧策略。监控画面里人脸状态不会每一帧都发生剧烈变化,完全可以每处理两帧、跳过一帧,把省下来的算力用到更大的输入分辨率或者更大的模型上。对于门禁闸机这种固定机位的场景,效果几乎没有肉眼可感知的差异。

第三板斧是降低输入分辨率。很多项目一上来就用1080P逐帧推理,其实720P甚至640P对人脸口罩识别已经足够。把视频流缩放到640再进模型,推理耗时能降到1080P的六成左右。注意缩放要在读取帧之后立即做,不要在画框之后做,否则检测框坐标会和显示分辨率对不上。

这里顺带说一个很多人会忽略的点:摄像头接入推流时,尽量在摄像头端把分辨率设置为2048或2560,不是因为运行时要在这个分辨率下做推理,而是高分辨率原图可以提供清晰的截图证据。推理用缩放图,事件证据用高清图,两者可以共存。

5.3 多路摄像头与落地方案建议

如果你要监控的不止一个门,而是整栋楼的多个出入口,系统的复杂度会进一步上升。

多路场景下,我给每路摄像头单独开一个采集线程,但推理部分使用同一个模型实例,因为YOLOv8模型是线程安全的,避免重复加载权重带来的显存浪费。如果GPU显存够,可以把多路画面拼成batch一起推理,吞吐量能翻倍;显存吃紧时,就按帧串行推理,配合跳帧策略也能撑住三四路720p。

落地方案上要区分两种场景。室内固定机位,比如图书馆入口、会议室门口,用一台带GPU的本地服务器或工作站,摄像头通过RTSP接入,是成本最优方案。室外多点位、设备分散的场景,我更推荐在每一个点位部署一个边缘计算设备,只把检测结果回调到中心平台,避免把大流量视频数据汇聚到一台机器上。口罩检测模型本身不算大,边缘设备完全扛得住。

我在搭建系统时还考虑过一个问题:如果现场有人没戴口罩走进来,系统要做什么?除了界面告警、截图落盘之外,我加了一个自动打卡记录功能,把"未佩戴口罩事件"连同时间戳、检测截图归档到数据库里。这个设计在后期复盘时非常有用,主管人员可以按时间段检索哪个人、在什么时间、哪个位置没有佩戴口罩。

6. 常见问题与排查技巧实录

6.1 漏检、误检的常见原因

排查检测问题的顺序,我建议按照"数据->模型->后处理"的逻辑来。

出现大量漏检,先看是不是人脸太小。摄像头装在3米高的位置,人脸区域可能只有几十个像素,模型当然检测不到。解决办法是把imgsz从640提到768,或者干脆换一个更大的模型。如果人脸并不小还是漏检,那就去统计验证集里这个类别的recall,通常是样本不足导致的。

误检情况比较复杂。最常见的误检是把"用手捂住嘴"识别成"佩戴口罩",因为肤色+手部纹理在模型看来很像口罩覆盖的效果。这类问题靠调阈值解决不了,只能补充"手遮挡嘴部"的负样本,让模型学会区分。另一种常见误检是口罩上的文字或图案干扰分类,解决办法是在数据增强阶段增加图案噪声的模拟。

6.2 训练时显存不够怎么办

训练中途报CUDA out of memory,是最常见的劝退错误。

处理顺序是:先把batch减半,再从YOLOv8s降到YOLOv8n,最后才考虑降低imgsz。batch对训练收敛稳定性的影响最大,imgsz对精度的影响最大,所以优先牺牲batch。如果batch已经降到2还不够,检查是否同时开了很多其他程序占用显存,把这些程序关掉,通常能腾出空间。

还有一种做法是开启梯度累积,等效于用小batch模拟大batch,不会增加显存占用。YOLOv8训练时通过优化器参数可以实现,效果比直接硬跑大batch稍弱,但胜在稳定。

6.3 界面卡顿、掉线的排查顺序

界面卡顿不要上来就怀疑模型推理慢,先用排除法确认瓶颈在哪。

第一步关掉检测线程,只跑视频采集和显示,如果还是卡,问题出在视频流读取或UI刷新逻辑上。第二步开检测线程但关掉画框,对比帧率。第三步才考虑推理耗时。

实际项目里,我遇到最多的是RTSP摄像头掉线问题。OpenCV去读一个已经断开的RTSP流,不会立即报错,而是会一直卡在读帧的阻塞调用里。解决办法是设置读取超时时间,连续多秒读不到新帧就重新初始化摄像头对象。我把重连逻辑写成了一个独立线程,每30秒检查一次所有通道的心跳,掉线的通道自动重建连接,整个过程不需要人工干预。

UI刷新还有一个容易被忽略的点:不要用QTimer以过高的频率去拉取检测结果。我用的是信号驱动模式,有检测结果才发一次信号,信号槽里再做200毫秒的节流,这样UI线程压力很小,即使推理偶尔波动,界面也不会明显卡顿。

6.4 一条速查表

我把典型问题整理成了速查表,方便你直接对照排查:

症状最可能原因处理方案
训练loss不下降学习率过高或数据标注错误将lr0降到0.0005,抽查50张标注图
验证集mAP高但现场效果差训练集和真实场景分布不一致增加现场视角自采数据
不规范佩戴总被漏检该类样本占比太少补充样本,使占比不低于25%
推理帧率低模型太大或输入分辨率过高换YOLOv8n、降低imgsz、跳帧
画面卡住不刷新RTSP读取阻塞设置超时读取,加入自动重连
UI无响应在子线程直接操作界面组件改用信号槽,UI操作只在主线程
检测框偏移推理用缩放图但画框用原图坐标统一坐标系,先缩放再检测再映射回原图

写在最后的一些体会

做完这个口罩检测系统,我最大的感受是:这类项目真正难的不是训练模型,而是把它变成一套"能用、能扛、能维护"的系统。数据标注的质量、视频流的稳定性、界面反馈的直观程度,每一点都影响最终能否落地。我自己在后续几次迭代里,反复做的都是同一件事:把现场采集到的失败案例补回训练集,重新训练,再部署回去。模型会随着场景数据变多越来越准,这套闭环比任何参数调优都重要。

最后分享一个小技巧。如果你用的摄像头距离人脸比较远,且画面里行人较多,可以在检测之后加一道"目标跟踪"逻辑:对同一张人脸连续多帧保持同一个ID,只有当这个人连续几帧都被判定为未佩戴口罩时才触发告警。这个简单的时序过滤能大幅减少误报,因为个别人只是抬手擦汗、低头整理衣领,那一瞬间的误判不应该直接触发告警。把检测结果从单帧决策升级为时序决策,是让整个系统真正达到"可用"水平的关键一步。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询