Yolo v5 训练自己的数据从训练到调参实战详解

主要分3章,第一章先跑通模型代码,熟悉yolo v5的输入和输出;第二章训练自己的数据;第三章讲解模型参数部分


一、跑通模型

1、代码下载

2、环境配置

conda create -n 【环境名自定义】 python = 3.6
activate 【环境名自定义】

进入pytorch官网,选择复制对应版本的pytorch安装命令
pip install

conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch

然后缺什么库下载什么库就行了。具体查看根目录下的 requirements.txt
在这里插入图片描述

3、参数路径调整

源代码中好像没有权重和视频,如果没有自动下载的话请自行下载并保存到相应位置
这部分主要需要确认权重路径、和数据(图像或视频)路径
视频的话改为路径下指定视频名即可
在这里插入图片描述
在这里插入图片描述
这里的路径也需要改!
在这里插入图片描述

运行之前配置一下 Edit Configurations --> 选择 detect -->在Parameters 里输入 --view-img 可实时观看检测情况
ps:也可以不配置,此步骤可略过
在这里插入图片描述
在这里插入图片描述

3、运行detect.py文件

训练结束后可在根目录下的run文件夹查看检测结果
在这里插入图片描述
在这里插入图片描述

二、训练自己的数据

1.数据准备

1.1准备数据样本和标签

  • 数据标签格式
    *

  • 用到的工具:labelImg

a.安装labelImg

pip install labelImg

b.选择文件路径、选择保存路径、选择yolo模式。并在 View中选择 自动保存模式
在这里插入图片描述

2、路径创建与修改

2.1样本数据读取路径修改

# 新建文件夹 #
文件夹名称自定义,如mydata1,下所属文件夹按以下格式创建
mydata1下文件目录如下,分别将前面准备好的【训练样本】放到images下的train,【测试样本】放到images下的val;【训练标签】–> labes下的train,【测试标签】–> labels下的val
在这里插入图片描述

2.2新建并修改配置文件.yaml

  • 在根目录data下新建xxx.yaml文件
    在这里插入图片描述
  • 复制粘贴参数内容如下,路径自定义为你数据路径,类的数量名称自定义并按0、1、2、3对应排列
    在这里插入图片描述

2.3修改train.py文件中的data路径参数

指定自己创建的xxx.yaml文件路径
在这里插入图片描述

3、常用参数调节

