YOLOv5 超参数演化#
📚 本指南介绍 YOLOv5 的超参数演化 🚀。超参数演化是一种使用遗传算法 (GA)进行优化的超参数优化方法。
机器学习中的超参数控制训练的各个方面,为它们找到最佳值可能颇具挑战。网格搜索等传统方法很快就会变得难以处理,原因包括:
- 搜索空间的维度很高
- 各维度之间存在未知的相关性
- 评估每个点的适应度成本高昂
因此,遗传算法适合用于超参数搜索。
开始之前#
克隆仓库,并在包含 PyTorch>=1.8 的 Python>=3.8.0 环境中安装 requirements.txt。模型和数据集会从 YOLOv5 最新版本自动下载。
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install1. 初始化超参数#
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 中的默认适应度定义(推荐)。适应度决定哪个结果会保存到 hyp_evolve.yaml;遗传算法本身只根据 mAP@0.5 对父代和精英个体进行排名,因此更改这些权重不会影响父代选择。
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] # [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 代,每一代都会针对种群中的 50 个个体分别训练一次基础场景。你可以通过 --evolve 参数修改代数,例如 python train.py --evolve 1000。
主要的遗传操作是交叉和变异。每一代都会训练每个个体,并根据 mAP@0.5 为其评分;随后通过锦标赛选择法挑选父代,并将适应度最高的精英个体加入父代池;再通过交叉和变异构建下一代种群,且交叉和变异率会随着进化进程自适应调整。结果会记录到 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 字典中选择此设置,这对于固定参数并防止参数继续进化很有用。

支持的环境#
Ultralytics 提供多种开箱即用的环境,每种环境都预装了 CUDA、CUDNN、Python 和 PyTorch 等必备依赖,助你快速启动项目。
- 免费 GPU 笔记本:
- Google Cloud:GCP 快速入门指南
- Amazon:AWS 快速入门指南
- Azure:AzureML 快速入门指南
- Docker:Docker 快速入门指南
项目状态#
此徽章表示所有 YOLOv5 GitHub Actions 持续集成 (CI) 测试均已成功通过。这些 CI 测试会严格检查 YOLOv5 在多个关键方面的功能和性能:训练、验证、推理、导出和基准测试。这些测试每 24 小时以及每次提交新代码后运行一次,确保 YOLOv5 在 macOS、Windows 和 Ubuntu 上保持稳定可靠地运行。
常见问题#
每一代都会针对 50 个个体组成的种群中的每个个体训练一次基础场景,因此,运行 300 代、每代 10 个轮次的 COCO128 训练,成本约为单次此类训练的 15,000 倍。请保持基础场景简短且具有代表性。上面的多 GPU 循环会在每个 GPU 上启动独立搜索,而不是让多个 GPU 共享同一次搜索,因此,如果你的预算固定,请降低每个进程的
--evolve。可以。
--evolve默认为 300 代;传入一个数字(例如--evolve 1000)即可运行更多代。在
train.py中的meta字典里,将对应条目的第一个值设为False。被排除的参数会保持初始值,并在evolve.png中显示为垂直线。在常规训练运行中传入已保存的文件:
python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt。