Ultralytics YOLO27:
Get Started

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()
    pass

PyTorch-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#

CallbackBeschreibung
on_pretrain_routine_startWird zu Beginn der Vortrainingsroutine ausgelöst, vor dem Laden der Daten und der Modelleinstellungen.
on_pretrain_routine_endWird am Ende der Vortrainingsroutine ausgelöst, nachdem das Laden der Daten und die Modelleinstellungen abgeschlossen sind.
on_train_startWird zu Beginn des Trainings ausgelöst, bevor die erste Epoche beginnt.
on_train_epoch_startWird zu Beginn jeder Trainingsepoche ausgelöst, bevor die Batch-Verarbeitung beginnt.
on_train_batch_startWird zu Beginn jedes Trainings-Batches ausgelöst, vor dem Forward-Pass.
optimizer_stepWird während des Optimizer-Schritts ausgelöst. Für benutzerdefinierte Integrationen vorgesehen; wird nicht von der standardmäßigen Trainingsschleife aufgerufen.
on_before_zero_gradWird 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_endWird am Ende jedes Trainings-Batches nach dem Backward-Pass ausgelöst. Aufgrund der Gradientenakkumulation kann der Optimizer-Schritt aufgeschoben werden.
on_train_epoch_endWird 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_saveWird ausgelöst, wenn der Modell-Checkpoint nach der Validierung gespeichert wird.
on_fit_epoch_endWird 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_endWird ausgelöst, wenn der Trainingsprozess nach der abschließenden Auswertung des besten Modells endet.
on_params_updateWird ausgelöst, wenn Modellparameter aktualisiert werden. Für benutzerdefinierte Integrationen vorgesehen; wird nicht von der standardmäßigen Trainingsschleife aufgerufen.
teardownWird ausgelöst, wenn der Trainingsprozess bereinigt wird.

Validator-Callbacks#

CallbackBeschreibung
on_val_startWird ausgelöst, wenn die Validierung beginnt.
on_val_batch_startWird zu Beginn jedes Validierungs-Batches ausgelöst.
on_val_batch_endWird am Ende jedes Validierungs-Batches ausgelöst.
on_val_endWird ausgelöst, wenn die Validierung endet.

Predictor-Callbacks#

CallbackBeschreibung
on_predict_startWird ausgelöst, wenn der Vorhersageprozess beginnt.
on_predict_batch_startWird zu Beginn jedes Vorhersage-Batches ausgelöst.
on_predict_postprocess_endWird am Ende der Nachverarbeitung der Vorhersage ausgelöst.
on_predict_batch_endWird am Ende jedes Vorhersage-Batches ausgelöst.
on_predict_endWird ausgelöst, wenn der Vorhersageprozess endet.

Exporter-Callbacks#

CallbackBeschreibung
on_export_startWird ausgelöst, wenn der Export beginnt.
on_export_endWird 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, Validator oder Predictor. Ausführliche Informationen zu den Eigenschaften dieser Objekte findest du auf den Referenzseiten BaseTrainer, BaseValidator und BasePredictor.

    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():
        pass
  • Passe 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_end und on_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)
    Tipp

    Du brauchst keinen Callback, um beim Verwenden von freeze die 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_end und on_val_end bieten 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_end und on_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:
        pass

    Eine 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_end verwendest:

    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

    Weitere Möglichkeiten und Beispiele findest du im Quellcode der Callbacks.

Kommentare