Meet YOLO26: next-gen vision AI.

Link to this sectionCome eseguire il fine-tuning di YOLO su un dataset personalizzato#

Il fine-tuning adatta un modello preaddestrato a riconoscere nuove classi partendo da pesi appresi invece che da un'inizializzazione casuale. Invece di addestrare da zero per centinaia di epoche, il fine-tuning sfrutta le caratteristiche COCO preaddestrate 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 a tecniche avanzate come il blocco dei layer (layer freezing) e l'addestramento a due fasi (two-stage training).

Link to this sectionFine-Tuning vs Addestramento da zero#

Un modello preaddestrato ha già appreso caratteristiche visive generali - rilevamento dei bordi, riconoscimento delle texture, comprensione delle forme - da milioni di immagini. Il transfer learning tramite fine-tuning riutilizza tale conoscenza e insegna al modello solo l'aspetto delle nuove classi, motivo per cui converge più rapidamente e richiede meno dati. L'addestramento da zero scarta tutto ciò e costringe il modello a imparare 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 di datiMinori - le caratteristiche preaddestrate compensano la scarsità di datiMaggiori - il modello deve apprendere tutte le caratteristiche solo dal dataset
Quando utilizzareClassi personalizzate con immagini naturaliDomini fondamentalmente diversi da COCO (medico, satellitare, radar)
Il fine-tuning non richiede codice aggiuntivo

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

Link to this sectionCome 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, dalle 80 classi di COCO a 5 classi personalizzate), Ultralytics esegue un trasferimento dei pesi consapevole della forma (shape-aware):

  1. Il backbone e il neck vengono trasferiti completamente - questi layer estraggono caratteristiche visive generali e le loro forme sono indipendenti dal numero di classi.
  2. La head 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 delle bounding box (cv2, one2one_cv2) nella head hanno forme fisse indipendentemente dal numero di classi, quindi vengono trasferiti normalmente.
  3. La stragrande maggioranza dei pesi viene trasferita quando si modifica il numero di classi. Solo i layer specifici per la classificazione nella head di rilevamento vengono reinizializzati - il backbone, il neck e i rami di regressione delle box rimangono intatti.

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

Link to this sectionEsempio 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)

Link to this sectionScelta della dimensione del modello#

I modelli più grandi hanno 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) ed effettuare l'upscaling 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 la pagina del modello YOLO26 per le dimensioni disponibili e i benchmark delle prestazioni.

Link to this sectionScelta 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 dei compiti di fine-tuning, l'impostazione predefinita funziona bene senza alcuna regolazione manuale. Considera di impostare l'ottimizzatore esplicitamente quando:

  • L'addestramento è instabile (la perdita subisce picchi o diverge): prova optimizer=AdamW, lr0=0.001 per una convergenza più stabile
  • Esegui il fine-tuning di un modello grande su un dataset piccolo: un learning rate inferiore come lr0=0.001 aiuta a preservare le caratteristiche preaddestrate
L'ottimizzatore automatico sovrascrive il valore lr0 manuale

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

Link to this sectionBlocco dei layer (Freezing)#

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

Il parametro freeze accetta un intero o una lista. Un intero freeze=10 blocca i primi 10 layer (da 0 a 9, che corrispondono al backbone in YOLO26). Una lista può contenere indici di layer come freeze=[0, 3, 5] per il blocco 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 blocco corretta dipende da quanto il dominio di destinazione è simile ai dati preaddestrati e da quanti dati di addestramento sono disponibili:

ScenarioRaccomandazioneLogica
Dataset grande, dominio similefreeze=None (predefinito)Dati sufficienti per adattare tutti i layer senza overfitting
Dataset piccolo, dominio similefreeze=10Preserva le caratteristiche del backbone, riduce i parametri addestrabili
Dataset molto piccolofreeze=23Viene addestrata solo la head di rilevamento, minimizzando il rischio di overfitting
Dominio lontano da COCOfreeze=NoneLe caratteristiche del backbone potrebbero non trasferirsi bene e richiedere un riaddestramento

