Ultralytics YOLO27:
Get Started

Callback#

Il framework Ultralytics supporta i callback, che fungono da punti di ingresso nelle fasi strategiche durante le modalità train, val, export e predict. Ogni callback accetta un oggetto Trainer, Validator oppure Predictor, a seconda del tipo di operazione. Tutte le proprietà di questi oggetti sono descritte nelle pagine di riferimento BaseTrainer, BaseValidator e BasePredictor.



Guarda: Come usare le callback di Ultralytics | Callback per predict, train, validate ed export | Ultralytics YOLO26 🚀

Esempi#

Restituire informazioni aggiuntive con la predizione#

In questo esempio mostriamo come restituire il frame originale insieme a ogni oggetto risultato:

from ultralytics import YOLO

def on_predict_batch_end(predictor):
    """Combine prediction results with corresponding frames."""
    _, image, _ = predictor.batch

    # Assicurati che image sia una lista
    image = image if isinstance(image, list) else [image]

    # Combina i risultati della predizione con i frame corrispondenti
    predictor.results = zip(predictor.results, image)

# Crea un'istanza del modello YOLO
model = YOLO("yolo26n.pt")

# Aggiungi il callback personalizzato al modello
model.add_callback("on_predict_batch_end", on_predict_batch_end)

# Scorri i risultati e i frame
for result, frame in model.predict():  # oppure model.track()
    pass

Registrare gli hook forward di PyTorch prima dell'addestramento#

model.train() crea un modello di addestramento a partire dalla configurazione del modello e vi trasferisce i pesi caricati. Gli hook di PyTorch registrati direttamente su model.model prima di questa chiamata sono stato di runtime, quindi il modello di addestramento ricreato non li eredita. Registra gli hook di addestramento in on_pretrain_routine_end, dopo aver completato la configurazione del modello:

from ultralytics import YOLO
from ultralytics.utils.torch_utils import unwrap_model

def preprocess_input(module, inputs):
    """Center each input channel before the first model layer."""
    images = inputs[0]
    return (images - images.mean(dim=(-2, -1), keepdim=True),)

def register_forward_pre_hook(trainer):
    """Attach preprocessing to the active training model."""
    train_model = unwrap_model(trainer.model)
    train_model.model[0].register_forward_pre_hook(preprocess_input)

model = YOLO("yolo26n.pt")
model.add_callback("on_pretrain_routine_end", register_forward_pre_hook)
model.train(data="coco8.yaml", epochs=1)

unwrap_model() gestisce sia l'addestramento su un singolo dispositivo sia l'addestramento DistributedDataParallel. Non associare un hook definito localmente a trainer.ema.ema, perché i checkpoint di addestramento serializzano il modello EMA e un altro processo potrebbe non riuscire a importare il callback durante il caricamento del checkpoint. Se lo stesso pre-elaborazione deve essere eseguita durante la validazione dell'addestramento, implementala come componente del modello importabile anziché come hook di runtime. Il ripristino da NaN ricrea il modello EMA a partire dal modello di addestramento, quindi un hook registrato in questo modo viene copiato nel modello EMA e nei checkpoint salvati dopo un ripristino; definisci la funzione hook in un modulo importabile se i checkpoint devono essere caricati in un altro processo.

model.val() autonomo copia il modello caricato a ogni chiamata. La predizione crea e memorizza nella cache una copia alla prima chiamata, quindi registra gli hook su model.model prima della prima chiamata a model.predict() o model.track(); gli hook aggiunti in seguito non raggiungono il predittore memorizzato nella cache. Registra nuovamente gli hook di runtime dopo aver caricato un checkpoint in un nuovo processo.

Accedere alle metriche del modello usando il callback on_model_save#

Questo esempio mostra come recuperare i dettagli dell'addestramento, come il punteggio best_fitness, total_loss e altre metriche, dopo aver salvato un checkpoint usando il callback on_model_save.

from ultralytics import YOLO

# Load a YOLO model
model = YOLO("yolo26n.pt")

def print_checkpoint_metrics(trainer):
    """Print trainer metrics and loss details after each checkpoint is saved."""
    print(
        f"Model details\n"
        f"Best fitness: {trainer.best_fitness}, "
        f"Loss names: {trainer.loss_names}, "  # List of loss names
        f"Metrics: {trainer.metrics}, "
        f"Total loss: {trainer.tloss}"  # Total loss value
    )

if __name__ == "__main__":
    # Add on_model_save callback.
    model.add_callback("on_model_save", print_checkpoint_metrics)

    # Run model training on custom dataset.
    results = model.train(data="coco8.yaml", epochs=3)

