Обратные вызовы (Callbacks)#
Фреймворк Ultralytics поддерживает обратные вызовы, которые служат точками входа на стратегических этапах в режимах train, val, export и predict. Каждый обратный вызов принимает объект Trainer, Validator или Predictor в зависимости от типа операции. Все свойства этих объектов подробно описаны в разделе справки документации.
Watch: How to use Ultralytics Callbacks | Predict, Train, Validate and Export Callbacks | Ultralytics YOLO🚀
Примеры#
Возврат дополнительной информации при предсказании#
В этом примере мы показываем, как возвращать исходный кадр вместе с каждым объектом результата:
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()
passДоступ к метрикам модели с помощью обратного вызова on_model_save#
В этом примере показано, как получать данные обучения, такие как оценка best_fitness, total_loss и другие метрики, после сохранения контрольной точки с помощью обратного вызова 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)Все обратные вызовы#
Ниже приведены все поддерживаемые обратные вызовы. Подробнее см. в исходном коде обратных вызовов.
Обратные вызовы обучения (Trainer Callbacks)#
| Обратный вызов | Описание |
|---|---|
on_pretrain_routine_start | Запускается в начале процедуры предварительного обучения, до загрузки данных и настройки модели. |
on_pretrain_routine_end | Запускается в конце процедуры предварительного обучения, после завершения загрузки данных и настройки модели. |
on_train_start | Вызывается при запуске обучения, до начала первой эпохи. |
on_train_epoch_start | Вызывается в начале каждой эпохи обучения, до начала итерации батча. |
on_train_batch_start | Запускается в начале каждого батча обучения, перед прямым проходом. |
optimizer_step | Запускается во время шага оптимизатора. Зарезервировано для пользовательских интеграций; не вызывается стандартным циклом обучения. |
on_before_zero_grad | Запускается перед обнулением градиентов. Зарезервировано для пользовательских интеграций; не вызывается стандартным циклом обучения. |
on_train_batch_end | Запускается в конце каждого батча обучения, после обратного прохода. Шаг оптимизатора может быть отложен из-за накопления градиентов. |
on_train_epoch_end | Запускается в конце каждой эпохи обучения, после обработки всех батчей, но перед валидацией. Метрики валидации и показатель fitness могут быть еще недоступны. |
on_model_save | Запускается при сохранении контрольной точки модели, после валидации. |
on_fit_epoch_end | Запускается в конце каждой эпохи подгонки (обучение + валидация), после валидации и любого сохранения контрольной точки. Метрики валидации доступны, а показатель fitness доступен для вызова обучения за эпоху. Этот обратный вызов также вызывается во время финальной оценки лучшей модели, где сохранение контрольной точки не происходит и показатель fitness может отсутствовать. |
on_train_end | Запускается, когда процесс обучения завершается, после финальной оценки лучшей модели. |
on_params_update | Запускается при обновлении параметров модели. Зарезервировано для пользовательских интеграций; не вызывается стандартным циклом обучения. |
teardown | Запускается, когда процесс обучения завершается и происходит очистка ресурсов. |
Обратные вызовы валидации (Validator Callbacks)#
| Обратный вызов | Описание |
|---|---|
on_val_start | Запускается при начале валидации. |
on_val_batch_start | Запускается в начале каждого батча валидации. |
on_val_batch_end | Запускается в конце каждого батча валидации. |
on_val_end | Запускается, когда валидация завершается. |
Обратные вызовы предсказания (Predictor Callbacks)#
| Обратный вызов | Описание |
|---|---|
on_predict_start | Запускается при начале процесса предсказания. |
on_predict_batch_start | Запускается в начале каждого батча предсказания. |
on_predict_postprocess_end | Запускается в конце пост-обработки предсказания. |
on_predict_batch_end | Запускается в конце каждого батча предсказания. |
on_predict_end | Запускается, когда процесс предсказания завершается. |
Обратные вызовы экспорта (Exporter Callbacks)#
| Обратный вызов | Описание |
|---|---|
on_export_start | Запускается при начале процесса экспорта. |
on_export_end | Запускается, когда процесс экспорта завершается. |
FAQ#
Обратные вызовы Ultralytics — это специализированные точки входа, которые срабатывают на ключевых этапах операций с моделью, таких как обучение, валидация, экспорт и прогнозирование. Эти обратные вызовы обеспечивают реализацию пользовательской функциональности в определенных точках процесса, позволяя улучшать и модифицировать рабочий процесс. Каждый обратный вызов принимает объект
Trainer,ValidatorилиPredictorв зависимости от типа операции. Подробные сведения о свойствах этих объектов см. в разделе справки.Чтобы использовать обратный вызов, определи функцию и добавь ее в модель с помощью метода
model.add_callback(). Вот пример возврата дополнительной информации во время прогнозирования: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Настрой процесс обучения Ultralytics, внедрив логику на определенных этапах процесса обучения. Ultralytics YOLO предоставляет различные обратные вызовы обучения, такие как
on_train_start,on_train_endиon_train_batch_end, которые позволяют добавлять пользовательские метрики, обработку или логирование.Вот как заморозить статистику BatchNorm при заморозке слоев с помощью обратных вызовов:
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)Дополнительные сведения об эффективном использовании обратных вызовов обучения см. в Руководстве по обучению.
Использование обратных вызовов во время валидации в Ultralytics YOLO улучшает оценку модели, позволяя выполнять пользовательскую обработку, логирование или расчет метрик. Обратные вызовы, такие как
on_val_start,on_val_batch_endиon_val_end, предоставляют точки входа для внедрения пользовательской логики, обеспечивая детальные и комплексные процессы валидации.Например, чтобы построить графики для всех батчей валидации, а не только для первых трех:
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")Дополнительные сведения о внедрении обратных вызовов в процесс валидации см. в Руководстве по валидации.
Чтобы подключить пользовательский обратный вызов для режима прогнозирования в Ultralytics YOLO, определи функцию обратного вызова и зарегистрируй ее в процессе прогнозирования. К распространенным обратным вызовам прогнозирования относятся
on_predict_start,on_predict_batch_endиon_predict_end. Они позволяют изменять результаты прогнозирования и интегрировать дополнительные функциональные возможности, такие как логирование данных или преобразование результатов.Вот пример, где пользовательский обратный вызов сохраняет предсказания в зависимости от того, присутствует ли объект определенного класса:
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Для получения более подробных инструкций обратись к Руководству по прогнозированию, которое содержит подробные инструкции и дополнительные опции настройки.
Ultralytics YOLO поддерживает различные практические реализации обратных вызовов для улучшения и настройки разных фаз, таких как обучение, валидация и предсказание. Некоторые практические примеры включают:
- Логирование пользовательских метрик: логируй дополнительные метрики на разных этапах, например в конце эпох обучения или валидации.
- Аугментация данных: реализуй пользовательские преобразования или аугментации данных во время прогнозирования или в батчах обучения.
- Промежуточные результаты: Сохраняй промежуточные результаты, такие как предсказания или кадры, для дальнейшего анализа или визуализации.
Пример: объединение кадров с результатами прогнозирования во время прогнозирования с помощью
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(): passИзучи исходный код обратных вызовов, чтобы найти больше вариантов и примеров.