YOLOv8目标检测(三*)_最佳超参数训练
YOLOv8目标检测(一)_检测流程梳理:YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客
YOLOv8目标检测(二)_准备数据集:YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客
YOLOv8目标检测(三)_训练模型:YOLOv8目标检测(三)_训练模型_yolo data.yaml-CSDN博客
YOLOv8目标检测(三*)_最佳超参数训练:YOLOv8目标检测(三*)_最佳超参数训练_yolo 为什么要选择yolov8m.pt进行训练-CSDN博客
YOLOv8目标检测(四)_图片推理:YOLOv8目标检测(四)_图片推理-CSDN博客
YOLOv8目标检测(五)_结果文件(run/detrct/train)详解:YOLOv8目标检测(五)_结果文件(run/detrct/train)详解_yolov8 yolov8m.pt可以训练什么-CSDN博客
YOLOv8目标检测(六)_封装API接口:YOLOv8目标检测(六)_封装API接口-CSDN博客
YOLOv8目标检测(七)_AB压力测试:YOLOv8目标检测(七)_AB压力测试-CSDN博客
官方文档参考:超参数调整 -Ultralytics YOLO 文档
为什么要最佳超参数训练?
简单来说:
进行最佳超参数训练(Hyperparameter Optimization,HPO)是为了提高模型的性能,确保其在目标任务上的表现尽可能优异。
具体原因如下:
1.提升模型性能
(1)更高的准确性:通过调优学习率、权重衰减、批量大小等超参数,可以显著提高模型的准确性。
(2)更好的泛化能力:合适的超参数能够帮助模型在未见过的数据上表现更好,避免过拟合或欠拟合。
2.加快收敛速度
通过选择合适的学习率等超参数,模型的训练过程可以更快地收敛,从而节省训练时间和计算资源。
3.避免过拟合或欠拟合
超参数如正则化参数、数据增强策略、学习率衰减等会影响模型的复杂度和训练过程,优化这些参数有助于找到合适的平衡点。
4.适配特定任务或数据集
每个任务或数据集都有其独特的特点,默认的超参数可能不适合特定的应用场景。通过超参数搜索,可以为具体的任务定制训练流程。
5.优化资源使用
超参数优化能够找到在性能与计算资源之间的最佳平衡点。例如,通过调节批量大小、网络宽度或深度,可以降低显存占用,同时维持或提升模型性能。
注:笔者首先对数据进行了训练集和验证集的切分,用验证集数据寻找最佳超参数,得到参数后,再把全部数据进行训练。
一、修改脚本
(1)修改model路径
推荐使用yolov8m.pt或者yolov8n.pt等下载好的权重文件。
(2)修改model.tune参数
微调模型参数。
以下代码作用是加载 YOLOv8 的预训练模型,并使用其 tune 方法对指定数据集进行微调。
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLOif __name__ == '__main__':model = YOLO('/usr/src/ultralytics/ultralytics/yolov8m.pt') # 需要修改#model.load('yolov8n.pt') # loading pretrain weightsmodel.tune(data=r'/usr/src/ultralytics/ultralytics/phone.yaml', # 需要修改# 如果任务是其它的,找到'ultralytics/cfg/default.yaml'修改task可以改成detect, segment, classify, pose# cache=False,imgsz=640,epochs=50,# single_cls=False, # 是否是单类别检测# batch=4,# close_mosaic=10,# workers=0,device='0',# optimizer='SGD', # resume='', # 续训设置last.pt的地址# amp=False, # 如果出现训练损失为Nan可以关闭ampproject='runs/train',# val=False, #注释false相当属于val=Trueiterations=100,name='exp',)
model.tune参数详细解释
1)data
-
数据集配置文件的路径,是一个
.yaml
文件。 -
该文件包含训练集和验证集的路径,以及类别标签信息。例如:
# 数据集路径和类别数 train: /path/to/dataset/train/images # 训练集的图片路径 val: /path/to/dataset/val/images # 验证集的图片路径names: ['class1','class2','class3']nc: 3 # 类别数,与 names 的总数一致
2)imgsz
- 输入图像的尺寸,默认值是
640
。 - 表示将图像缩放到
640x640
的大小后再进行训练或推理。
3)epochs
- 训练的轮次。
- 模型会在数据集上迭代指定的次数,可以根据实验需求调整。
4)device
- 指定训练使用的设备,例如:
'0'
:使用 GPU 0 进行训练。'cpu'
:使用 CPU。
- 如果有多块 GPU,可以指定多个,例如
device='0,1'
。
5)project
- 保存训练结果的路径,默认是
runs/train
。 - 所有实验的模型权重、日志、结果图片等会存储在这个目录下。
6)iterations
- 每个 epoch 中完成的迭代次数,决定了一轮训练中数据加载的批次总量。
- 如果数据集较大,可以增加迭代次数,以确保每轮训练更充分。
7)name
- 当前实验的名字,用于区分不同实验。
- 实验结果会保存在
project
指定路径下的exp
文件夹中,例如runs/train/exp
。
8)cache
- 是否将数据加载到内存中以加速训练。
- 如果注释掉,默认值为
False
。 - 设置为
True
可以提升加载速度,但会占用大量内存。
9)single_cls
- 如果数据集中只有一个类别,可以设置为
True
。 - 适合单类别检测任务,例如仅检测某一特定物体。
10)batch
- 每次训练使用的样本数量(批次大小)。
- 批次大小越大,对显存要求越高,通常调整到显存能承受的最大值。
11)close_mosaic
- 控制 Mosaic 数据增强的关闭周期。
- Mosaic 是一种将多个图像拼接为一张训练样本的方法,默认在训练后期关闭以稳定模型。
12)workers
- 数据加载的线程数。
- 设置为
0
表示不使用多线程加载数据。 - 如果设置更高的值,可以加快数据加载,但对 CPU 性能有要求。
13)optimizer
- 优化器的选择,默认是 Adam。
- 可选值包括
'SGD'
、'Adam'
等。
14)resume
- 用于续训的设置。
- 如果有中断的训练,可以通过指定
last.pt
的路径继续训练。
15)amp
- 是否启用混合精度训练(Automatic Mixed Precision)。
- 默认为
True
,可以提升训练速度并减少显存占用。 - 如果训练过程中出现
NaN
错误,可以关闭它。
16)val
- 是否在训练过程中进行验证。
- 如果注释掉
val=False
,相当于默认开启验证(val=True
)。
二、运行脚本
python train_tune.py
三、查看最佳结果
(1)查看结果文件
训练完成后保存在hyptune_result_tune中,文件夹内容如下
1)weights中存放着权重文件。
2)best_hyperparameters.yaml存放着训练的最佳参数。
3)tune_fitness.png展示了超参数优化过程中,目标函数( fitness 值)的变化趋势。
这是一幅显示适应度(通常是 AP50 这样的性能指标)与迭代次数的对比图。它可以帮助你直观地了解遗传算法在一段时间内的表现。
什么是fitness?
fitness是衡量模型性能的综合指标,一般是是基于多个评价指标(如精确率、召回率、mAP 等)的加权和。
4)tune_results.csv
部分数据如下
fitness | lr0 | lrf | momentum | weight_decay | warmup_epochs | warmup_momentum | box | cls | dfl | hsv_h | hsv_s | hsv_v | degrees | translate | scale | shear | perspective | flipud | fliplr | mosaic | mixup | copy_paste |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0.7561 | 0.01074 | 0.01092 | 0.87809 | 0.0005 | 5 | 0.6645 | 3.81906 | 0.52678 | 2.53135 | 0.01114 | 0.351 | 0.22014 | 0 | 0.07474 | 0.59202 | 0 | 0 | 0 | 0.26175 | 1 | 0 | 0 |
0.75352 | 0.01074 | 0.01311 | 0.88108 | 0.00048 | 4.6469 | 0.60231 | 3.81906 | 0.43861 | 2.57052 | 0.01134 | 0.39181 | 0.22014 | 0 | 0.07474 | 0.66259 | 0 | 0 | 0 | 0.27737 | 0.82468 | 0 | 0 |
0.76364 | 0.00915 | 0.0102 | 0.88694 | 0.00044 | 3.79998 | 0.54519 | 3.57381 | 0.57831 | 2.5339 | 0.01114 | 0.33132 | 0.21189 | 0 | 0.07475 | 0.54387 | 0 | 0 | 0 | 0.26416 | 1 | 0 | 0 |
0.75078 | 0.00915 | 0.0102 | 0.88697 | 0.00044 | 3.80256 | 0.54519 | 3.57242 | 0.57854 | 2.53504 | 0.01114 | 0.33132 | 0.21198 | 0 | 0.07476 | 0.54405 | 0 | 0 | 0 | 0.26416 | 1 | 0 | 0 |
0.76293 | 0.00928 | 0.00811 | 0.86524 | 0.00042 | 3.79998 | 0.54854 | 3.67781 | 0.57831 | 2.4856 | 0.01166 | 0.29207 | 0.23139 | 0 | 0.06951 | 0.59062 | 0 | 0 | 0 | 0.23951 | 0.97602 | 0 | 0 |
CSV文件,包含调整过程中每次迭代的详细结果。文件中的每一行代表一次迭代,包括适配度得分、精确度、召回率等指标,以及使用的超参数。
5)tune_scatter_plots.png
这个图文件展示了超参数与目标性能指标的关系。
请注意,初始化为 0 的超参数将不会被调整,如degrees、shear、persprctive、flipud、mixup、copy_paste。
(2)查看最佳参数
查看best_hyperparameters.yaml文件,如下图
四、使用最佳超参数训练
复制修改训练的yaml文件(:改为=)
#修改前训练命令
yolo task=detect mode=train model=yolov8m.yaml data=./data.yaml pretrained=/data/yolov8m.pt imgsz=640 save=True epochs=400 patience=50 resume=True device=0
#修改后训练命令
yolo task=detect mode=train model=yolov8m.yaml data=./data.yaml pretrained=/data/yolov8m.pt imgsz=640 save=True epochs=400 patience=50 resume=True device=0 lr0=0.00976 lrf=0.01153 momentum=0.93626 weight_decay=0.00018 warmup_epochs=4.85722 warmup_momentum=0.95 box=4.18836 cls=0.66206 dfl=2.35773 hsv_h=0.00929 hsv_s=0.25334 hsv_v=0.15979 degrees=0.0 translate=0.09706 scale=0.69983 shear=0.0 perspective=0.0 flipud=0.0 fliplr=0.26921 mosaic=0.97292 mixup=0.0 copy_paste=0.0
注意:训练命令添加最佳超参数后,data.yaml文件别忘了修改成完整的数据集,笔者是先用小部分数据找最佳超参数,再训练完整数据集。
恭喜你学会了如何找到最佳超参数,并使用其进行训练!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mrgr.cn/news/80480.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!