备注
1.采用模型:yolov5
-
社区使用最广,教程、代码和预训练模型非常多。
-
基于 PyTorch,安装和上手都很方便。
-
适合做入门项目和快速实验。
2.数据集:https://public.roboflow.com/object-detection/mask-wearing/4(选v5+torch会把配置文件一并给你)口罩数据集
3.解释器:python3.10
4.虚拟环境:anaconda3
前期准备
1.必要准备
准备pycharm和anaconda3,并具有创建pychon3.10以上环境的能力
2.环境搭建
(1)准备一个空文件夹,有git可以直接git clone,没有就下载zip再解压。https://github.com/ultralytics/yolov5
(2)用pycharm打开这个文件夹,创建和激活虚拟环境,
conda create -n yolov5 python=3.10 -y
conda activate yolov5
如果前面搞坏了就删了重新创建。
conda deactivate
conda remove -n yolov5 --all -y
路径前面有这个括号虚拟环境的名称就进入成功了,可以pip list看看是不是初始的几个简单的包
3.依赖下载
在虚拟环境下
pip install -r requirements.txt
等待依赖下载完成
有nvidia显卡可以另外下载CUDA和对应版本的pytorch来让GPU参与训练。当前默认是CPU训练(比较慢)
4.快速自检
python detect.py --weights weights/yolov5s.pt --source data/images/bus.jpg --img 640
看看runs/detect/exp/有无输出,有则ok,否则检查前面的问题。
操作过程
1.下载和解压数据集
在网站上下载对应的数据集并解压,已经配好了的。
yolov5/
├─ datasets/ # 数据集文件夹
│ └─ mask/ # 其中一份数据集
│ ├─ train/
│ │ ├─ images/ # 训练集图片
│ │ └─ labels/ # 训练集标签(txt)
│ ├─ val/
│ │ ├─ images/ # 验证集图片
│ │ └─ labels/ # 验证集标签(txt)
│ └─ test/ # 可选
│ ├─ images/
│ └─ labels/
先将下载好的数据集文件夹名改一个比较简单的,防止格式有误。比如原名->Mask Wearing Dataset
因为YOLOv5 默认用 val/ 作为验证集,所以把 valid 改名为 val
在yolov5/下增加一个配置文件mask.yaml
train: datasets/Mask Wearing Dataset/train/images
val: datasets/Mask Wearing Dataset/val/images
test: datasets/Mask Wearing Dataset/test/imagesnc: 3
names: ['with_mask', 'without_mask', 'mask_weared_incorrect']# ⚠ 注意:names 的顺序要和数据集标签里的类别一致(Roboflow 的 mask 数据集一般就是这 3 类)
2.开始训练
yolov5/下运行
python train.py --img 640 --batch 8 --epochs 50 --data mask.yaml --weights yolov5s.pt 即开始训练(没什么意外的话),其实用CPU的话不用管batch,epoch第一次练可以先设为5,看看整个流程能不能跑完,后面再加
参数详解
--img 640
- 指定训练时输入图片的大小(这里是
640x640)。 - YOLOv5 会把你的图片 resize 到这个尺寸再训练。
- 常见取值:
416、640、1280。 - 越大,精度可能更高,但训练速度和显存占用都会增加。
--batch 16
- 批次大小(batch size),每次训练送入 GPU 的图片数量。
- 取值受限于显存:
- 显存 4GB:
--batch 8 - 显存 8GB:
--batch 16 - 显存 12GB+:
--batch 32
- 显存 4GB:
- 如果显存不足,会报 CUDA out of memory 错误,那就改小点。
--epochs 50
- 训练总轮数。
- 每个 epoch = 训练集完整走一遍。
- 一般从
50~100起步,根据数据量大小调节。 - 数据少可以少点,多的话就多点(100–300 都可以)。
3.训练结束
结束后,提供了一些过程性和结果性的内容文件
runs/train/exp/
├─ weights/
│ ├─ best.pt # 验证集表现最好
│ └─ last.pt # 最后一轮
├─ results.png # 精度曲线图
├─ confusion_matrix.png
└─ opt.yaml # 参数配置记录
(1)模型文件(训练成果的核心)
训练完成后,YOLOv5 会在 runs/train/exp/ 目录下保存结果:
weights/last.pt—— 训练最后一轮的模型权重weights/best.pt—— 在验证集上表现最好的模型权重(一般用这个做推理)
👉 这两个文件就是“训练成果”,后续推理、部署都用 best.pt。
(2)训练过程记录(日志 + 图表)
在 runs/train/exp/ 目录下还会有很多文件,比如:
-
results.png包含了 loss 曲线、mAP 曲线、precision/recall 变化趋势。
- 你可以直观地看出模型是否收敛、有没有过拟合。
-
confusion_matrix.png
类别之间预测的混淆矩阵,可以看出模型在哪些类别上容易混淆。 -
labels.jpg
展示了训练集标注框的分布情况。 -
train_batch0.jpg,train_batch1.jpg
随机挑选的训练图片+标注,可检查数据是否正确加载。
(3)查看验证结果
在训练最后,会输出类似这样的指标:
Class Images Instances P R mAP50 mAP50-95
all 100 300 0.912 0.878 0.901 0.754
with_mask 40 120 0.935 0.910 0.925 0.800
without_mask 30 100 0.890 0.850 0.880 0.720
mask_weared 30 80 0.910 0.870 0.900 0.740
- P = Precision(查准率)
- R = Recall(查全率)
- mAP@0.5 = mAP 在 IoU=0.5 时的平均精度
- mAP@0.5:0.95 = 更严格的指标,越高说明模型泛化更好
4.推理测试
测试用例:自备的一张或多张众人戴口罩的图片,最好是一张图中有些人有戴有些人没戴的,上网下载即可。
在yolov5/data/images/下新建一个文件夹,用来装本次测试图片
单张图片检测:
python detect.py --weights runs/train/exp/weights/best.pt --img 640 --conf 0.25 --source data/images/maskers/test1.jpg
多图检测:
python detect.py --weights runs/train/exp/weights/best.pt --img 640 --conf 0.25 --source data/images/
如果是视频文件:
python detect.py --weights runs/train/exp/weights/best.pt --source test.mp4
如果用摄像头实时检测:
python detect.py --weights runs/train/exp/weights/best.pt --source 0
参数说明:
--weights:你训练好的模型(推荐用best.pt,last.pt就是最后一次训练的结果模型)--img 640:输入图片大小(要和训练时一致),不输入也可以,默认就是一致的--conf 0.25:预测框的置信度阈值--source:图片所在目录,也可以是单张图片路径
运行完成后,结果会自动保存在:runs/detect/exp/
后日谈
1.增量训练
已经训练好了一个口罩检测模型,如果以后想继续训练,有两种常见方式:
重新从头训练(fresh training)
- 把
train.py再跑一遍,指定同样的--data mask.yaml、--weights yolov5s.pt(或者换更大的 YOLOv5m/l/x)。 - 这样会完全忽略之前的训练成果,从头开始。
- 适合 你有全新的数据集(比如换了任务、数据分布完全不同)。
增量训练 / 继续训练(resume training)
YOLOv5 支持从已有的 checkpoint 接着训练,相当于“增量训练”。
✅ 方法一:resume
如果你只是想从上次的中断继续:
python train.py --resume
默认会从 runs/train/exp/weights/last.pt 接着训练。
✅ 方法二:指定权重文件
如果你有新的数据,想在之前训练好的模型上微调,可以指定权重:
python train.py --img 640 --batch 16 --epochs 50 --data mask.yaml --weights runs/train/exp/weights/best.pt
区别:
--weights yolov5s.pt👉 从官方 COCO 预训练模型开始(更通用)--weights best.pt👉 从你自己训练好的口罩模型继续训练(更快收敛,适合新增数据)
迁移学习(transfer learning)
- 如果你以后换任务(比如要做安全帽检测、手机检测),也可以把
best.pt当作起点:
python train.py --data helmet.yaml --weights runs/train/exp/weights/best.pt --epochs 100
- YOLO 会自动把检测头替换成新任务的类别数(比如
nc=1只检测“安全帽”)。 - 这种做法通常比从头训练快得多,而且准确率更高。
快速上手暂且如此,实际上需要根据项目需求做出一些改变。
