基于YOLOv5的行人口罩检测系统实现与优化
1. 项目背景与核心价值去年在指导本科生毕业设计时遇到一个特别有现实意义的选题——基于深度学习的行人口罩佩戴检测系统。这个项目看似简单但深入做下来发现涵盖了计算机视觉领域的多个关键技术点。现在把整个实现过程整理成技术笔记特别适合刚接触目标检测的同学作为入门实践项目。口罩检测本质上属于特定场景下的目标检测任务但相比通用检测有其特殊性首先口罩作为面部附着物检测目标较小其次行人姿态变化会导致口罩呈现不同视角再者实际场景中存在光照变化、遮挡等情况。这些特点决定了我们不能直接套用现成的检测模型。2. 技术方案选型与对比2.1 主流目标检测算法评估在方案设计阶段我们对比了三种主流框架Faster R-CNN经典两阶段检测器在COCO等通用数据集上表现优异但模型复杂度高约500MB在移动端部署困难。YOLOv5单阶段检测代表推理速度快在RTX 3060上可达140FPS但小目标检测效果稍逊。SSD平衡了速度与精度模型体积较小约90MB适合嵌入式部署。最终选择YOLOv5s小型版本作为基础模型主要考虑毕业设计周期有限YOLO的端到端训练更易上手提供完善的PyTorch实现和预训练权重支持ONNX导出便于后续部署2.2 数据增强策略针对口罩检测的特殊性设计了专项增强方案# 自定义增强配置YOLOv5 data.yaml augmentations: - hsv_h: 0.015 # 色相扰动 - hsv_s: 0.7 # 饱和度增强应对光线不足 - hsv_v: 0.4 # 明度扰动 - degrees: 15 # 旋转角度模拟头部偏转 - scale: 0.8 # 尺度缩放应对远近变化 - shear: 5 # 剪切变换 - perspective: 0.001 # 透视变换特别增加了对口罩区域的局部遮挡增强模拟实际场景中围巾、手部等遮挡情况。3. 数据集构建与标注3.1 数据来源组合采用开源数据集自采数据的混合方案公开数据集MAFA3.5万标注样本、FaceMask8千张自建数据集在校园多个点位采集2000张照片覆盖不同光照条件强光/逆光/夜间多种遮挡情况眼镜/围巾/手部各类口罩类型医用/N95/棉布3.2 标注规范制定定义了三类标签mask_ok- 正确佩戴口罩覆盖口鼻mask_bad- 错误佩戴露出鼻子或下巴no_mask- 未佩戴口罩使用LabelImg工具标注时特别注意对于侧脸情况标注实际可见的口罩区域多人密集场景确保每个实例独立标注模糊/严重遮挡的样本直接剔除标注经验对争议样本如透明口罩建立判定标准文档保证标注一致性。4. 模型训练与优化4.1 基线模型训练基础训练配置python train.py --img 640 --batch 16 --epochs 100 --data mask.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt初始测试发现两个主要问题对小尺寸人脸50px检测率低对错误佩戴情况误判率高4.2 针对性优化措施改进1自适应锚框计算# 使用k-means重新计算锚框尺寸 anchors: - [12,16, 19,36, 40,28] # P3/8 (小目标层) - [36,75, 76,55, 72,146] # P4/16 - [142,110, 192,243, 459,401] # P5/32改进2注意力机制增强在Backbone末端添加SE模块class SEBlock(nn.Module): def __init__(self, c): super().__init__() self.avgpool nn.AdaptiveAvgPool2d(1) self.fc nn.Sequential( nn.Linear(c, c//16), nn.ReLU(), nn.Linear(c//16, c), nn.Sigmoid() ) def forward(self, x): b, c, _, _ x.size() y self.avgpool(x).view(b, c) y self.fc(y).view(b, c, 1, 1) return x * y改进3关键点辅助检测增加5个人脸关键点预测分支鼻尖/嘴角等帮助判断佩戴位置。优化后指标对比模型版本mAP0.5推理速度(FPS)参数量(M)基线0.7821557.2优化版0.8511328.75. 部署应用方案5.1 边缘设备部署在Jetson Nano上的优化策略使用TensorRT加速python export.py --weights best.pt --include engine --device 0 --half --simplify --opset 12量化到INT8精度体积减少75%采用多线程流水线处理摄像头采集独立线程检测推理主线程结果渲染异步线程5.2 系统集成设计整体架构包含前端PyQt5界面实时显示检测结果和统计报表后端Flask服务提供API接口报警模块对未佩戴口罩人员触发声音提醒数据看板记录各时段佩戴率变化趋势6. 典型问题与解决方案6.1 误检问题排查现象将部分白色衣领识别为口罩解决方法数据层面增加类似负样本模型层面调整loss权重# 修改class weights class_weights: [0.5, 1.0, 1.5] # 加重no_mask惩罚后处理层面添加人脸检测先验只处理人脸区域内的预测6.2 小目标漏检优化改进措施修改特征金字塔结构增强浅层特征# 修改models/yolov5s.yaml backbone: [...] - [-1, 3, C3, [256, True]] # 增加P2输出 head: - [17, 20, 23, [128, 256, 512]] # 新增P2检测头使用超分辨率预处理ESRGAN提升输入质量7. 项目扩展方向多模态检测结合红外测温模块同步监测体温异常行为分析检测佩戴口罩时的调整动作反映佩戴舒适度轻量化改进使用MobileNetV3替换Backbone适配手机端半监督学习利用未标注视频数据提升模型鲁棒性这个项目最让我惊喜的是通过合理的优化策略即使是基础模型也能在特定场景下达到商用级精度。建议初学者先完整复现基线模型再逐步尝试各个改进点这样的学习曲线最为平缓。