Evoluzione degli iperparametri per YOLOv5#
📚 Questa guida spiega l'evoluzione degli iperparametri per YOLOv5 🚀. L'evoluzione degli iperparametri è un metodo di Ottimizzazione degli iperparametri che utilizza un Algoritmo Genetico (GA) per l'ottimizzazione.
Gli iperparametri nel machine learning controllano vari aspetti dell'addestramento e trovare i loro valori ottimali può essere una sfida. I metodi tradizionali come la ricerca a griglia possono diventare rapidamente intrattabili a causa di:
- L'elevata dimensionalità dello spazio di ricerca
- Correlazioni sconosciute tra le dimensioni
- La natura costosa della valutazione del fitness in ogni punto
Questo rende gli algoritmi genetici un candidato adatto per la ricerca degli iperparametri.
Prima di iniziare#
Clona il repository e installa requirements.txt in un ambiente Python>=3.8.0, inclusi PyTorch>=1.8. I modelli e i dataset vengono scaricati automaticamente dall'ultima release di YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install1. Inizializza gli Iperparametri#
YOLOv5 ha circa 30 iperparametri utilizzati per varie impostazioni di addestramento. Questi sono definiti nei file *.yaml nella directory /data/hyps. Tentativi iniziali migliori produrranno risultati finali migliori, quindi è importante inizializzare correttamente questi valori prima dell'evoluzione. In caso di dubbio, usa semplicemente i valori predefiniti, ottimizzati per l'addestramento YOLOv5 su COCO da zero.
# 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. Definisci il Fitness#
Il fitness è il valore che cerchiamo di massimizzare. In YOLOv5 definiamo una funzione di fitness predefinita come combinazione ponderata di metriche: mAP@0.5 contribuisce per il 10% del peso e mAP@0.5:0.95 contribuisce per il restante 90%, con precisione (P) e richiamo (R) assenti. Puoi regolarli come ritieni opportuno o utilizzare la definizione di fitness predefinita in utils/metrics.py (consigliato).
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. Evolvi#
L'evoluzione viene eseguita su uno scenario di base che cerchiamo di migliorare. Lo scenario di base in questo esempio è il fine-tuning di COCO128 per 10 epoche utilizzando YOLOv5s preaddestrato. Il comando di addestramento dello scenario di base è:
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cachePer far evolvere gli iperparametri specifici per questo scenario, partendo dai nostri valori iniziali definiti nella Sezione 1. e massimizzando il fitness definito nella Sezione 2., aggiungi --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
# ) &
# doneLe impostazioni di evoluzione predefinite eseguiranno lo scenario di base 300 volte, ovvero per 300 generazioni. Puoi modificare le generazioni tramite l'argomento --evolve, ovvero python train.py --evolve 1000.
I principali operatori genetici sono crossover e mutazione. In questo lavoro viene utilizzata la mutazione, con una probabilità dell'80% e una varianza di 0,04 per creare nuovi figli basati su una combinazione dei migliori genitori di tutte le generazioni precedenti. I risultati vengono registrati su runs/evolve/exp/evolve.csv e il figlio con il fitness più alto viene salvato a ogni generazione come runs/evolve/exp/hyp_evolve.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)Consigliamo un minimo di 300 generazioni di evoluzione per ottenere i migliori risultati. Nota che l'evoluzione è generalmente costosa e richiede molto tempo, poiché lo scenario base viene addestrato centinaia di volte, richiedendo potenzialmente centinaia o migliaia di ore GPU.
Al termine dell'evoluzione, riutilizza le impostazioni scoperte puntando l'addestramento al file salvato, ad esempio python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.
Visualizza#
evolve.csv viene tracciato come evolve.png da utils.plots.plot_evolve() al termine dell'evoluzione con un sotto-grafico per ciascun iperparametro che mostra il fitness (asse y) rispetto ai valori degli iperparametri (asse x). Il giallo indica concentrazioni più elevate. Le distribuzioni verticali indicano che un parametro è stato disabilitato e non subisce mutazioni. Questo è selezionabile dall'utente nel dizionario meta in train.py ed è utile per bloccare i parametri e impedirne l'evoluzione.

Ambienti supportati#
Ultralytics offre una gamma di ambienti pronti all'uso, ciascuno preinstallato con dipendenze essenziali come CUDA, CUDNN, Python e PyTorch, per dare il via ai tuoi progetti.
- Notebook GPU Gratuiti:
- Google Cloud: Guida rapida a GCP
- Amazon: Guida rapida AWS
- Azure: Guida rapida AzureML
- Docker: Guida rapida a Docker
Stato del progetto#
Questo badge indica che tutti i test di Integrazione Continua (CI) di YOLOv5 GitHub Actions vengono superati con successo. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 su vari aspetti chiave: addestramento, validazione, inferenza, esportazione e benchmark. Garantiscono un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test condotti ogni 24 ore e a ogni nuovo commit.