YOLOV5训练代码train.py训练参数解析

一,前言

yolov5项目代码中,train.py是用于模型训练的代码,是yolov5中最为核心的代码之一,而代码中的训练参数则是核心中的核心,只有学会了各种训练参数的真正含义,才能使用yolov5进行最基本的训练。

本文讲解的yolov5版本为目前最新的V7.0
yolov5官方GitHub地址: https://github.com/ultralytics/yolov5

二,训练参数解析

yolov5中train.py采用python内置的命令行选项、参数和子命令解析器模块argparse,对用户自定义的命令行选项,参数和子命令进行解析,然后将解析出来的选项,参数和子命令传给代码中需要用到的地方。

注:关于argparse模块的基本使用,可以看我的另一篇博客:
链接: python基础之命令行参数解析模块:argparse.ArgumentParser(add_argument)
强烈建议先学习一下argparse模块的基本使用,要不然模块中有些参数和用法会看不懂,或者边学边看,边看边学。

1,–weights

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

解析: 模型预训练权重路径,默认为ROOT / ‘yolov5s.pt’
命令行用法:python train.py --weights yolov5s.pt
注:
1,若在命令行中使用"–weights" 参数,可指定预训练权重文件(路径);
2,若在命令行不使用"–weights" 参数,则预训练权重文件(路径)为自定义的default默认值;
3,若既使用命令行"–weights" 参数,又自定义了default默认值,则模型使用的是命令行"–weights" 参数指定的预训练权重文件(路径)
4,若不进行预训练,可使用"–weights" 参数指定一个空字符串:“”,或者将default默认值设置为空字符串:“”;
5,若使用yolov5s.pt、yolov5m.pt、yolov5l.pt、yolov5x.pt等yolov5官方预训练权重文件,若没有下载,代码会自动帮你下载,放在ROOT路径下,也就是你yolov5工程项目路径下,但是下载速度一般会很慢,建议先去yolov5官方GitHub中下载好。

2,–cfg

parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
python train.py --cfg yolov5s.pt**

解析:模型结构文件路径,默认为空
命令行用法:python train.py --cfg models/yolov5s.yaml
注:
1,在已经使用"–weights" 参数加载了预训练权重的情况下,可以不使用该参数,模型结构直接使用预训练权重中保存的模型结构;
2,不使用"–weights" 参数使用"–cfg" 参数,表示模型从头开始训练,不进行预训练;
3,“–weights” 参数和"–cfg" 参数必须要有一个,不然代码会报错。

3,–data

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

解析:数据集配置文件路径
命令行用法:python train.py --data data/coco128.yaml
注:
1,如果没有检查到数据集,代码会自动下载coco128数据集,也可以自己下载;
2,把yolov5官方的数据集配置文件中的数据集下载部分内容给注释掉,代码则不会自动下载。

4,–hyp

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

解析:训练超参数配置文件路径
命令行用法:python train.py --hyp data/hyps/hyp.scratch-low.yaml

5,–epochs

parser.add_argument('--epochs', type=int, default=100, help='total training epochs')

解析:训练迭代轮数
命令行用法:python train.py --epochs n
注:
1,epochs表示训练整个训练集的次数,epoch为n表示将整个训练集训练n次。

6,–batch-size

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

解析:训练批量大小
命令行用法:python train.py --batch-size n
注:
1,训练批量大小表示每个 mini-batch 中的样本数,batch-size设置为n表示一次性从训练集中获取n张图片送入模型进行训练;
2, batch-size大小需要根据自己设备GPU的资源合理设置。

7,–imgsz, --img, --img-size

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

解析:模型训练和验证时输入图片的尺寸
命令行用法:python train.py --imgsz/img/–img-size 640

8,–rect

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

解析:矩形训练,默认关闭
命令行用法:python train.py --rect
注:
1,矩形训练过程中会对输入的矩形图片进行预处理,通过保持原图高宽比进行resize后,对resize后的图片进行填充,填充到32的最小整数倍,然后进行矩形训练,减少训练时间。

9,–resum

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

解析:断点续训,默认关闭
命令行用法:python train.py ----weights /path/last.pt --rect
注:
1,断点续训就是从上一个训练任务中断的地方继续训练,直至训练完成;
2,当模型按指定的epoch训练完成后,则无法进行断点续训;
3,需要搭配"–weights" 参数使用,指定训练中断保存的最后一次模型权重文件。

10,–nosave

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

解析:只保留最后一次训练的权重,默认关闭
命令行用法:python train.py --nosave

11,–noval

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

