Callbacks#
Das Ultralytics-Framework unterstützt Callbacks, die während der Modi train, val, export und predict als Einstiegspunkte an strategischen Stellen dienen. Je nach Art des Vorgangs akzeptiert jeder Callback ein Objekt vom Typ Trainer, Validator oder Predictor. Alle Eigenschaften dieser Objekte werden auf den Referenzseiten BaseTrainer, BaseValidator und BasePredictor ausführlich beschrieben.
Ansehen: So verwendest du Ultralytics-Callbacks | Callbacks für Vorhersage, Training, Validierung und Export | Ultralytics YOLO26 🚀
Beispiele#
Zusätzliche Informationen bei der Vorhersage zurückgeben#
In diesem Beispiel zeigen wir, wie du zusammen mit jedem Ergebnisobjekt den ursprünglichen Frame zurückgeben kannst:
from ultralytics import YOLO
def on_predict_batch_end(predictor):
"""Combine prediction results with corresponding frames."""
_, image, _ = predictor.batch
# Sicherstellen, dass image eine Liste ist
image = image if isinstance(image, list) else [image]
# Vorhersageergebnisse mit den entsprechenden Frames kombinieren
predictor.results = zip(predictor.results, image)
# Eine YOLO-Modellinstanz erstellen
model = YOLO("yolo26n.pt")
# Den benutzerdefinierten Callback zum Modell hinzufügen
model.add_callback("on_predict_batch_end", on_predict_batch_end)
# Die Ergebnisse und Frames durchlaufen
for result, frame in model.predict(): # oder model.track()
passPyTorch-Forward-Hooks vor dem Training registrieren#
model.train() erstellt anhand der Modellkonfiguration ein Trainingsmodell und überträgt die geladenen Gewichte darauf. PyTorch-Hooks, die vor diesem Aufruf direkt auf model.model registriert werden, sind Laufzeitstatus. Das neu erstellte Trainingsmodell übernimmt sie daher nicht. Registriere Trainings-Hooks in on_pretrain_routine_end, nachdem die Modelleinstellungen abgeschlossen sind:
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() verarbeitet sowohl das Training auf einem einzelnen Gerät als auch das Training mit DistributedDataParallel. Hänge keinen lokal definierten Hook an trainer.ema.ema, da Trainings-Checkpoints das EMA-Modell serialisieren und ein anderer Prozess den Callback beim Laden des Checkpoints möglicherweise nicht importieren kann. Wenn dieselbe Vorverarbeitung während der Trainingsvalidierung ausgeführt werden muss, implementiere sie stattdessen als importierbare Modellkomponente und nicht als Laufzeit-Hook. Bei der Wiederherstellung nach NaN-Werten wird das EMA-Modell aus dem Trainingsmodell neu erstellt. Ein auf diese Weise registrierter Hook wird daher in das EMA-Modell und nach einer Wiederherstellung in gespeicherte Checkpoints kopiert. Definiere die Hook-Funktion in einem importierbaren Modul, wenn Checkpoints in einem anderen Prozess geladen werden müssen.
Ein eigenständiges model.val() kopiert das geladene Modell bei jedem Aufruf. Bei der Vorhersage wird beim ersten Aufruf eine Kopie erstellt und zwischengespeichert. Registriere Hooks daher auf model.model, bevor du model.predict() oder model.track() zum ersten Mal aufrufst. Später hinzugefügte Hooks werden nicht an den zwischengespeicherten Predictor weitergegeben. Registriere Laufzeit-Hooks erneut, nachdem du in einem neuen Prozess einen Checkpoint geladen hast.
Mit dem Callback on_model_save auf Modellmetriken zugreifen#
Dieses Beispiel zeigt, wie du nach dem Speichern eines Checkpoints mit dem Callback on_model_save Trainingsdetails wie den best_fitness-Wert, total_loss und weitere Metriken abrufen kannst.
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#
Im Folgenden findest du alle unterstützten Callbacks. Weitere Informationen findest du im Quellcode der Callbacks.
Trainer-Callbacks#
| Callback | Beschreibung |
|---|---|
on_pretrain_routine_start | Wird zu Beginn der Vortrainingsroutine ausgelöst, vor dem Laden der Daten und der Modelleinstellungen. |
on_pretrain_routine_end | Wird am Ende der Vortrainingsroutine ausgelöst, nachdem das Laden der Daten und die Modelleinstellungen abgeschlossen sind. |
on_train_start | Wird zu Beginn des Trainings ausgelöst, bevor die erste Epoche beginnt. |
on_train_epoch_start | Wird zu Beginn jeder Trainingsepoche ausgelöst, bevor die Batch-Verarbeitung beginnt. |
on_train_batch_start | Wird zu Beginn jedes Trainings-Batches ausgelöst, vor dem Forward-Pass. |
optimizer_step | Wird während des Optimizer-Schritts ausgelöst. Für benutzerdefinierte Integrationen vorgesehen; wird nicht von der standardmäßigen Trainingsschleife aufgerufen. |
on_before_zero_grad | Wird ausgelöst, bevor die Gradienten auf null gesetzt werden. Für benutzerdefinierte Integrationen vorgesehen; wird nicht von der standardmäßigen Trainingsschleife aufgerufen. |
on_train_batch_end | Wird am Ende jedes Trainings-Batches nach dem Backward-Pass ausgelöst. Aufgrund der Gradientenakkumulation kann der Optimizer-Schritt aufgeschoben werden. |
on_train_epoch_end | Wird am Ende jeder Trainingsepoche ausgelöst, nachdem alle Batches verarbeitet wurden, aber vor der Validierung. Validierungsmetriken und Fitness sind möglicherweise noch nicht verfügbar. |
on_model_save | Wird ausgelöst, wenn der Modell-Checkpoint nach der Validierung gespeichert wird. |
on_fit_epoch_end | Wird am Ende jeder Fit-Epoche (Training + Validierung) ausgelöst, nach der Validierung und dem Speichern eines Checkpoints, sofern dies erfolgt. Validierungsmetriken sind verfügbar, und der Fitnesswert steht beim Training pro Epoche zur Verfügung. Dieser Callback wird auch bei der abschließenden Auswertung des besten Modells aufgerufen. Dabei wird kein Checkpoint gespeichert und der Fitnesswert ist möglicherweise nicht vorhanden. |
on_train_end | Wird ausgelöst, wenn der Trainingsprozess nach der abschließenden Auswertung des besten Modells endet. |
on_params_update | Wird ausgelöst, wenn Modellparameter aktualisiert werden. Für benutzerdefinierte Integrationen vorgesehen; wird nicht von der standardmäßigen Trainingsschleife aufgerufen. |
teardown | Wird ausgelöst, wenn der Trainingsprozess bereinigt wird. |
Validator-Callbacks#
| Callback | Beschreibung |
|---|---|
on_val_start | Wird ausgelöst, wenn die Validierung beginnt. |
on_val_batch_start | Wird zu Beginn jedes Validierungs-Batches ausgelöst. |
on_val_batch_end | Wird am Ende jedes Validierungs-Batches ausgelöst. |
on_val_end | Wird ausgelöst, wenn die Validierung endet. |
Predictor-Callbacks#
| Callback | Beschreibung |
|---|---|
on_predict_start | Wird ausgelöst, wenn der Vorhersageprozess beginnt. |
on_predict_batch_start | Wird zu Beginn jedes Vorhersage-Batches ausgelöst. |
on_predict_postprocess_end | Wird am Ende der Nachverarbeitung der Vorhersage ausgelöst. |
on_predict_batch_end | Wird am Ende jedes Vorhersage-Batches ausgelöst. |
on_predict_end | Wird ausgelöst, wenn der Vorhersageprozess endet. |
Exporter-Callbacks#
| Callback | Beschreibung |
|---|---|
on_export_start | Wird ausgelöst, wenn der Export beginnt. |
on_export_end | Wird ausgelöst, wenn der Export endet. |
Häufig gestellte Fragen#
Ultralytics-Callbacks sind spezialisierte Einstiegspunkte, die während wichtiger Phasen von Modellvorgängen wie Training, Validierung, Export und Vorhersage ausgelöst werden. Mit diesen Callbacks kannst du an bestimmten Stellen des Prozesses benutzerdefinierte Funktionen einbinden und so den Arbeitsablauf erweitern und anpassen. Je nach Art des Vorgangs akzeptiert jeder Callback ein Objekt vom Typ
Trainer,ValidatoroderPredictor. Ausführliche Informationen zu den Eigenschaften dieser Objekte findest du auf den ReferenzseitenBaseTrainer,BaseValidatorundBasePredictor.Um einen Callback zu verwenden, definiere eine Funktion und füge sie dem Modell mit der Methode
model.add_callback()hinzu. Hier ein Beispiel, wie du bei der Vorhersage zusätzliche Informationen zurückgibst: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 an bestimmten Stellen des Trainingsprozesses eigene Logik einfügst. Ultralytics YOLO bietet verschiedene Trainings-Callbacks wie
on_train_start,on_train_endundon_train_batch_end, mit denen du benutzerdefinierte Metriken, Verarbeitungsschritte oder Protokollierung hinzufügen kannst.So protokollierst du die Lernrate jeder Parametergruppe des Optimizers am Ende jeder Trainingsepoche:
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)TippDu brauchst keinen Callback, um beim Verwenden von
freezedie Statistiken von BatchNorm einzufrieren: Der Trainer versetzt die BatchNorm-Schichten eingefrorener Layer zu Beginn jeder Epoche automatisch in den Evaluierungsmodus.Weitere Informationen zur effektiven Verwendung von Trainings-Callbacks findest du im Trainingsleitfaden.
Callbacks während der Validierung in Ultralytics YOLO verbessern die Modellauswertung, indem sie benutzerdefinierte Verarbeitung, Protokollierung oder Metrikberechnung ermöglichen. Callbacks wie
on_val_start,on_val_batch_endundon_val_endbieten Einstiegspunkte, an denen du eigene Logik einfügen kannst. So lassen sich detaillierte und umfassende Validierungsabläufe sicherstellen.So kannst du beispielsweise alle Validierungs-Batches statt nur der ersten drei darstellen:
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 Informationen zum Einbinden von Callbacks in deinen Validierungsprozess findest du im Validierungsleitfaden.
Um in Ultralytics YOLO einen benutzerdefinierten Callback für den Vorhersagemodus hinzuzufügen, definiere eine Callback-Funktion und registriere sie beim Vorhersageprozess. Zu den gängigen Vorhersage-Callbacks gehören
on_predict_start,on_predict_batch_endundon_predict_end. Damit kannst du Vorhersageausgaben ändern und zusätzliche Funktionen wie die Datenprotokollierung oder die Umwandlung von Ergebnissen integrieren.Hier ein Beispiel für einen benutzerdefinierten Callback, der Vorhersagen abhängig davon 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: passEine ausführlichere Anleitung mit detaillierten Anweisungen und weiteren Anpassungsmöglichkeiten findest du im Vorhersageleitfaden.
Ultralytics YOLO unterstützt verschiedene praktische Callback-Implementierungen, mit denen du unterschiedliche Phasen wie Training, Validierung und Vorhersage erweitern und anpassen kannst. Beispiele aus der Praxis:
- Benutzerdefinierte Metriken protokollieren: Protokolliere zusätzliche Metriken in verschiedenen Phasen, etwa am Ende von Trainings- oder Validierungsepochen.
- Datenerweiterung: Führe während der Vorhersage oder der Trainings-Batches benutzerdefinierte Datentransformationen oder -erweiterungen durch.
- Zwischenergebnisse: Speichere Zwischenergebnisse wie Vorhersagen oder Frames zur weiteren Analyse oder Visualisierung.
Beispiel: Frames während der Vorhersage mit den Vorhersageergebnissen kombinieren, indem du
on_predict_batch_endverwendest: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(): passWeitere Möglichkeiten und Beispiele findest du im Quellcode der Callbacks.