Skip to main content

Come eseguire il fine-tuning di YOLO su un dataset personalizzato

Fine-tuning adatta un modello preaddestrato per riconoscere nuove classi partendo da pesi appresi anziché da un'inizializzazione casuale. Invece di addestrare da zero per centinaia di epoche, il fine-tuning sfrutta le funzionalità preaddestrate COCO e converge su dati personalizzati in una frazione del tempo.

Questa guida copre il fine-tuning di YOLO26 su dataset personalizzati, dall'utilizzo di base alle tecniche avanzate come il congelamento dei layer e addestramento a due fasi.

Fine-Tuning vs Addestramento da zero

Un modello preaddestrato ha già appreso funzionalità visive generali - rilevamento dei bordi, riconoscimento delle texture, comprensione delle forme - da milioni di immagini. Transfer learning tramite il fine-tuning riutilizza tale conoscenza e insegna al modello solo l'aspetto delle nuove classi; ecco perché converge più velocemente e richiede meno dati. L'addestramento da zero scarta tutto ciò e costringe il modello ad apprendere tutto partendo dai pattern a livello di pixel, il che richiede molte più risorse.

Fine-tuningAddestramento da zero
Pesi di partenzaPreaddestrato su COCO (80 classi)Inizializzazione casuale
ComandoYOLO("yolo26n.pt")YOLO("yolo26n.yaml")
ConvergenzaPiù veloce - il backbone è già addestratoPiù lenta - tutti i layer imparano da zero
Requisiti dei datiMinori - le funzionalità preaddestrate compensano la scarsità di datiMaggiori - il modello deve apprendere tutte le funzionalità solo dal dataset
Quando utilizzareClassi personalizzate con immagini naturaliDomini fondamentalmente diversi da COCO (medico, satellitare, radar)
Il fine-tuning non richiede codice extra

Quando un file .pt viene caricato con YOLO("yolo26n.pt"), i pesi preaddestrati vengono memorizzati nel modello. Chiamare .train(data="custom.yaml") dopo di ciò trasferisce automaticamente tutti i pesi compatibili alla nuova architettura del modello, reinizializza eventuali layer che non corrispondono (come la testa di rilevamento quando il numero di classi differisce) e avvia l'addestramento. Non è richiesto alcun caricamento manuale dei pesi, manipolazione dei layer o codice di transfer learning personalizzato.

Come funziona il trasferimento dei pesi preaddestrati

Quando un modello preaddestrato viene sottoposto a fine-tuning su un dataset con un numero diverso di classi (ad esempio, passando dalle 80 classi di COCO a 5 classi personalizzate), Ultralytics esegue il trasferimento dei pesi basato sulla forma:

  1. Il trasferimento di backbone e neck è completo - questi layer estraggono funzionalità visive generali e le loro forme sono indipendenti dal numero di classi.
  2. La testa di rilevamento viene parzialmente reinizializzata - i layer di output della classificazione (cv3, one2one_cv3) hanno forme legate al conteggio delle classi (80 vs 5), quindi non possono essere trasferiti e vengono inizializzati casualmente. I layer di regressione della BBox (cv2, one2one_cv2) nella testa hanno forme fisse indipendentemente dal conteggio delle classi, quindi vengono trasferiti normalmente.
  3. La stragrande maggioranza dei pesi viene trasferita quando si cambia il conteggio delle classi. Solo i layer specifici per la classificazione nella testa di rilevamento vengono reinizializzati - i rami di backbone, neck e regressione della BBox rimangono intatti.

Per i dataset con lo stesso numero di classi del modello preaddestrato (ad esempio, il fine-tuning dei pesi preaddestrati su COCO su un altro dataset a 80 classi), il 100% dei pesi viene trasferito, inclusa la testa di rilevamento.

Esempio di fine-tuning 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)

Scegliere la dimensione del modello

I modelli più grandi hanno una maggiore capacità ma anche più parametri da aggiornare, il che può aumentare il rischio di overfitting quando i dati di addestramento sono limitati. Iniziare con un modello più piccolo (YOLO26n o YOLO26s) e passare a dimensioni superiori solo se le metriche di validazione si stabilizzano è un approccio pratico. La dimensione ottimale del modello dipende dalla complessità del compito, dal numero di classi, dalla diversità del dataset e dall'hardware disponibile per il deployment. Consulta il pagina del modello YOLO26 completo per le dimensioni disponibili e i benchmark delle prestazioni.

Selezione dell'ottimizzatore e del learning rate