解析:只对最后一次训练进行验证,默认关闭
命令行用法:python train.py --noval

12,–noautoanchor

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

解析:关闭自动计算锚框功能,默认关闭
命令行用法:python train.py --noautoanchor
注:
1,yolov5采用的是kmeans聚类算法来计算anchor box的大小和比例,最终自动计算出一组最合适训练的锚框。

13,–noplots

parser.add_argument('--noplots', action='store_true', help='save no plot files')

解析:不保存可视化文件
命令行用法:python train.py --noplots

14,–evolve

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

解析:使用超参数优化算法进行自动调参,默认关闭
命令行用法:python train.py --evolve n
注:
1,yolov5采用遗传算法对超参数进行优化,寻找一组最优的训练超参数;
2,开启后传入参数n,训练每迭代n次进行一次超参数进化;
3,开启后不传入参数,则默认为const=300。

15,–bucket

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

解析:从谷歌云盘下载或上传数据
命令行用法:python train.py --bucket gsutil bucket
注:
1,该参数用于指定 gsutil bucket 的名称,其中 gsutil 是 Google 提供的一个命令行工具,用于访问 Google Cloud Storage(GCS)服务;
2,GCS 是 Google 提供的一种对象存储服务,用户可以将任意数量和类型的数据存储在其中。用户可以通过 gsutil 命令行工具上传、下载、复制、删除等操作 GCS 中的数据。在训练模型时,如果需要使用 GCS 中的数据集,就需要指定 bucket 的名称。

16,–cache

parser.add_argument('--cache', type=str, nargs='?', const='ram', help='image --cache ram/disk')

解析:缓存数据集,默认关闭
命令行用法:python train.py --cache
注:
1,缓存数据集图片到内存中,训练时模型直接从内存中读取,加快数据加载和训练速度
2,若"–cache"参数指定值,可以指定的;值:ram/disk;
3,若"–cache"参数不指定值,则默认为const=‘ram’。

17,–image-weights

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

解析:对数据集图片进行加权训练,默认关闭
命令行用法:python train.py --image-weights --rect
注:
1,需要搭配"–rect"参数一起使用。

18,–device

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

解析:选择训练使用的设备处理器,CPU或者GPU,默认为空
命令行用法:python train.py --device 0/0,1,2,3/cpu
注:
1,默认为空时,代码会进行自动选择,若检查到设备有GPU则优先使用GPU进行训练,若没有则使用CPU进行训练;
2,使用GPU训练时,0,1,2,3分别表示第1,2,3,4张GPU;
3,设备没有GPU,使用CPU训练:
python train.py --device cpu
4,设备有单个GPU,使用单个GPU训练:
python train.py --device 0
5,设备有多个GPU,使用单个GPU训练:
python train.py --device 0 (使用第1张GPU训练);
python train.py --device 2 (使用第3张GPU训练);
6,设备有多个GPU,使用多个GPU训练:
python train.py --device 0,1,2(使用第1,2,3张GPU训练训练)。

19,–multi-scale

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

解析:多尺度训练,默认关闭
命令行用法:python train.py --multi-scale
注:
1,开启多尺度训练,训练过程中每次输入图片会放大或缩小50%。

20,–single-cls

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

解析:单类别训练,默认关闭
命令行用法:python train.py --single-cls

21,–optimizer

parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')

解析:选择训练使用的优化器,默认使用SGD
命令行用法:python train.py --optimizer SGD
注:
1,choices=[‘SGD’, ‘Adam’, ‘AdamW’]表示只能选择’SGD’, ‘Adam’, 'AdamW’这三种优化器,当然也可以添加自定义的优化器,但代码中其他地方也要做相应的更改。

22,–sync-bn

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

解析:使用SyncBatchNorm(Synchronized Batch Normalization:同步批量归一化),只有在使用DDP模式(分布式训练)时有效,默认关闭
命令行使用方法:python train.py --sync-bn
注:
1,关闭时,训练使用传统的批量归一化;
2,在传统的批归一化(Batch Normalization,简称 BN)中,每个 GPU 会对数据的均值和方差进行单独计算,因此在多 GPU 训练时,每个 GPU 计算的均值和方差可能会不同,导致模型训练不稳定。为了解决这个问题,SyncBN 技术将 BN 的计算放在了整个分布式训练过程中进行,确保所有 GPU 上计算的均值和方差是一致的,从而提高模型训练的稳定性和效果,但同时也会增加训练时间和硬件要求,因此需要根据具体的训练数据和硬件资源来决定是否使用 SyncBN。