Tutti i callback#

Di seguito sono riportati tutti i callback supportati. Per maggiori dettagli, consulta il codice sorgente dei callback.

Callback del trainer#

CallbackDescrizione
on_pretrain_routine_startAttivato all'inizio della procedura di pre-addestramento, prima del caricamento dei dati e della configurazione del modello.
on_pretrain_routine_endAttivato al termine della procedura di pre-addestramento, dopo aver completato il caricamento dei dati e la configurazione del modello.
on_train_startAttivato all'avvio dell'addestramento, prima dell'inizio della prima epoca.
on_train_epoch_startAttivato all'inizio di ogni epoca di addestramento, prima dell'avvio dell'iterazione sui batch.
on_train_batch_startAttivato all'inizio di ogni batch di addestramento, prima del passaggio in avanti.
optimizer_stepAttivato durante il passaggio dell'ottimizzatore. Riservato alle integrazioni personalizzate; non viene chiamato dal ciclo di addestramento predefinito.
on_before_zero_gradAttivato prima dell'azzeramento dei gradienti. Riservato alle integrazioni personalizzate; non viene chiamato dal ciclo di addestramento predefinito.
on_train_batch_endAttivato al termine di ogni batch di addestramento, dopo il passaggio all'indietro. Il passaggio dell'ottimizzatore può essere rinviato a causa dell'accumulo dei gradienti.
on_train_epoch_endAttivato al termine di ogni epoca di addestramento, dopo l'elaborazione di tutti i batch ma prima della validazione. Le metriche di validazione e il punteggio di fitness potrebbero non essere ancora disponibili.
on_model_saveAttivato quando viene salvato il checkpoint del modello, dopo la validazione.
on_fit_epoch_endAttivato al termine di ogni epoca di fit (train + val), dopo la validazione e l'eventuale salvataggio del checkpoint. Le metriche di validazione sono disponibili e il punteggio di fitness è disponibile per la chiamata di addestramento di ogni epoca. Questo callback viene chiamato anche durante la valutazione finale del modello migliore, quando non viene salvato alcun checkpoint e il punteggio di fitness potrebbe non essere presente.
on_train_endAttivato al termine del processo di addestramento, dopo la valutazione finale del modello migliore.
on_params_updateAttivato quando vengono aggiornati i parametri del modello. Riservato alle integrazioni personalizzate; non viene chiamato dal ciclo di addestramento predefinito.
teardownAttivato durante la pulizia del processo di addestramento.

Callback del validatore#

CallbackDescrizione
on_val_startAttivato all'avvio della validazione.
on_val_batch_startAttivato all'inizio di ogni batch di validazione.
on_val_batch_endAttivato al termine di ogni batch di validazione.
on_val_endAttivato al termine della validazione.

Callback del predittore#

CallbackDescrizione
on_predict_startAttivato all'avvio del processo di predizione.
on_predict_batch_startAttivato all'inizio di ogni batch di predizione.
on_predict_postprocess_endAttivato al termine della post-elaborazione della predizione.
on_predict_batch_endAttivato al termine di ogni batch di predizione.
on_predict_endAttivato al termine del processo di predizione.

Callback dell'esportatore#

CallbackDescrizione
on_export_startAttivato all'avvio del processo di esportazione.
on_export_endAttivato al termine del processo di esportazione.

