回调
回调
Ultralytics框架支持在训练、验证、导出和预测模式的战略阶段使用回调。每个回调根据操作类型接受一个Trainer
、Validator
或Predictor
对象。这些对象的所有属性可以在文档的参考部分找到。
观看: 掌握Ultralytics YOLO: 回调
示例
在预测中返回额外信息
在这个例子中,我们希望在每个结果对象中返回原始帧。以下是如何做到这一点:
from ultralytics import YOLO
def on_predict_batch_end(predictor):
"""在预测批次结束时处理,将结果与相应的帧结合;修改预测器结果。"""
_, image, _, _ = predictor.batch
# 确保图像是一个列表
image = image if isinstance(image, list) else [image]
# 将预测结果与相应的帧结合
predictor.results = zip(predictor.results, image)
# 创建一个YOLO模型实例
model = YOLO("yolo11n.pt")
# 将自定义回调添加到模型中
model.add_callback("on_predict_batch_end", on_predict_batch_end)
# 遍历结果和帧
for result, frame in model.predict(): # 或 model.track()
pass
所有回调
以下是所有支持的回调。有关更多详细信息,请参阅回调源代码。
训练器回调
回调 | 描述 |
---|---|
on_pretrain_routine_start |
在预训练例程开始时触发 |
on_pretrain_routine_end |
在预训练例程结束时触发 |
on_train_start |
在训练开始时触发 |
on_train_epoch_start |
在每个训练epoch开始时触发 |
on_train_batch_start |
在每个训练批次开始时触发 |
optimizer_step |
在优化器步骤期间触发 |
on_before_zero_grad |
在梯度归零之前触发 |
on_train_batch_end |
在每个训练批次结束时触发 |
on_train_epoch_end |
在每个训练epoch结束时触发 |
on_fit_epoch_end |
在每个拟合epoch结束时触发 |
on_model_save |
在模型保存时触发 |
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 回调是什么,我该如何使用它们?
Ultralytics 回调是在模型操作的关键阶段(如训练、验证、导出和预测)触发的专用入口点。这些回调允许在过程的特定点自定义功能,从而增强和修改工作流程。每个回调接受一个 Trainer
、Validator
或 Predictor
对象,具体取决于操作类型。有关这些对象的详细属性,请参阅参考部分。
要使用回调,您可以定义一个函数,然后使用 add_callback
方法将其添加到模型中。以下是如何在预测期间返回额外信息的示例:
from ultralytics import YOLO
def on_predict_batch_end(predictor):
"""通过将结果与相应的帧组合来处理预测批次结束;修改预测器结果。"""
_, 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 训练例程?
要使用回调自定义您的 Ultralytics 训练例程,您可以在训练过程的特定阶段注入您的逻辑。Ultralytics YOLO 提供了各种训练回调,如 on_train_start
、on_train_end
和 on_train_batch_end
。这些回调允许您添加自定义指标、处理或日志记录。
以下是如何在每个训练周期结束时记录额外指标的示例:
from ultralytics import YOLO
def on_train_epoch_end(trainer):
"""在每个训练周期结束时记录额外指标的自定义逻辑。"""
additional_metric = compute_additional_metric(trainer)
trainer.log({"additional_metric": additional_metric})
model = YOLO("yolo11n.pt")
model.add_callback("on_train_epoch_end", on_train_epoch_end)
model.train(data="coco.yaml", epochs=10)
有关如何有效使用训练回调的更多详细信息,请参阅训练指南。
为什么在 Ultralytics YOLO 中验证时应该使用回调?
在 Ultralytics YOLO 中使用验证回调可以通过允许自定义处理、日志记录或指标计算来增强模型评估。回调如 on_val_start
、on_val_batch_end
和 on_val_end
提供了注入自定义逻辑的入口点,确保详细和全面的验证过程。
例如,您可能希望记录额外的验证指标或保存中间结果以供进一步分析。以下是如何在验证结束时记录自定义指标的示例:
from ultralytics import YOLO
def on_val_end(validator):
"""在验证结束时记录自定义指标。"""
custom_metric = compute_custom_metric(validator)
validator.log({"custom_metric": custom_metric})
model = YOLO("yolo11n.pt")
model.add_callback("on_val_end", on_val_end)
model.val(data="coco.yaml")
查看验证指南以获取有关将回调纳入验证过程的更多见解。
如何在 Ultralytics YOLO 的预测模式中附加自定义回调?
要在 Ultralytics YOLO 的预测模式中附加自定义回调,您可以定义一个回调函数并将其注册到预测过程中。常见的预测回调包括 on_predict_start
、on_predict_batch_end
和 on_predict_end
。这些回调允许修改预测输出并集成额外的功能,如数据日志记录或结果转换。
以下是使用自定义回调记录预测的示例:
from ultralytics import YOLO
def on_predict_end(predictor):
"""在预测结束时记录预测。"""
for result in predictor.results:
log_prediction(result)
model = YOLO("yolo11n.pt")
model.add_callback("on_predict_end", on_predict_end)
results = model.predict(source="image.jpg")
有关更全面的用法,请参阅预测指南,其中包含详细的说明和额外的自定义选项。
在 Ultralytics YOLO 中使用回调的一些实际示例是什么?
Ultralytics YOLO 支持各种回调的实际实现,以增强和自定义训练、验证和预测等不同阶段。一些实际示例包括:
- 记录自定义指标:在不同阶段记录额外的指标,例如训练或验证周期的结束。
- 数据增强:在预测或训练批次期间实现自定义数据变换或增强。
- 中间结果:保存中间结果,例如预测或帧,以供进一步分析或可视化。
示例:在预测期间使用 on_predict_batch_end
将帧与预测结果结合:
from ultralytics import YOLO
def on_predict_batch_end(predictor):
"""将预测结果与帧结合。"""
_, 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
探索 完整的回调参考 以找到更多选项和示例。