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#
Die Fitness ist der Wert, den wir maximieren möchten. In YOLOv5 definieren wir eine Standard-Fitnessfunktion als gewichtete Kombination von Metriken: mAP@0.5 trägt 10 % zum Gewicht bei und mAP@0.5:0.95 die verbleibenden 90 %, wobei Präzision (P) und Sensitivität (R) nicht enthalten sind. Du kannst diese Werte nach Bedarf anpassen oder die Standarddefinition der Fitness 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. 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
# ) &
# doneMit den standardmäßigen Evolutionseinstellungen wird das Basisszenario 300-mal ausgeführt, also über 300 Generationen. Du kannst die Anzahl der Generationen über das Argument --evolve ändern, zum Beispiel mit python train.py --evolve 1000.
Die wichtigsten genetischen Operatoren sind Rekombination und Mutation. In dieser Arbeit wird die Mutation mit einer Wahrscheinlichkeit von 80 % und einer Varianz von 0,04 verwendet, um neue Nachkommen auf Grundlage einer Kombination der besten Eltern aus allen vorherigen Generationen zu erzeugen. 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)Für beste Ergebnisse empfehlen wir mindestens 300 Evolutionsgenerationen. Beachte, dass die Evolution im Allgemeinen teuer ist und viel Zeit in Anspruch nimmt, da das Basisszenario Hunderte Male trainiert wird und möglicherweise Hunderte oder Tausende 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.