Consigli per ottenere i migliori risultati nell'addestramento di YOLOv5#
📚 Questa guida spiega come ottenere i migliori risultati di mAP e di addestramento con YOLOv5 🚀.
Nella maggior parte dei casi si ottengono buoni risultati senza modificare i modelli o le impostazioni di addestramento, a patto che il dataset sia sufficientemente ampio e ben etichettato. Se inizialmente non ottieni buoni risultati, puoi provare alcuni accorgimenti per migliorarli, ma consigliamo sempre di addestrare prima con tutte le impostazioni predefinite e valutare eventuali modifiche solo in seguito. In questo modo stabilisci un riferimento delle prestazioni e individui gli aspetti da migliorare.
Se hai domande sui risultati dell'addestramento, ti consigliamo di fornire il maggior numero possibile di informazioni per ricevere una risposta utile, inclusi i grafici dei risultati (loss di train e val, P, R, mAP), la curva PR, la matrice di confusione, i mosaici di addestramento, i risultati dei test e le immagini con le statistiche del dataset, come labels.png. Tutti questi elementi si trovano nella directory project/name, in genere yolov5/runs/train/exp.
Di seguito abbiamo preparato una guida completa per aiutare gli utenti a ottenere i migliori risultati durante l'addestramento di YOLOv5.
Dataset#
- Immagini per classe. Si consigliano ≥ 1500 immagini per classe
- Istanze per classe. Si consigliano ≥ 10000 istanze (oggetti etichettati) per classe
- Varietà delle immagini. Le immagini devono essere rappresentative dell'ambiente di distribuzione. Per i casi d'uso reali consigliamo immagini scattate in diversi momenti della giornata, stagioni, condizioni meteorologiche e di illuminazione, da angolazioni e fonti diverse (raccolte online, acquisite localmente, con fotocamere diverse) e così via.
- Coerenza delle etichette. Tutte le istanze di tutte le classi in tutte le immagini devono essere etichettate. Un'etichettatura parziale non è sufficiente.
- Accuratezza delle etichette. Le etichette devono racchiudere da vicino ogni oggetto. Non deve esserci spazio tra un oggetto e il relativo riquadro delimitatore. Nessun oggetto deve essere privo di etichetta.
- Gestione della suddivisione train/val. Per evitare metriche eccessivamente ottimistiche, assicurati che le immagini di validazione e test non compaiano mai nel set di addestramento. Mantieni distribuzioni delle classi simili tra le suddivisioni.
- Verifica delle etichette. Visualizza
train_batch*.jpgall'avvio dell'addestramento per verificare che le etichette siano corrette, ad esempio controllando il mosaico di esempio. - Immagini di sfondo. Le immagini di sfondo non contengono oggetti e vengono aggiunte a un dataset per ridurre i falsi positivi (FP). Consigliamo che circa lo 0-10% del dataset sia composto da immagini di sfondo, così da contribuire a ridurre gli FP (COCO ne include 1000 come riferimento, pari all'1% del totale). Le immagini di sfondo non richiedono etichette.
Scelta del modello#
I modelli più grandi, come YOLOv5x e YOLOv5x6, offrono risultati migliori in quasi tutti i casi, ma hanno più parametri, richiedono più memoria CUDA per l'addestramento e sono più lenti in esecuzione. Per le distribuzioni su dispositivi mobili consigliamo YOLOv5s/m, mentre per quelle su cloud consigliamo YOLOv5l/x. Consulta la tabella del nostro README per un confronto completo di tutti i modelli.

-
Inizia dai pesi pretrained. È l'approccio consigliato per dataset di dimensioni piccole o medie (ad es. VOC, VisDrone, GlobalWheat). Passa il nome del modello all'argomento
--weights. I modelli vengono scaricati automaticamente dalla versione più recente di YOLOv5.python train.py --data custom.yaml --weights yolov5s.pt python train.py --data custom.yaml --weights yolov5m.pt python train.py --data custom.yaml --weights yolov5l.pt python train.py --data custom.yaml --weights yolov5x.pt python train.py --data custom.yaml --weights custom_pretrained.pt -
Inizia da zero. È l'approccio consigliato per dataset di grandi dimensioni (ad es. COCO, Objects365, OIv6). Passa l'architettura del modello YAML che ti interessa insieme a un argomento
--weights ''vuoto:python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml python train.py --data custom.yaml --weights '' --cfg yolov5m.yaml python train.py --data custom.yaml --weights '' --cfg yolov5l.yaml python train.py --data custom.yaml --weights '' --cfg yolov5x.yaml
Impostazioni di addestramento#
Prima di modificare qualsiasi cosa, addestra prima con le impostazioni predefinite per stabilire un riferimento delle prestazioni. L'elenco completo delle impostazioni di train.py è disponibile nell'argparser di train.py.
- Epoche. Inizia con 300 epoche. Se si verifica overfitting precocemente, puoi ridurne il numero. Se l'overfitting non si verifica dopo 300 epoche, prolunga l'addestramento, ad esempio a 600, 1200 epoche e così via.
- Dimensione dell'immagine. COCO viene addestrato alla risoluzione nativa di
--img 640, ma, dato l'elevato numero di oggetti piccoli nel dataset, può essere utile addestrare a risoluzioni più alte, come--img 1280. Se contengono molti oggetti piccoli, i dataset personalizzati traggono vantaggio dall'addestramento alla risoluzione nativa o a una risoluzione superiore. I migliori risultati in inferenza si ottengono usando la stessa--imgdell'addestramento; ad esempio, se addestri a--img 1280, dovresti eseguire test e rilevamento anche a--img 1280. - Dimensione del batch. Usa la dimensione
--batch-sizepiù grande supportata dal tuo hardware. Batch di piccole dimensioni producono statistiche di batch normalization scadenti e sono da evitare. Puoi usare--batch-size -1per selezionare automaticamente la dimensione ottimale del batch per la tua GPU. - Tasso di apprendimento. La pianificazione predefinita del tasso di apprendimento funziona bene nella maggior parte dei casi. Per una convergenza più rapida, puoi provare il flag
--cos-lrper attivare una pianificazione coseno del tasso di apprendimento, che lo riduce gradualmente seguendo una curva coseno durante le epoche. - Aumento dei dati. YOLOv5 include diverse tecniche di aumento dei dati, come il mosaico, che combina più immagini di addestramento. Regola l'intensità dell'aumento tramite l'iperparametro
mosaicnel file--hypper contribuire a stabilizzare l'addestramento. - Iperparametri. Gli iperparametri predefiniti si trovano in hyp.scratch-low.yaml. Ti consigliamo di addestrare prima con gli iperparametri predefiniti, prima di valutare eventuali modifiche. In generale, aumentare gli iperparametri di data augmentation riduce e ritarda l'overfitting, consentendo addestramenti più lunghi e un mAP finale più alto. Ridurre gli iperparametri di guadagno delle componenti della loss, come
hyp['obj'], aiuta a ridurre l'overfitting in quelle specifiche componenti della loss. Per un metodo automatizzato di ottimizzazione di questi iperparametri, consulta il nostro tutorial sull'evoluzione degli iperparametri. - Addestramento a precisione mista. YOLOv5 attiva automaticamente la precisione mista automatica (AMP) quando rileva una GPU supportata, velocizzando l'addestramento e riducendo l'uso di memoria senza sacrificare l'accuratezza del modello.
- Addestramento multi-GPU. Se disponi di più GPU, usa
--device 0,1,2,3per distribuire l'addestramento tra di esse e ridurne sensibilmente la durata. - Arresto anticipato. Usa
--patience 50per interrompere l'addestramento se le metriche di validazione non migliorano per 50 epoche, risparmiando tempo e prevenendo l'overfitting.
Tecniche di ottimizzazione avanzate#
- Transfer learning. Per dataset specializzati, inizia dai pesi pretrained e, facoltativamente, congela alcuni layer con
--freezeper adattare il modello al tuo compito specifico. - Potatura del modello. Dopo l'addestramento, valuta di potare il modello per rimuovere i pesi ridondanti e ridurne le dimensioni senza perdite significative di prestazioni.
- Ensemble di modelli. Per le applicazioni critiche, addestra più modelli con configurazioni diverse e combina le loro predizioni per migliorare l'accuratezza.
- Aumento in fase di test. Attiva TTA durante l'inferenza con
--augmentper migliorare l'accuratezza delle predizioni calcolando la media dei risultati ottenuti da versioni aumentate dell'immagine di input.
Approfondimenti#
Se vuoi approfondire, un buon punto di partenza è la «ricetta per l'addestramento delle reti neurali» di Karpathy, ricca di spunti applicabili in generale a tutti i domini ML: https://karpathy.github.io/2019/04/25/recipe/
Buona fortuna 🍀 e facci sapere se hai altre domande!
Domande frequenti#
Il tuo modello potrebbe essere in overfitting se la loss di addestramento continua a diminuire mentre la loss di validazione inizia ad aumentare. Monitora il mAP di validazione: se si stabilizza o diminuisce mentre la loss di addestramento continua a migliorare, è un segnale di overfitting. Tra le soluzioni ci sono aggiungere altri dati di addestramento, aumentare la data augmentation o applicare tecniche di regolarizzazione.
La dimensione ottimale del batch dipende dalla memoria della tua GPU. In generale, batch più grandi forniscono statistiche di batch normalization migliori e maggiore stabilità durante l'addestramento. Usa la dimensione del batch più grande che il tuo hardware può gestire senza esaurire la memoria. Puoi usare
--batch-size -1per determinare automaticamente la dimensione ottimale del batch per la tua configurazione.Per velocizzare l'addestramento, prova a usare più GPU con
--device 0,1,2,3, a memorizzare nella cache il dataset con--cachee a ottimizzare la dimensione del batch (la precisione mista viene attivata automaticamente sulle GPU supportate). Valuta anche l'uso di una variante più piccola, come YOLOv5s, se l'accuratezza assoluta non è fondamentale.
