Meet YOLO26: next-gen vision AI.

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

Il fine-tuning adatta un modello preaddestrato a 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 caratteristiche preaddestrate COCO e converge sui dati personalizzati in una frazione del tempo.

Questa guida copre il fine-tuning di YOLO26 su dataset personalizzati, dall'uso di base a tecniche avanzate come il blocco dei livelli (layer freezing) e l'addestramento a due stadi (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ù velocemente e richiede meno dati. L'addestramento da zero scarta tutto questo e costringe il modello ad apprendere tutto 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ù rapida - il backbone è già addestratoPiù lenta - tutti i livelli apprendono da zero
Requisiti dei 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 vengono salvati nel modello. Chiamare .train(data="custom.yaml") dopo questa operazione trasferisce automaticamente tutti i pesi compatibili alla nuova architettura del modello, reinizializza i livelli che non corrispondono (come la detection head quando il numero di classi differisce) e avvia l'addestramento. Non è richiesto alcun caricamento manuale dei pesi, manipolazione dei livelli o codice personalizzato di transfer learning.

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, passando 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 livelli estraggono caratteristiche visive generali e le loro forme sono indipendenti dal numero di classi.
  2. La detection head viene parzialmente reinizializzata - i livelli 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 livelli di regressione dei box (cv2, one2one_cv2) nella head hanno forme fisse indipendentemente dal conteggio delle classi, quindi vengono trasferiti normalmente.
  3. La stragrande maggioranza dei pesi viene trasferita quando si cambia il numero di classi. Ad esempio, il fine-tuning di YOLO26n da COCO (80 classi) su un dataset a 5 classi trasferisce 606 tensori di pesi su 708: solo i livelli di classificazione dipendenti dal conteggio delle classi vengono reinizializzati, mentre il backbone, il neck e i rami di regressione dei box rimangono intatti.

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

Link to this sectionEsempio di base di fine-tuning#

Esempio
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load pretrained model
model.train(data="custom.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 completa per le dimensioni disponibili e i benchmark delle prestazioni.

Link to this sectionSelezione 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 (piccoli dataset o poche epoche): AdamW con un learning rate basso, calcolato automaticamente
  • > 10.000 iterazioni (dataset di grandi dimensioni): 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 (picchi di perdita o divergenza): prova optimizer=AdamW, lr0=0.001 per una convergenza più stabile
  • Effettui il fine-tuning di un modello grande su un dataset piccolo: un learning rate più basso come lr0=0.001 aiuta a preservare le caratteristiche preaddestrate
L'ottimizzatore automatico sovrascrive il parametro manuale lr0

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

Link to this sectionBlocco dei livelli (Freezing Layers)#

Il blocco impedisce ad alcuni livelli specifici 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 numero intero o una lista. Un numero intero freeze=10 blocca i primi 10 livelli (indici 0-9), che coprono la maggior parte del backbone di YOLO26. Il backbone si estende sui livelli 0-10, quindi freeze=10 lascia addestrabile l'ultimo blocco C2PSA (livello 10); usa freeze=11 per bloccare l'intero backbone. Una lista può contenere indici di livello come freeze=[0, 3, 5] per il blocco parziale del backbone, o stringhe con i nomi dei moduli come freeze=["23.cv2", "23.one2one_cv2"] per un controllo preciso su rami specifici all'interno di un livello (qui, entrambi i rami di regressione dei box della detection head).

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 di preaddestramento e da quanti dati di addestramento sono disponibili:

ScenarioRaccomandazioneLogica
Dataset grande, dominio similefreeze=None (predefinito)Dati sufficienti per adattare tutti i livelli senza overfitting
Dataset piccolo, dominio similefreeze=10Preserva le caratteristiche del backbone, riduce i parametri addestrabili
Dataset molto piccolofreeze=23Solo la detection head viene addestrata, riducendo al minimo il rischio di overfitting
Dominio lontano da COCOfreeze=NoneLe caratteristiche del backbone potrebbero non trasferirsi bene e necessitare di riaddestramento

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

Link to this sectionIperparametri 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 rispetto all'addestramento da zero. Inizia con un valore moderato e usa patience per terminare anticipatamente quando le metriche di validazione si stabilizzano.
  • patience: Il valore predefinito di 100 è pensato per sessioni di addestramento lunghe. Ridurlo a 10-20 evita di sprecare tempo su sessioni che hanno già raggiunto la convergenza.
  • warmup_epochs: Il warmup predefinito (3 epoche) aumenta gradualmente il learning rate da zero, il che previene che grandi aggiornamenti del gradiente danneggino le caratteristiche preaddestrate nelle iterazioni iniziali. Si consiglia di mantenere il valore predefinito anche per il fine-tuning.

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

Link to this sectionFine-Tuning a due stadi#

Il fine-tuning a due stadi suddivide l'addestramento in due fasi. Il primo stadio blocca il backbone e addestra solo il neck e la head, permettendo ai livelli di rilevamento di adattarsi alle nuove classi senza disturbare le caratteristiche preaddestrate. Il secondo stadio sblocca tutti i livelli e addestra l'intero modello con un learning rate più basso 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 necessitare di adattamento ma l'addestramento completo immediato causa instabilità. Per lo sblocco automatico con un approccio basato su callback, consulta Blocco e sblocco del backbone.

Fine-tuning a due stadi
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: addestrare con pochissimi campioni è la causa più comune - il modello non può apprendere o generalizzare da troppi 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 etichette. Esegui yolo detect val model=yolo26n.pt data=custom.yaml prima dell'addestramento per confermare che le etichette vengano caricate correttamente.
  • Abbassa la soglia di confidenza: se esistono previsioni 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 etichette.

Link to this sectionL'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 vari.
  • Controlla il bilanciamento delle classi: le classi sottorappresentate avranno un AP basso. Usa cls_pw per applicare la ponderazione delle classi per frequenza inversa (inizia con cls_pw=0.25 per uno squilibrio moderato, aumenta a 1.0 per uno squilibrio grave).
  • Riduci l'aumento dei dati (augmentation): per dataset molto piccoli, un'augmentation 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 sulle classi originali peggiorano dopo il fine-tuning#

Questo è noto come dimenticanza catastrofica: il modello perde la conoscenza precedentemente appresa quando viene sottoposto a fine-tuning esclusivamente su nuovi dati. La dimenticanza è quasi inevitabile senza includere immagini del dataset originale insieme ai nuovi dati. Per mitigare ciò:

  • 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 detection head aiuta nelle brevi sessioni di fine-tuning 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.

Link to this sectionFAQ#

Link to this sectionDi quante immagini ho bisogno per fare il fine-tuning di YOLO?#

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

Link to this sectionCome posso effettuare 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 detection head 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 etichette), una discrepanza tra nc nello YAML e i file delle etichette effettivi, o una soglia di confidenza troppo alta. Consulta le Insidie comuni per una lista di controllo completa per la risoluzione dei problemi.

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

Dipende dalla dimensione del dataset e dalla somiglianza 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 livelli sbloccati (freeze=None) permette al backbone di adattarsi. Consulta Blocco dei livelli per consigli dettagliati.

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 ciò non è possibile, bloccare più livelli (freeze=10 o superiore) e utilizzare un learning rate più basso aiuta a preservare la conoscenza preaddestrata. Consulta Le prestazioni sulle classi originali peggiorano per ulteriori dettagli.

Collaboratori

Commenti