Rappels#
Le framework Ultralytics prend en charge les callbacks, qui servent de points d’entrée à des étapes clés des modes train, val, export et predict. Chaque callback accepte un objet Trainer, Validator ou Predictor, selon le type d’opération. Toutes les propriétés de ces objets sont détaillées dans les pages de référence BaseTrainer, BaseValidator et BasePredictor.
Regarder : Comment utiliser les callbacks Ultralytics | Callbacks de prédiction, d’entraînement, de validation et d’exportation | Ultralytics YOLO26 🚀
Exemples#
Renvoyer des informations supplémentaires avec la prédiction#
Dans cet exemple, nous montrons comment renvoyer la frame d’origine avec chaque objet de résultat :
from ultralytics import YOLO
def on_predict_batch_end(predictor):
"""Combine prediction results with corresponding frames."""
_, image, _ = predictor.batch
# Vérifier que image est une liste
image = image if isinstance(image, list) else [image]
# Associer les résultats de prédiction aux frames correspondantes
predictor.results = zip(predictor.results, image)
# Créer une instance du modèle YOLO
model = YOLO("yolo26n.pt")
# Ajouter le callback personnalisé au modèle
model.add_callback("on_predict_batch_end", on_predict_batch_end)
# Parcourir les résultats et les frames
for result, frame in model.predict(): # ou model.track()
passEnregistrer des hooks forward PyTorch avant l’entraînement#
model.train() construit un modèle d’entraînement à partir de la configuration du modèle et y transfère les poids chargés. Les hooks PyTorch enregistrés directement sur model.model avant cet appel font partie de l’état d’exécution ; le modèle d’entraînement reconstruit ne les récupère donc pas. Enregistre les hooks d’entraînement dans on_pretrain_routine_end, une fois la configuration du modèle terminée :
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() gère l’entraînement sur un seul appareil et l’entraînement DistributedDataParallel. N’attache pas de hook défini localement à trainer.ema.ema, car les checkpoints d’entraînement sérialisent le modèle EMA et un autre processus risque de ne pas pouvoir importer le callback lors du chargement du checkpoint. Si le même prétraitement doit être exécuté pendant la validation de l’entraînement, implémente-le comme un composant de modèle importable plutôt que comme un hook d’exécution. La récupération après NaN reconstruit l’EMA à partir du modèle d’entraînement : un hook enregistré de cette manière est donc copié dans l’EMA et dans les checkpoints enregistrés après une récupération. Définis la fonction du hook dans un module importable si les checkpoints doivent être chargés dans un autre processus.
model.val() autonome copie le modèle chargé à chaque appel. La prédiction crée et met en cache une copie lors du premier appel ; enregistre donc les hooks sur model.model avant le premier appel à model.predict() ou model.track() : les hooks ajoutés ensuite ne sont pas transmis au prédicteur mis en cache. Enregistre de nouveau les hooks d’exécution après le chargement d’un checkpoint dans un nouveau processus.
Accéder aux métriques du modèle avec le callback on_model_save#
Cet exemple montre comment récupérer des détails sur l’entraînement, tels que le score best_fitness, la valeur total_loss et d’autres métriques, après l’enregistrement d’un checkpoint avec le 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)Tous les callbacks#
Voici tous les callbacks pris en charge. Pour en savoir plus, consulte le code source des callbacks.
Callbacks de l’entraîneur#
| Callback | Description |
|---|---|
on_pretrain_routine_start | Déclenché au début de la routine de pré-entraînement, avant le chargement des données et la configuration du modèle. |
on_pretrain_routine_end | Déclenché à la fin de la routine de pré-entraînement, une fois le chargement des données et la configuration du modèle terminés. |
on_train_start | Déclenché au démarrage de l’entraînement, avant le début de la première époque. |
on_train_epoch_start | Déclenché au début de chaque époque d’entraînement, avant le début du traitement des lots. |
on_train_batch_start | Déclenché au début de chaque lot d’entraînement, avant la passe avant. |
optimizer_step | Déclenché pendant l’étape de l’optimiseur. Réservé aux intégrations personnalisées ; non appelé par la boucle d’entraînement par défaut. |
on_before_zero_grad | Déclenché avant la remise à zéro des gradients. Réservé aux intégrations personnalisées ; non appelé par la boucle d’entraînement par défaut. |
on_train_batch_end | Déclenché à la fin de chaque lot d’entraînement, après la passe arrière. L’étape de l’optimiseur peut être reportée en raison de l’accumulation des gradients. |
on_train_epoch_end | Déclenché à la fin de chaque époque d’entraînement, une fois tous les lots traités, mais avant la validation. Les métriques de validation et le score de fitness peuvent ne pas être encore disponibles. |
on_model_save | Déclenché lors de l’enregistrement du checkpoint du modèle, après la validation. |
on_fit_epoch_end | Déclenché à la fin de chaque époque d’ajustement (entraînement + validation), après la validation et l’enregistrement éventuel d’un checkpoint. Les métriques de validation sont disponibles, ainsi que le score de fitness pour l’appel d’entraînement de l’époque. Ce callback est également appelé lors de l’évaluation finale du meilleur modèle, lorsqu’aucun checkpoint n’est enregistré et que le score de fitness peut être absent. |
on_train_end | Déclenché à la fin du processus d’entraînement, après l’évaluation finale du meilleur modèle. |
on_params_update | Déclenché lors de la mise à jour des paramètres du modèle. Réservé aux intégrations personnalisées ; non appelé par la boucle d’entraînement par défaut. |
teardown | Déclenché lors du nettoyage du processus d’entraînement. |
Callbacks du validateur#
| Callback | Description |
|---|---|
on_val_start | Déclenché au début de la validation. |
on_val_batch_start | Déclenché au début de chaque lot de validation. |
on_val_batch_end | Déclenché à la fin de chaque lot de validation. |
on_val_end | Déclenché à la fin de la validation. |
Callbacks du prédicteur#
| Callback | Description |
|---|---|
on_predict_start | Déclenché au démarrage du processus de prédiction. |
on_predict_batch_start | Déclenché au début de chaque lot de prédiction. |
on_predict_postprocess_end | Déclenché à la fin du post-traitement des prédictions. |
on_predict_batch_end | Déclenché à la fin de chaque lot de prédiction. |
on_predict_end | Déclenché à la fin du processus de prédiction. |
Callbacks de l’exportateur#
| Callback | Description |
|---|---|
on_export_start | Déclenché au démarrage du processus d’exportation. |
on_export_end | Déclenché à la fin du processus d’exportation. |
FAQ#
Les callbacks Ultralytics sont des points d’entrée spécialisés qui se déclenchent à des étapes clés des opérations sur les modèles, comme l’entraînement, la validation, l’exportation et la prédiction. Ils permettent d’ajouter des fonctionnalités personnalisées à des étapes précises du processus, afin d’améliorer et de modifier le flux de travail. Chaque callback accepte un objet
Trainer,ValidatorouPredictor, selon le type d’opération. Pour connaître en détail les propriétés de ces objets, consulte les pages de référenceBaseTrainer,BaseValidatoretBasePredictor.Pour utiliser un callback, définis une fonction et ajoute-la au modèle à l’aide de la méthode
model.add_callback(). Voici un exemple qui renvoie des informations supplémentaires pendant la prédiction :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(): passPersonnalise ta routine d’entraînement Ultralytics en injectant une logique à des étapes précises du processus d’entraînement. Ultralytics YOLO fournit différents callbacks d’entraînement, comme
on_train_start,on_train_endeton_train_batch_end, qui te permettent d’ajouter des métriques, du traitement ou de la journalisation personnalisés.Voici comment enregistrer le taux d’apprentissage de chaque groupe de paramètres de l’optimiseur à la fin de chaque époque d’entraînement :
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)ConseilTu n’as pas besoin d’un callback pour geler les statistiques de BatchNorm avec
freeze: l’entraîneur place automatiquement en mode eval les couches BatchNorm des couches gelées au début de chaque époque.Pour en savoir plus sur l’utilisation efficace des callbacks d’entraînement, consulte le Guide d’entraînement.
L’utilisation de callbacks pendant la validation avec Ultralytics YOLO améliore l’évaluation du modèle en permettant d’effectuer des traitements personnalisés, de la journalisation ou le calcul de métriques. Des callbacks comme
on_val_start,on_val_batch_endeton_val_endfournissent des points d’entrée où injecter une logique personnalisée, pour des processus de validation détaillés et complets.Par exemple, voici comment tracer tous les lots de validation au lieu des trois premiers uniquement :
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")Pour en savoir plus sur l’intégration de callbacks à ton processus de validation, consulte le Guide de validation.
Pour associer un callback personnalisé au mode prédiction d’Ultralytics YOLO, définis une fonction de callback et enregistre-la auprès du processus de prédiction. Parmi les callbacks de prédiction courants, on trouve
on_predict_start,on_predict_batch_endeton_predict_end. Ils permettent de modifier les sorties de prédiction et d’intégrer des fonctionnalités supplémentaires, comme la journalisation des données ou la transformation des résultats.Voici un exemple dans lequel un callback personnalisé enregistre les prédictions selon la présence ou non d’un objet d’une classe donnée :
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: passPour une présentation plus complète de l’utilisation, consulte le Guide de prédiction, qui comprend des instructions détaillées et d’autres options de personnalisation.
Ultralytics YOLO prend en charge différentes utilisations pratiques des callbacks pour améliorer et personnaliser plusieurs phases, comme l’entraînement, la validation et la prédiction. En voici quelques exemples :
- Journalisation de métriques personnalisées : enregistre des métriques supplémentaires à différentes étapes, par exemple à la fin des époques d’entraînement ou de validation.
- Augmentation des données : mets en œuvre des transformations ou des augmentations de données personnalisées pendant les lots de prédiction ou d’entraînement.
- Résultats intermédiaires : enregistre des résultats intermédiaires, comme des prédictions ou des frames, pour les analyser ou les visualiser ultérieurement.
Exemple : associer les frames aux résultats de prédiction pendant la prédiction avec
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(): passConsulte le code source des callbacks pour découvrir d’autres options et exemples.