1. 项目背景与核心价值
去年在指导某高校毕业设计时,遇到一个典型的机器视觉落地场景——校园出入口需要自动检测行人是否规范佩戴口罩。这个看似简单的需求背后,其实包含了完整的计算机视觉技术链。不同于实验室的完美环境,真实场景中的人脸角度、光照变化、遮挡情况都给检测算法带来巨大挑战。
口罩检测本质上属于特定目标检测任务,但相比常规物体检测有其特殊性:一是目标尺寸小(口罩仅占人脸下部约1/6区域),二是存在大量半遮挡情况(如口罩佩戴不规范)。这要求算法既要具备细粒度识别能力,又要能处理不完整特征。当前主流方案主要基于YOLO系列改进或采用两阶段检测框架,我们在项目中最终选择了YOLOv5s+注意力机制的改进方案。
2. 技术方案选型与对比
2.1 主流算法性能对比
通过对比实验,我们测试了三种典型方案在自建数据集上的表现:
| 模型类型 | 准确率(%) | 推理速度(FPS) | 模型大小(MB) |
|---|---|---|---|
| Faster R-CNN | 92.3 | 8 | 245 |
| YOLOv5s | 89.7 | 45 | 14 |
| MobileNetV3+SSD | 86.5 | 62 | 9 |
考虑到实际部署需要平衡精度和速度,最终选择在YOLOv5s基础上进行改进。这个选择基于三点考量:首先,校园场景对实时性要求较高(需要30FPS以上);其次,边缘设备算力有限(使用Jetson Nano部署);最后,YOLO系列在目标检测任务中已形成完整生态,便于后续迭代。
2.2 模型改进关键点
在基础模型上,我们主要做了三处改进:
注意力机制融合:在Backbone末端添加CBAM模块,使网络更关注口罩区域。实验表明这使小目标检测AP提升约4.2%
多尺度训练策略:针对远近不同的人脸,采用640×640和320×320双尺度交替训练,改善尺度适应性
数据增强优化:除常规的翻转、旋转外,特别添加了口罩模拟生成器,自动生成各种佩戴状态的样本
实践发现:直接使用公开口罩数据集效果不佳,因为拍摄角度和场景差异太大。建议至少收集30%的实际场景数据。
3. 数据集构建与标注规范
3.1 数据采集方案
我们采用"3+1"数据来源策略:
- 校园监控视频抽帧(占比40%)
- 公开数据集筛选(MAFA、FaceMask等,占比30%)
- 模拟生成数据(占比20%)
- 人工补拍特殊场景(占比10%)
特别注意收集以下难点样本:
- 侧脸/低头等非常规角度
- 透明/花纹等特殊材质口罩
- 佩戴不规范(露鼻、挂下巴等)
3.2 标注标准制定
采用严格的四类标注规范:
- proper_mask:规范佩戴
- improper_mask:佩戴不规范
- no_mask:未佩戴
- occluded:严重遮挡无法判断
标注时要求精确贴合口罩边缘,对于不规范佩戴的情况,需要同时标注人脸关键点(鼻尖、下巴)作为参考。我们开发了半自动标注工具,结合Dlib人脸检测预生成标注框,将人工标注效率提升3倍。
4. 模型训练与调优实战
4.1 训练环境配置
硬件配置:
- GPU:RTX 3060 (12GB显存)
- CPU:i7-11800H
- 内存:32GB
软件环境:
# 关键依赖版本 python==3.8.10 torch==1.9.0+cu111 torchvision==0.10.0+cu111 albumentations==1.1.04.2 超参数设置
核心参数配置:
# yolov5s_mask.yaml nc: 4 # 类别数 depth_multiple: 0.33 width_multiple: 0.50 anchors: - [10,13, 16,30, 33,23] - [30,61, 62,45, 59,119] - [116,90, 156,198, 373,326] # 训练命令示例 python train.py --img 640 --batch 32 --epochs 100 --data yolov5s_mask.yaml --weights yolov5s.pt4.3 训练过程监控
使用WandB进行可视化监控,重点关注三个指标:
- mAP@0.5:主要精度指标
- mAP@0.5:0.95:综合性能指标
- inference_time:单帧处理耗时
典型训练曲线显示,约在50epoch后模型进入稳定期,此时可以开始进行模型剪枝等优化操作。
5. 边缘端部署优化
5.1 TensorRT加速实践
在Jetson Nano上的部署流程:
# 模型转换 python export.py --weights runs/train/exp/weights/best.pt --include onnx trtexec --onnx=best.onnx --saveEngine=best.engine --fp16 # 推理测试 ./inference_engine --model best.engine --video test.mp4经过TensorRT优化后,推理速度从原来的22FPS提升到37FPS,满足实时性要求。
5.2 功耗优化技巧
通过三项措施将整机功耗控制在10W以内:
- 设置GPU频率上限
sudo jetson_clocks --fan sudo nvpmodel -m 1- 使用异步推理流水线
- 动态调整检测频率(人流量少时降至15FPS)
6. 实际场景问题排查
6.1 典型误检案例
收集到的TOP3错误类型:
- 手持口罩误判为佩戴(占比38%)
- 高领衣物误识别为口罩(占比25%)
- 阴影导致的误判(占比17%)
解决方案:
- 添加行为时序分析,要求"口罩"区域持续存在5帧以上
- 融合人脸姿态估计,排除非面部区域的误检
- 引入光流分析,过滤静态纹理误判
6.2 性能瓶颈分析
使用Nsight Systems工具分析发现:
- 60%时间消耗在图像预处理
- 25%时间在模型推理
- 15%时间在后处理
优化措施:
- 将resize操作移至GPU执行
- 使用双缓冲机制重叠处理
- 优化NMS实现
经过优化后,整体吞吐量提升40%,在Jetson Nano上达到稳定25FPS的处理能力。
7. 项目扩展方向
当前系统可进一步扩展:
- 多目标检测:同步检测体温异常(结合热成像)
- 语音提示模块:对不规范佩戴实时提醒
- 人流量统计:基于检测结果生成热力图
一个实用的改进是在校园地图上实时显示各入口的口罩佩戴率,帮助管理人员快速定位需要加强监管的区域。这只需要在现有系统上添加简单的数据可视化接口。