上周就被催更了,但很不巧转天就发烧了,躺到周末才好一些,再加上一些落下的工作要补,于是完事后火速更出第三篇。这一篇主要讲解使用YOLOv5训练模型,但博主也承认,YOLOv5训练模型也不是什么新鲜事了,各大编程论坛也有相关详尽的教程,所以建议自学为主。本篇主要讲解使用OpenBayes训练YOLOv5模型。
上一篇中,我们完成了在OpenBayes中搭建了YOLOv5环境,接下来让我们先来进行简单讲解,然后开始训练模型 。
一、YOLOv5文件夹
YOLOv5作为训练模型的“程序”,和我们平常使用的应用程序(Application)是有差异的。YOLOv5中有许多单独的模块、工具等,它们集成为一个完整的程序。接下来让我们了解一下必要的文件(夹):
- detect.py——运行模型,识别提供的数据集。
- train.py——训练模型,使用提供的数据集。
- export.py——转换模型格式(例如Tensorflow等)(原模型为Pytorch格式)。
- val.py——验证模型,使用提供的数据集。
- data——文件夹,用于存放数据集以及数据集信息。
- models——文件夹,用于存放模型信息及其他程序。
- runs(该文件夹需要生成结果才会出现)——文件夹,用于存放运行结果(图片识别、模型训练等)。
我们可以先打开看一下data-images文件夹里,里面放了一些官方预设的图像,下一节我们用官方预设的模型来跑一下这两幅图(强烈建议可以上传自己的图片跑一下试试)。
如果想要上传自己本地的文件,直接将文件拖入左边的资源管理器中即可。
二、使用detect.py运行官方例程
我们上一篇讲过要运行YOLOv5程序,需要移动到其目录下。所以我们在工作空间中打开终端,输入指令cd ./yolov5。官方在YOLOv5中已经做好了一个小例程,直接使用detect.py可以对data-images里的图像进行识别(再次建议可以上传自己的本地图片跑一下试试)。我们直接在终端中输入以下指令即可运行:
python ./detect.py
在运行detect.py前,程序会为你自动下载yolov5s的权重模型。何为权重模型?实际上YOLOv5一共有5种预设的权重模型,其参数大小及信息影响了模型的效果和速度。打开model文件夹可以找到预设的权重配置。我们按照顺序依次介绍一下:
l(large): 大型模型,模型深度和宽度都较大,计算量较大,对应FLOPS(每秒浮点运算次数)和参数量也较高,精度较高但速度较慢。
m(medium): 中等规模的模型,深度和宽度介于小型和大型模型之间,计算量适中,对应的FLOPS和参数量也适中。在精度和速度之间取得一定平衡。
n(nano): 极小的模型,深度和宽度都很小,计算量极低,FLOPS和参数量最少,推理速度最快但精度会有所牺牲。通常用于对推理速度和模型尺寸有苛刻要求的场景。
s(small): 小型模型,深度和宽度相对较小,计算量较低,FLOPS和参数量也较少,相比大型模型精度降低但推理速度加快。
x(extra-large): 超大型模型,深度和宽度都比较深宽,计算量非常大,对应的FLOPS和参数量很高,精度最高但推理速度最慢,通常用于对精度要求很高的特殊场景。
由于我们的任务比较简单,所以使用默认的yolov5s模型就可以了。在以后使用YOLOv5时,可以根据项目规模选择不同的模型参数。
跑完detect.py后,我们发现在目录下多了一个runs的文件夹。进行识别的结果会存放在这个文件夹内,detect是识别结果,exp是进行的轮次,里面就是我们跑完的结果了。这是其中一个跑完的结果图像。
可以看到,YOLOv5将自己识别到的物体用不同颜色的框划分下来。每个框都有识别结果的信息,其中包含了标签(例如person)、置信度(例如0.87)等。总之,这个框就是告诉你,此处标记的地方,YOLOv5有百分之多少的把握,认为是什么类别。
三、使用train.py训练模型
3.1 准备权重模型以及训练数据集
如果没有准备数据集的话,或者感觉自己的数据集不够多,可以用博主的快递类型识别来做。快递类型识别数据集是用于训练识别快递的“塑料”、“纸盒”和“有损纸盒”三个分类的数据集。
在进行train.py模型训练之前,我们先来分析一下训练都需要什么内容。以下是一个使用train.py进行训练的指令,其中后面包含了许多参数:
python train.py --img 640 --batch 16 --epochs 300 --data ./data/mydata.yaml --cfg ./models/yolov5s.yaml --weights ./yolov5s.pt --device 0
其中,–img表示统一输入图像的尺寸,–batch表示训练批次,–epochs表示训练轮数。这些参数具体有什么含义,我们后面再讲——先来关注一下后面的几个参数:
- –data——数据集信息(文件路径)
- –cfg——权重模型信息(文件路径)
- –weights——权重模型(文件路径)
- –device——训练设备(例如cpu、gpu)
这三个文件是必不可少的。上面我们说到使用默认的yolov5s模型。所以–cfg的路径就是YOLOv5目录下的models/yolov5s.yaml。权重模型,由于之前运行过一次detect.py,所以已经下载好在YOLOv5目录下,文件名叫yolov5s.pt,所以–weights就是./yolov5s.pt。
至于数据集信息,由于我们使用自己的数据集,所以要为自己的数据集编写一套信息。我们打开YOLOv5目录下的data文件夹,发现里面有几个yaml格式的文件。这些就是数据集的信息文件。打开VOC.yaml,看看里面都写了哪些内容。
文件中主要提供了数据集、训练集、验证集合测试集的路径信息。其中path为整体数据集的路径,而train、val、test这些文件夹的路径是以path的路径为基础的。names为类别序号和对应名称,序号应从0开始。download以脚本或url链接的方式指定从哪里下载数据集。其中,test和download不是必填选项。
知道了我们应该为数据集提供哪些信息,我们制作一个自己的数据集信息文件。新建一个名为”mydata.yaml“的文件,其内容如下:
path: ../datasets
train: # train images (relative to 'path')
- images/train
- images/val
val: # val images (relative to 'path')
- images/val
test: # test images (可选)
- images/test
# Classes
names:
0: package
1: damaged
2: box
这是我另一个项目用到的数据集配置文件。大家可以根据自己的需求来修改Classes。具体可以参考你在使用Labelimg生成的classes.txt里查看。比如我这里的类别分别是package、damaged和box,对应序号0、1、2。
由于我们使用的是本地数据集,可以不用download。注意,其中所写的 相对路径是对train.py所在路径而言,并非.yaml文件的路径。所以数据集的位置可以放在yolov5文件夹以外(“../”指明上一级文件夹)。
下面是整体的文件夹结构示意。
# home
# ├── yolov5 # YOLOv5文件夹
# ├── train.py
# └── ...... # 其他文件
# └── datasets # 数据集文件夹
# ├── images # 图像信息
# ├── train # 训练集
# └── val # 验证集
# └── labels # 标注信息
# ├── train # 训练集
# └── val # 验证集
我们先将自己准备的数据集整理好上传,再按上面的文件夹格式制作目录。仔细观察,会发现这里datasets的目录和mydata.yaml里所写的数据集目录是对应的,所以可以根据个人习惯进行调整。至此,我们的权重模型和训练数据集准备完毕,下面就可以开始正式训练模型了。
对于数据集划分来说,最简单常用的方法是直接划分,即训练集和验证集的图像应当控制在合适的比例。例如,我有700张标注好的数据集图像,那么我可以525张放入训练集,175张放入验证集。同时,应当注意训练集和验证集的个例或者特征是否有偏向,以免造成过拟合,降低模型泛化能力。
顺带一提,我们可以在自己的主机上划分好数据集,然后再将压缩包上传后解压,这样会节省很多时间。在网页终端中,一些常用的指令如下(此处会持续更新):
unzip <文件路径> # 解压文件
rm -r <文件路径> # 删除文件夹
3.2 训练模型
万事俱备,只欠东风。接下来我们使用一个指令便可以开始模型的训练。我们在终端转移到yolov5的目录下(cd /home/yolov5),然后输入以下指令(确保训练设备支持GPU训练,如果之前跟做的话直接输入):
python train.py --img 640 --batch 16 --epochs 300 --data ./data/mydata.yaml --cfg ./models/yolov5s.yaml --weights ./yolov5s.pt --device 0
讲到这里,我们来回顾一下这条指令的具体内容。我们上一节解决了需要的配置文件以及权重模型问题,所以来看看训练所需的参数都有哪些:
- –img——训练图像的输入大小,图像输入的精度要多少。
- –batch——训练批次,一次要训练多少图。
- –epochs——训练轮次,要训练多少轮。
还有一些像是learning rate学习率、优化器之类的超参数,是要通过–hyp来设置的。详细可以参考以下引用的文章:点击此处跳转。
简单来说,精度越高,训练批次合理,训练轮数足够大,都会影响最后模型的最终效果,且大多数是正面影响。当然也没有绝对的情况,精度过高、批次过大、轮数过大都会造成训练时间过长、模型过拟合等效果。这些都要根据实际情况来进行设置。感兴趣的可以深入了解一下。
好了,回到正题,我们输入这个指令,Yolov5会做很多前置的检查,不报错的话耐心等待即可。之后出现epochs和进度条等内容就说明正式开始了训练。训练时,我们可以根据各种信息指标,来判断目前训练的进度和质量。
你可以相信RTX4090的算力。等待五分钟左右,epoch达到指定数量后,会出现以下字样,说明训练已经结束。它提示你结果已经保存到了yolov5目录下的runs/train/exp文件夹里,并且给出了模型训练后最终的指标参数。如图中,我们得到每一类的P(Precision)准确率,R(Recall)召回率以及mAP50-95平均精度指标。这些指标有些不是越高越好,具体怎么看我后面另开一篇再介绍吧……
我们去往runs/train/exp的文件夹下,里面有各种信息,大家感兴趣可以看一看,同样具体怎么看图,后面另开一篇再讲。
结果看起来还是很理想的。最后训练完的模型在weights里,其中有一个best.pt和last.pt,我们一般使用best.pt来部署,如果训练效果不理想,last.pt可以用来继续训练。
至此,我们完成了在OpenBayes里训练YOLOv5模型。下一篇介绍如何将模型部署到本地运行。