23,–workers

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

解析:设置Dataloader使用的最大numworkers,默认设置为8
命令行使用方法:python train.py --workers 8
注:
1,Dataloader中numworkers表示加载处理数据使用的线程数,使用多线程加载数据时,每个线程会负责加载和处理一批数据,数据加载处理完成后,会送入相应的队列中,最后主线程会从队列中读取数据,并送入GPU中进行模型计算;
2,numworkers为0表示不使用多线程,仅使用主线程进行数据加载和处理。

24,–project

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

解析:设置每次训练结果保存的主路径名称
命令行用法:python train.py --project ‘runs/train’
注:
1,这里主路径的意思是,你每次训练会生成一个单独的子文件夹,主路径就是存放你这些单独子文件夹的地方,可以自己命名,例如’runs/train’。比如说你第一次训练保存结果的文件夹是exp1,第二次是exp2,第三次是exp3,则这些子文件夹都会放在主路径’runs/train’下面。

25,–name

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

解析:设置每次训练结果保存的子路径名称
命令行用法:python train.py --name exp
1,这里子路径的意思是就是上面在’–project’中提到的每次训练生成的单独的子文件夹,可以自己命名,例如’exp’。你每次训练生成的模型权重文件、可视化结果以及其它结果文件保存的地方。

26,–exist-ok

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

解析:是否覆盖同名的训练结果保存路径,默认关闭,表示不覆盖
命令行用法:python train.py --exist-ok
注:
1,不使用’–exist-ok’参数时,如果’–name’指定的名称不变,比如’exp’,每次训练会按顺序新建文件夹,例如exp1、exp2、exp3、… 、expn;
2,使用’–exist-ok’参数时,如果’–name’指定的名称不变,比如’exp’,每次训练则不会新建文件夹,训练结果会覆盖原先文件夹中保存的所有结果。

27,–quad

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

解析:是否使用quad dataloader,默认关闭
命令行用法:python train.py --quad
注:
quad dataloader 是一种数据加载器,它可以并行地从磁盘读取和处理多个图像,并将它们打包成四张图像,从而减少了数据读取和预处理的时间,并提高了数据加载的效率。

28,–cos-lr

parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')

解析:训练学习率衰减策略使用余弦退火策略,默认关闭
命令行用法:python train.py --cos-lr
注:
1,余弦退火策略在训练初期加快学习速度,训练后期减小学习率,从而更好地学习数据的分布,避免模型陷入局部最优。

29,–label-smoothing

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

解析:训练使用标签平滑策略,防止过拟合
命令行用法:python train.py --label-smoothing
注:
1,默认为0.0,即标签平滑策略使用的epsilon为0.0;
2,将标签平滑策略使用的epsilon设置为0.1:
python train.py --label-smoothing 0.1
表示在每个标签的真实概率上添加一个 epsilon=0.1的噪声,从而使模型对标签的波动更加鲁棒;
3,–label-smoothing 参数的值应该根据具体的数据集和模型来调整,以达到最优的训练效果。

30,–patience

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

解析:训练使用EarlyStopping策略,防止过拟合
命令行用法:python train.py --patience 100
注:
1,‘–patience’参数指定为整数n时,表示模型在训练时,若连续n个epoch验证精度都没有提升,则认为训练已经过拟合,停止训练。’–patience’可根据具体的模型和数据集进行调整。

31,–freeze

parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')

解析:训练使用冻结训练策略,默认关闭
命令行用法:python train.py --freeze
注:
1,冻结训练是指在训练过程中冻结模型中的某些层,冻结的层不进行权重参数更新;
2,指定’0’或’-1’,不冻结任何层,更新所有层的权重参数:
python train.py --freeze 0/-1
3,指定n,冻结前n(0<n<=10)层,即只更新前n层的权重参数:
python train.py --freeze n

32,–save-period

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

解析:每训练n个epoch保存一次训练权重,默认关闭
命令行用法:python train.py --save-period n
注:
1,n>0,每训练n个epoch保存一次训练权重;
2,n<=0,关闭save-period,只保存best和last权重。

33,–seed

parser.add_argument('--seed', type=int, default=0, help='Global training seed')

解析:设置训练使用的全局随机种子
命令行用法:python train.py --seed n
注:
1,在训练过程中,有很多地方会使用到随机种子,例如数据加载和处理阶段或模型初始化阶段,随机种子可以保证每次生成的结果都一致,从而有利于代码的可复现性。

