Ultralytics YOLO27:
Get Started

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

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



Смотри: Как использовать колбэки Ultralytics | Колбэки для predict, train, validate и export | Ultralytics YOLO26 🚀

Примеры#

Возврат дополнительной информации при выполнении предсказаний#

В этом примере показано, как возвращать исходный кадр вместе с каждым объектом результата:

from ultralytics import YOLO

def on_predict_batch_end(predictor):
    """Combine prediction results with corresponding frames."""
    _, image, _ = predictor.batch

    # Убедись, что image — это список
    image = image if isinstance(image, list) else [image]

    # Объедини результаты предсказания с соответствующими кадрами
    predictor.results = zip(predictor.results, image)

# Создай экземпляр модели YOLO
model = YOLO("yolo26n.pt")

# Добавь пользовательский колбэк к модели
model.add_callback("on_predict_batch_end", on_predict_batch_end)

# Перебери результаты и кадры
for result, frame in model.predict():  # или model.track()
    pass

Регистрация PyTorch forward-хуков перед обучением#

model.train() создает модель для обучения на основе конфигурации модели и переносит в нее загруженные веса. Хуки PyTorch, зарегистрированные непосредственно на model.model до этого вызова, являются состоянием времени выполнения, поэтому заново созданная модель для обучения их не наследует. Регистрируй хуки для обучения в on_pretrain_routine_end после завершения настройки модели:

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() поддерживает обучение как на одном устройстве, так и с помощью DistributedDataParallel. Не добавляй хук, определенный локально, к trainer.ema.ema: контрольные точки обучения сериализуют модель EMA, и другой процесс может не иметь возможности импортировать колбэк при загрузке контрольной точки. Если одна и та же предобработка должна выполняться при валидации во время обучения, реализуй ее как импортируемый компонент модели, а не как хук времени выполнения. При восстановлении после NaN модель EMA создается заново из обучаемой модели, поэтому зарегистрированный таким способом хук копируется в EMA и сохраняемые контрольные точки после восстановления; если контрольные точки должны загружаться в другом процессе, определи функцию хука в импортируемом модуле.

Автономный model.val() копирует загруженную модель при каждом вызове. При первом вызове предсказания создается и кэшируется копия, поэтому регистрируй хуки на model.model до первого вызова model.predict() или model.track(); добавленные позже хуки не попадут в кэшированный предиктор. После загрузки контрольной точки в новом процессе зарегистрируй хуки времени выполнения повторно.

Доступ к метрикам модели с помощью колбэка 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)

Все колбэки#

Ниже перечислены все поддерживаемые колбэки. Подробнее см. в исходном коде колбэков.

Колбэки тренера#

КолбэкОписание
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Вызывается при очистке ресурсов после завершения процесса обучения.

Колбэки валидатора#

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

Колбэки предиктора#

КолбэкОписание
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 — это специализированные точки входа, которые вызываются на ключевых этапах работы с моделью, например при обучении, валидации, экспорте и предсказании. Они позволяют добавлять пользовательскую функциональность в определенных точках процесса, расширяя и изменяя рабочий процесс. Каждый колбэк принимает объект Trainer, Validator или Predictor в зависимости от типа операции. Подробные сведения о свойствах этих объектов см. на справочных страницах BaseTrainer, BaseValidator и BasePredictor.

    Чтобы использовать колбэк, определи функцию и добавь ее к модели с помощью метода 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, которые позволяют добавлять пользовательские метрики, обработку данных или журналирование.

    Вот как регистрировать скорость обучения для каждой группы параметров оптимизатора в конце каждой эпохи обучения:

    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)
    Совет

    При использовании freeze колбэк для заморозки статистики BatchNorm не нужен: в начале каждой эпохи тренер автоматически переводит слои BatchNorm замороженных слоев в режим eval.

    Подробнее об эффективном использовании колбэков обучения см. в руководстве по обучению.

  • Колбэки при валидации в 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

    Изучи исходный код колбэков, чтобы найти дополнительные параметры и примеры.

Комментарии