Callbacks#
Das Ultralytics-Framework unterstützt Callbacks, die als Einstiegspunkte an strategischen Phasen während der Modi train, val, export und predict dienen. Jeder Callback akzeptiert je nach Operationstyp ein Trainer-, Validator- oder Predictor-Objekt. Alle Eigenschaften dieser Objekte sind auf den Referenzseiten BaseTrainer, BaseValidator und BasePredictor detailliert beschrieben.
Watch: How to use Ultralytics Callbacks | Predict, Train, Validate and Export Callbacks | Ultralytics YOLO🚀
Beispiele#
Zusätzliche Informationen bei der Vorhersage zurückgeben#
In diesem Beispiel zeigen wir, wie der Original-Frame zusammen mit jedem Ergebnisobjekt zurückgegeben wird:
from ultralytics import YOLO
def on_predict_batch_end(predictor):
"""Combine prediction results with corresponding frames."""
_, image, _ = predictor.batch
# Ensure that image is a list
image = image if isinstance(image, list) else [image]
# Combine the prediction results with the corresponding frames
predictor.results = zip(predictor.results, image)
# Create a YOLO model instance
model = YOLO("yolo26n.pt")
# Add the custom callback to the model
model.add_callback("on_predict_batch_end", on_predict_batch_end)
# Iterate through the results and frames
for result, frame in model.predict(): # or model.track()
passRegistrieren von PyTorch-Forward-Hooks vor dem Training#
model.train() erstellt ein Trainingsmodell aus der Modellkonfiguration und überträgt die geladenen Gewichte hinein. PyTorch-Hooks, die direkt vor diesem Aufruf an model.model registriert werden, stellen den Laufzeitzustand dar, sodass das neu erstellte Trainingsmodell diese nicht übernimmt. Registriere Trainings-Hooks in on_pretrain_routine_end, nachdem das Modell-Setup abgeschlossen ist:
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() unterstützt sowohl das Training auf einem einzelnen Gerät als auch DistributedDataParallel-Training. Hänge keinen lokal definierten Hook an trainer.ema.ema an, da Trainings-Checkpoints das EMA-Modell serialisieren und ein anderer Prozess beim Laden des Checkpoints den Callback möglicherweise nicht importieren kann. Wenn dieselbe Vorverarbeitung während der Trainingsvalidierung ausgeführt werden muss, implementiere sie als importierbare Modellkomponente anstelle eines Laufzeit-Hooks.
Eigenständige model.val() kopieren das geladene Modell für jeden Aufruf. Die Vorhersage erstellt und cacht eine Kopie beim ersten Aufruf. Registriere daher Hooks an model.model vor dem ersten model.predict()- oder model.track()-Aufruf; danach hinzugefügte Hooks erreichen den gecachten Prädiktor nicht. Registriere Laufzeit-Hooks nach dem Laden eines Checkpoints in einem neuen Prozess erneut.
Zugriff auf Modellmetriken über den Callback on_model_save#
Dieses Beispiel zeigt, wie Trainingsdetails wie der Score best_fitness, total_loss und andere Metriken abgerufen werden, nachdem ein Prüfpunkt mit dem Callback on_model_save gespeichert wurde.
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)Alle Callbacks#
Unten sind alle unterstützten Callbacks aufgeführt. Weitere Details findest du im Quellcode der Callbacks.
Trainer-Callbacks#
| Callback | Beschreibung |
|---|---|
on_pretrain_routine_start | Wird zu Beginn der Pre-Training-Routine vor dem Laden der Daten und der Modelleinrichtung ausgelöst. |
on_pretrain_routine_end | Wird am Ende der Pre-Training-Routine ausgelöst, nachdem das Laden der Daten und die Modelleinrichtung abgeschlossen sind. |
on_train_start | Wird beim Start des Trainings ausgelöst, bevor die erste Epoche beginnt. |
on_train_epoch_start | Wird zu Beginn jeder Trainingsepoche (Epoch) ausgelöst, bevor die Batch-Iteration beginnt. |
on_train_batch_start | Wird zu Beginn jedes Trainings-Batch vor dem Forward-Pass ausgelöst. |
optimizer_step | Wird während des Optimierungsschritts ausgelöst. Reserviert für benutzerdefinierte Integrationen; wird von der Standard-Trainingsschleife nicht aufgerufen. |
on_before_zero_grad | Wird ausgelöst, bevor die Gradienten auf Null gesetzt werden. Reserviert für benutzerdefinierte Integrationen; wird von der Standard-Trainingsschleife nicht aufgerufen. |
on_train_batch_end | Wird am Ende jedes Trainings-Batch nach dem Backward-Pass ausgelöst. Der Optimierungsschritt kann aufgrund der Gradientenakkumulation verzögert sein. |
on_train_epoch_end | Wird am Ende jeder Trainingsepoche nach der Verarbeitung aller Batches, aber vor der Validierung ausgelöst. Validierungsmetriken und Fitness sind möglicherweise noch nicht verfügbar. |
on_model_save | Wird beim Speichern des Modell-Checkpoints nach der Validierung ausgelöst. |
on_fit_epoch_end | Wird am Ende jeder Fit-Epoche (Train + Val) nach der Validierung und eventuellen Checkpoint-Speicherung ausgelöst. Validierungsmetriken sind verfügbar, und die Fitness ist für den Training Aufruf pro Epoche verfügbar. Dieser Callback wird auch während der finalen Evaluierung des besten Modells aufgerufen, bei der kein Checkpoint gespeichert wird und die Fitness möglicherweise nicht vorhanden ist. |
on_train_end | Wird beim Beenden des Trainingsprozesses nach der finalen Evaluierung des besten Modells ausgelöst. |
on_params_update | Wird ausgelöst, wenn Modellparameter aktualisiert werden. Reserviert für benutzerdefinierte Integrationen; wird von der Standard-Trainingsschleife nicht aufgerufen. |
teardown | Wird ausgelöst, wenn der Trainingsprozess bereinigt wird. |
Validator-Callbacks#
| Callback | Beschreibung |
|---|---|
on_val_start | Wird beim Start der Validierung ausgelöst. |
on_val_batch_start | Wird zu Beginn jedes Validierungs-Batch ausgelöst. |
on_val_batch_end | Wird am Ende jedes Validierungs-Batch ausgelöst. |
on_val_end | Wird beim Ende der Validierung ausgelöst. |
Predictor-Callbacks#
| Callback | Beschreibung |
|---|---|
on_predict_start | Wird beim Start des Vorhersageprozesses ausgelöst. |
on_predict_batch_start | Wird zu Beginn jedes Vorhersage-Batch ausgelöst. |
on_predict_postprocess_end | Wird am Ende der Vorhersage-Nachbearbeitung ausgelöst. |
on_predict_batch_end | Wird am Ende jedes Vorhersage-Batch ausgelöst. |
on_predict_end | Wird beim Ende des Vorhersageprozesses ausgelöst. |
Exporter-Callbacks#
| Callback | Beschreibung |
|---|---|
on_export_start | Wird beim Start des Exportprozesses ausgelöst. |
on_export_end | Wird beim Ende des Exportprozesses ausgelöst. |
FAQ#
Ultralytics-Callbacks sind spezialisierte Einstiegspunkte, die während wichtiger Phasen von Modelloperationen wie Training, Validierung, Export und Vorhersage ausgelöst werden. Diese Callbacks ermöglichen benutzerdefinierte Funktionen an bestimmten Punkten des Prozesses, wodurch Verbesserungen und Modifikationen des Workflows erlaubt werden. Jeder Callback akzeptiert je nach Operationstyp ein
Trainer-,Validator- oderPredictor-Objekt. Ausführliche Eigenschaften dieser Objekte findest du auf den ReferenzseitenBaseTrainer,BaseValidatorundBasePredictor.Um einen Callback zu verwenden, definiere eine Funktion und füge sie dem Modell über die Methode
model.add_callback()hinzu. Hier ist ein Beispiel für die Rückgabe zusätzlicher Informationen während der Vorhersage: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(): passPasse deine Ultralytics-Trainingsroutine an, indem du Logik in bestimmten Phasen des Trainingsprozesses injizierst. Ultralytics YOLO bietet eine Vielzahl von Trainings-Callbacks wie
on_train_start,on_train_endundon_train_batch_end, mit denen du benutzerdefinierte Metriken, Verarbeitungen oder Protokollierungen hinzufügen kannst.Hier erfährst du, wie du BatchNorm-Statistiken beim Einfrieren von Layern mit Callbacks einfrierst:
from ultralytics import YOLO # Add a callback to put the frozen layers in eval mode to prevent BN values from changing def put_in_eval_mode(trainer): n_layers = trainer.args.freeze if not isinstance(n_layers, int): return for i, (name, module) in enumerate(trainer.model.named_modules()): if name.endswith("bn") and int(name.split(".")[1]) < n_layers: module.eval() module.track_running_stats = False model = YOLO("yolo26n.pt") model.add_callback("on_train_epoch_start", put_in_eval_mode) model.train(data="coco.yaml", epochs=10)Weitere Details zur effektiven Verwendung von Trainings-Callbacks findest du im Trainingshandbuch.
Die Verwendung von Callbacks während der Validierung in Ultralytics YOLO verbessert die Modellevaluierung, indem sie benutzerdefinierte Verarbeitungen, Protokollierungen oder Metrikberechnungen ermöglicht. Callbacks wie
on_val_start,on_val_batch_endundon_val_endbieten Einstiegspunkte, um benutzerdefinierte Logik zu injizieren, was detaillierte und umfassende Validierungsprozesse gewährleistet.Um beispielsweise alle Validierungs-Batches anstelle nur der ersten drei zu plotten:
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")Weitere Einblicke zur Integration von Callbacks in deinen Validierungsprozess findest du im Validierungshandbuch.
Um einen benutzerdefinierten Callback für den Vorhersagemodus in Ultralytics YOLO anzuhängen, definiere eine Callback-Funktion und registriere sie beim Vorhersageprozess. Gängige Vorhersage-Callbacks sind
on_predict_start,on_predict_batch_endundon_predict_end. Diese ermöglichen die Modifikation von Vorhersageausgaben und die Integration zusätzlicher Funktionen wie Datenprotokollierung oder Ergebnistransformation.Hier ist ein Beispiel, bei dem ein benutzerdefinierter Callback Vorhersagen basierend darauf speichert, ob ein Objekt einer bestimmten Klasse vorhanden ist:
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: passFür eine umfassendere Nutzung schaue im Vorhersagehandbuch nach, das detaillierte Anweisungen und zusätzliche Anpassungsoptionen enthält.
Ultralytics YOLO unterstützt verschiedene praktische Implementierungen von Callbacks, um verschiedene Phasen wie Training, Validierung und Vorhersage zu verbessern und anzupassen. Einige praktische Beispiele umfassen:
- Protokollierung benutzerdefinierter Metriken: Protokolliere zusätzliche Metriken in verschiedenen Phasen, wie am Ende von Training- oder Validierungs-Epochen.
- Datenaugmentierung: Implementiere benutzerdefinierte Datentransformationen oder -augmentierungen während der Vorhersage- oder Trainings-Batches.
- Zwischenergebnisse: Speichere Zwischenergebnisse wie Vorhersagen oder Frames für weitere Analysen oder Visualisierungen.
Beispiel: Kombinieren von Frames mit Vorhersagenergebnissen während der Vorhersage unter Verwendung von
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(): passEntdecke den Callback-Quellcode für weitere Optionen und Beispiele.