L'impostazione predefinita optimizer=auto seleziona l'ottimizzatore e il learning rate in base al numero totale di iterazioni di addestramento:

  • < 10.000 iterazioni (dataset piccoli o poche epoche): AdamW con un learning rate basso, calcolato automaticamente
  • > 10.000 iterazioni (dataset grandi): MuSGD (un ottimizzatore ibrido Muon+SGD) con lr=0.01

Per la maggior parte delle attività di fine-tuning, l'impostazione predefinita funziona bene senza alcuna regolazione manuale. Considera di impostare l'ottimizzatore esplicitamente quando:

  • L'addestramento è instabile (la loss ha picchi o diverge): prova optimizer=AdamW, lr0=0.001 per una convergenza più stabile
  • Fine-tuning di un modello grande su un dataset piccolo: un learning rate più basso come lr0=0.001 aiuta a preservare le funzionalità preaddestrate
L'ottimizzatore automatico sovrascrive i valori manuali di lr0

Quando optimizer=auto, la funzione lr0 e momentum i valori vengono ignorati. Per controllare il learning rate manualmente, imposta esplicitamente l'ottimizzatore: optimizer=SGD, lr0=0.005.

Congelamento dei layer

Il congelamento impedisce ad alcuni layer di aggiornarsi durante l'addestramento. Ciò accelera l'addestramento e riduce overfitting quando il dataset è piccolo rispetto alla capacità del modello.

Il metodo freeze Il parametro accetta sia un numero intero che una lista. Un numero intero freeze=10 congela i primi 10 layer (da 0 a 9, che corrisponde al backbone in YOLO26). Una lista può contenere indici di layer come freeze=[0, 3, 5] per il congelamento parziale del backbone, o stringhe di nomi di moduli come freeze=["23.cv2"] per un controllo granulare su rami specifici all'interno di un layer.

Esempio
model.train(data="custom.yaml", epochs=50, freeze=10)

La profondità di congelamento giusta dipende da quanto il dominio di destinazione è simile ai dati preaddestrati e da quanti dati di addestramento sono disponibili:

ScenarioConsiglioLogica
Dataset grande, dominio similefreeze=None (default)Dati sufficienti per adattare tutti i layer senza overfitting
Dataset piccolo, dominio similefreeze=10Preserva le funzionalità del backbone, riduce i parametri addestrabili
Dataset molto piccolofreeze=23Si addestra solo la testa di rilevamento, minimizzando il rischio di overfitting
Dominio lontano da COCOfreeze=NoneLe funzionalità del backbone potrebbero non trasferirsi bene e necessitano di riaddestramento

La profondità di congelamento può anche essere trattata come un iperparametro: provare alcuni valori (0, 5, 10) e confrontare il mAP di validazione è un modo pratico per trovare l'impostazione migliore per uno specifico dataset.

Iperparametri chiave per il fine-tuning

Il fine-tuning generalmente richiede meno regolazioni degli iperparametri rispetto all'addestramento da zero. I parametri più importanti sono:

  • epochs: Il fine-tuning converge più velocemente dell'addestramento da zero. Inizia con un valore moderato e usa patience per fermarti in anticipo quando le metriche di validazione si stabilizzano.
  • patience: Il valore predefinito di 100 è progettato per lunghe sessioni di addestramento. Ridurlo a 10-20 evita di sprecare tempo in esecuzioni già convergenti.
  • warmup_epochs: Il warmup predefinito (3 epoche) aumenta gradualmente il learning rate da zero, il che impedisce che grandi aggiornamenti del gradiente danneggino le funzionalità preaddestrate nelle iterazioni iniziali. Mantenere l'impostazione predefinita è consigliato anche per il fine-tuning.

Per l'elenco completo dei parametri di addestramento, consulta il riferimento alla configurazione di addestramento.

Fine-tuning a due fasi

Il fine-tuning a due fasi divide l'addestramento in due fasi. La prima fase congela il backbone e addestra solo il neck e la testa, consentendo ai layer di rilevamento di adattarsi alle nuove classi senza interrompere le funzionalità preaddestrate. La seconda fase scongela tutti i layer e addestra il modello completo con un learning rate più basso per affinare il backbone per il dominio di destinazione.

Questo approccio è particolarmente utile quando il dominio di destinazione differisce significativamente da COCO (immagini mediche, aeree, microscopia), dove il backbone potrebbe aver bisogno di adattamento ma l'addestramento completo immediato causa instabilità. Per lo scongelamento automatico con un approccio basato su callback, consulta Congelamento e scongelamento del backbone.

