Come ottimizzare YOLO un set di dati personalizzato
La messa a punto adatta un modello preaddestrato al riconoscimento di nuove classi partendo dai pesi appresi anziché da un'inizializzazione casuale. Anziché addestrare il modello da zero per centinaia di epoche, la messa a punto sfrutta modelli preaddestrati COCO e converge sui dati personalizzati in una frazione del tempo.
Questa guida illustra come ottimizzare YOLO26 su set di dati personalizzati, dall'utilizzo di base alle tecniche avanzate come il congelamento dei livelli e l'addestramento in due fasi.
Messa a punto vs. Addestramento da zero
Un modello preaddestrato ha già appreso caratteristiche visive generali – rilevamento dei contorni, riconoscimento delle texture, comprensione delle forme – da milioni di immagini. Il transfer learning tramite fine-tuning riutilizza tali conoscenze e si limita a insegnare al modello l'aspetto delle nuove classi; ecco perché converge più rapidamente e richiede meno dati. L'addestramento partendo da zero scarta tutto ciò e costringe il modello ad apprendere tutto, a partire dai modelli a livello di pixel, il che richiede risorse notevolmente maggiori.
| Fine-Tuning | Imparare da zero | |
|---|---|---|
| Pesi iniziali | Preaddestrato su COCO 80 classi) | Inizializzazione casuale |
| Comando | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Convergenza | Più veloce: la struttura di base è già pronta | Più lento: tutti i livelli partono da zero |
| Requisiti relativi ai dati | Livello inferiore: le caratteristiche preaddestrate compensano la minore quantità di dati | Livello superiore: il modello deve apprendere tutte le caratteristiche esclusivamente dal set di dati |
| Quando utilizzarlo | Classi personalizzate con immagini della natura | Settori sostanzialmente diversi da COCO medicina, satelliti, radar) |
La messa a punto non richiede codice aggiuntivo
Quando un .pt il file viene caricato con YOLO("yolo26n.pt"), i pesi preaddestrati vengono memorizzati nel modello. Richiamando .train(data="custom.yaml") Successivamente, il sistema trasferisce automaticamente tutti i pesi compatibili alla nuova architettura del modello, reinizializza gli strati che non corrispondono (come l'unità di rilevamento quando il numero di classi è diverso) e avvia l'addestramento. Non è necessario caricare manualmente i pesi, modificare gli strati o scrivere codice personalizzato per il transfer learning.
Come funziona il trasferimento dei pesi preaddestrati
Quando un modello preaddestrato viene ottimizzato su un set di dati con un numero diverso di classi (ad esempio, passando dalle 80 classi COCO a 5 classi personalizzate), Ultralytics un trasferimento dei pesi che tiene conto della forma:
- Trasferimento completo della colonna vertebrale e del collo: questi livelli estraggono le caratteristiche visive generali e le loro forme sono indipendenti dal numero di classi.
- La testa di rilevamento è stata parzialmente reinizializzata - i livelli di output della classificazione (
cv3,one2one_cv3) hanno forme legate al numero di classi (80 contro 5), quindi non possono essere trasferite e vengono inizializzate in modo casuale. Livelli di regressione a casella (cv2,one2one_cv2) nella testa hanno forme fisse indipendentemente dal numero di classi, quindi vengono trasferite normalmente. - La stragrande maggioranza dei pesi viene trasferita quando si modifica il numero di classi. Vengono reinizializzati solo i livelli specifici della classificazione nella testa di rilevamento, mentre i rami relativi alla struttura portante, al collo e alla regressione box rimangono invariati.
Per i set di dati con lo stesso numero di classi del modello preaddestrato (ad esempio, la messa a punto dei pesi COCO su un altro set di dati a 80 classi), il trasferimento dei pesi è del 100%, compreso il modulo di rilevamento.
Esempio di regolazione di base
Esempio
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)
yolo detect train model=yolo26n.pt data=path/to/data.yaml epochs=50 imgsz=640
Scegliere la taglia del modello
I modelli più grandi hanno una maggiore capacità, ma anche un numero maggiore di parametri da aggiornare, il che può aumentare il rischio di overfitting quando i dati di addestramento sono limitati. Un approccio pratico consiste nel partire da un modello più piccolo (YOLO26n o YOLO26s) e passare a modelli più grandi solo se le metriche di validazione raggiungono un plateau. La dimensione ottimale del modello dipende dalla complessità del compito, dal numero di classi, dalla diversità del set di dati e dall'hardware disponibile per l'implementazione. Consulta la pagina completa del modello YOLO26 per le dimensioni disponibili e i benchmark delle prestazioni.
Selezione dell'ottimizzatore e del tasso di apprendimento
L'impostazione predefinita optimizer=auto Questa impostazione seleziona l'ottimizzatore e il tasso di apprendimento in base al numero totale di iterazioni di addestramento:
- < 10,000 iterations (small datasets or few epochs): AdamW with a low, auto-calculated learning rate
- > 10.000 iterazioni (set di dati di grandi dimensioni): MuSGD (unSGD ibridoSGD ) con lr=0,01
Per la maggior parte delle operazioni di messa a punto, l'impostazione predefinita funziona bene senza necessità di regolazioni manuali. Si consiglia di impostare esplicitamente l'ottimizzatore nei seguenti casi:
- L'allenamento è instabile (i picchi di perdita o le divergenze): prova
optimizer=AdamW, lr0=0.001per una convergenza più stabile - Ottimizzazione di un modello di grandi dimensioni su un set di dati ridotto: un tasso di apprendimento più basso come
lr0=0.001aiuta a conservare le caratteristiche pre-addestrate
L'ottimizzatore automatico ha la precedenza sull'impostazione manuale lr0
Quando optimizer=auto, la funzione lr0 e momentum i valori vengono ignorati. Per controllare manualmente la velocità di apprendimento, impostare esplicitamente l'ottimizzatore: optimizer=SGD, lr0=0.005.
Livelli congelati
Il congelamento impedisce l'aggiornamento di determinati livelli durante l'addestramento. Ciò accelera l'addestramento e riduce il rischio di overfitting quando il set di dati è di dimensioni ridotte rispetto alla capacità del modello.
Il freeze Il parametro accetta sia un numero intero che una lista. Un numero intero freeze=10 blocca i primi 10 livelli (da 0 a 9, che corrispondono alla struttura portante in YOLO26). Un elenco può contenere indici di livello come freeze=[0, 3, 5] per il congelamento parziale della struttura portante, oppure stringhe di nomi di moduli come freeze=["23.cv2"] per un controllo dettagliato su rami specifici all'interno di un livello.
Esempio
model.train(data="custom.yaml", epochs=50, freeze=10)
model.train(data="custom.yaml", epochs=50, freeze=[0, 1, 2, 3, 4])
# Freeze the box regression branch of the detection head
model.train(data="custom.yaml", epochs=50, freeze=["23.cv2"])
La profondità di congelamento corretta dipende dal grado di somiglianza tra il dominio di destinazione e i dati preaddestrati, nonché dalla quantità di dati di addestramento disponibili:
| Scenario | Raccomandazione | Motivazione |
|---|---|---|
| Set di dati di grandi dimensioni, settore affine | freeze=None (impostazione predefinita) | Dati sufficienti per adattare tutti i livelli senza sovradattamento |
| Set di dati ridotto, ambito simile | freeze=10 | Mantiene le caratteristiche fondamentali, riduce i parametri addestrabili |
| Set di dati molto piccolo | freeze=23 | Viene addestrata solo la testa di rilevamento, riducendo al minimo il rischio di overfitting |
| Dominio lontano da COCO | freeze=None | Le competenze fondamentali potrebbero non essere facilmente trasferibili e richiedere un nuovo periodo di formazione |
Anche la profondità di congelamento può essere considerata un iperparametro: provare alcuni valori (0, 5, 10) e confrontare mAP di validazione mAP un modo pratico per individuare l'impostazione ottimale per un determinato set di dati.
Iperparametri chiave per la messa a punto
La messa a punto richiede in genere meno modifiche agli iperparametri rispetto all'addestramento da zero. I parametri più importanti sono:
epochs: La messa a punto converge più rapidamente rispetto all'addestramento partendo da zero. Inizia con un valore moderato e usapatienceinterrompere l'operazione non appena gli indicatori di validazione raggiungono un plateau.patience: Il valore predefinito di 100 è pensato per sessioni di addestramento di lunga durata. Riducendolo a 10-20 si evita di perdere tempo con sessioni che hanno già raggiunto la convergenza.warmup_epochs: Il riscaldamento predefinito (3 epoche) aumenta gradualmente il tasso di apprendimento partendo da zero, evitando così che aggiornamenti di gradiente troppo consistenti danneggino le caratteristiche preaddestrate nelle prime iterazioni. Si consiglia di mantenere l'impostazione predefinita anche per la messa a punto.
Per l'elenco completo dei parametri di addestramento, consultare la guida di riferimento alla configurazione dell'addestramento.
Ottimizzazione in due fasi
L'ottimizzazione in due fasi suddivide l'addestramento in due fasi. La prima fase blocca la struttura portante e addestra solo il collo e la testa, consentendo ai livelli di rilevamento di adattarsi alle nuove classi senza compromettere le caratteristiche pre-addestrate. La seconda fase sblocca tutti i livelli e addestra l'intero modello con un tasso di apprendimento più basso per perfezionare la struttura portante in vista del dominio di destinazione.
Questo approccio risulta particolarmente utile quando il dominio di destinazione differisce in modo significativo da COCO immagini mediche, immagini aeree, microscopia), dove la rete di base potrebbe richiedere un adattamento, ma l'addestramento simultaneo di tutti i componenti causa instabilità. Per lo sblocco automatico con un approccio basato su callback, consultare la sezione " Freezing and Unfreezing the Backbone".
Messa a punto in due fasi
from ultralytics import YOLO
# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)
# Stage 2: unfreeze all, fine-tune with lower lr
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, lr0=0.001, name="stage2", exist_ok=True)
Errori comuni
Il modello non genera previsioni
- Dati di addestramento insufficienti: l'addestramento con un numero molto limitato di campioni è la causa più comune: il modello non è in grado di apprendere o generalizzare sulla base di dati insufficienti. Assicurati di disporre di un numero sufficiente di esempi diversificati per ogni classe prima di indagare su altre cause.
- Verifica i percorsi dei set di dati: percorsi errati in
data.yamlgenera silenziosamente zero etichette. Eseguiyolo detect val model=yolo26n.pt data=your_data.yamlprima dell'addestramento, per verificare che le etichette vengano caricate correttamente. - Soglia di confidenza più bassa: se le previsioni esistono ma vengono filtrate, prova a
conf=0.1durante l'inferenza. - Verifica il numero di studenti: garantire
ncindata.yamlcorrisponde al numero effettivo di classi presenti nei file di etichette.
La validazione mAP presto mAP
- Aggiungere ulteriori dati: la messa a punto trae notevoli vantaggi dall'aggiunta di dati di addestramento, in particolare da esempi eterogenei con diverse angolazioni, condizioni di illuminazione e sfondi.
- Verifica il bilanciamento della classe: le classi sottorappresentate avranno AP basso. Utilizza
cls_pwper applicare la ponderazione inversa delle classi di frequenza (iniziare concls_pw=0.25in caso di squilibrio moderato, aumentare a1.0(in caso di grave squilibrio). - Ridurre l'aumento: per insiemi di dati molto piccoli, un aumento eccessivo dei dati può essere più dannoso che utile. Prova
mosaic=0.5oppuremosaic=0.0. - Aumenta la risoluzione: per i set di dati contenenti oggetti di piccole dimensioni, prova
imgsz=1280per preservare i dettagli.
Dopo la messa a punto, le prestazioni delle classi originali subiscono un calo
Questo fenomeno è noto come "dimenticanza catastrofica": il modello perde le conoscenze acquisite in precedenza quando viene ottimizzato esclusivamente sui nuovi dati. La dimenticanza è per lo più inevitabile se non si includono le immagini del set di dati originale insieme ai nuovi dati. Per mitigare questo fenomeno:
- Unire i set di dati: includere esempi delle classi originali insieme a quelli delle nuove classi durante la messa a punto. Questo è l'unico modo affidabile per evitare che il modello dimentichi le informazioni.
- Bloccare la colonna vertebrale e il collo: bloccando sia la colonna vertebrale che il collo in modo che si muovano solo le articolazioni della testa di rilevamento, si facilitano brevi sessioni di messa a punto con un tasso di apprendimento molto basso.
- Allenare il modello per un numero minore di epoche: più a lungo il modello viene addestrato esclusivamente su nuovi dati, maggiore è il fenomeno dell’oblio.
FAQ
Quante immagini servono per mettere a punto YOLO?
Non esiste un limite minimo prestabilito: i risultati dipendono dalla complessità del compito, dal numero di classi e dal grado di somiglianza del dominio con COCO. Immagini più diversificate (con illuminazione, angolazioni e sfondi vari) sono più importanti della semplice quantità. Inizia con ciò che hai a disposizione e aumenta il volume se i parametri di validazione risultano insufficienti.
Come posso ottimizzare YOLO26 su un set di dati personalizzato?
Carica un modello preaddestrato .pt salvare e chiamare .train() con il percorso di un file personalizzato data.yaml. Ultralytics gestisce Ultralytics trasferimento del peso, la reinizializzazione della testa di rilevamento e la selezione dell'ottimizzatore. Vedere il Réglage di base Sezione dedicata all'esempio di codice completo.
Perché YOLO mio YOLO ottimizzato non rileva nulla?
Le cause più comuni sono percorsi errati in data.yaml (che produce silenziosamente zero etichette), una discrepanza tra nc nel file YAML e nei file delle etichette effettivi, oppure una soglia di affidabilità troppo elevata. Vedi Errori comuni per una lista di controllo completa per la risoluzione dei problemi.
Quali YOLO dovrei congelare per la messa a punto?
Dipende dalle dimensioni del set di dati e dalla somiglianza del dominio. Per i set di dati di piccole dimensioni con un dominio simile a COCO, il congelamento della struttura portante (freeze=10) impedisce il sovradattamento. Per domini molto diversi da COCO, lasciando tutti i livelli non congelati (freeze=None) permette alla dorsale di adattarsi. Vedi Livelli congelati per consigli dettagliati.
Come posso evitare l'oblio catastrofico durante la messa a punto YOLO nuove classi?
Includere esempi delle classi originali nei dati di addestramento insieme alle nuove classi. Se ciò non fosse possibile, bloccare più livelli (freeze=10 (o superiore) e l'utilizzo di un tasso di apprendimento più basso aiuta a preservare le conoscenze acquisite durante il pre-addestramento. Vedi Le prestazioni delle classi originali risultano compromesse per maggiori dettagli.