Zum Inhalt springen

Hyperparameter-Evolution für YOLOv5

📚 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 im maschinellen Lernen steuern verschiedene Aspekte des Trainings, und die Suche nach optimalen Werten für sie kann eine Herausforderung sein. Traditionelle Methoden wie Gittersuchen können aufgrund folgender Gründe schnell unübersichtlich werden:

  1. Der hochdimensionale Suchraum
  2. Unbekannte Korrelationen zwischen den Dimensionen
  3. Hoher Aufwand für die Bewertung der Fitness an jedem Punkt

Dies macht genetische Algorithmen zu einem geeigneten Kandidaten für Hyperparameter-Suchen.

Bevor Sie beginnen

Repository klonen und requirements.txt in einer Python>=3.8.0-Umgebung installieren, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuesten YOLOv5 Version heruntergeladen.

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

1. Initialisierung der Hyperparameter

YOLOv5 hat etwa 30 Hyperparameter, die für verschiedene Trainingseinstellungen verwendet werden. Diese sind definiert in *.yaml Dateien in der /data/hyps Verzeichnis. Bessere Anfangsschätzungen führen zu besseren Endergebnissen. Daher ist es wichtig, diese Werte vor der Entwicklung richtig zu initialisieren. Verwenden Sie im Zweifelsfall 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 wir maximieren wollen. In YOLOv5 definieren wir eine Standard-Fitnessfunktion als eine gewichtete Kombination von Metriken: mAP@0.5 trägt 10 % zum Gewicht bei und mAP@0.5:0.95 trägt die restlichen 90 % bei, wobei Präzision P und Recall R nicht vorhanden. Sie können diese nach Bedarf anpassen oder die Standard-Fitnessdefinition 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. Evolve

Die Evolution wird über ein Basisszenario durchgeführt, das wir verbessern wollen. Das Basisszenario in diesem Beispiel ist die Feinabstimmung von COCO128 für 10 Epochen unter Verwendung des vortrainierten YOLOv5s. Der Trainingsbefehl für das Basisszenario lautet:

python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache

Zur Entwicklung von Hyperparametern speziell für dieses Szenariobeginnend mit unseren in definierten Ausgangswerten Abschnitt 1., und Maximierung der in definierte Fitness Abschnitt 2., fügen Sie hinzu --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

Die Standard-Evolutionseinstellungen führen das Basisszenario 300 Mal aus, d. h. für 300 Generationen. Sie können die Anzahl der Generationen über die --evolve Argument in ein beliebiges Format exportieren, z. B. python train.py --evolve 1000.

Die wichtigsten genetischen Operatoren sind Crossover und Mutation. In dieser Arbeit wird Mutation mit einer Wahrscheinlichkeit von 80 % und einer Varianz von 0,04 verwendet, um neue Nachkommen basierend auf einer Kombination der besten Eltern aus allen vorherigen Generationen zu erzeugen. Die Ergebnisse werden protokolliert in runs/evolve/exp/evolve.csv, und der Nachkomme mit der höchsten Fitness wird jede Generation als gespeichert 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 ein Minimum von 300 Generationen der Evolution für beste Ergebnisse. Beachten Sie, dass Evolution im Allgemeinen teuer und zeitaufwendig ist, da das Basisszenario Hunderte Male trainiert wird, was möglicherweise Hunderte oder Tausende von GPU-Stunden erfordert.

4. Visualisieren

evolve.csv wird dargestellt als evolve.png durch utils.plots.plot_evolve() Nachdem die Evolution abgeschlossen ist, wird ein Subplot pro Hyperparameter angezeigt, der die Fitness (y-Achse) im Verhältnis zu den Hyperparameterwerten (x-Achse) zeigt. Gelb deutet auf höhere Konzentrationen hin. Vertikale Verteilungen zeigen an, dass ein Parameter deaktiviert wurde und nicht mutiert. Dies ist vom Benutzer wählbar in der meta Dictionary in train.py und ist nützlich, um Parameter zu fixieren und ihre Entwicklung zu verhindern.

evolve

Unterstützte Umgebungen

Ultralytics bietet eine Reihe von gebrauchsfertigen Umgebungen, die jeweils mit wichtigen Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch vorinstalliert sind, um Ihre Projekte zu starten.

Projektstatus

YOLOv5 CI

Dieses Badge zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI)-Tests erfolgreich bestanden wurden. Diese CI-Tests überprüfen rigoros 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 jedem neuen Commit durchgeführt werden.



📅 Vor 1 Jahr erstellt ✏️ Vor 5 Monaten aktualisiert

Kommentare