Перейти к содержанию

Обратные вызовы (Callbacks)

Фреймворк Ultralytics поддерживает обратные вызовы, которые служат точками входа на стратегических этапах во время train, val, exportи predict режимы. Каждый обратный вызов принимает Trainer, Validator, или Predictor объект, в зависимости от типа операции. Все свойства этих объектов подробно описаны в Справочный раздел документации.



Смотреть: Как использовать обратные вызовы Ultralytics | Обратные вызовы Predict, Train, Validate и Export | 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("yolo11n.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 callback

В этом примере показано, как получить детали обучения, такие как лучший показатель best_fitness, total_loss и другие метрики после сохранения контрольной точки с помощью on_model_save callback.

from ultralytics import YOLO

# Load a YOLO model
model = YOLO("yolo11n.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)

Все обратные вызовы (Callbacks)

Ниже представлены все поддерживаемые обратные вызовы (callbacks). Для получения более подробной информации обратитесь к исходному коду обратных вызовов.

Обратные вызовы Trainer

Обратный вызов Описание
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 Запускается в конце каждой эпохи обучения.
on_fit_epoch_end Запускается в конце каждой эпохи обучения.
on_model_save Запускается при сохранении модели.
on_train_end Запускается при завершении процесса обучения.
on_params_update Запускается при обновлении параметров модели.
teardown Запускается при завершении процесса обучения.

Обратные вызовы Validator

Обратный вызов Описание
on_val_start Вызывается при начале валидации.
on_val_batch_start Запускается в начале каждого пакета валидации.
on_val_batch_end Запускается в конце каждого пакета валидации.
on_val_end Вызывается при завершении валидации.

Обратные вызовы Predictor

Обратный вызов Описание
on_predict_start Запускается при запуске процесса предсказания.
on_predict_batch_start Запускается в начале каждого пакета предсказаний.
on_predict_postprocess_end Запускается в конце постобработки предсказаний.
on_predict_batch_end Запускается в конце каждого пакета предсказаний.
on_predict_end Запускается при завершении процесса предсказания.

Обратные вызовы экспортера

Обратный вызов Описание
on_export_start Запускается при запуске процесса экспорта.
on_export_end Запускается при завершении процесса экспорта.

Часто задаваемые вопросы

Что такое обратные вызовы Ultralytics и как я могу их использовать?

Callback-функции Ultralytics - это специализированные точки входа, которые вызываются на ключевых этапах операций с моделью, таких как обучение, валидация, экспорт и прогнозирование. Эти callback-функции обеспечивают пользовательскую функциональность в определенных точках процесса, позволяя улучшать и модифицировать рабочий процесс. Каждая callback-функция принимает Trainer, Validator, или Predictor объект, в зависимости от типа операции. Подробные свойства этих объектов можно найти в разделе Справочный раздел.

Чтобы использовать обратный вызов, определите функцию и добавьте ее в модель, используя model.add_callback() method. Вот пример возврата дополнительной информации во время предсказания:

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("yolo11n.pt")
model.add_callback("on_predict_batch_end", on_predict_batch_end)
for result, frame in model.predict():
    pass

Как настроить процедуру обучения Ultralytics с помощью callbacks?

Настройте процедуру обучения 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("yolo11n.pt")
model.add_callback("on_train_epoch_start", put_in_eval_mode)
model.train(data="coco.yaml", epochs=10)

Для получения более подробной информации об эффективном использовании обратных вызовов при обучении см. Руководство по обучению.

Зачем использовать обратные вызовы во время проверки в Ultralytics YOLO?

Использование обратных вызовов (callbacks) во время валидации в 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("yolo11n.pt")
model.add_callback("on_val_batch_end", plot_samples)
model.val(data="coco.yaml")

Для получения дополнительной информации о включении обратных вызовов в процесс валидации см. Руководство по валидации.

Как подключить пользовательский обратный вызов для режима прогнозирования в Ultralytics YOLO?

Чтобы подключить пользовательскую функцию обратного вызова для режима предсказания в Ultralytics YOLO, определите функцию обратного вызова и зарегистрируйте ее в процессе предсказания. Общие обратные вызовы предсказания включают on_predict_start, on_predict_batch_endи on_predict_end. Они позволяют изменять выходные данные прогнозирования и интегрировать дополнительные функциональные возможности, такие как ведение журнала данных или преобразование результатов.

Вот пример, когда пользовательская функция обратного вызова сохраняет прогнозы в зависимости от того, присутствует ли объект определенного класса:

from ultralytics import YOLO

model = YOLO("yolo11n.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 = model("pedestrians.mp4", stream=True, save=True)

for results in results:
    pass

Для более полного использования обратитесь к Руководству по прогнозированию, которое содержит подробные инструкции и дополнительные параметры настройки.

Какие существуют практические примеры использования обратных вызовов в Ultralytics YOLO?

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("yolo11n.pt")
model.add_callback("on_predict_batch_end", on_predict_batch_end)
for result, frame in model.predict():
    pass

Ознакомьтесь с исходным кодом обратного вызова для получения дополнительных параметров и примеров.



📅 Создано 1 год назад ✏️ Обновлено 3 месяца назад

Комментарии