Fine-tuning a 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 produce previsioni

  • Dati di addestramento insufficienti: l'addestramento con pochissimi campioni è la causa più comune - il modello non può imparare o generalizzare da troppi pochi dati. Assicurati di avere esempi diversificati a sufficienza per classe prima di indagare su altre cause.
  • Controlla i percorsi del dataset: percorsi errati in data.yaml producono silenziosamente zero etichette. Esegui yolo detect val model=yolo26n.pt data=your_data.yaml prima dell'addestramento per confermare che le etichette vengano caricate correttamente.
  • Soglia di confidenza inferiore: se le previsioni esistono ma vengono filtrate, prova conf=0.1 durante l'inferenza.
  • Verifica il numero di classi: assicurati che nc in data.yaml corrisponda al numero effettivo di classi nei file delle etichette.

Il mAP di validazione si stabilizza prematuramente

  • Aggiungi più dati: il fine-tuning trae vantaggio in modo significativo da dati di addestramento aggiuntivi, specialmente esempi diversificati con angolazioni, illuminazione e sfondi vari.
  • Controlla il bilanciamento delle classi: le classi sottorappresentate avranno un AP basso. Usa cls_pw per applicare la ponderazione delle classi basata sulla frequenza inversa (inizia con cls_pw=0.25 per uno squilibrio moderato, aumenta a 1.0 per uno squilibrio grave).
  • Riduci l'augmentation: per set di dati molto piccoli, un'augmentation pesante può fare più male che bene. Prova mosaic=0.5 o mosaic=0.0.
  • Aumenta la risoluzione: per set di dati con oggetti piccoli, prova imgsz=1280 per preservare i dettagli.

Le prestazioni sulle classi originali peggiorano dopo il fine-tuning

Questo fenomeno è noto come dimenticanza catastrofica: il modello perde le conoscenze apprese in precedenza quando viene sottoposto a fine-tuning esclusivamente su nuovi dati. La dimenticanza è quasi inevitabile senza includere le immagini del set di dati originale insieme ai nuovi dati. Per mitigare questo problema:

  • Unisci i set di dati: includi esempi delle classi originali insieme alle nuove classi durante il fine-tuning. Questo è l'unico modo affidabile per prevenire la dimenticanza.
  • Congela il backbone e il neck: congelare sia il backbone che il neck in modo che venga addestrata solo la head di rilevamento aiuta per cicli di fine-tuning brevi con un learning rate molto basso.
  • Addestra per meno epoche: più a lungo il modello viene addestrato esclusivamente sui nuovi dati, più la dimenticanza aumenta.

FAQ

Quante immagini mi servono per eseguire il fine-tuning di YOLO?

Non esiste un minimo fisso: i risultati dipendono dalla complessità del compito, dal numero di classi e da quanto il dominio è simile a COCO. Immagini più diversificate (illuminazione, angolazioni e sfondi vari) contano più della quantità grezza. Inizia con ciò che hai e aumenta se le metriche di validazione non sono sufficienti.

Come posso eseguire il fine-tuning di YOLO26 su un set di dati personalizzato?

Carica un file .pt preaddestrato e chiama .train() con il percorso verso un data.yaml personalizzato. Ultralytics gestisce automaticamente il trasferimento dei pesi, la reinizializzazione della head di rilevamento e la selezione dell'ottimizzatore. Vedi la sezione Fine-Tuning di base per l'esempio di codice completo.

Perché il mio modello YOLO sottoposto a fine-tuning non rileva nulla?

Le cause più comuni sono percorsi errati nel data.yaml (che produce silenziosamente zero etichette), una discrepanza tra nc nello YAML e i file delle etichette effettivi, o una soglia di confidenza troppo alta. Vedi Errori comuni per una lista di controllo completa per la risoluzione dei problemi.

Quali layer di YOLO dovrei congelare per il fine-tuning?

Dipende dalle dimensioni del set di dati e dalla similarità del dominio. Per set di dati piccoli con un dominio simile a COCO, congelare il backbone (freeze=10) previene l'overfitting. Per domini molto diversi da COCO, lasciare tutti i layer non congelati (freeze=None) consente al backbone di adattarsi. Vedi Congelamento dei layer per raccomandazioni dettagliate.

Come posso prevenire la dimenticanza catastrofica durante il fine-tuning di YOLO su nuove classi?

Includi esempi delle classi originali nei dati di addestramento insieme alle nuove classi. Se ciò non è possibile, congelare più layer (freeze=10 o superiore) e utilizzare un learning rate più basso aiuta a preservare la conoscenza preaddestrata. Vedi Le prestazioni sulle classi originali peggiorano per ulteriori dettagli.

Commenti