Ultralytics YOLO27: Iscriviti alla lista d'attesa.
Get Started
Addestra il tuo primo modello YOLO·Addestramento·Lezione 8/10
Lezioneprincipiante

Riprendi e itera

Riprendi esattamente un'esecuzione interrotta, avvia una nuova iterazione da best.pt con un tasso di apprendimento effettivamente applicato e confronta le esecuzioni affiancate.

I progetti reali consistono in una serie di esecuzioni di training. Alcune si interrompono a metà — per un portatile chiuso, una sessione SSH persa o una GPU cloud riassegnata — e ricominciare da zero significa sprecare ore. Altre terminano e la iterazione successiva dovrebbe basarsi su di esse, invece di ripartire da COCO.

In questa lezione interromperai un'esecuzione e la riprenderai, avvierai la seconda iterazione da best.pt con un tasso di apprendimento effettivamente applicato e confronterai tutte le esecuzioni in un'unica tabella. Imparerai anche a riconoscere i due comportamenti di resume che fanno sprecare esecuzioni senza che te ne accorga.

Esito

Sai scegliere correttamente tra riprendere, avviare il training iniziale e ricominciare da zero, eseguire ciascuna opzione e confrontare le esecuzioni in una tabella.

Percorso rapido
Se sai già come muoverti, ecco la versione breve.
  1. Interruzione senza modifiche? yolo train resume=True model=.../weights/last.pt.

  2. Esecuzione terminata oppure dati o impostazioni da modificare? Avvia una nuova esecuzione da .../weights/best.pt.

  3. Per impostare lr0, imposta anche optimizer; con optimizer=auto, lr0 viene ignorato.

  4. Assegna alle esecuzioni un nome che descriva la modifica, poi confronta i relativi file results.csv.

Pratico

Scegli il tipo di esecuzione giusto#

Grafici di training della Ultralytics Platform che mostrano l'andamento delle curve di perdita e delle metriche nel corso delle epoche di un'esecuzione

SituazioneTipo di esecuzionePunto di partenza
Interruzione di corrente, disconnessione o esaurimento della memoria durante l'esecuzioneRipresalast.pt, con lo stato dell'ottimizzatore e la pianificazione originali
Esecuzione terminata; più dati, correzione delle annotazioni o training più lungoAvvio inizialebest.pt come modello preaddestrato
Classi aggiunte o rimosse, molte annotazioni modificate oppure imgsz cambiato in modo significativoDa zeroyolo26n.pt

Esempio pratico: riprendere un'esecuzione interrotta#

resume=True ripristina il modello, lo stato dell'ottimizzatore, la pianificazione del tasso di apprendimento e il contatore delle epoche da last.pt, poi prosegue seguendo il piano originale:

yolo train resume=True model=runs/detect/pills_resume/weights/last.pt

Output reale di un'esecuzione di 5 epoche interrotta dopo l'epoca 2:

Resuming training runs/detect/pills_resume/weights/last.pt from epoch 3 to 5 total epochs
        3/5         0G      1.232      2.393   0.005478        206        320: 100% 6/6 4.5s
        4/5         0G      1.345      1.859   0.005833        208        320: 100% 6/6 4.5s
        5/5         0G       1.31      1.625   0.005854        191        320: 100% 6/6 4.4s
3 epochs completed in 0.004 hours.
  • from epoch 3 to 5 total epochs: è ripartita esattamente dall'ultima epoca salvata, mantenendo il numero di epoche previsto in origine.
  • Non hai passato data né epochs: tutti gli argomenti provenivano dal checkpoint. Alcune impostazioni di esecuzione, come batch, device e workers, possono essere sovrascritte quando riprendi; tutte le altre vengono ignorate con un avviso Resume ignores ....

Esempio pratico: avvio iniziale della seconda iterazione#

La maggior parte degli esperimenti della «iterazione successiva» non consiste nel riprendere un'esecuzione: si tratta di nuove esecuzioni che partono dall'ultimo modello valido — semplice apprendimento per trasferimento all'interno del tuo progetto. Usa un tasso di apprendimento più basso, così il modello affina le proprie prestazioni invece di reimparare da zero:

from ultralytics import YOLO

model = YOLO("runs/detect/pills_v1/weights/best.pt")  # avvio iniziale dalla prima iterazione
model.train(
    data="my_dataset/data.yaml",
    epochs=5,
    imgsz=320,
    optimizer="AdamW",  # impostalo esplicitamente: optimizer="auto" ignora lr0
    lr0=0.0005,  # più moderato dello 0.002 selezionato automaticamente per la prima iterazione
    name="pills_v2_warm",
)

Il log conferma che l'impostazione è stata applicata: optimizer: AdamW(lr=0.0005, momentum=0.937). La guida al fine-tuning tratta il congelamento dei layer e il training in due fasi; la guida all'ottimizzazione degli iperparametri tratta le ricerche sistematiche.

Esempio pratico: confrontare le esecuzioni#

Assegna a ogni esecuzione un nome che descriva la modifica — pills_v2_warm, pills_v3_imgsz640, pills_v4_edge_frames — e non usare mai train2 o final. Ogni esecuzione genera un results.csv, quindi bastano poche righe per confrontarle:

from pathlib import Path

import pandas as pd

