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 YOLO
 
if __name__ == '__main__':
    model = YOLO('/usr/src/ultralytics/ultralytics/yolov8m.pt')      # 需要修改
    #model.load('yolov8n.pt') # loading pretrain weights
    model.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可以关闭amp
                project='runs/train',
               # val=False,             #注释false相当属于val=True
                iterations=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文件别忘了修改成完整的数据集,笔者是先用小部分数据找最佳超参数,再训练完整数据集。

恭喜你学会了如何找到最佳超参数,并使用其进行训练!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