本教程将通过实验的形式,带领你快速掌握 YOLOv5 目标检测模型的训练过程。
注:本次实验是在window环境下进行,且默认已经配置好python环境。
目录
1. 环境准备
从github上下载Yolov5的源码。我们的项目用到yolov5的6.0版本,所以这里以6.0版本为例子。
a. 根据提示选择版本,点击右边绿色按钮code,下载模型的源码。
b. 解压缩,用vs code打开文件夹,看到文件的目录结构如下
c. 用vs code打开终端(或者用文件资源管理器打开文件夹,在空白处按Shift+鼠标右键,选择打开Power shell,输入命令:pip install -r requirements.txt,后等待环境安装。部分库可能会出现下载缓慢的情况,可以在网上换源单独下载(注:需下载requirements.txt中要求的版本)。
2. 准备数据集
要训练 YOLOv5 模型,需要一个包含原始图片和标签数据的数据集。其中,原始图片需要根据你的项目需求进行专门的收集(如果要识别火焰就收集一些带有火焰的图片),而标签数据分别储存在.txt文件,文件名的前缀对应原始图片的前缀,如下:
在 Yolov5 中,每个.txt 文件的一行包含了一个目标的标注信息,具体每行的 5 个值代表如下:
1) 目标类别索引: 表示目标物体所属的类别,在数据集中每个类别都有一个唯一的索引来表示。
2)目标中心点的相对横坐标: 相对于整张图片的宽度,目标中心点的横坐标位置(0-1)
3)目标中心点的相对纵坐标: 相对于整张图片的高度,目标中心点的纵坐标位置(0-1)
4)目标相对于整张图片的宽度: 目标物体边界框的宽度与整张图片宽度的比例(0-1)
5)目标相对于整张图片的高度: 目标物体边界框的高度与整张图片高度的比例(0-1)
这些文件通常需要使用工具进行人工标注得到,这里推荐的工具是make sense(Make Sense)。
如果使用make sense工具:进入网页后,点击右下角的Get Started,然后将装有原始图片的文件夹拖入图片指示位置,选择object detection。
写一个记录标签名的labels.txt文件,保存。
点击Load labels from file,将这个labels.txt拖入其中,Start project。
标注图片后需要在右边选择标签名。当你标注完所有图片后,点击Actions,选择Export,并选择yolo格式导出,得到的压缩包就是图片标注数据,解压后得到.txt文件。每个.txt文件名的前缀对应原始图片文件名的前缀。
(注:只有标注过的图片才有对应的.txt文件,没有标注的图片没有对应的.txt文件)
(注:框与框之间尽量避免重叠)
3. 配置参数
a. 打开源码中的train.py文件,拖动到图中所示位置。
weights指向即将开始训练的权重文件,也就是模型本体。
cfg是模型的参数配置文件。
data是模型数据文件,也就是数据集存放的位置。
hyp是模型的参数文件。
根据data找到coco128.yaml文件,修改为如下,保存。
path:../ -> ./ 表示文件夹的位置设置为当前文件夹
nc的数量需要和names的数量一致
names的顺序需要跟标注时的顺序一致。
b. 根据path指向的位置,创建文件夹。假设当前文件夹为yolov5-6.0,那么需要创建文件夹,并放入数据。
yolov5-6.0\datasets\images\train2017 # 存放训练集原始图片
yolov5-6.0\datasets\images\val2017 # 存放验证集原始图片
yolov5-6.0\datasets\labels\train2017 # 存放训练集标注数据
yolov5-6.0\datasets\labels\val2017 # 存放验证集标注数据
c. 运行train.py文件,源码中没有yolov5s.pt权重文件,在检查不到该文件后,会默认帮你下载,但是往往下载得很慢,或者下载不了,去网上查找下载yolov5s.pt。
d. 开始调整参数,移到到步骤a指示的train.py代码位置,修改多处。
1)填写cfg,训练的是yolov5s.pt,所以设置cfg为yolov5s.yaml(注:修改yolov5s.yaml的nc)
2)batch-size的大小需要根据电脑的配置进行设置,batch-size越大,需要的算力越多。
3)evole表示优化学习率的次数,一般设置50-100次。
4)device设置为cuda:0,表示调用第一张显卡,有多的显卡可以多卡cuda:0,1。
注:千万不要用CPU训练,太慢了
5)将 "workers" 参数设置为 CPU 核数的 2 到 4 倍,可以加快数据加载速度(注:太高会崩)
6)patience设置为40,表示40次迭代没有进步就会停止训练。
7)epochs的数量需要根据数据集的大小进行设置,可以多试几次,一般结合学习率进行修改。
8)根据hyp的路径打开对应文件。
lf0 #模型的初始学习率 一般设置0.01,0.001
lrf #模型的最终学习率是lf0*lrf
degrees #旋转增强
shear # 剪切增强
perspective #透视变换 范围0-0.001
YOLOv5系列(二十) 解析数据增强部分augmentations(详尽) - 知乎 (zhihu.com)
yolov5数据增强引发的思考——透视变换矩阵的创建_yolov5 perspective-CSDN博客
可以考虑将上述参数修改为如下
4. 训练模型
用vs code运行train.py文件,或者在终端、powershell运行 python train.py命令。
出现上述情况,可以在import numpy as np 下面加一句np.int=int
5. 模型的评估和优化
打开yolov5-6.0\runs\train\exp文件夹,查看results.png如下。
obj_loss反应模型检测目标存在与否的能力,cls_loss反应模型检测准确性。
查看val部分的loss曲线,当曲线尾部平滑,没有上升或下降的趋势,表示模型拟合,此时模型的性能达到最高。
当val部分的loss曲线明显还有下降的趋势,表示模型欠拟合,模型训练失败。
解决:可以增加epochs的大小(增加模型的训练时间),或者在hyp文件处提高学习率(学习率过高可能导致训练过程不稳定,过拟合,甚至无法收敛)
当val部分的loss曲线明显先下降后上升,表示模型过拟合,模型训练失败。
解决:可以减少epochs的大小、降低学习率或者降低最终学习率。如果上述方法都没有解决过拟合问题,很可能是因为数据集出现问题,需要检查数据集。(是否有空的.txt文件,.txt的类别index是不是错了,标注的时候是不是标了重叠的框框)
F1_curve反应模型的性能好坏,如果在模型拟合的情况下,模型的性能仍然不能满足需求,则需要在数据集和前处理上寻找优化点。
训练后产生的权重文件在yolov5-6.0\runs\train\exp\weights文件夹中,一般选用best.pt进行应用、部署。