Meet YOLO26: next-gen vision AI.

Link to this sectionHyperparameter-Evolution für YOLOv5#

📚 Dieser Leitfaden erklärt die Hyperparameter-Evolution für YOLOv5 🚀. Die Hyperparameter-Evolution ist eine Methode der Hyperparameter-Optimierung, bei der ein genetischer Algorithmus (GA) zur Optimierung eingesetzt wird.

Hyperparameter im maschinellen Lernen steuern verschiedene Aspekte des Trainings, und das Finden optimaler Werte für diese kann eine Herausforderung sein. Traditionelle Methoden wie Rastersuchen können aufgrund der folgenden Punkte schnell unhandlich werden:

  1. Der hochdimensionale Suchraum
  2. Unbekannte Korrelationen zwischen den Dimensionen
  3. Die kostspielige Bewertung der Fitness an jedem Punkt

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

Link to this sectionBevor du beginnst#

Klonen Sie das Repo und installieren Sie die requirements.txt in einer Python>=3.8.0 Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch vom neuesten YOLOv5-Release heruntergeladen.

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

Link to this section1. Hyperparameter initialisieren#

YOLOv5 hat etwa 30 Hyperparameter, die für verschiedene Trainingseinstellungen verwendet werden. Diese sind in *.yaml-Dateien im Verzeichnis /data/hyps definiert. Bessere anfängliche Schätzungen führen zu besseren Endergebnissen, daher ist es wichtig, diese Werte vor der Evolution ordnungsgemäß zu initialisieren. Verwende im Zweifelsfall einfach die Standardwerte, die für das YOLOv5-Training von Grund auf mit COCO 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)

Link to this section2. Fitness definieren#

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 trägt die restlichen 90 % bei, wobei Präzision (P) und Recall (R) nicht berücksichtigt werden. Du kannst diese nach Belieben 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)

Link to this section3. Evolutionsprozess#

Die Evolution wird basierend auf einem Szenario durchgeführt, das wir verbessern möchten. Das Basisszenario in diesem Beispiel ist das Fine-Tuning von COCO128 für 10 Epochen unter Verwendung von vortrainierten YOLOv5s. Der Befehl für das Training des Basisszenarios lautet:

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

Um die Hyperparameter speziell für dieses Szenario zu entwickeln, ausgehend von unseren in Abschnitt 1. definierten Anfangswerten und unter Maximierung der in Abschnitt 2. definierten Fitness, hänge --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
#   ) &
# done

Die Standard-Evolutionseinstellungen führen das Basisszenario 300 Mal aus, d. h. über 300 Generationen. Du kannst die Anzahl der Generationen über das Argument --evolve ändern, 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 erstellen. 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 mindestens 300 Generationen der Evolution für die besten Ergebnisse. Beachte, dass Evolution im Allgemeinen kostspielig und zeitaufwendig ist, da das Basisszenario hunderte Male trainiert wird, was möglicherweise hunderte oder tausende GPU-Stunden erfordert.

Wenn die Evolution abgeschlossen ist, verwende die entdeckten Einstellungen erneut, 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.

Link to this sectionVisualisieren#

evolve.csv is plotted as evolve.png by utils.plots.plot_evolve() after evolution finishes with one subplot per hyperparameter showing fitness (y-axis) vs hyperparameter values (x-axis). Yellow indicates higher concentrations. Vertical distributions indicate that a parameter has been disabled and does not mutate. This is user selectable in the meta dictionary in train.py, and is useful for fixing parameters and preventing them from evolving.

YOLOv5 Hyperparameter-Evolutions-Fitnessergebnisse

Link to this sectionUnterstützte Umgebungen#

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

Link to this sectionProjektstatus#

YOLOv5 CI

Dieses Abzeichen 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 auf macOS, Windows und Ubuntu, mit Tests, die alle 24 Stunden und bei jedem neuen Commit durchgeführt werden.

Kommentare