34,—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 0,1,2,3
注:
1,如果你有 4 个 GPU,想要使用第 2 号和第 3 号 GPU 进行训练,那么可以在启动训练脚本时设置如下参数:
python train.py --local_rank 1,2
这样,第一个进程将使用第 2 号 GPU,第二个进程将使用第 3 号 GPU。注意,如果使用了 --local_rank 参数,那么在启动训练脚本时需要使用 PyTorch 的分布式训练工具,例如 torch.distributed.launch。

35,–entity

parser.add_argument('--entity', default=None, help='Entity')

解析:用于指定模型实体的参数
命令行用法:python train.py --entity None
注:
1,模型实体可以是一个实体名称或实体 ID,通常用于在实体存储库中管理模型的版本控制和记录。
在使用实体存储库时,你需要创建一个实体来存储模型,并在训练时指定该实体,这样训练结果就可以与该实体相关联并保存到实体存储库中。
该参数默认值为 None,如果未指定实体,则训练结果将不会与任何实体相关联。

36,–upload_dataset

parser.add_argument('--upload_dataset', nargs='?', const=True, default=False, help='Upload data, "val" option')

解析:用于上传数据集,默认关闭
命令行使用方法:python train.py --upload_dataset False
注:
1,如果命令行未使用’–upload_dataset’参数,则默认值为default=False,表示不上传数据集。
2,如果命令行使用’–upload_dataset’参数,但没有传递参数,则默认值为const=True,表示上传数据集。
3,如果命令行使用’–upload_dataset’参数,并且传递了参数’val’,则默认为True,表示要上传val数据集。

37,–bbox_interval

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

解析: 指定在训练过程中每隔多少个epoch记录一次带有边界框的图片,默认关闭
命令行使用方法:python train.py --bbox_interval n
注:
1,n>0,每隔n个epoch记录一次带有边界框的图片;
2,n<=0,关闭–bbox_interval。

38,–artifact_alias

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

解析:用于指定要使用的数据集工件的版本别名。
命令行使用方法:python train.py --artifact_alias latest
注:
1,在使用MLFlow等工具跟踪模型训练和数据集版本时,会给每个版本分配唯一的别名。通过指定此参数,可以使用特定版本的数据集工件。默认情况下,使用最新版本的数据集工件。

### KTransformer Buffer Cache Optimization and Relationship in Kubernetes Environment In the context of Kubernetes, understanding how buffer caches operate is crucial for optimizing performance within environments that involve data processing or storage operations. The term "KTransformer," while not standard terminology in Kubernetes documentation, can be inferred as referring to transformations applied at kernel levels affecting buffering mechanisms. Buffer caching plays an essential role in improving read/write speeds by temporarily storing frequently accessed data blocks in memory rather than fetching them from slower disk drives each time they are needed[^1]. In a Kubernetes setting, this concept extends beyond traditional databases like Oracle Database (where server result cache enhances query response times)[^1], impacting various components including containerized applications' interaction with underlying file systems. For specific optimizations related to buffer/cache management: - **Resource Allocation**: Ensuring adequate resources such as CPU and RAM allocation per pod helps maintain efficient buffer usage without causing contention among multiple pods. - **Persistent Volume Configuration**: Configuring persistent volumes correctly ensures optimal access patterns which indirectly influence buffer efficiency. For instance, using SSD-backed storage classes over HDDs could lead to better overall system throughput due to faster I/O operations. - **Application-Level Tuning**: Applications running inside containers should also implement best practices regarding their own internal caching strategies where applicable. This might include tuning parameters associated with database connections or adjusting application-specific settings that affect how often certain pieces of information need to be retrieved from external sources versus being served directly out of local memory structures. Regarding `DXGI_FORMAT_B5G6R5_UNORM` mentioned in another reference point, although primarily relevant to graphics rendering contexts [^2], it highlights considerations around format selection when dealing with specialized hardware interfaces—this principle may loosely apply here too if one considers choosing appropriate formats/data types during serialization/deserialization processes involving cached objects within a distributed computing framework like Kubernetes. To address potential bottlenecks caused by suboptimal handling of buffers/caches in a Kubernetes cluster hosting transformed workloads similar to what 'KTransformer' implies, monitoring tools become indispensable. Tools like Prometheus combined with Grafana provide comprehensive insights into resource utilization trends across nodes and individual services, enabling proactive identification and mitigation of issues before they escalate into significant performance degradation events. ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: app-container image: my-app-image resources: limits: memory: "512Mi" cpu: "500m" requests: memory: "256Mi" cpu: "250m" ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

调参小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值