YOLO Vision 2026:

YOLOv5 超参数演化#

📚 本指南介绍 YOLOv5 的超参数演化 🚀。超参数演化是一种使用遗传算法(GA)进行超参数优化的方法。

机器学习中的超参数控制训练的各个方面,而为它们找到最优值可能是一项挑战。由于以下原因,网格搜索等传统方法很快会变得难以处理:

  1. 搜索空间维度高
  2. 各维度之间的相关性未知
  3. 评估每个点适应度的成本高昂

因此,遗传算法非常适合用于超参数搜索。

开始之前#

Python>=3.8.0 环境中克隆仓库并安装 requirements.txt,其中包括 PyTorch>=1.8模型数据集 会自动从最新的 YOLOv5 版本下载。

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

1. 初始化超参数#

YOLOv5 有大约 30 个用于各种训练设置的超参数。这些参数定义在 *.yaml 文件中,该文件位于 /data/hyps 目录内。更好的初始猜测会带来更好的最终结果,因此在演化之前正确初始化这些值非常重要。如果不确定,直接使用默认值即可;这些默认值针对从头开始进行 YOLOv5 COCO 训练进行了优化。

# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# Hyperparameters for low-augmentation COCO training from scratch
# python train.py --batch 64 --cfg yolov5n6.yaml --weights '' --data coco.yaml --img 640 --epochs 300 --linear
# See tutorials for hyperparameter evolution https://github.com/ultralytics/yolov5#tutorials

lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.01 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4
warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
iou_t: 0.20 # IoU training threshold
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3  # anchors per output layer (0 to ignore)
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
copy_paste: 0.0 # segment copy-paste (probability)

2. 定义适应度#

适应度是我们寻求最大化的值。在 YOLOv5 中,我们将默认适应度函数定义为多个指标的加权组合:mAP@0.5 占权重的 10%,mAP@0.5:0.95 占剩余的 90%,其中不包含精确率(P)召回率(R)。你可以根据需要调整这些设置,也可以使用 utils/metrics.py 中默认的适应度定义(推荐)。

def fitness(x):
    """Return model fitness as the sum of weighted metrics [P, R, mAP@0.5, mAP@0.5:0.95]."""
    w = [0.0, 0.0, 0.1, 0.9]  # weights for [P, R, mAP@0.5, mAP@0.5:0.95]
    return (x[:, :4] * w).sum(1)

3. 演化#

演化围绕一个我们希望加以改进的基础场景进行。本示例中的基础场景是使用预训练 YOLOv5s 对 COCO128 进行 10 个周期微调。基础场景的训练命令为:

python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache

要演化针对此场景的超参数,从第 1 节中定义的初始值开始,并最大化第 2 节中定义的适应度,请追加 --evolve

# Single-GPU
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve

# Multi-GPU with delay
for i in {0..7}; do
  sleep $((30 * i)) # 30-second delay (optional)
  echo "Starting GPU $i..."
  nohup python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log" &
done

# Continuous training (use with caution)
# for i in {0..7}; do
#   sleep $((30 * i))  # 30-second delay (optional)
#   echo "Starting continuous training on GPU $i..."
#   (
#     while true; do
#       python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log"
#     done
#   ) &
# done

默认的演化设置会运行基础场景 300 次,即进行 300 代。你可以通过 --evolve 参数修改代数,即 python train.py --evolve 1000

主要的遗传算子是交叉变异。在本工作中使用变异,以 80% 的概率和 0.04 的方差,基于此前所有代中最佳父代的组合创建新的后代。结果会记录到 runs/evolve/exp/evolve.csv,而适应度最高的后代会在每一代保存为 runs/evolve/exp/hyp_evolve.yaml

# YOLOv5 Hyperparameter Evolution Results
# Best generation: 287
# Last generation: 300
#    metrics/precision,       metrics/recall,      metrics/mAP_0.5, metrics/mAP_0.5:0.95,         val/box_loss,         val/obj_loss,         val/cls_loss
#              0.54634,              0.55625,              0.58201,              0.33665,             0.056451,             0.042892,             0.013441

lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4
warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
iou_t: 0.20 # IoU training threshold
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3  # anchors per output layer (0 to ignore)
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
copy_paste: 0.0 # segment copy-paste (probability)

为了获得最佳结果,我们建议至少进行 300 代演化。请注意,演化通常成本高昂且耗时很长,因为基础场景会被训练数百次,可能需要数百或数千个 GPU 小时。

演化完成后,将训练指向保存的文件即可重新使用发现的设置,例如 python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt

4. 可视化#

演化完成后,evolve.csv 会由 utils.plots.plot_evolve() 绘制为 evolve.png,每个超参数对应一个子图,显示适应度(y 轴)与超参数值(x 轴)的关系。黄色表示更高的集中度。垂直分布表示某个参数已被禁用,不会发生变异。你可以在 train.py 的 meta 字典中选择此设置;它适用于固定参数并防止参数发生演化。

YOLOv5 超参数演化适应度结果

支持的环境#

Ultralytics 提供一系列可直接使用的环境,每个环境都预装了 CUDACUDNNPythonPyTorch 等必要依赖项,帮助你快速启动项目。

项目状态#

YOLOv5 CI

此徽章表示所有 YOLOv5 GitHub Actions 持续集成(CI)测试均已成功通过。这些 CI 测试会严格检查 YOLOv5 在多个关键方面的功能和性能:训练验证推理导出基准测试。它们确保 YOLOv5 在 macOS、Windows 和 Ubuntu 上持续稳定地运行,并且每 24 小时以及每次新提交时都会执行测试。

评论