1. 项目概述:零基础玩转YOLOv8口罩检测
去年帮社区部署智能防疫系统时,我花了三天时间才跑通第一个口罩检测模型。现在用YOLOv8,同样的任务两小时就能完成——这就是技术迭代的魅力。本文将带你用最新版的YOLOv8,从零开始训练一个高精度的口罩检测模型,整个过程就像搭积木一样简单。
这个实战教程特别适合:
- 刚接触目标检测的在校学生
- 需要快速实现防疫监控的中小企业IT人员
- 想给自己的店铺/办公室加装智能检测的个体业主
你只需要:
- 一台Windows电脑(配置要求不高,4GB显存的显卡就能跑)
- 基础Python环境
- 按照本文步骤复制粘贴命令
注意:本文所有代码都经过Win10/11系统实测,遇到报错可直接看第四章的解决方案
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境配置与数据准备
2.1 极简环境搭建
推荐使用conda创建虚拟环境,避免包冲突:
bash复制conda create -n yolov8_mask python=3.8
conda activate yolov8_mask
pip install ultralytics torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
这里特别选择了torch 1.12.1版本,因为实测发现:
- 新版torch可能遇到NMS计算错误
- cu113表示CUDA11.3驱动,兼容大多数30/40系显卡
2.2 数据集获取与标注
口罩检测数据集可以自己采集,也可以使用公开数据集。推荐以下两种方案:
方案A:使用现成数据集
python复制from roboflow import Roboflow
rf = Roboflow(api_key="YOUR_API_KEY")
project = rf.workspace("community").project("mask-wearing")
dataset = project.version(3).download("yolov8")
方案B:自制数据集
- 用手机拍摄200-300张含有人脸的照片(建议不同角度、光照条件)
- 使用LabelImg工具标注:
- 戴口罩的标注为"mask"
- 未戴口罩的标注为"no_mask"
- 生成YOLO格式的txt标注文件
实操技巧:标注时建议按住Ctrl键拖动选框,可以自动吸附人脸边缘
数据集目录结构示例:
code复制mask_dataset/
├── images/
│ ├── train/
│ │ ├── img001.jpg
│ │ └── ...
│ └── val/
│ ├── img101.jpg
│ └── ...
└── labels/
├── train/
│ ├── img001.txt
│ └── ...
└── val/
├── img101.txt
└── ...
3. 模型训练全流程
3.1 配置文件详解
创建mask_detection.yaml配置文件:
yaml复制path: ./mask_dataset
train: images/train
val: images/val
names:
0: mask
1: no_mask
关键参数说明:
- 类别数建议不超过3个(口罩/未戴/错误佩戴)
- 验证集比例建议20%-30%
3.2 启动训练命令
使用官方API训练:
python复制from ultralytics import YOLO
model = YOLO('yolov8n.pt') # 加载预训练模型
results = model.train(
data='mask_detection.yaml',
epochs=100,
imgsz=640,
batch=16,
device=0 # 使用GPU
)
或者命令行方式:
bash复制yolo task=detect mode=train model=yolov8n.pt data=mask_detection.yaml epochs=100 imgsz=640
参数优化技巧:
- 显存不足时:减小batch size(最低可设4)
- 训练不稳定:降低学习率(lr0=0.001)
- 过拟合时:增加数据增强(flipud=0.5)
3.3 训练过程监控
训练时会自动启动TensorBoard:
code复制tensorboard --logdir runs/detect
重点关注三个指标:
- mAP@0.5:高于0.85说明模型可用
- box_loss:应稳定下降至0.05以下
- cls_loss:应稳定下降至0.01以下
异常处理:如果loss出现NaN,尝试减小学习率或更换torch版本
4. 模型部署与优化
4.1 模型导出与测试
导出为ONNX格式:
python复制model.export(format='onnx')
测试推理效果:
python复制results = model.predict('test.jpg', save=True)
4.2 性能优化技巧
提升推理速度:
python复制model.predict(..., half=True) # 启用半精度推理
提高小目标检测:
yaml复制# 修改anchors参数
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
4.3 实际部署方案
方案A:本地视频流检测
python复制import cv2
from ultralytics import YOLO
model = YOLO('best.pt')
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
results = model(frame)
annotated_frame = results[0].plot()
cv2.imshow("Mask Detection", annotated_frame)
if cv2.waitKey(1) == ord('q'):
break
方案B:Web服务部署
python复制from fastapi import FastAPI, UploadFile
import numpy as np
import cv2
app = FastAPI()
model = YOLO('best.pt')
@app.post("/detect")
async def detect(file: UploadFile):
image = np.frombuffer(await file.read(), np.uint8)
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
results = model(image)
return {"result": results[0].tojson()}
5. 常见问题排坑指南
5.1 训练报错解决方案
CUDA out of memory
- 降低batch size
- 添加
--device cpu参数临时用CPU训练
Missing labels警告
- 检查标注文件是否为空
- 确认图片和标注文件同名
5.2 效果优化方案
漏检率高怎么办?
- 增加负样本(不含人脸的图片)
- 调整conf参数:
model.predict(..., conf=0.3)
误检多怎么办?
- 增加困难样本(半遮挡、儿童等)
- 使用TTA增强:
model.predict(..., augment=True)
5.3 模型微调技巧
增量训练
python复制model = YOLO('runs/detect/train/weights/last.pt')
model.train(resume=True)
冻结骨干网络
python复制model.train(..., freeze=[0,1,2]) # 冻结前3层
我在实际部署中发现,对于720p的视频流,YOLOv8n在RTX3060上能达到120FPS,而准确率最高的YOLOv8x也有45FPS。如果用在树莓派这类边缘设备,建议使用YOLOv8s版本并开启TensorRT加速。
