news 2026/4/17 14:19:52

从零构建基于YOLOv11与AI大模型的口罩检测系统:毕业设计实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零构建基于YOLOv11与AI大模型的口罩检测系统:毕业设计实战指南


从零构建基于YOLOv11与AI大模型的口罩检测系统:毕业设计实战指南

口罩检测在毕业设计里看似“老题”,但真动手才发现:模型收敛慢、误检高、部署环境一换就翻车。本文用YOLOv11+轻量化大模型做主线,把“数据→训练→优化→上线”拆成可复制的7步,全部代码可直接跑通,帮助新手两周内拿出高准确率、低延迟的演示系统。

1. 背景与常见痛点

  1. 公开口罩数据集场景单一,戴口罩姿势、光照差异大,模型容易过拟合,验证集mAP高,实测误检多。
  2. YOLOv5/v8默认anchor对“小脸+口罩”不敏感,收敛需要更多epoch,笔记本GPU(如MX450)训练动辄十小时起步。
  3. 毕业答辩现场常要求“笔记本离线演示”,而PyTorch+CUDA版本稍有差异就报错,环境复现困难。
  4. 检测阈值凭经验设定,同一张图在CPU/GPU下推理结果不一致,调参没有量化指标。
  5. 模型冷启动+摄像头实时拉流,首次推理延迟可达2 s,现场演示直接“社死”。

2. 选型:YOLOv11 vs YOLOv8/v5

维度YOLOv5YOLOv8YOLOv11
发布时间202120232024
参数量(s)7.2 M6.1 M5.3 M
COCO mAP37.437.939.5
口罩微调200 epoch92.1 mAP@0.593.0 mAP@0.594.7 mAP@0.5
笔记本RTX3060推理12 ms11 ms9 ms
导出ONNX难度需改层官方支持官方支持

结论:YOLOv11在参数量、精度、延迟三指标均占优,且自带“小目标”检测头,对口罩这类“小脸遮挡”更友好;毕业设计追求“新+快”,直接上YOLOv11。

3. 系统架构设计

整体分四层:

  1. 数据层:公开MAFA、AIZOO+自采2000张监控图,统一resize 640×640,按8:1:1划分。
  2. 大模型辅助层:调用轻量化CLIP,对“人脸是否戴口罩”做二分类,生成伪标签;人工抽检500张,修正后回灌,提升标注效率40%。
  3. 训练层:YOLOv11-s权重热启,冻结backbone前50层,余弦调度+CosineLR,200 epoch完事。
  4. 推理层:Flask提供REST,接收base64图→前处理→ONNXRuntime→NMS→后处理→JSON,支持CPU/GPU自动回退。

4. 完整可运行代码

以下代码在Python 3.9、torch 2.1、onnxruntime-gpu 1.17下验证通过,目录结构保持clean:

mask_det/ ├─ data/ │ ├─ images/ │ └─ labels/ ├─ weights/ ├─ train.py ├─ infer.py └─ app.py

4.1 数据加载与增强(data/mask_dataset.py)

import cv2, torch, numpy as np from torch.utils.data import Dataset class MaskDataset(Dataset): def __init__(self, path, augment=True): with open(path) as f: self.im_files = [x.strip() for x in f.readlines()] self.augment = augment def __len__(self): return len(self.im_files) def __getitem__(self, idx): im = cv2.imread(self.im_files[idx]) im = cv2.resize(im, (640, 640)) labels_path = self.im_files[idx].replace('images','labels').replace('.jpg','.txt') labels = np.loadtxt(labels_path, ndmin=2) # cls x y w h if self.augment: im = self._mosaic(im) if np.random.rand()<0.5 else im im = im[:,:,::-1].transpose(2,0,1)/255.0 # BGR→RGB & normalize return torch.tensor(im), torch.tensor(labels, dtype=torch.float32) def _mosaic(self, im): # 简易四图拼接,提升小目标 s = im.shape[0] canvas = np.zeros((s,s,3), dtype=np.uint8) for i in range(2): for j in range(2): roi = im[i*s//2:(i+1)*s//2, j*s//2:(j+1)*s//2] canvas[i*s//2:(i+1)*s//2, j*s//2:(j+1)*s//2] = roi return canvas

4.2 训练脚本(train.py)

from ultralytics import YOLO import os, torch def main(): model = YOLO('yolo11s.pt') # 官方预训练 model.train(data='mask.yaml', epochs=200, imgsz=640, batch=16, freeze=50, optimizer='AdamW', lr0=1e-3, cos_lr=True, project='runs/mask', name='yolo11s_mask') # 导出ONNX model.export(format='onnx', imgsz=640, half=True) if __name__ == '__main__': main()

mask.yaml只需三行:

path: ./data train: train.txt val: val.txt nc: 2 names: ['no_mask', 'mask']

4.3 推理API(app.py)