La profondità di blocco 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 un dataset specifico.

Link to this sectionIperparametri chiave per il fine-tuning#

Il fine-tuning richiede generalmente meno aggiustamenti degli iperparametri rispetto all'addestramento da zero. I parametri che contano di più 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 cicli di addestramento lunghi. Ridurlo a 10-20 evita di sprecare tempo su cicli che hanno già raggiunto la convergenza.
  • warmup_epochs: Il warmup predefinito (3 epoche) aumenta gradualmente il learning rate da zero, il che impedisce che grandi aggiornamenti del gradiente danneggino le caratteristiche preaddestrate nelle prime iterazioni. Mantenere il valore predefinito è consigliato anche per il fine-tuning.

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

Link to this sectionFine-tuning a due fasi (Two-Stage Fine-Tuning)#

Il fine-tuning a due fasi divide l'addestramento in due fasi. La prima fase blocca il backbone e addestra solo il neck e la head, consentendo ai layer di rilevamento di adattarsi alle nuove classi senza disturbare le caratteristiche preaddestrate. La seconda fase sblocca tutti i layer e addestra l'intero modello con un learning rate inferiore per rifinire il backbone per il dominio di destinazione.

Questo approccio è particolarmente utile quando il dominio di destinazione differisce significativamente da COCO (immagini mediche, immagini aeree, microscopia), dove il backbone potrebbe aver bisogno di adattamento ma l'addestramento simultaneo di tutto causa instabilità. Per lo sblocco automatico con un approccio basato su callback, consulta Blocco e sblocco 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)

Link to this sectionInsidie comuni#

Link to this sectionIl modello non produce previsioni#

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

Link to this sectionIl mAP di validazione si stabilizza precocemente#

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

Link to this sectionLe prestazioni degradano sulle classi originali dopo il fine-tuning#

Questo è noto come dimenticanza catastrofica (catastrophic forgetting) - il modello perde le conoscenze apprese in precedenza quando viene sottoposto a fine-tuning esclusivamente su nuovi dati. La dimenticanza è per lo più inevitabile senza includere immagini del dataset originale insieme ai nuovi dati. Per mitigare questo problema:

  • Unisci i dataset: includi esempi delle classi originali insieme alle nuove classi durante il fine-tuning. Questo è l'unico modo affidabile per prevenire la dimenticanza.
  • Blocca backbone e neck: bloccare 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, maggiore è l'aumento della dimenticanza.

Link to this sectionFAQ#

Link to this sectionQuante 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. Più immagini diverse (illuminazione, angolazioni, sfondi variati) contano più della quantità grezza. Inizia con ciò che hai ed effettua l'upscaling se le metriche di validazione non sono sufficienti.

Link to this sectionCome posso eseguire il fine-tuning di YOLO26 su un dataset personalizzato?#

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

Link to this sectionPerché il mio modello YOLO sottoposto a fine-tuning non rileva nulla?#

Le cause più comuni sono percorsi errati in data.yaml (che produce silenziosamente zero label), una discrepanza tra nc nello YAML e i file delle label effettivi, o una soglia di confidenza troppo alta. Consulta le Insidie comuni per una checklist completa di risoluzione dei problemi.

Link to this sectionQuali layer di YOLO dovrei bloccare per il fine-tuning?#

Dipende dalla dimensione del dataset e dalla similarità del dominio. Per dataset piccoli con un dominio simile a COCO, bloccare il backbone (freeze=10) previene l'overfitting. Per domini molto diversi da COCO, lasciare tutti i layer non bloccati (freeze=None) consente al backbone di adattarsi. Consulta Blocco dei layer per raccomandazioni dettagliate.

Link to this sectionCome 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 non è possibile, bloccare più layer (freeze=10 o superiore) e utilizzare un learning rate inferiore aiuta a preservare le conoscenze preaddestrate. Consulta Le prestazioni degradano sulle classi originali per maggiori dettagli.

Contributors

Commenti