Entwicklung der Hyperparameter
📚 Dieser Leitfaden erklärt die Hyperparameter-Evolution für YOLOv5 🚀. Die Hyperparameter-Evolution ist eine Methode der Hyperparameter-Optimierung unter Verwendung eines genetischen Algorithmus (GA) zur Optimierung.
Hyperparameter in ML steuern verschiedene Aspekte des Trainings, und die Suche nach optimalen Werten für sie kann eine Herausforderung sein. Herkömmliche Methoden wie die Gittersuche können aufgrund 1) des hochdimensionalen Suchraums, 2) unbekannter Korrelationen zwischen den Dimensionen und 3) der kostspieligen Bewertung der Fitness an jedem Punkt schnell unpraktikabel werden, was GA zu einem geeigneten Kandidaten für die Hyperparametersuche macht.
Bevor Sie beginnen
Repo klonen und requirements.txt in einem Python>=3.8.0 Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuestenVersion von YOLOv5 heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
1. Hyperparameter initialisieren
YOLOv5 hat etwa 30 Hyperparameter, die für verschiedene Trainingseinstellungen verwendet werden. Diese sind definiert in *.yaml
Dateien im /data/hyps
Verzeichnis. Bessere anfängliche Schätzungen führen zu besseren Endergebnissen, daher ist es wichtig, diese Werte vor der Entwicklung richtig zu initialisieren. Im Zweifelsfall verwenden Sie einfach die Standardwerte, die für YOLOv5 COCO Training von Grund auf optimiert sind.
# 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. Definieren Sie Fitness
Fitness ist der Wert, den wir zu maximieren versuchen. In YOLOv5 definieren wir eine Standard-Fitnessfunktion als gewichtete Kombination von Metriken: mAP@0.5
10 % des Gewichts ausmacht und mAP@0.5:0.95
trägt die restlichen 90% bei, wobei Präzision P
und Rückruf R
abwesend. Sie können diese nach eigenem Ermessen anpassen oder die Standard-Fitness-Definition in utils/metrics.py verwenden (empfohlen).
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. Entwickeln Sie
Die Evolution wird anhand eines Basisszenarios durchgeführt, das wir zu verbessern versuchen. Das Basisszenario in diesem Beispiel ist das Finetuning von COCO128 für 10 Epochen unter Verwendung von vortrainierten YOLOv5s. Der Trainingsbefehl für das Basisszenario lautet:
Entwickeln von Hyperparametern speziell für dieses Szenarioausgehend von unseren Anfangswerten, die in Abschnitt 1.und die Maximierung der Fitness, die in Abschnitt 2., anhängen --evolve
:
# Single-GPU
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve
# Multi-GPU
for i in 0 1 2 3 4 5 6 7; do
sleep $(expr 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
# Multi-GPU bash-while (not recommended)
for i in 0 1 2 3 4 5 6 7; do
sleep $(expr 30 \* $i) && # 30-second delay (optional)
echo 'Starting GPU '$i'...' &&
"$(while true; do nohup python train.py... --device $i --evolve 1 > evolve_gpu_$i.log; done)" &
done
Mit den Standardeinstellungen für die Entwicklung wird das Basisszenario 300 Mal durchgespielt, d. h. 300 Generationen lang. Sie können die Generationen über die Funktion --evolve
Argument, d.h. python train.py --evolve 1000
.
Die wichtigsten genetischen Operatoren sind Crossover und Mutation. In dieser Arbeit wird die Mutation mit einer Wahrscheinlichkeit von 80 % und einer Varianz von 0,04 verwendet, um neue Nachkommen zu erzeugen, die auf einer Kombination der besten Eltern aus allen vorherigen Generationen basieren. Die Ergebnisse werden protokolliert in runs/evolve/exp/evolve.csv
und der Nachkomme mit der höchsten Fitness wird in jeder Generation gespeichert als 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)
Wir empfehlen mindestens 300 Evolutionsgenerationen, um optimale Ergebnisse zu erzielen. Beachten Sie, dass die Evolution im Allgemeinen teuer und zeitaufwändig ist, da das Basisszenario Hunderte von Malen trainiert wird, was möglicherweise Hunderte oder Tausende von GPU Stunden erfordert.
4. Visualisieren Sie
evolve.csv
wird aufgetragen als evolve.png
von utils.plots.plot_evolve()
nach Abschluss der Evolution mit einem Subplot pro Hyperparameter, der die Fitness (y-Achse) im Vergleich zu den Hyperparameterwerten (x-Achse) zeigt. Gelb zeigt höhere Konzentrationen an. Vertikale Verteilungen zeigen an, dass ein Parameter deaktiviert wurde und nicht mutiert. Dies kann vom Benutzer im Menü meta
Wörterbuch in train.py und ist nützlich, um Parameter zu fixieren und zu verhindern, dass sie sich weiterentwickeln.
Unterstützte Umgebungen
Ultralytics bietet eine Reihe gebrauchsfertiger Umgebungen, die jeweils mit wichtigen Abhängigkeiten vorinstalliert sind, z. B. CUDA, CUDNN, Python, und PyTorchvorinstalliert, um Ihre Projekte in Gang zu bringen.
- Kostenlose GPU Notizbücher:
- Google Wolke: GCP-Schnellstart-Anleitung
- Amazon: AWS Schnellstart-Anleitung
- Azure: AzureML-Schnellstart-Anleitung
- Docker: Docker-Schnellstart-Anleitung
Projektstatus
Dieses Abzeichen zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI) Tests erfolgreich bestanden wurden. Diese CI-Tests überprüfen die Funktionalität und Leistung von YOLOv5 in verschiedenen Schlüsselbereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu, wobei die Tests alle 24 Stunden und bei jeder neuen Übertragung durchgeführt werden.