1. 项目概述
这个口罩检测系统项目基于当前计算机视觉领域最前沿的YOLOv5目标检测框架,结合PyTorch深度学习平台实现。在公共卫生事件频发的背景下,自动化的口罩佩戴检测技术具有重要的现实意义。我在实际开发中发现,相比传统检测方法,基于深度学习的方案在准确率和实时性方面都有显著优势。
系统核心是通过摄像头实时检测画面中的人脸,并判断是否规范佩戴口罩。我选择YOLOv5作为基础框架主要考虑其出色的推理速度(在Tesla T4显卡上可达140FPS)和较高的检测精度(在自定义数据集上mAP@0.5可达98%)。整个开发流程涉及环境配置、数据准备、模型训练和部署应用四个关键环节。
2. 环境配置与工具选型
2.1 硬件配置建议
开发阶段建议配置:
- GPU:NVIDIA GTX 1660及以上(4GB显存起步)
- CPU:Intel i5 8代或AMD同等性能
- 内存:16GB及以上
实际部署可选用:
- 边缘设备:Jetson Nano/NX系列
- 工业电脑:研华/研祥等工控机
- 云服务:AWS EC2 g4dn实例
注意:使用CPU模式运行时,检测速度会下降约10-15倍。建议至少配备支持CUDA的NVIDIA显卡。
2.2 软件环境搭建
推荐使用Anaconda创建隔离环境:
bash复制conda create -n maskdetect python=3.8
conda activate maskdetect
关键依赖安装:
bash复制pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
pip install opencv-python matplotlib tqdm pandas seaborn
YOLOv5源码获取:
bash复制git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
验证安装:
python复制import torch
print(torch.__version__, torch.cuda.is_available()) # 应输出1.8.1 True
3. 数据准备与标注
3.1 数据集构建
优质的数据集应包含:
- 多种光照条件(强光/弱光/逆光)
- 不同角度的人脸(正面/侧面/俯仰)
- 多样化的口罩类型(医用/N95/布质)
- 复杂背景(室内/室外/多人场景)
建议数据来源:
- 公开数据集:MAFA、FaceMaskDetection等
- 自行采集:使用OpenCV录制视频后抽帧
- 网络爬取(注意版权)
3.2 数据标注规范
使用LabelImg工具标注时需注意:
- 标注框应紧贴人脸下巴到额头
- 对于部分遮挡情况,按实际可见部分标注
- 类别分为:
- mask:规范佩戴口罩
- no_mask:未佩戴口罩
- incorrect:口罩佩戴不规范(露出鼻子等)
标注文件示例(YOLO格式):
code复制0 0.548672 0.482143 0.215054 0.357143 # mask
1 0.323656 0.571429 0.188172 0.392857 # no_mask
3.3 数据增强策略
在data.yaml中配置:
yaml复制train: ../mask_data/train
val: ../mask_data/val
nc: 3 # 类别数
names: ['mask', 'no_mask', 'incorrect']
# 增强参数
augmentations:
hsv_h: 0.015 # 色调变化
hsv_s: 0.7 # 饱和度变化
hsv_v: 0.4 # 明度变化
degrees: 15 # 旋转角度
translate: 0.1 # 平移比例
scale: 0.5 # 缩放比例
shear: 0.0 # 剪切变换
4. 模型训练与优化
4.1 模型选择对比
YOLOv5提供四种预训练模型:
| 模型 | 参数量 | mAP@0.5 | 速度(FPS) | 适用场景 |
|---|---|---|---|---|
| YOLOv5n | 1.9M | 0.56 | 450 | 移动端/嵌入式 |
| YOLOv5s | 7.2M | 0.67 | 140 | 通用场景 |
| YOLOv5m | 21.2M | 0.73 | 95 | 高精度要求 |
| YOLOv5l | 46.5M | 0.75 | 60 | 服务器端部署 |
经过实测,YOLOv5s在精度和速度上取得了最佳平衡,推荐作为基础模型。
4.2 训练参数配置
典型训练命令:
bash复制python train.py --img 640 --batch 16 --epochs 100 --data mask_data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name mask_detection
关键参数说明:
--img 640:输入图像尺寸--batch 16:根据GPU显存调整(11GB显存可设32)--epochs 100:通常50-300轮--weights:加载预训练权重加速收敛
4.3 训练过程监控
使用TensorBoard观察指标变化:
bash复制tensorboard --logdir runs/train
重点关注指标:
- 损失函数(box_loss, obj_loss, cls_loss)
- 准确率(precision)
- 召回率(recall)
- mAP@0.5(综合评估指标)
典型收敛曲线应呈现:
- 前10个epoch快速下降
- 30-50epoch进入平稳期
- 100epoch后趋于稳定
4.4 模型优化技巧
- 困难样本挖掘:
python复制# 在val.py中添加
if pred_iou < 0.3 and label_iou > 0.7:
save_hard_example()
- 自适应锚框计算:
bash复制python train.py --autoanchor
- 混合精度训练(节省显存):
bash复制python train.py --fp16
5. 模型部署与应用
5.1 模型导出
导出为TorchScript格式:
bash复制python export.py --weights runs/train/mask_detection/weights/best.pt --include torchscript
导出为ONNX格式(适用于TensorRT):
bash复制python export.py --weights runs/train/mask_detection/weights/best.pt --include onnx --dynamic
5.2 Python接口调用
基础检测代码:
python复制import torch
model = torch.jit.load('best.torchscript')
model.eval()
def detect(image):
# 预处理
img = cv2.resize(image, (640, 640))
img = img.transpose(2, 0, 1) # HWC to CHW
img = torch.from_numpy(img).float() / 255.0
# 推理
with torch.no_grad():
pred = model(img[None])[0]
# 后处理
pred = non_max_suppression(pred, 0.5, 0.45)
return pred
5.3 性能优化技巧
- 多线程处理:
python复制from threading import Thread
class StreamLoader:
def __init__(self, src):
self.cap = cv2.VideoCapture(src)
self.thread = Thread(target=self.update, daemon=True)
self.thread.start()
def update(self):
while True:
self.status, self.frame = self.cap.read()
- TensorRT加速:
bash复制trtexec --onnx=best.onnx --saveEngine=best.engine --fp16
- 模型量化(适用于边缘设备):
python复制model = torch.quantization.quantize_dynamic(
model, {torch.nn.Linear}, dtype=torch.qint8
)
6. 实际应用案例
6.1 商场入口监测系统
架构设计:
code复制摄像头组 -> 边缘计算盒 -> 云端管理平台 -> 报警终端
关键参数:
- 分辨率:1920x1080
- 帧率:15FPS
- 识别距离:2-8米
- 多人检测:支持同时检测20+人脸
6.2 公共交通车载系统
特殊考虑:
- 振动补偿:使用IMU数据稳定图像
- 低光照增强:采用Retinex算法预处理
- 离线运行:内置SD卡存储异常记录
6.3 工厂考勤集成
与企业HR系统对接:
- 人脸识别(员工ID)
- 口罩检测(合规检查)
- 温度检测(可选)
- 考勤记录自动生成
7. 常见问题与解决方案
7.1 检测效果问题
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 误检率高 | 背景干扰多 | 增加负样本训练 |
| 小脸漏检 | 原始分辨率低 | 使用--img 1280增大输入尺寸 |
| 侧脸识别差 | 数据缺乏多样性 | 添加更多角度样本 |
7.2 性能问题排查
-
GPU利用率低:
- 检查数据传输瓶颈(使用NVIDIA Nsight)
- 增大batch size
- 启用DALI加速数据加载
-
内存泄漏:
python复制torch.cuda.empty_cache() # 定期清理缓存
- 延迟过高:
- 降低检测频率(如每秒5帧)
- 使用ROI区域检测
7.3 部署异常处理
- CUDA版本不匹配:
bash复制conda install cudatoolkit=11.1 -c nvidia
- 模型加载失败:
python复制# 确保导出和运行环境一致
print(torch.__version__, torch.version.cuda)
- 视频流中断:
python复制while True:
try:
ret, frame = cap.read()
if not ret: raise ConnectionError
except:
cap.release()
cap = cv2.VideoCapture(url)
continue
8. 进阶优化方向
-
多模态融合:
- 结合红外测温数据
- 集成声音检测(咳嗽识别)
- 增加社交距离检测
-
模型轻量化:
- 知识蒸馏(Teacher-Student架构)
- 通道剪枝(使用TorchPruner)
- 量化感知训练
-
异常行为分析:
- 连续未戴口罩预警
- 口罩反复摘戴检测
- 群体聚集告警
在实际项目中,我们发现系统的鲁棒性很大程度上取决于训练数据的质量。建议至少收集5000张以上标注样本,覆盖各种极端场景。另外,模型部署时要特别注意内存管理,我们在Jetson设备上通过使用TensorRT和动态批处理,成功将内存占用降低了40%。
