Обратные вызовы#
Фреймворк 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Изучи исходный код колбэков, чтобы найти дополнительные параметры и примеры.