主要分3章,第一章先跑通模型代码,熟悉yolo v5的输入和输出;第二章训练自己的数据;第三章讲解模型参数部分
一、跑通模型
1、代码下载
2、环境配置
conda create -n 【环境名自定义】 python = 3.6 activate 【环境名自定义】
进入pytorch官网,选择复制对应版本的pytorch安装命令
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')
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')
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path')
parser.add_argument('--epochs', type=int, default=400)
parser.add_argument('--batch-size', type=int, default=32, help='total batch size for all GPUs, -1 for autobatch')
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
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')
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')
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')
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')
parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
parser.add_argument('--workers', type=int, default=0, help='max dataloader workers (per RANK in DDP mode)')
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')
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)')
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)')
parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')
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
|