1. 项目概述:基于深度学习的口罩佩戴检测系统
去年在商场门口看到保安手动检查口罩时,我就萌生了用AI实现自动检测的想法。这个毕设项目采用YOLOv5算法,能在视频流中实时识别未佩戴口罩、错误佩戴和正确佩戴三种状态。相比传统图像处理方法,深度学习方案在复杂光照、多人场景下的准确率提升了至少40个百分点。
口罩检测本质上属于特定场景下的目标检测任务,但比通用检测多了状态判别的维度。我们不仅需要定位人脸,还要分析口罩与人脸的相对位置关系。经过测试,直接使用现成的YOLO模型只能达到75%的准确率,而经过我们改进后的模型在自建数据集上达到了93.2%的mAP。
关键指标:处理速度32FPS(GTX1660显卡)、支持最多同时检测20人、最小可识别像素30×30
2. 核心算法选型与改进
2.1 为什么选择YOLOv5而非Faster R-CNN
在对比实验中,YOLOv5s(small版本)的表现令人惊喜:
- 速度:Faster R-CNN仅8FPS,YOLOv5s达到45FPS
- 准确率:在口罩检测任务上,YOLOv5s的mAP仅比Faster R-CNN低2.3%
- 模型大小:YOLOv5s仅14MB,便于部署到边缘设备
我们修改了原版YOLOv5的head部分,增加了针对口罩状态的分类分支。具体是在原有检测头基础上:
- 新增一个3分类的全连接层(无口罩/错误佩戴/正确佩戴)
- 调整损失函数权重,给状态分类增加0.3的系数
- 添加注意力机制模块,强化口罩区域特征提取
2.2 数据增强策略
由于口罩佩戴存在大量遮挡情况,我们特别设计了以下增强方案:
# 关键增强代码示例 transform = A.Compose([ A.RandomShadow(p=0.3), # 模拟光照变化 A.RandomFog(p=0.1), # 模拟雾气环境 A.RandomSunFlare(p=0.1),# 强光干扰 A.Cutout(num_holes=8, max_h_size=20, max_w_size=20, p=0.5) # 模拟遮挡 ])这种组合使模型在逆光、侧光等复杂场景下的鲁棒性提升了27%。
3. 数据集构建与标注
3.1 数据来源与配比
我们收集了三个来源的数据:
- 公开数据集MAFA(占比40%)
- 自拍采集(占比30%)
- 网络爬取(占比30%)
最终构建的数据集包含12,458张图像,类别分布如下:
| 类别 | 数量 | 占比 |
|---|---|---|
| 无口罩 | 4,102 | 32.9% |
| 错误佩戴 | 3,756 | 30.1% |
| 正确佩戴 | 4,600 | 37.0% |
3.2 标注技巧与工具
使用LabelImg标注时发现几个关键点:
- 口罩边界应包含耳挂绳
- 对于透明口罩,以可见轮廓为准
- 侧脸情况标注整个面部区域
我们开发了标注辅助脚本,可自动预标人脸位置:
python pre_label.py --input_dir=./raw_images --output_dir=./annotations4. 模型训练与调优
4.1 超参数设置
经过200次实验得出的最优配置:
lr0: 0.01 # 初始学习率 lrf: 0.1 # 最终学习率 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0使用余弦退火策略,batch_size设为32时效果最佳。
4.2 训练过程监控
典型的loss曲线应呈现以下特征:
- 前5个epoch分类loss快速下降
- 10-15epoch出现轻微震荡
- 30epoch后趋于平稳
我们添加了自定义回调函数,当验证集mAP连续3次不提升时自动:
- 降低学习率
- 启用更强的数据增强
- 保存当前最佳权重
5. 部署与性能优化
5.1 边缘设备部署方案
在Jetson Nano上的优化手段:
- 使用TensorRT加速,FP16精度下速度提升3倍
- 采用多线程流水线处理:
- 线程1:图像采集
- 线程2:推理计算
- 线程3:结果可视化
- 输入分辨率调整为320×320
5.2 性能对比
不同硬件平台的实测结果:
| 设备 | 分辨率 | FPS | 功耗 |
|---|---|---|---|
| GTX1660 | 640×640 | 32 | 120W |
| Jetson Nano | 320×320 | 8 | 10W |
| RK3588 | 416×416 | 15 | 5W |
6. 常见问题与解决方案
6.1 误检情况处理
典型误检场景及对策:
- 下巴遮挡误判为口罩
- 解决方案:增加下巴遮挡的负样本
- 高领衣物干扰
- 解决方案:添加neck类别的二分类器
6.2 模型量化后的精度损失
当采用INT8量化时,发现:
- 准确率下降约5%
- 速度提升2.8倍
改进方法:
- 使用量化感知训练(QAT)
- 对分类头保持FP16精度
- 采用混合精度量化策略
7. 项目扩展方向
在实际部署中发现几个有价值的改进点:
- 结合人脸识别实现人员追踪
- 添加语音提示模块
- 开发低功耗版本的轻量级模型
训练过程中有个有趣的发现:当把口罩图案数据增强到人脸其他部位时,模型对异常佩戴的识别率会提升。这启发我们可以合成更多"对抗样本"来增强模型鲁棒性。
最后分享一个实用技巧:在部署时使用OpenVINO工具包可以进一步提升Intel平台上的推理速度,我们在i5-1135G7上实现了25FPS的实时处理能力。对于需要7×24小时运行的场景,建议添加温度监控和动态频率调节功能来保护硬件。