这两年我在不同方向的落地项目里反复碰到同一个需求判断画面里的人有没有戴口罩。一开始我以为这只是某个特定阶段才有的临时需求后来发现它其实会长期出现在门禁、考勤、安防监控和园区管理里几乎成了视觉检测的一个基础子任务。基于YOLOv5的戴口罩检测是我反复选型之后仍然愿意当基线方案的组合——精度够用、推理速度快、社区配套齐全。下面把模型原理、数据准备、训练调参到部署优化这四个阶段的实测经验串在一起给正在做类似任务的读者一条可以直接参考的路线。如果你急着先跑通一个Demo可以直接跳到第4节把里边的超参数拿来用如果你更在意模型为什么能这样做第2节解释得比较细。真打算进业务系统的人我建议把第5节也看完因为mAP达标和能上线之间隔着一整套工程问题。1. 戴口罩检测的需求背景与YOLOv5选型逻辑1.1 “检测口罩”在真实项目里意味着什么先别急着选模型第一步是把任务定义掰开。我开始和需求方沟通时很多人嘴上说的是“检测口罩”但实际要的东西可以差得很远。最常见的是二分类画面里的每个人要么戴了要么没戴。稍微严格一点的要把“没戴好”也单独拉出来比如口罩挂在下巴、露着鼻子、口罩歪到一边。再严格一点还要支持后期追溯按时间、按点位、按人物重查当时的口罩状态。这三种要求对应的技术方案不一样成本也完全不一样。只做二分类数据标注简单模型结构用一个检测头加分类头就够了要区分“没戴好”就得给这个特殊类别单独收集大量样本并在标注时界定清楚“什么样算没戴好”否则不同标注员的理解差异会让模型学到噪声要支持追溯模型就不仅要有检测框还得配合跟踪算法、按帧输出结构化结果复杂度会跳跃式上升。我跟很多同行聊下来实际接到的需求大多在第二种而且客户回翻视频时最在意的正是“看似戴了、实际没有防护效果”的场景。这个任务真正的难点从来不在“有没有口罩”的语义而在于目标外观太不稳定。口罩是非刚性物体不同款式、颜色、佩戴松紧度差异极大人脸被大面积遮挡后模型可用的特征大量减少监控相机又往往架在上方人脸在画面里只有几十像素宽。这些条件叠加起来让口罩检测从“看起来很简单”变成“细节决定成败”的事。1.2 传统方案与两阶段检测的局限如果往前看几轮口罩检测的思路其实走过三个时期。最早是人脸关键点方案它非常依赖五官的相对位置口罩把口鼻区域一遮特征点数量骤减算法基本失效。后面是Haar级联这一类手工特征分类器优点是轻巧缺点也明显对遮挡、角度、光照的变化几乎没有容忍度稍微偏一点角度就漏检或误检。我试过在侧脸、低头、帽子遮挡三个条件同时出现时这类方案基本不能用。进入深度学习时代两阶段检测器在精度上能打得很好。但我在某个人流闸机联动项目里实测过它的代价离线评测时mAP能到0.92换到边缘设备上单帧推理要1.2秒。对这个业务来说1秒钟就意味着人已经走过闸机检测结果才出来。区域提议网络带来的计算开销太大CPU和边缘盒子扛不住这是两阶段方案在口罩检测这类实时监控场景中的硬伤。单阶段检测器把“提候选框”和“分类回归”揉在同一个网络里速度天然占优。SSD虽然早期很有代表性但多尺度特征表达和样本匹配策略都比较固化对密集小目标不友好。后面YOLO系列迭代到第四版、第五版才在速度和精度之间找到了更适合工程使用的平衡。1.3 为什么最终选中YOLOv5而不折腾别的当时摆在我面前的有YOLOv4、YOLOv5和几类改进分支。YOLOv4的检测效果不差但社区的改进版本比较分散部署时文档不集中遇到问题要花时间翻各种讨论。YOLOv5这边最大的优势不是某一个结构的强度而是训练、验证、导出、部署的工具链非常完整遇到常见问题基本能找到现成答案。对口罩检测这样一个具体任务来说社区里也已有大量可参考的配置和参数。我把当时的选型判断整理成一个简单对比方便后来人直接参考方案精度上限实时性部署与生态口罩小目标适配性两阶段检测较高偏慢一般离线分析可以实时不现实SSD中等中等一般小目标容易漏检YOLOv3中高中等中小目标有所改善工程化一般YOLOv4中高较快中可以训练但工具链分散YOLOv5高快完善小目标机制成熟部署资料全最终选YOLOv5不是为了追新而是它在数据分布适配、预训练模型、训练框架和部署导出之间几乎全部打通。口罩检测的任务属性很明确需要一个能快速迭代、快速测试不同输入尺寸和模型规模的框架YOLOv5正好满足。2. 从模型骨架看YOLOv5对口罩目标的适配逻辑2.1 CSP结构带来的特征表达变化YOLOv5的主干网络采用了跨阶段局部结构思路是把基础卷积层的输出拆成两条路径一条经过密集卷积块一条保持直连。两条路径在末端合并既能加深梯度反传的路径又控制了整体计算量。对口罩检测来说这个结构带来的实际影响是模型可以在同一层特征里同时看到“口罩区域的纹理细节”和“人脸轮廓的上下文”。很多人以为口罩检测靠的是颜色比如白色口罩、蓝色口罩在肤色前比较显眼。但实际监控画面里黑色口罩、迷彩口罩、深色防晒口罩都有可能出现光照一变颜色特征非常不可靠。跨阶段结构里保留直连路径相当于给网络留了一条跨层的信息通道让它更倾向去学习边界、纹理这些结构信息而不是只依赖颜色。这也是为什么经过充分训练的YOLOv5模型在彩色口罩上的表现往往比预想中更好。2.2 多尺度预测与小目标检测机制口罩检测里最难处理的是小目标。监控相机的安装位置一般较高人脸在画面中可能只有二三十个像素宽。YOLOv5把预测头放在三个不同尺度的特征图上其中下采样倍数较小的那一层特征图保留了更多细节专门负责小目标。这个机制从结构上保证了小目标不会被主特征图“淹掉”。除了多尺度锚框也是影响小目标检测的一个重要因素。YOLOv5默认带有通用锚框但口罩目标的长宽比与通用目标差异不大不小最好基于自己的训练集重新做一次聚类。我在一次试验中对比过默认锚框和重新聚类锚框重置之后验证集mAP从0.86提升到0.88。这个提升幅度不算惊人但在真实场景里可能意味着漏检率的明显下降。注意锚框聚类要用自己的标注框数据来算不要直接拿别人项目的锚框文件。2.3 损失函数和训练稳定性的关系边界框回归损失上YOLOv5使用的是CIoU它同时考虑了重叠程度、中心点距离和长宽比一致性。口罩目标的边界其实是模糊的口罩和肤色的交界经常会出现混叠如果只用坐标差异来算损失训练早期很容易出现框抖动。CIoU因为把几何一致性纳入了优化目标整体训练过程更稳最终框的位置也更贴合目标。分类损失方面YOLOv5用的是BCE并配合自适应的正负样本分配。简单来说每个真值框周围有几个候选锚点会被标为正样本正样本数量是动态调整的。对于口罩这类前景占比较小的任务这个机制可以避免网络被大量背景带偏。训练稳定性上YOLOv5还做了学习率warm-up刚开始的几轮学习率从小往大升避免模型在一开始就跑进奇怪的方向。3. 数据准备决定口罩检测项目成败的关键环节3.1 数据规模、来源与场景覆盖先给一个直接结论口罩检测常见类别数一般是2类或3类。2类就是“戴口罩 / 未戴口罩”3类多加一个“未戴好”。训练数据规模上2类任务四到六千张标注图可以起步3类任务建议至少八千到一万张。很多人觉得这个数量太多但实际碰到的问题恰恰在数据量少、场景单一。公开的口罩检测数据集很多优点是标注质量不错、类别明确适合快速验证模型。缺点也很现实绝大多数来自手持相机或网络图片视角集中在正脸而真实监控是俯视视角还有逆光、暗光、侧脸、低头、遮挡等复杂情况。直接拿公开数据训练验证集mAP能到0.8以上一上现场就现原形。我在一次漏检问题排查时把测试集中的失败样本翻了一遍发现绝大多数不是模型结构问题而是训练数据里压根没有这种角度和光照的样本。所以自建数据是绕不开的。不用一上来就追求几万张先把场景覆盖到位更重要室内均匀光、户外逆光、夜间低照度、头顶俯拍、人员密集排队、同时戴帽子和眼镜、老人与儿童。每个场景给五六十张能做标注的图就能明显改善模型在对应场景下的表现。3.2 标注规范边界框的“贴边”怎么处理数据标注看起来技术含量不高但恰恰是口罩检测项目里最容易出问题的环节。最大的分歧点在于边界框到底框住口罩区域还是框住包含口罩的人脸区域我自己的经验是如果任务目标是判断“人戴没戴口罩”应该框住包含口罩的整个头部区域。理由很直接模型需要同时看到口罩和周围面部特征才能作出稳定判断。如果只框口罩区域模型会倾向于把口罩当做一个纹理斑块来识别遇到口罩颜色和背景相近时就容易漏检框住头部整体模型学到的“人脸口罩”的整体结构更稳健。标注口径不一致是训练集统计没问题但模型行为怪异的常见原因。另一个细节是截断目标的标注。画面边缘的人脸经常会有一半超出图像边界如果严格只标可见部分模型会被迫学习一个“截断框”的分布反而带偏。我的做法是边缘目标按完整语义区域标注即使框延伸出图像边界也没关系。单独验证这个规则之后图像边缘人员的召回率有明显提升。一个小改动效果往往比调整多次网络结构还明显。3.3 数据增强与类别不平衡YOLOv5默认开启Mosaic增强把四张图拼接成一张来训练。这个增强对小目标特别有利因为它变相把目标“缩小”了让模型在训练时看到更多小尺寸的口罩目标。我的经验是保留Mosaic但在类别不平衡比较严重时把Mosaic概率稍微调低一点避免增强后的合成图形状怪异反而引入额外噪声。类别不平衡方面口罩检测常见的是“未戴口罩”样本少“戴口罩”样本多。如果不处理模型对少数类的召回率会很差。处理方式有两种一是按类别设置损失权重把少数类的权重调高二是在采样时提高少数类图片的出现概率。这两种我都在项目里用过效果上后者更直接但我更推荐先用数据层面平衡再动训练参数因为参数调节盲目性大容易引入别的副作用。4. 训练全流程版本选择、参数配置与调参记录4.1 环境与版本的取舍YOLOv5开源社区的版本迭代比较快但我的建议是固定某个向后兼容性较好的历史版本不要频繁跟随更新。不同版本之间的数据增强、锚框计算和导出流程可能都存在差异今天能用明天拉完新版本可能反而跑不通。第一次接触这个任务的读者建议直接用当时主流的稳定版本并记录下自己的环境信息深度学习框架版本、显卡驱动版本、计算加速库版本。这些信息不匹配时最典型的表现就是训练中途报错排查起来很浪费时间。4.2 一套可直接上手的基线参数下面这套参数是多次试验后比较稳妥的基线配置适合大部分口罩检测场景。参数名称推荐值说明输入尺寸640 × 640小目标特别多时可试1280但耗时和显存翻倍批量大小32显存不够则降到16学习率相应调整优化器SGD带动量的SGD在检测任务上更稳初始学习率0.01使用warm-up后从0开始慢慢升warm-up轮数3预热轮数稳定早期训练总训练轮数100~150小数据集可适当增加到200标签平滑0.1对类别不平衡有一点缓解作用少数类权重按需调整建议在数据平衡后再动别一开始就调特别提醒一下输入尺寸是一个经常被忽略的杠杆。口罩目标小把输入从640提升到960或1280很多时候直接提升小目标召回率。但代价是显存占用、训练时间和推理时长都会明显上升。我的习惯是先用640快速验证数据有没有问题再针对小目标场景试更大输入而不是一上来直接开大分辨率。4.3 训练曲线中的典型“病态”训练过程中最常见的一种情况是训练loss一直在降验证集mAP却纹丝不动甚至更差。这多半是过拟合而且问题出在数据侧。处理顺序是这样的先把Mosaic增强概率降下来看看验证集有没有变化再看标注口径是否统一最后才考虑换模型或加正则。我之前在某个项目里就是被增强参数坑过Mosaic比例过大导致模型学到了拼接形态的伪特征验证集mAP只有0.8出头关掉Mosaic之后直接涨了0.03。另一种让新手困惑的现象是前几个epoch的mAP为0。这不一定需要紧张。YOLOv5训练早期正负样本分配还在调整损失波动剧烈是正常的一般到warm-up结束后曲线会快速下降。如果到第20个epoch mAP仍为0再去检查标签文件和类别编号对应关系。标签类别编号反了也是新手最容易犯的错误之一检查时优先看验证集预测框的类别名称是否正确。5. 评估指标之外的部署环节mAP高不等于能上线5.1 推理速度才是真正的硬门槛模型训练完很多人盯着mAP和F1看但部署时最先卡住人的往往是推理延迟。YOLOv5家族里有s、m、l、x几种规格规模越大精度越高速度也越慢。我实测下来在边缘设备上用YOLOv5s中等分辨率输入单帧推理可以做到几十毫秒换成YOLOv5l精度提升有限但推理时间可能要翻两三倍。对戴口罩检测这种实时监控场景帧率的要求通常在15FPS以上如果检测结果达不到这个速度整个业务设计都要重新考虑。推理延迟不只是网络本身的问题。后处理尤其是非极大值抑制在目标多的时候也可能占掉很大一部分时间。我在一次优化中把一些检测框合并逻辑从后处理中抽出来单独实现整体耗时下降了大约30%。后来再深入看发现很多框架自带的后处理对CPU设备的优化程度其实一般必要的时候值得自己单独排查。5.2 现实环境的鲁棒性光线、遮挡与运动在测试集上表现良好的模型进入现场后通常会出现几个固定类别的失败。第一是暗光环境。晚上或楼道里的低照度画面口罩和肤色对比度很低模型很容易把深色口罩漏掉。数据增强里加入亮度扰动可以缓解但真正稳妥的办法是在训练集里加入真实夜视、红外画面。第二是部分遮挡。医疗场所的防护面屏、安全帽、围巾都可能把口罩或脸部轮廓挡掉一部分这类样本在常规数据集里很少需要主动补充。第三是运动模糊。人员快速通过闸机或摄像头画面晃动时一张运动模糊图上可能连人眼都看不清检测模型漏检也算正常。遇到这类问题先从业务侧看能不能通过安装位置和补光解决不一定非要靠模型硬扛。5.3 模型轻量化与部署优化部署阶段模型轻量化是一条明确的路。常见做法是把训练好的权重导出为中间格式再转换到推理引擎用半精度或INT8量化来加速。半精度一般不会带来明显精度损失在支持对应指令集的设备上速度收益很直接INT8量化压缩更狠速度提升更明显但精度波动需要重新在验证集上评估尤其是小目标口罩检测量化后容易掉点。我在一次部署中对比过INT8量化后推理速度快了接近一倍但小目标召回率下降了3个百分点。如果业务对口罩漏检很敏感我宁可保留半精度把调优精力花在数据上而不是为了速度牺牲召回。另一个容易被忽略的部署优化是输入分辨率和检测阈值。把输入从1280降到640速度能快很多把置信度阈值从0.25提升到0.4误检会明显减少但漏检可能增加。每个项目都要根据现场视频重新标定这个阈值而不是直接用默认值。这类设置对最终业务效果的影响往往比换一个更大的模型还要明显。6. 现有方案的局限与后续可探索方向6.1 “检测框”不等于“合规判定”YOLOv5输出的是一个矩形框和类别置信度它能告诉你画面里这个人“被判定为戴了口罩”但没法保证口罩真的遮住了口鼻。有人口罩只罩着嘴、鼻子整个露在外面从正面看检测框和类别可能仍然是“戴了”。要解决这个问题不能只靠目标检测还要在检测框基础上加一个语义粒度更细的分类器或者单独训练一个将人脸关键点与口罩区域对齐的模型。我在实际项目中补过一层后处理规则当检测置信度高但口罩区域与嘴部关键点的重合度较低时自动降级为“未戴好”。这当然增加了复杂度但从业务验收角度来说这层补盲基本是必须的。6.2 后处理与多模型组合的思路单一模型期望把所有复杂情况都解决往往会过度训练、过拟合。更实用的方案是多模型组合先用YOLOv5把画面里的人脸区域全部检测出来再用一个更轻量的口罩分类器对每个区域进行二次判断。人脸检测器的任务是找全人口罩分类器的任务是判断状态两个模型各干各的职责边界清楚更容易调优。这种方法的特点是集成门槛不高但能明显降低口罩颜色与环境颜色相近时的误检。我在这类组合里还接入了简单的目标跟踪对同一目标跨帧打分后再输出最终状态这样单帧漏检不会直接导致一次误告警业务侧的稳定性会好很多。6.3 从YOLOv5向新一代模型的迁移思考YOLOv5本身很成熟但它的方法论也在被更新的架构吸收。新一代检测模型在主干网络、注意力机制、无锚框检测头等方向做了不少改进对小目标、遮挡目标的处理能力也更强。如果是从零开始的新项目可以先把YOLOv5跑通作为基线再用同样的数据去试新模型对比mAP、速度和部署成本。不过我的建议是不要为了“新”而换口罩检测场景的收益往往来自数据和后处理层面的细节模型结构带来的提升通常远小于数据分布修正和部署适配带来的提升。从更长远的角度看口罩检测这类任务很可能不再单独存在而是融入到通用的人脸属性识别、人体结构化描述等框架里成为其中一个属性分支。届时目标的重点就不再是单独检测口罩而是如何把口罩状态和人脸识别、人流量统计等能力在一个统一框架下高效整合。作为从业者我的体会是不管是做综述还是做项目都要把时间和算力投在数据、评测闭环和部署工程上因为在真实业务里这些环节决定最终能不能落地。