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()
passRegistrare 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#
| Callback | Descrizione |
|---|---|
on_pretrain_routine_start | Attivato all'inizio della procedura di pre-addestramento, prima del caricamento dei dati e della configurazione del modello. |
on_pretrain_routine_end | Attivato al termine della procedura di pre-addestramento, dopo aver completato il caricamento dei dati e la configurazione del modello. |
on_train_start | Attivato all'avvio dell'addestramento, prima dell'inizio della prima epoca. |
on_train_epoch_start | Attivato all'inizio di ogni epoca di addestramento, prima dell'avvio dell'iterazione sui batch. |
on_train_batch_start | Attivato all'inizio di ogni batch di addestramento, prima del passaggio in avanti. |
optimizer_step | Attivato durante il passaggio dell'ottimizzatore. Riservato alle integrazioni personalizzate; non viene chiamato dal ciclo di addestramento predefinito. |
on_before_zero_grad | Attivato prima dell'azzeramento dei gradienti. Riservato alle integrazioni personalizzate; non viene chiamato dal ciclo di addestramento predefinito. |
on_train_batch_end | Attivato 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_end | Attivato 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_save | Attivato quando viene salvato il checkpoint del modello, dopo la validazione. |
on_fit_epoch_end | Attivato 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_end | Attivato al termine del processo di addestramento, dopo la valutazione finale del modello migliore. |
on_params_update | Attivato quando vengono aggiornati i parametri del modello. Riservato alle integrazioni personalizzate; non viene chiamato dal ciclo di addestramento predefinito. |
teardown | Attivato durante la pulizia del processo di addestramento. |
Callback del validatore#
| Callback | Descrizione |
|---|---|
on_val_start | Attivato all'avvio della validazione. |
on_val_batch_start | Attivato all'inizio di ogni batch di validazione. |
on_val_batch_end | Attivato al termine di ogni batch di validazione. |
on_val_end | Attivato al termine della validazione. |
Callback del predittore#
| Callback | Descrizione |
|---|---|
on_predict_start | Attivato all'avvio del processo di predizione. |
on_predict_batch_start | Attivato all'inizio di ogni batch di predizione. |
on_predict_postprocess_end | Attivato al termine della post-elaborazione della predizione. |
on_predict_batch_end | Attivato al termine di ogni batch di predizione. |
on_predict_end | Attivato al termine del processo di predizione. |
Callback dell'esportatore#
| Callback | Descrizione |
|---|---|
on_export_start | Attivato all'avvio del processo di esportazione. |
on_export_end | Attivato 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,ValidatoroppurePredictor, a seconda del tipo di operazione. Per informazioni dettagliate sulle proprietà di questi oggetti, consulta le pagine di riferimentoBaseTrainer,BaseValidatoreBasePredictor.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(): passPersonalizza 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_endeon_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)SuggerimentoNon 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_endeon_val_endforniscono 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_endeon_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: passPer 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(): passEsplora il codice sorgente dei callback per altre opzioni ed esempi.