YOLOv5 的超参数进化
📚 本指南介绍了 YOLOv5 🚀 的 超参数进化。超参数进化是一种使用 遗传算法 (GA) 进行优化的 超参数优化 方法。
机器学习中的超参数控制着训练的各个方面,找到它们的最佳值可能是一个挑战。由于以下原因,网格搜索等传统方法可能会很快变得难以处理:
- 高维搜索空间
- 维度之间未知的相关性
- 在每个点评估适应度的昂贵性质
这使得遗传算法成为超参数搜索的合适选择。
开始之前
克隆仓库并在 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 个epoch的微调。基本场景训练命令是:
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/hyp_evolved.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 小时。
4. 可视化
evolve.csv
绘制为 evolve.png
by utils.plots.plot_evolve()
进化完成后,每个超参数都有一个子图,显示适应度(y 轴)与超参数值(x 轴)。黄色表示浓度较高。垂直分布表示参数已被禁用且不会变异。这可以在 meta
train.py 中的字典,可用于修复参数并防止它们演变。
支持的环境
Ultralytics 提供一系列即用型环境,每个环境都预装了必要的依赖项,如 CUDA、CUDNN、Python 和 PyTorch,以快速启动您的项目。
- 免费 GPU Notebooks:
- Google Cloud:GCP 快速入门指南
- Amazon:AWS 快速入门指南
- Azure:AzureML 快速入门指南
- Docker: Docker 快速入门指南
项目状态
此徽章表示所有 YOLOv5 GitHub Actions 持续集成 (CI) 测试均已成功通过。这些 CI 测试严格检查 YOLOv5 在各个关键方面的功能和性能:训练、验证、推理、导出 和 基准测试。它们确保在 macOS、Windows 和 Ubuntu 上运行的一致性和可靠性,测试每 24 小时进行一次,并在每次提交新内容时进行。