Hyperparameter-Evolution für YOLOv5#
📚 Dieser Leitfaden erklärt die Hyperparameter-Evolution für YOLOv5 🚀. Die Hyperparameter-Evolution ist eine Methode zur Hyperparameter-Optimierung, bei der ein genetischer Algorithmus (GA) zur Optimierung verwendet wird.
Hyperparameter im maschinellen Lernen steuern verschiedene Aspekte des Trainings, und die Ermittlung optimaler Werte kann eine Herausforderung darstellen. Herkömmliche Methoden wie Gittersuchen können aufgrund folgender Faktoren schnell unpraktikabel werden:
- Der große Suchraum mit vielen Dimensionen
- Unbekannte Korrelationen zwischen den Dimensionen
- Der hohe Aufwand für die Bewertung der Fitness an jedem Punkt
Dadurch eignen sich genetische Algorithmen für die Suche nach Hyperparametern.
Bevor du beginnst#
Klone das Repository und installiere requirements.txt in einer Python>=3.8.0-Umgebung einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch aus der neuesten YOLOv5-Version heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install1. Hyperparameter initialisieren#
YOLOv5 verwendet etwa 30 Hyperparameter für verschiedene Trainingseinstellungen. Diese sind in den Dateien *.yaml im Verzeichnis /data/hyps definiert. Bessere Anfangsschätzungen führen zu besseren Endergebnissen. Daher ist es wichtig, diese Werte vor der Evolution korrekt zu initialisieren. Verwende im Zweifel einfach die Standardwerte, die für das 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. Fitness definieren#
Fitness ist der Wert, den du maximieren möchtest. In YOLOv5 definieren wir eine Standard-Fitnessfunktion als gewichtete Kombination von Metriken: mAP@0.5 macht 10 % des Gewichts aus und mAP@0.5:0.95 die verbleibenden 90 %, wobei Präzision (P) und Sensitivität (R) fehlen. Du kannst diese nach Belieben anpassen oder die in utils/metrics.py definierte Standard-Fitness nutzen (empfohlen). Diese Fitness bestimmt, welches Ergebnis unter hyp_evolve.yaml gespeichert wird; der genetische Algorithmus selbst bewertet Eltern und Eliten ausschließlich anhand von mAP@0.5, sodass eine Änderung dieser Gewichte die Elternauswahl nicht verändert.
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. Evolution durchführen#
Die Evolution wird anhand eines Basisszenarios durchgeführt, das wir verbessern möchten. Das Basisszenario in diesem Beispiel besteht aus dem Feinabstimmen von COCO128 über 10 Epochen mit dem vortrainierten YOLOv5s. Der Trainingsbefehl für das Basisszenario lautet:
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cacheUm Hyperparameter zu entwickeln, die für dieses Szenario spezifisch sind, ausgehend von unseren in Abschnitt 1. definierten Anfangswerten und unter Maximierung der in Abschnitt 2. definierten Fitness, füge --evolve an:
# 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
# ) &
# doneDie Standard-Evolutionseinstellungen laufen über 300 Generationen, und jede Generation trainiert das Basisszenario einmal für jedes der 50 Individuen in der Population. Du kannst die Generationen über das Argument --evolve modifizieren, d. h. python train.py --evolve 1000.
Die wichtigsten genetischen Operatoren sind Crossover und Mutation. Jede Generation trainiert jedes Individuum, bewertet es anhand von mAP@0.5, wählt Eltern durch Turnierauswahl aus, wobei die fittesten Eliten dem Elternpool hinzugefügt werden, und baut die nächste Population durch Crossover und Mutation auf, wobei sich die Raten im Laufe der Evolution anpassen. Die Ergebnisse werden in runs/evolve/exp/evolve.csv protokolliert, und der Nachkomme mit der höchsten Fitness wird in jeder Generation als runs/evolve/exp/hyp_evolve.yaml gespeichert:
# 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 für optimale Ergebnisse mindestens 300 Evolutionsgenerationen. Beachte, dass die Evolution im Allgemeinen aufwendig und zeitintensiv ist, da das Basisszenario tausendermal trainiert wird und möglicherweise Hunderte oder Tausende von GPU-Stunden erfordert.
Wenn die Evolution abgeschlossen ist, kannst du die ermittelten Einstellungen wiederverwenden, indem du das Training auf die gespeicherte Datei verweist, zum Beispiel python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.
4. Visualisieren#
evolve.csv wird nach Abschluss der Evolution von utils.plots.plot_evolve() als evolve.png dargestellt, mit einem Teilplot pro Hyperparameter, der die Fitness (y-Achse) gegenüber den Hyperparameterwerten (x-Achse) zeigt. Gelb kennzeichnet höhere Konzentrationen. Vertikale Verteilungen zeigen an, dass ein Parameter deaktiviert wurde und nicht mutiert. Dies kann im Wörterbuch meta in train.py ausgewählt werden und ist nützlich, um Parameter festzusetzen und ihre Weiterentwicklung zu verhindern.

Unterstützte Umgebungen#
Ultralytics stellt eine Reihe sofort einsatzbereiter Umgebungen bereit, in denen wichtige Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch bereits installiert sind, damit du deine Projekte schnell starten kannst.
- Kostenlose GPU-Notebooks:
- Google Cloud: Kurzanleitung für GCP
- Amazon: Kurzanleitung für AWS
- Azure: Kurzanleitung für AzureML
- Docker: Docker-Schnellstartanleitung
Projektstatus#
Dieses Abzeichen zeigt an, dass alle GitHub-Actions für YOLOv5-Tests zur kontinuierlichen Integration (CI) erfolgreich durchlaufen. Diese CI-Tests prüfen die Funktionalität und Leistung von YOLOv5 in verschiedenen wichtigen Bereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu. Die Tests werden alle 24 Stunden sowie bei jedem neuen Commit durchgeführt.
FAQ#
Jede Generation trainiert das Basisszenario einmal pro Individuum in der 50-köpfigen Population, sodass 300 Generationen eines COCO128-Laufs mit 10 Epochen ungefähr dem 15.000-Fachen der Kosten eines solchen Laufs entsprechen. Halte das Basisszenario kurz und aussagekräftig. Die obige Multi-GPU-Schleife startet auf jeder GPU eine unabhängige Suche, anstatt eine gemeinsame Suche zu verwenden. Reduziere daher
--evolvepro Prozess, wenn du mit einem festen Budget arbeitest.Ja.
--evolveist standardmäßig auf 300 Generationen eingestellt; übergib eine Zahl wie--evolve 1000, um mehr auszuführen.Setze den ersten Wert seines Eintrags im
meta-Wörterbuch intrain.pyaufFalse. Ausgeschlossene Parameter behalten ihren Anfangswert und werden inevolve.pngals vertikale Linien angezeigt.Übergebe die gespeicherte Datei an einen normalen Trainingslauf:
python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.