高亮部分都是初步训练时常用可修改的,具体内容看后面的解释
parser.add_argument(’–weights’, type=str, default=ROOT / 'yolov5s.pt’, help=‘initial weights path’) #选择预训练权重模型,若default为空则用程序自带初始权重
parser.add_argument(’–cfg’, type=str, default=‘yolov5s.yaml’, help=‘model.yaml path’) #选择神经网络模型
parser.add_argument(’–data’, type=str, default=ROOT / ‘data/mydata.yaml’, help=‘dataset.yaml path’) #样本数据路径,进入到mydata.yaml文件里修改修改
parser.add_argument(’–hyp’, type=str, default=ROOT / ‘data/hyps/hyp.scratch.yaml’, help=‘hyperparameters path’) #超参数:动量、衰减率等。一般用不到
parser.add_argument(’–epochs’, type=int, default=400) #训练几轮,设定epoch数量
parser.add_argument(’–batch-size’, type=int, default=32, help=‘total batch size for all GPUs, -1 for autobatch’) #每批次的数据量,default=-1时自动调节大小
parser.add_argument(’–imgsz’, ‘–img’, ‘–img-size’, type=int, default=640, help=‘train, val image size (pixels)’)#训练集和测试集图片的像素大小,640*640
parser.add_argument(’–device’, default=’’, help=‘cuda device, i.e. 0 or 0,1,2,3 or cpu’) #用于设置运行 pytorch 框架的使用设备,是用 GPU cuda,还是 cpu
parser.add_argument(’–workers’, type=int, default=0, help=‘max dataloader workers (per RANK in DDP mode)’) #多线程:这里建议 default 设置为 0。
parser.add_argument(’–project’, default=ROOT / ‘runs/train’, help=‘save to project/name’) #用于指定训练好的模型的保存路径。
parser.add_argument(’–freeze’, type=int, default=24, help=‘Number of layers to freeze. backbone=10, all=24’) #冻结层数设置

4、train.py

运行train.py训练即可
训练结束后会在根目录下生成一个run文件夹,里面存放训练结果和权重
在这里插入图片描述

三、可修改的参数部分详解

1.总述

参数部分代码如下:

'''*****************超参数修改*****************'''
def parse_opt(known=False):
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')  #选择预训练权重模型,若default为空则用程序自带初始权重
    # parser.add_argument('--weights', type=str, default='', help='initial weights path')
    # parser.add_argument('--cfg', type=str, default='', help='model.yaml path')         #选择神经网络模型
    parser.add_argument('--cfg', type=str, default='yolov5s.yaml', help='model.yaml path')
    parser.add_argument('--data', type=str, default=ROOT / 'data/mydata.yaml', help='dataset.yaml path')  #样本数据路径,进入到mydata.yaml文件里修改修改
    parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path') #超参数:动量、衰减率等。一般用不到
    # parser.add_argument('--epochs', type=int, default=300)
    parser.add_argument('--epochs', type=int, default=400)    #训练几轮,设定epoch数量
    parser.add_argument('--batch-size', type=int, default=32, help='total batch size for all GPUs, -1 for autobatch')  #每批次的数据量,default=-1时自动调节大小
    parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')#训练集和测试集图片的像素大小,640*640
    parser.add_argument('--rect', action='store_true', help='rectangular training')  #减去一些不必要信息,加速模型推理过程
    parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')  #在最近训练的一个模型基础上继续训练
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint') #生效后只保存最后一次 pt 文件
    parser.add_argument('--noval', action='store_true', help='only validate final epoch') #生效后只在最后一次测试
    parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
    parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')  #对x代超参数进行优化
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
    parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')  #将对图片进行缓存,以便更好地进行训练
    parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')   #对于那些训练不好的图片,会在下一轮中增加一些权重。
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')  #用于设置运行 pytorch 框架的使用设备,是用 GPU cuda,还是 cpu
    parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')   #对图片尺度进行变换
    parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')  # 用于设定训练数据集是单类别还是多类别。默认为 false,意味着是多别。
    parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')   #优化器:填入到 Edit Configuration --> Parameters
    parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')   #进行多 GPU 进行分布式训练。
    # parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')
    parser.add_argument('--workers', type=int, default=0, help='max dataloader workers (per RANK in DDP mode)')  #多线程:这里建议 default 设置为 0。
    parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')  #用于指定训练好的模型的保存路径。
    parser.add_argument('--name', default='exp', help='save to project/name')   # 用于设定保存的模型文件名。
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')  #用于设定预测结果的保存存在位置情况。
    parser.add_argument('--quad', action='store_true', help='quad dataloader')  #quad 数据加载的相关设置
    parser.add_argument('--linear-lr', action='store_true', help='linear LR')  #学习率方式设置
    parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')  #平滑处理防止过拟合
    parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')  #若epoch没有提升则提前结束
    parser.add_argument('--freeze', type=int, default=24, help='Number of layers to freeze. backbone=10, all=24')  #冻结层数设置
    parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')   #用于记录训练日志信息,int 型,默认为 -1。
    parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')  #DistributedDataParallel 单机多卡训练,一般不改动。

    # Weights & Biases arguments  #wandb可视化的一些设置
    parser.add_argument('--entity', default=None, help='W&B: Entity')
    parser.add_argument('--upload_dataset', action='store_true', help='W&B: Upload dataset as artifact table')
    parser.add_argument('--bbox_interval', type=int, default=-1, help='W&B: Set bounding-box image logging interval')
    parser.add_argument('--artifact_alias', type=str, default='latest', help='W&B: Version of dataset artifact to use')  #无意义,可注释掉

    opt = parser.parse_known_args()[0] if known else parser.parse_args()
    return opt

2.参数详解

2.1–weights

parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')  

选择预训练权重模型,若default为空则用程序自带初始权重

2.2–cfg

parser.add_argument('--cfg', type=str, default='yolov5s.yaml', help='model.yaml path')  

选择神经网络模型,default为’ '时使用程序自带模型

2.3–data

parser.add_argument('--data', type=str, default=ROOT / 'data/mydata.yaml', help='dataset.yaml path')  

样本数据路径,进入到mydata.yaml文件里修改修改

2.4–hyp

parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path')

超参数:动量、衰减率、box设置等等,一般情况下用不到在这里插入图片描述

2.5–epochs

parser.add_argument('--epochs', type=int, default=400) 

训练的轮数:训练几轮,设定epoch数量。源码中 default 值为 300,训练轮次则显示为 0~299

2.6–batch-size

parser.add_argument('--batch-size', type=int, default=32, help='total batch size for all GPUs, -1 for autobatch') 

每次网路输入的数据量:每批次的输入数据量,default=-1时自动调节大小

2.7–imgsz

parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')

图片大小:训练集和测试集图片的像素大小,输入默认640*640

2.8–rect

parser.add_argument('--rect', action='store_true', help='rectangular training')  

在这里插入图片描述

设置矩阵的训练方式:作用是减去一些不必要信息,加速模型推理过程。

2.9–resume

parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training') 

是否在最近训练的一个模型基础上继续训练:default 值默认是 false,当想要 default 为 true 时必须指定在哪个模型上继续训练。指定的模型路径按字符串形式赋值给 default。

2.10–nosave

parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')

只保存最后一次 pt 文件

2.11–notest

 parser.add_argument('--noval', action='store_true', help='only validate final epoch')

生效后只在最后一次进行测试。

此类参数被激活的条件是填入到 Edit Configuration --> Parameters 中,若有多个被激活参数,中间用空格隔开即可。
在这里插入图片描述在这里插入图片描述

2.12–noautoanchor

    parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')

用于设置在目标检测任务中是否采用锚点 / 锚框。
遍历输入图像上所有可能的像素框,然后选出正确的目标框,并对位置和大小进行调整就可以完成目标检测任务。
默认开启,用这种方式来简化模型训练过程。

2.13–evolve

    parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')

对x代超参数进行优化。
作用是寻找最优超参数的方式,方法是利用遗传算法自动搜索超参数。
默人不开启

2.14–bucket

	parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')

这个参数是 yolov5 作者将一些东西放在谷歌云盘,可以进行下载。

2.15–cache

	parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')

生效后将对图片进行缓存,以便更好地进行训练。

2.16–image-weights

	parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')

生效后对于那些训练不好的图片,会在下一轮中增加一些权重。

2.17–device

	parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')

用于设置运行 pytorch 框架的使用设备,是用 GPU cuda,还是 cpu

2.18–multi-scale

parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')

对图片尺度进行变换

2.19–single-cls

parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')

用于设定训练数据集是单类别还是多类别。
默认为 false,意味着是多类别。

2.20–adam

parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')

优化器:填入到 Edit Configuration --> Parameters 中即为 true ,意味着要用此优化器;否则为 false,为 false 时用的是随机梯度下降(SGD)优化算法。

2.21–sync-bn

parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')

进行多 GPU 进行分布式训练。

2.22–workers

parser.add_argument('--workers', type=int, default=0, help='max dataloader workers (per RANK in DDP mode)')

多线程这里建议 default 设置为 0。

2.23–project

parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')

用于指定训练好的模型的保存路径。

2.24–name

parser.add_argument('--name', default='exp', help='save to project/name')

用于设定保存的模型文件名。

2.25–exist-ok

parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')

用于设定预测结果的保存存在位置情况。
当激活时为 true,在 name 指定文件夹下保存,源码中保存在 exp 文件夹下
当不激活时为 false,在新命名的文件夹下保存。

2.26–quad

parser.add_argument('--quad', action='store_true', help='quad dataloader')

解释为 quad 数据加载的相关设置。
简单理解,生效后可以在比前面 “–img-size” 部分设置的训练测试数据集更大的数据集上训练。

  • 好处是在比默认 640 大的数据集上训练效果更好
  • 副作用是在 640 大小的数据集上训练效果可能会差一些

2.27–linear-lr

parser.add_argument('--linear-lr', action='store_true', help='linear LR')

用于对学习速率进行调整
默认为 false,含义是通过余弦函数来降低学习率。

注:当我们使用梯度下降算法来优化目标函数的时候,当越来越接近Loss值的全局最小值时,学习率应该变得更小来使得模型尽可能接近这一点,而余弦退火(Cosine
annealing)可以通过余弦函数来降低学习率。

2.28–label-smoothing

parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')

用于对标签进行平滑处理。
作用是防止在分类算法中过拟合情况的产生。

2.29–patience

parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')

提前结束:若epoch没有提升则提前结束

2.30–freeze

parser.add_argument('--freeze', type=int, default=24, help='Number of layers to freeze. backbone=10, all=24')

冻结层:可适当减少冻结层数

2.31–save-period

parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')

用于记录训练日志信息,int 型,默认为 -1。

2.32–local_rank

parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')

DistributedDataParallel 单机多卡训练,一般不改动。

2.33–entity

parser.add_argument('--entity', default=None, help='W&B: Entity')

与 wandb 库相关的参数设置,作用不大,忽略。

2.34–upload_dataset

parser.add_argument('--upload_dataset', action='store_true', help='W&B: Upload dataset as artifact table')

wandb 库对应的东西,作用不大,不必考虑。

2.35–bbox_interval

parser.add_argument('--bbox_interval', type=int, default=-1, help='W&B: Set bounding-box image logging interval')

与 wandb 库相关的参数设置,作用不大,忽略。

2.36–artifact_alias

parser.add_argument('--artifact_alias', type=str, default='latest', help='W&B: Version of dataset artifact to use')

这一行参数表达的是想实现但还未实现的一个内容,忽略即可。亲测注释掉整个程序也可运行。

参考

https://blog.csdn.net/IT_charge/article/details/119177578

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>