Domande frequenti#

  • I callback di Ultralytics sono punti di ingresso specializzati che si attivano nelle fasi chiave delle operazioni sui modelli, come addestramento, validazione, esportazione e predizione. Questi callback consentono di implementare funzionalità personalizzate in punti specifici del processo, permettendo di migliorare e modificare il flusso di lavoro. Ogni callback accetta un oggetto Trainer, Validator oppure Predictor, a seconda del tipo di operazione. Per informazioni dettagliate sulle proprietà di questi oggetti, consulta le pagine di riferimento BaseTrainer, BaseValidator e BasePredictor.

    Per usare un callback, definisci una funzione e aggiungila al modello usando il metodo model.add_callback(). Ecco un esempio di come restituire informazioni aggiuntive durante la predizione:

    from ultralytics import YOLO
    
    def on_predict_batch_end(predictor):
        """Handle prediction batch end by combining results with corresponding frames; modifies predictor results."""
        _, image, _ = predictor.batch
        image = image if isinstance(image, list) else [image]
        predictor.results = zip(predictor.results, image)
    
    model = YOLO("yolo26n.pt")
    model.add_callback("on_predict_batch_end", on_predict_batch_end)
    for result, frame in model.predict():
        pass
  • Personalizza la procedura di addestramento di Ultralytics inserendo la tua logica in fasi specifiche del processo di addestramento. Ultralytics YOLO offre diversi callback di addestramento, come on_train_start, on_train_end e on_train_batch_end, che ti consentono di aggiungere metriche, elaborazioni o registrazioni personalizzate.

    Ecco come registrare il tasso di apprendimento di ogni gruppo di parametri dell'ottimizzatore al termine di ogni epoca di addestramento:

    from ultralytics import YOLO
    
    def log_learning_rates(trainer):
        """Print the current learning rates after each training epoch."""
        print(f"Epoch {trainer.epoch + 1}: {trainer.lr}")
    
    model = YOLO("yolo26n.pt")
    model.add_callback("on_train_epoch_end", log_learning_rates)
    model.train(data="coco8.yaml", epochs=3)
    Suggerimento

    Non ti serve un callback per congelare le statistiche di BatchNorm quando usi freeze: il trainer imposta automaticamente in modalità eval i livelli BatchNorm dei livelli congelati all'inizio di ogni epoca.

    Per maggiori dettagli su come usare efficacemente i callback di addestramento, consulta la Guida all'addestramento.

  • L'uso dei callback durante la validazione in Ultralytics YOLO migliora la valutazione del modello consentendo di eseguire elaborazioni personalizzate, registrazioni o calcoli delle metriche. Callback come on_val_start, on_val_batch_end e on_val_end forniscono punti di ingresso per inserire logica personalizzata, garantendo processi di validazione dettagliati e completi.

    Ad esempio, per tracciare tutti i batch di validazione anziché solo i primi tre:

    import inspect
    
    from ultralytics import YOLO
    
    def plot_samples(validator):
        frame = inspect.currentframe().f_back.f_back
        v = frame.f_locals
        validator.plot_val_samples(v["batch"], v["batch_i"])
        validator.plot_predictions(v["batch"], v["preds"], v["batch_i"])
    
    model = YOLO("yolo26n.pt")
    model.add_callback("on_val_batch_end", plot_samples)
    model.val(data="coco.yaml")

    Per ulteriori informazioni su come integrare i callback nel processo di validazione, consulta la Guida alla validazione.

  • Per associare un callback personalizzato alla modalità di predizione in Ultralytics YOLO, definisci una funzione callback e registrala nel processo di predizione. Tra i callback di predizione più comuni ci sono on_predict_start, on_predict_batch_end e on_predict_end. Questi consentono di modificare gli output della predizione e integrare funzionalità aggiuntive, come la registrazione dei dati o la trasformazione dei risultati.

    Ecco un esempio in cui un callback personalizzato salva le predizioni in base alla presenza di un oggetto appartenente a una determinata classe:

    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    
    class_id = 2
    
    def save_on_object(predictor):
        r = predictor.results[0]
        if class_id in r.boxes.cls:
            predictor.args.save = True
        else:
            predictor.args.save = False
    
    model.add_callback("on_predict_postprocess_end", save_on_object)
    results_stream = model("pedestrians.mp4", stream=True, save=True)
    
    for result in results_stream:
        pass

    Per un utilizzo più completo, consulta la Guida alla predizione, che include istruzioni dettagliate e ulteriori opzioni di personalizzazione.

  • Ultralytics YOLO supporta diverse applicazioni pratiche dei callback per migliorare e personalizzare fasi diverse, come l'addestramento, la validazione e la predizione. Ecco alcuni esempi pratici:

    • Registrazione di metriche personalizzate: registra metriche aggiuntive in diverse fasi, ad esempio al termine delle epoche di addestramento o validazione.
    • Aumento dei dati: implementa trasformazioni o aumenti dei dati personalizzati durante la predizione o i batch di addestramento.
    • Risultati intermedi: salva risultati intermedi, come predizioni o frame, per ulteriori analisi o visualizzazioni.

    Esempio: combinare i frame con i risultati della predizione durante la predizione usando on_predict_batch_end:

    from ultralytics import YOLO
    
    def on_predict_batch_end(predictor):
        """Combine prediction results with frames."""
        _, image, _ = predictor.batch
        image = image if isinstance(image, list) else [image]
        predictor.results = zip(predictor.results, image)
    
    model = YOLO("yolo26n.pt")
    model.add_callback("on_predict_batch_end", on_predict_batch_end)
    for result, frame in model.predict():
        pass

    Esplora il codice sorgente dei callback per altre opzioni ed esempi.

Commenti