YOLOv5-手写数字识别:三、在OpenBayes中训练YOLOv5模型
本文最后更新于474 天前,其中的信息可能已经过时,如有错误请联系站长。

上周就被催更了,但很不巧转天就发烧了,躺到周末才好一些,再加上一些落下的工作要补,于是完事后火速更出第三篇。这一篇主要讲解使用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模型。下一篇介绍如何将模型部署到本地运行。

站内分享资源仅限学习交流使用,禁止作任何其他用途。请在下载后24小时内删除!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
背景图片