for csv in sorted(Path("runs/detect").glob("*/results.csv")):
    df = pd.read_csv(csv)
    best = df["metrics/mAP50-95(B)"].max()
    print(f"{csv.parent.name:<14} epochs={len(df):<3} best mAP50-95={best:.3f}")
pills_resume   epochs=5   best mAP50-95=0.579
pills_v1       epochs=10  best mAP50-95=0.659
pills_v2_warm  epochs=5   best mAP50-95=0.694

Cinque epoche con avvio iniziale hanno aumentato mAP50-95 da 0.659 a 0.694, mentre cinque epoche con i pesi COCO (pills_resume) hanno raggiunto solo 0.579. L'avvio iniziale permette di migliorare spendendo meno, purché classi e annotazioni non siano cambiate nel frattempo. Dopo alcune esecuzioni, uno strumento di monitoraggio si ripaga da sé: la Ultralytics Platform (consulta Confrontare le esecuzioni e scegliere la migliore) oppure le integrazioni Comet e Weights & Biases, che registrano automaticamente ogni esecuzione.

Riduci i costi di ogni iterazione#

La maggior parte delle iterazioni serve a rispondere a una domanda, ad esempio «i nuovi fotogrammi sono stati utili?». Mentre esplori, questi argomenti ti aiutano a ottenere risposte più rapidamente:

ArgomentoEsempioEffetto
fractionfraction=0.5Esegue il training sulla prima metà delle immagini di training, ordinate per nome del file
timetime=0.25Si arresta dopo 0.25 ore, sovrascrivendo epochs
patiencepatience=10Si arresta quando le prestazioni di validazione non migliorano per 10 epoche
imgszimgsz=320Usa un quarto dei pixel rispetto a 640; confronta le esecuzioni solo alla stessa dimensione
cachecache=TrueMantiene le immagini decodificate in RAM, così il caricamento è più rapido nelle epoche successive

Modifica una sola cosa per iterazione e conferma il risultato migliore con un'esecuzione alla dimensione completa prima di distribuirlo. Quando hai bisogno di ripartire da zero, usa lo stesso comando con i pesi preaddestrati:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # torna ai pesi preaddestrati su COCO
model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v3_relabeled")

Evita questi errori#

Riprendere un'esecuzione completata

Sintomo: WARNING ⚠️ model '.../last.pt' is not a resumable training checkpoint ... Starting new training instead, seguito da una nuova esecuzione — sul dataset predefinito coco8, a meno che tu non abbia passato data. Causa: resume=True riprende solo le esecuzioni interrotte in anticipo. Soluzione: interrompila e avvia intenzionalmente una nuova esecuzione da best.pt.

lr0 viene ignorato senza avviso

Sintomo: optimizer: 'optimizer=auto' found, ignoring 'lr0=0.0005' and determining best 'optimizer' and 'lr0' automatically... Causa: il valore predefinito optimizer=auto sceglie autonomamente il tasso di apprendimento. Soluzione: imposta esplicitamente optimizer (ad esempio "AdamW" o "SGD") ogni volta che imposti lr0 e controlla la riga di log optimizer:.

I nomi già usati non sovrascrivono i file

Se esegui una seconda volta l'addestramento con name="pills_v1", i risultati vengono scritti in pills_v1-2, cosa che può facilmente creare confusione in seguito. Usa un nome nuovo e descrittivo per ogni esecuzione.

Provalo

Esercitati con tutti e tre i tipi di esecuzione. Avvia un'esecuzione di 5 epoche chiamata pills_resume, interrompila dopo l'epoca 2 (con Ctrl+C o il callback della soluzione) e riprendila. Addestra pills_v2_warm a partire dai migliori pesi di pills_v1 usando optimizer="AdamW" e lr0=0.0005. Consegna la tabella compare_runs.py e una frase che spieghi da quale esecuzione continueresti e perché.

Criteri di completamento
La lezione è completata quando tutte le seguenti condizioni sono soddisfatte.
  • L'esecuzione ripresa ha stampato Resuming training ... from epoch 3 e ha completato tutte e 5 le epoche.

  • Il log di pills_v2_warm mostra AdamW(lr=0.0005, ...), non il messaggio relativo all'ottimizzatore automatico.

  • Hai una tabella comparativa stampata con tutte le esecuzioni e nomi descrittivi, oltre a una decisione espressa in una frase.

Mostra la soluzione

Se su una macchina veloce è difficile temporizzare Ctrl+C, un callback può interrompere l'esecuzione dopo l'epoca 2:

from ultralytics import YOLO

def power_cut(trainer):
    if trainer.epoch == 1:  # Indicizzato da 0: interrompi dopo aver salvato l'epoca 2
        raise KeyboardInterrupt

model = YOLO("yolo26n.pt")
model.add_callback("on_model_save", power_cut)
model.train(data="my_dataset/data.yaml", epochs=5, imgsz=320, name="pills_resume")
yolo train resume=True model=runs/detect/pills_resume/weights/last.pt
python round2.py
python compare_runs.py
pills_v2_warm has the best mAP50-95 (0.694 vs 0.659 for pills_v1), with the same
classes and labels, so round three warm-starts from pills_v2_warm/weights/best.pt.
Prossimi passi

Puoi addestrare, diagnosticare e iterare. Ora passa dalle immagini statiche ai video, l'ambito della maggior parte delle applicazioni reali.

Accedi per salvare i progressi