[Yolov5]Train参数
1.1.1 weights
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
- 权重的路径地址。
- 注意:weights 和 cfg 两者必须要有一个,否则代码会找不到网络的模型结构,即会报错!!!
1.1.2 cfg
parser.add_argument('--cfg', type=str, default=ROOT / 'models/yolov5s.yaml', help='model.yaml path')
- 网络模型的结构文件
- 内容是简易的网络结构与其中模块的具体参数,例如输入通道数,输出通道数,卷积核大小数量,步长以及concat的维度等等
- 注意:
- 如果使用了 weights 预训练权重,这个参数可以使用,代码会自动载入 weights 得到网络模型
不使用weights的话,则必须指定该参数
1.1.3
data
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
- 数据集的配置文件
- 可以使用coco格式,voc格式的数据集,但最终会转化成yolov5可以读的txt格式
1.1.4 hyp
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')
- 超参数配置文件
- 里面设定训练需要的超参数,例如学习率啊、动量啊、权重衰减等参数设定
- 注意:
- 其中hyp.VOC是对VOC数据集进行训练的文件,其中hyp.scratch中的三个yaml,分别是low,med,high是对coco数据集进行训练的超参数字典,其中scratch表示从头开始训练。
- 一些说法是当模型是n与s的时候使用low的超参数,其他时候使用high,但可能要考虑到数据集,自己尝试使用哪种会更好
1.1.5 epochs
parser.add_argument('--epochs', type=int, default=100, help='total training epochs')
- 训练周期
1.1.6 batch-size
parser.add_argument("--batch-size", type=int, default=16, help="total batch size for all GPUs, -1 for autobatch")
- 多少个数据算作一个batch
- 一次送进去网络多少数据(图像),一般是2的次幂,根据自己显卡的情况来判断,如果自己判断不了,这里可以改成‘-1’,网络可以自动计算适应训练需求。
1.1.7 imgsz
parser.add_argument("--imgsz", "--img", "--img-size", type=int, default=640, help="train, val image size (pixels)")
- 网络训练和验证的时候,输入图片的尺寸
- 两个数字前者为训练集大小,后者为评估集大小
1.1.8 rect
parser.add_argument('--rect', action='store_true', help='rectangular training')
- 矩形训练方式
- 开启后会对输入的矩形图片进行预处理,通过保持原图高宽比进行resize后,对resize后的图片进行填充,填充到32的最小整数倍,然后进行矩形训练,减少训练时间。
- 只要加上’–rect’程序就会将rect设为true; 所谓矩阵推理就是不再要求你训练的图片是正方形了;矩阵推理会加速模型的推理过程,减少一些冗余信息。下图分别是矩阵推理方式和方形推理方式
1.1.9 resume
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
- resume代表着断点续训:即是否在之前训练的一个模型基础上继续训练,default 值默认是 false。
- 不需要断点续训的情况是default是false,如果遇到意外情况,电脑断电等情况,可以考虑使用断点续训的方式,此时要给default具体的没训练完的权重位置。
parser.add_argument('--resume', nargs='?', const=True, default='runs/train/exp3/weights/best.pt', help='resume most recent training')
注:
- 不仅会读取文件,也会读取文件的配置信息
- 此时将会从上次意外断开的地方继续进行训练。
- 除非意外情况,一般不建议断点续训,我们一致认为断点续训的效果不如一直训练的情况要好。
1.1.10 nosave
parser.add_argument("--nosave", action="store_true", help="only save final checkpoint")
- 只保留最后一次权重
- 默认关闭,开启后只会保留最后的一次权重
1.1.11 noval
parser.add_argument("--noval", action="store_true", help="only validate final epoch")
- 开启后,网络只会对最后一个epoch进行验证
1.1.12 noautoanchor
parser.add_argument("--noautoanchor", action="store_true", help="disable AutoAnchor")
- 关闭自动计算锚框功能,默认关闭
- 注:yolov5采用的是kmeans聚类算法来计算anchor box的大小和比例,最终自动计算出一组最合适训练的锚框。
1.1.13 noplots
parser.add_argument("--noplots", action="store_true", help="save no plot files")
- 不保存训练过程的可视化文件,默认关闭
1.1.14 evolve
parser.add_argument("--evolve", type=int, nargs="?", const=300, help="evolve hyperparameters for x generations")
- 超参数优化,使用超参数优化算法进行自动调参,默认关闭
- 注:yolov5采用遗传算法对超参数进行优化,寻找一组最优的训练超参数。开启后传入参数n,训练每迭代n次进行一次超参数进化;开启后不传入参数,则默认为const=300。
1.1.15 evolve_population
parser.add_argument("--evolve_population", type=str, default=ROOT / "data/hyps", help="location for loading population")
- 超参数优化的文件
- 配合evolve自动使用,超参数优化的保存位置
1.1.16 resume_evolve
parser.add_argument("--resume_evolve", type=str, default=None, help="resume evolve from last generation")
- 断点训练+超参数优化
- 超参数优化会导致参数改变,如果采用断点训练的话,则需要指定参数的路径
1.1.17 bucket
parser.add_argument("--bucket", type=str, default="", help="gsutil bucket")
- 云盘
1.1.18 cache
parser.add_argument("--cache", type=str, nargs="?", const="ram", help="image --cache ram/disk")
- 缓存数据集到内存,这样可以加快训练的速度
- cache,可以指定的值:ram/disk;
- cache,参数不指定值,则默认为const=‘ram’。
1.1.19 image-weights
parser.add_argument("--image-weights", action="store_true", help="use weighted image selection for training")
- 对数据加权训练
- 搭配 rect 参数使用,对数据集的图片进行加权训练
1.1.20 device
parser.add_argument("--device", default="", help="cuda device, i.e. 0 or 0,1,2,3 or cpu")
- 训练时使用的设备
- 如果忽略的话,代码会根本环境自动选择,如果有GPU会优先使用
- 设备没有GPU,使用CPU训练------python train.py --device cpu
- 设备有单个GPU,使用单个GPU训练------python train.py --device 0
- 设备有多个GPU,使用多个GPU训练------python train.py --device 0,1,2(使用第1,2,3张GPU训练训练)
1.1.21 multi-scale
parser.add_argument("--multi-scale", action="store_true", help="vary img-size +/- 50%%")
- 多尺度训练,默认关闭
多尺度训练是指设置几种不同的图片输入尺度,训练时每隔一定iterations随机选取一种尺度训练,这样训练出来的模型鲁棒性更强。多尺度训练在比赛中经常可以看到他身影,是被证明了有效提高性能的方式。输入图片的尺寸对检测模型的性能影响很大,在基础网络部分常常会生成比原图小数十倍的特征图,导致小物体的特征描述不容易被检测网络捕捉。通过输入更大、更多尺寸的图片进行训练,能够在一定程度上提高检测模型对物体大小的鲁棒性。
1.1.22 single-cls
parser.add_argument("--single-cls", action="store_true", help="train multi-class data as single-class")
- 单类别训练,默认false
- 有多个检测类别时候,只训练指定的目标
1.1.23 optimizer
parser.add_argument("--optimizer", type=str, choices=["SGD", "Adam", "AdamW"], default="SGD", help="optimizer")
- 优化器,默认使用SGD优化器
这里可选择的只有三个‘SGD’, ‘Adam’, ‘AdamW’
1.1.24 sync-bn
parser.add_argument("--sync-bn", action="store_true", help="use SyncBatchNorm, only available in DDP mode")
- 同步批量归一化
只有在分布式训练(DDP)时才有效。
在传统的批归一化(Batch Normalization,简称 BN)中,每个 GPU 会对数据的均值和方差进行单独计算
在多 GPU 训练时,每个 GPU 计算的均值和方差可能会不同,导致模型训练不稳定
为了解决这个问题,SyncBN 技术将 BN 的计算放在了整个分布式训练过程中进行,确保所有 GPU 上计算的均值和方差是一致的,从而提高模型训练的稳定性和效果,但同时也会增加训练时间和硬件要求,因此需要根据具体的训练数据和硬件资源来决定是否使用 SyncBN。
1.1.25 workers
parser.add_argument("--workers", type=int, default=8, help="max dataloader workers (per RANK in DDP mode)")
- 线程数
Dataloader中workers表示加载处理数据使用的线程数,使用多线程加载数据时,每个线程会负责加载和处理一批数据,数据加载处理完成后,会送入相应的队列中,最后主线程会从队列中读取数据,并送入GPU中进行模型计算
workers为0表示不使用多线程,仅使用主线程进行数据加载和处理。
1.1.26 project
parser.add_argument("--project", default=ROOT / "runs/train", help="save to project/name")
- 训练结果保存的主路径
1.1.27 name
parser.add_argument("--name", default="exp", help="save to project/name")
- 训练结果保存的子路径
- 参考 1.1.26 project 参数介绍,里面的子文件夹
1.1.28 exist-ok
parser.add_argument("--exist-ok", action="store_true", help="existing project/name ok, do not increment")
- 是否覆盖保存位置,默认关闭
- 每次训练都会生成一个子文件夹,例如exp1,exp2,以此类推。开启的话,新生成的就会直接覆盖之前的训练结果
1.1.29 quad
parser.add_argument("--quad", action="store_true", help="quad dataloader")
quad dataloader 是一种数据加载器,它可以并行地从磁盘读取和处理多个图像,并将它们打包成四张图像,从而减少了数据读取和预处理的时间,并提高了数据加载的效率。
官方给出的开启这个功能后的实际效果:
- 好处是在比默认 640 大的数据集上训练效果更好
- 副作用是在 640 大小的数据集上训练效果可能会差一些
1.1.30 cos-lr
parser.add_argument("--cos-lr", action="store_true", help="cosine LR scheduler")
- 余弦退火学习率衰减策略,使用cos衰减的学习率
1.1.31 label-smoothing
parser.add_argument("--label-smoothing", type=float, default=0.0, help="Label smoothing epsilon")
- 标签平滑策略,可以防止过拟合
- 例:
python train.py --label-smoothing 0.1
表示在每个标签的真实概率上添加一个 epsilon=0.1的噪声,从而使模型对标签的波动更加鲁棒;
具体的值要根据实际网络调整
1.1.32 patience
parser.add_argument("--patience", type=int, default=100, help="EarlyStopping patience (epochs without improvement)")
- 提前停止训练
- patience 参数指定为整数n时,表示模型在训练时,若连续n个epoch验证精度都没有提升,则认为训练已经过拟合,停止训练
1.1.33 freeze
parser.add_argument("--freeze", nargs="+", type=int, default=[0], help="Freeze layers: backbone=10, first3=0 1 2")
- 冻结网络
- 网络共有10层,迁移学习时,可以冻结一部分参数,只训练后面的层达到加快训练的目的。指定n,冻结前n(0<n<=10)层参数。
冻结模型前n层的训练权重,比如可以冻结网络的主干权重,backbone是提取特征的,对于各大公司来说已经提取的很好了,我们需要做的是在提取出的特征上做好特征融合和提取,所以可以考虑冻结别人已经训练好的主干权重,fine-tune后面层就可以了,不需要从头开始训练,大大减少了实践而且还提高了性能。
例如命令
python train.py --freeze 9
就可以表示冻结前9层的主干特征提取。yolov5中主干一共就前10层(0-9层)
1.1.34 save-period
parser.add_argument("--save-period", type=int, default=-1, help="Save checkpoint every x epochs (disabled if < 1)")
- 固定周期保留权重。默认关闭,只保留最好和最后的网络权重
- 开启后,会根据设定的数值,每隔这个数值的epochs就会保留一次网络权重
1.1.35 seed
parser.add_argument("--seed", type=int, default=0, help="Global training seed")
- 随机种子
- 保证网络结果的复现,一般用于复现别人的成果。
1.1.36 local_rank
parser.add_argument("--local_rank", type=int, default=-1, help="Automatic DDP Multi-GPU argument, do not modify")
- 分布式训练
python train.py --local_rank 1,2
这样,第一个进程将使用第 2 号 GPU,第二个进程将使用第 3 号 GPU注意,如果使用了 --local_rank 参数,那么在启动训练脚本时需要使用 PyTorch 的分布式训练工具,例如
torch.distributed.launch
。
1.1.37 entiy
- 模型实体
- 模型实体可以是一个实体名称或实体 ID,通常用于在实体存储库中管理模型的版本控制和记录。
在使用实体存储库时,需要创建一个实体来存储模型,并在训练时指定该实体,这样训练结果就可以与该实体相关联并保存到实体存储库中。
该参数默认值为 None,如果未指定实体,则训练结果将不会与任何实体相关联。
1.1.38 upload_dataset
- 上传数据集。默认关闭,不上传数据集
- 如果命令行使用’–upload_dataset’参数,但没有传递参数,则默认值为const=True,表示上传数据集。
- 如果命令行使用’–upload_dataset’参数,并且传递了参数’val’,则默认为True,表示要上传val数据集。
1.1.39 bbox_interval
parser.add_argument("--bbox_interval", type=int, default=-1, help="Set bounding-box image logging interval")
- 记录边框图片
- 训练过程中,每隔多少个epoch记录一次带有边界框的图片,类似于训练过程数据的可视化
1.1.40 artifact_alias
parser.add_argument("--artifact_alias", type=str, default="latest", help="Version of dataset artifact to use")
- 数据集工件版本别名
- 用于指定要使用的数据集工件的版本别名。
命令行使用方法:python train.py --artifact_alias latest
- 在使用MLFlow等工具跟踪模型训练和数据集版本时,会给每个版本分配唯一的别名。通过指定此参数,可以使用特定版本的数据集工件。默认情况下,使用最新版本的数据集工件。
1.1.41 ndjson-console
parser.add_argument("--ndjson-console", action="store_true", help="Log ndjson to console")
- 将ndjson输出在控制台
3.42 ndjson-file
parser.add_argument("--ndjson-file", action="store_true", help="Log ndjson to file")
- 将ndjson 记录在文件中
本文系作者 @ATRAY 原创发布在ATRAY站点。未经许可,禁止转载。
暂无评论数据