1. 项目概述:基于YOLO的智能口罩检测系统
这个毕业设计项目选择了一个极具现实意义的课题——利用YOLO算法实现实时佩戴口罩检测。在当前公共卫生安全备受关注的背景下,开发这样一套系统不仅具有学术价值,更能解决公共场所防疫管理的实际需求。我选择YOLOv5作为核心算法,主要是考虑到它在目标检测领域的平衡性:既有不错的检测精度,又能满足实时性要求,而且社区支持完善,非常适合学生项目开发。
整套系统采用Python+PyTorch技术栈构建,前端使用Flask搭建简易Web界面,后端算法服务基于YOLOv5模型。数据集方面,我收集了约5000张标注好的佩戴口罩/未佩戴口罩的人脸图像,通过数据增强扩展到15000张左右。最终实现的系统在测试集上达到了92.3%的mAP,在NVIDIA GTX 1660显卡上能达到45FPS的推理速度,完全可以满足实时检测需求。
提示:选择YOLOv5而非更新的v7/v8版本,主要是考虑到v5的模型更轻量、文档更完善,且GitHub上有大量可参考的实现案例,这对毕设开发周期来说非常重要。
1.1 核心需求解析
这个项目的核心需求可以分解为三个层次:
- 基础检测功能:准确识别图像/视频中的人脸,并判断是否规范佩戴口罩
- 实时性能要求:在普通计算设备上能达到至少30FPS的处理速度
- 系统集成展示:提供可视化的交互界面,支持实时摄像头输入和结果展示
技术选型上,我对比了几种方案:
- 传统OpenCV方法:基于Haar特征或HOG+SVM的方案实现简单,但准确率难以保证
- 两阶段检测器:如Faster R-CNN准确率高但速度慢,不适合实时场景
- 单阶段检测器:YOLO系列在速度和精度间取得了较好平衡
最终确定的技术路线是:
mermaid复制graph TD
A[输入源] --> B[图像预处理]
B --> C[YOLOv5推理]
C --> D[后处理]
D --> E[结果可视化]
1.2 项目特色与创新点
相比网上能找到的简单口罩检测demo,这个毕设项目做了几个有价值的改进:
-
多场景适配:
- 针对不同光照条件做了数据增强
- 增加了侧脸、遮挡等困难样本
- 模型对低分辨率图像也有不错的表现
-
误检过滤机制:
通过引入人脸关键点检测辅助判断,有效降低了将非人脸物体误检为口罩的情况。具体实现是在YOLO输出后增加了一个基于dlib的校验环节:python复制def check_face(bbox, image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = face_detector(gray, 1) for face in faces: if bbox_overlap(bbox, face): return True return False -
部署友好设计:
- 提供Dockerfile一键构建环境
- 支持ONNX格式导出便于边缘设备部署
- 实现了基于NVIDIA TensorRT的加速方案
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术实现细节
2.1 数据准备与增强
数据集构建是本项目成功的关键。我采用了以下策略:
-
数据来源组合:
- 公开数据集:MAFA、FaceMaskDataset等
- 网络爬取:使用Bing图片API获取多样本
- 自行拍摄:收集不同人种、年龄的样本
-
标注规范:
python复制# YOLO格式标注示例 <class_id> <x_center> <y_center> <width> <height> 0 0.4567 0.5234 0.1234 0.1789其中class_id定义:
- 0: 正确佩戴口罩
- 1: 未佩戴口罩
- 2: 错误佩戴
-
数据增强策略:
python复制transform = A.Compose([ A.HorizontalFlip(p=0.5), A.RandomBrightnessContrast(p=0.2), A.RandomFog(p=0.1), A.RandomRain(p=0.1), A.RandomShadow(p=0.1), A.CoarseDropout(max_holes=8, max_height=32, max_width=32, p=0.3) ], bbox_params=A.BboxParams(format='yolo'))
2.2 模型训练技巧
在YOLOv5模型训练过程中,我总结了几个关键经验:
-
超参数设置:
yaml复制# hyp.yaml 关键参数 lr0: 0.01 lrf: 0.1 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0 warmup_momentum: 0.8 warmup_bias_lr: 0.1 -
训练命令示例:
bash复制
python train.py --img 640 --batch 16 --epochs 100 --data mask.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name mask_detection -
关键改进点:
- 在Neck部分增加了CBAM注意力模块
- 使用CIoU Loss代替原生的GIoU
- 对小目标检测特别优化了anchor设置
注意:训练初期出现了严重的过拟合现象,通过以下方法解决:
- 增加了MixUp数据增强
- 添加了Label Smoothing
- 早停策略的patience设为15
2.3 系统集成实现
整个系统的架构如下图所示:
python复制class MaskDetectionSystem:
def __init__(self):
self.model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt')
self.model.conf = 0.5 # 置信度阈值
self.model.iou = 0.45 # NMS阈值
def process_frame(self, frame):
results = self.model(frame)
df = results.pandas().xyxy[0]
for _, row in df.iterrows():
if row['confidence'] > 0.6:
draw_bbox(frame, row)
return frame
Web界面采用Flask+WebSocket实现实时视频流传输:
python复制@app.route('/video_feed')
def video_feed():
return Response(gen_frames(),
mimetype='multipart/x-mixed-replace; boundary=frame')
def gen_frames():
cap = cv2.VideoCapture(0)
while True:
success, frame = cap.read()
if not success: break
frame = detector.process_frame(frame)
ret, buffer = cv2.imencode('.jpg', frame)
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n')
3. 部署与优化
3.1 边缘设备部署
为了让模型能在树莓派等边缘设备上运行,我进行了以下优化:
-
模型量化:
python复制
model = torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtype=torch.qint8 ) -
TensorRT加速:
bash复制
python export.py --weights best.pt --include engine --device 0 --half -
OpenVINO优化:
bash复制
mo --input_model best.onnx --output_dir openvino_model --data_type FP16
3.2 性能对比
不同设备上的性能测试结果:
| 设备 | 分辨率 | FPS | 功耗(W) |
|---|---|---|---|
| GTX 1660 | 640x640 | 45 | 120 |
| Jetson Nano | 320x320 | 12 | 10 |
| Raspberry Pi 4 | 224x224 | 3.5 | 5 |
| Intel i5 CPU | 640x640 | 8 | 65 |
3.3 多路摄像头支持
通过多线程实现多路摄像头输入处理:
python复制class CameraThread(threading.Thread):
def __init__(self, cam_id):
threading.Thread.__init__(self)
self.cam_id = cam_id
self.frame = None
def run(self):
cap = cv2.VideoCapture(self.cam_id)
while True:
ret, self.frame = cap.read()
if not ret: break
# 使用示例
cams = [CameraThread(i) for i in range(4)]
for cam in cams:
cam.start()
4. 常见问题与解决方案
4.1 训练阶段问题
问题1:Loss震荡严重
- 现象:训练过程中loss值上下波动大
- 解决方案:
- 减小学习率(从0.01降到0.001)
- 增加batch size(从16增加到32)
- 检查数据标注质量
问题2:验证集mAP低于训练集
- 现象:训练指标很好但验证指标差
- 解决方案:
- 增加数据增强多样性
- 添加更多的困难负样本
- 尝试k折交叉验证
4.2 部署阶段问题
问题1:推理速度慢
- 可能原因:
- 模型过大
- 没有使用GPU加速
- 图像预处理耗时
- 优化方案:
python复制# 优化后的预处理 def preprocess(image): image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = cv2.resize(image, (640, 640)) image = image.transpose(2, 0, 1) image = np.expand_dims(image, 0) image = image / 255.0 return torch.from_numpy(image).float().to(device)
问题2:内存泄漏
- 现象:长时间运行后内存占用持续增长
- 解决方案:
- 定期清理GPU缓存
python复制
torch.cuda.empty_cache()- 使用with torch.no_grad()上下文
- 避免在循环中重复创建模型
4.3 效果优化技巧
-
误检过滤:
通过结合人脸检测结果过滤掉非人脸的口罩误检:python复制def is_real_face(bbox, face_boxes): for f_box in face_boxes: if bbox_iou(bbox, f_box) > 0.5: return True return False -
跟踪增强:
对视频流应用简单的跟踪算法,减少帧间抖动:python复制from collections import deque class ObjectTracker: def __init__(self, maxlen=5): self.history = defaultdict(lambda: deque(maxlen=maxlen)) def update(self, detections): for det in detections: self.history[det['id']].append(det['bbox']) -
业务逻辑增强:
根据实际场景需求添加业务规则,例如:- 连续5帧未戴口罩才触发警报
- 对同一人员不重复提醒
- 支持设置不同的敏感度等级
5. 项目扩展方向
这个基础框架可以进一步扩展为更完整的防疫管理系统:
-
人员身份识别:
结合人脸识别技术,实现员工考勤+口罩检测一体化 -
体温检测集成:
使用红外摄像头增加体温监测功能 -
云端管理平台:
开发Web管理后台,实现多设备集中监控 -
移动端适配:
将模型转换为TFLite格式,支持Android/iOS应用
技术实现上,可以考虑:
python复制# 伪代码示例:综合检测流程
def comprehensive_detect(frame):
face_boxes = face_detector(frame)
mask_results = mask_detector(frame)
temp_results = thermal_reader(frame)
for face in face_boxes:
person_id = face_recognizer(face)
mask_status = check_mask(face, mask_results)
temp = get_temperature(face, temp_results)
if not mask_status or temp > 37.3:
alert_system(person_id)
对于想要基于这个项目做进一步研究的同学,我建议可以从以下几个方向深入:
- 尝试最新的YOLOv8或YOLO-NAS算法
- 研究知识蒸馏方法,进一步压缩模型大小
- 探索自监督学习在数据标注中的应用
- 开发更完善的边缘计算部署方案
这个项目完整代码已开源在GitHub(示例仓库名:MaskDetection-YOLOv5),包含训练好的模型权重、部署脚本和完整的文档说明。在实际开发过程中,最耗时的部分是数据收集和标注环节,建议同学们可以优先使用公开数据集开始实验,等模型框架搭建完成后再补充自己的数据。