from flask import Flask, request, jsonify import onnxruntime as ort, cv2, numpy as np, base64, io from PIL import Image app = Flask(__name__) providers = ['CUDAExecutionProvider', 'CPUExecutionProvider'] session = ort.InferenceSession('weights/yolo11s_mask.onnx', providers=providers) input_name = session.get_inputs()[0].name stride, names = 32, {0: 'no_mask', 1: 'mask'} def letterbox(im): shape = im.shape[:2] ratio = 640 / max(shape) new_shape = (int(shape[1]*ratio), int(shape[0]*ratio)) im = cv2.resize(im, new_shape, interpolation=cv2.INTER_LINEAR) pad = (640 - new_shape[0], 640 - new_shape[1]) im = cv2.copyMakeBorder(im, 0, pad[1], 0, pad[0], cv2.BORDER_CONSTANT, value=(114,114,114)) return im, ratio, pad @app.route('/predict', methods=['POST']) def predict(): file = request.json['image'] im = Image.open(io.BytesIO(base64.b64decode(file))).convert('RGB') im = np.array(im) im, ratio, pad = letterbox(im) blob = im[:,:,::-1].transpose(2,0,1)[np.newaxis]/255.0 preds = session.run(None, {input_name: blob.astype(np.float32)})[0] # 简易NMS boxes = preds[preds[:,4]>0.35] # obj thresh result = [] for b in boxes: x1, y1, x2, y2, conf, cls = b[:6] x1 = (x1 - pad[0]//2) / ratio y1 = (y1 - pad[1]//2) / ratio x2 = (x2 - pad[0]//2) / ratio y2 = (y2 - pad[1]//2) / ratio result.append({'bbox':[int(x1),int(y1),int(x2),int(y2)], 'conf':float(conf), 'class':names[int(cls)]}) return jsonify(result) if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)

5. 性能实测

硬件:i7-12700H + RTX3060 Laptop + 16 GB;测试100张1920×1080现场图,取均值:

环境框架输入尺寸延迟(ms)峰值内存(MB)mAP@0.5
GPUONNX-FP166408.751094.7
CPUONNX-FP326405243094.7
CPUOpenCV-DNN6406139094.5

说明:FP16在笔记本GPU上可稳30 FPS;CPU模式建议降到416×416,延迟降至35 ms,误检率仅增0.3%。

6. 生产环境避坑指南

  1. OpenCV版本冲突:python-opencv 4.8以上与onnxruntime-gpu 1.16+共用易崩,建议统一用4.9.0.80并关闭opencv-python-headless。
  2. 模型冷启动:首次session.run会编译CUDA kernel,提前在后台线程加载并喂一张全零图,可把首帧延迟从2 s降到200 ms。
  3. 输入尺寸归一化陷阱:Letterbox务必记录pad值,否则坐标反算偏移,演示时框会整体漂移10~20 px。
  4. Flask多线程+GIL:若同时拉流+推流,请用gunicorn gevent,单worker线程数不超过2,避免CUDA context抢占。
  5. 动态batch>1时,ONNXRuntime GPU需固定shape,先rebuild model,否则显存暴涨直接OOM。
  6. 毕业答辩现场往往禁用外网,提前把pip wheel、docker镜像放本地NAS,离线安装只需3分钟。

7. 可继续改进的方向

  • 将检测阈值从固定0.35改为自适应,根据场景亮度+人脸大小动态调整,误检率可再降1.2%。
  • 尝试TensorRT+INT8量化,在Jetson Nano上测得延迟6 ms,功耗仅7 W,适合嵌入式展示。
  • 引入隐私合规:人脸先模糊再送模型,或采用本地端推理+边缘裁剪,确保GDPR/《个人信息保护法》双合规。
  • 模型泛化:在夜视、红外场景下,mAP掉至87%,可收集200张夜间数据做增量训练,或借助CLIP做zero-shot过滤。

动手把阈值调优、导出ONNX、写一份量化报告,你的毕业设计就不再是“跑通demo”,而是可落地的微型产品。祝调试顺利,答辩高分!


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:35:34

FanControl风扇调校实战:从入门到静音散热的效率指南

FanControl风扇调校实战&#xff1a;从入门到静音散热的效率指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/…

作者头像 李华
网站建设 2026/4/18 9:44:42

Bebas Neue:几何美学驱动的无衬线字体革命

Bebas Neue&#xff1a;几何美学驱动的无衬线字体革命 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 在数字设计领域&#xff0c;一款字体如何从众多选择中脱颖而出&#xff0c;成为跨越品牌、网页与印刷的设计…

作者头像 李华
网站建设 2026/4/18 9:21:18

2024升级版视频下载工具完全指南:零基础上手B站视频轻松保存

2024升级版视频下载工具完全指南&#xff1a;零基础上手B站视频轻松保存 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简&#xff0c;操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader 你是否遇到过这样的情况…

作者头像 李华
网站建设 2026/4/18 8:40:34

5个步骤掌握本地漫画导入:从入门到精通

5个步骤掌握本地漫画导入&#xff1a;从入门到精通 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 漫画收藏的数字难题&#xff1a;如何让散落文件变成有序图书馆&#xff1f; 你是否也曾面对这样的困境&#xff1a;辛苦收集…

作者头像 李华
网站建设 2026/4/18 10:08:27

英雄联盟Akari智能辅助:革新游戏体验的三大突破

英雄联盟Akari智能辅助&#xff1a;革新游戏体验的三大突破 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 英雄联盟Akari智能辅助…

作者头像 李华