Link to this sectionردود الاستدعاء (Callbacks)#
يدعم إطار عمل Ultralytics ردود الاستدعاء، والتي تعمل كنقاط دخول في مراحل استراتيجية أثناء أوضاع train و val و export و predict. يقبل كل رد استدعاء كائن Trainer أو Validator أو Predictor، اعتماداً على نوع العملية. تم تفصيل جميع خصائص هذه الكائنات في قسم المرجع من الوثائق.
Watch: How to use Ultralytics Callbacks | Predict, Train, Validate and Export Callbacks | Ultralytics YOLO🚀
Link to this sectionأمثلة#
Link to this sectionإرجاع معلومات إضافية مع التنبؤ#
في هذا المثال، نوضح كيفية إرجاع الإطار الأصلي جنباً إلى جنب مع كل كائن نتيجة:
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()
passLink to this sectionالوصول إلى مقاييس النموذج باستخدام رد الاستدعاء on_model_save#
يوضح هذا المثال كيفية استرداد تفاصيل التدريب، مثل درجة best_fitness، و total_loss، ومقاييس أخرى بعد حفظ نقطة التحقق (checkpoint) باستخدام رد الاستدعاء 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)Link to this sectionجميع ردود الاستدعاء#
فيما يلي جميع ردود الاستدعاء المدعومة. لمزيد من التفاصيل، راجع الكود المصدري لردود الاستدعاء.
Link to this sectionردود استدعاء المدرب (Trainer Callbacks)#
| رد الاستدعاء | الوصف |
|---|---|
on_pretrain_routine_start | يتم تفعيله في بداية روتين ما قبل التدريب، قبل تحميل البيانات وإعداد النموذج. |
on_pretrain_routine_end | يتم تفعيله في نهاية روتين ما قبل التدريب، بعد اكتمال تحميل البيانات وإعداد النموذج. |
on_train_start | يتم تفعيله عند بدء التدريب، قبل أن تبدأ الحقبة الأولى. |
on_train_epoch_start | يتم تفعيله في بداية كل حقبة تدريب، قبل أن يبدأ تكرار الدفعات. |
on_train_batch_start | يتم تفعيله في بداية كل دفعة تدريب، قبل التمرير الأمامي. |
optimizer_step | يتم تفعيله أثناء خطوة المُحسِّن (optimizer step). مخصص لعمليات الدمج المخصصة؛ لا يتم استدعاؤه بواسطة حلقة التدريب الافتراضية. |
on_before_zero_grad | يتم تفعيله قبل تصفير التدرجات. مخصص لعمليات الدمج المخصصة؛ لا يتم استدعاؤه بواسطة حلقة التدريب الافتراضية. |
on_train_batch_end | يتم تفعيله في نهاية كل دفعة تدريب، بعد التمرير العكسي. قد يتم تأجيل خطوة المُحسِّن بسبب تراكم التدرج. |
on_train_epoch_end | يتم تفعيله في نهاية كل حقبة تدريب، بعد معالجة جميع الدفعات ولكن قبل التحقق من الصحة. قد لا تكون مقاييس التحقق من الصحة واللياقة البدنية متاحة بعد. |
on_model_save | يتم تفعيله عند حفظ نقطة التحقق الخاصة بالنموذج، بعد التحقق من الصحة. |
on_fit_epoch_end | يتم تفعيله في نهاية كل حقبة ملاءمة (تدريب + تحقق)، بعد التحقق من الصحة وأي حفظ لنقطة التحقق. مقاييس التحقق متاحة، واللياقة متاحة لاستدعاء التدريب لكل حقبة. يتم استدعاء رد الاستدعاء هذا أيضاً أثناء التقييم النهائي لأفضل نموذج، حيث لا يحدث حفظ لنقطة التحقق وقد لا تكون اللياقة موجودة. |
on_train_end | يتم تفعيله عند انتهاء عملية التدريب، بعد التقييم النهائي لأفضل نموذج. |
on_params_update | يتم تفعيله عند تحديث معاملات النموذج. مخصص لعمليات الدمج المخصصة؛ لا يتم استدعاؤه بواسطة حلقة التدريب الافتراضية. |
teardown | يتم تفعيله عند تنظيف عملية التدريب. |
Link to this sectionردود استدعاء المُحقق (Validator Callbacks)#
| رد الاستدعاء | الوصف |
|---|---|
on_val_start | يتم تفعيله عند بدء التحقق من الصحة. |
on_val_batch_start | يتم تفعيله في بداية كل دفعة تحقق من الصحة. |
on_val_batch_end | يتم تفعيله في نهاية كل دفعة تحقق من الصحة. |
on_val_end | يتم تفعيله عند انتهاء التحقق من الصحة. |
Link to this sectionردود استدعاء المُتنبئ (Predictor Callbacks)#
| رد الاستدعاء | الوصف |
|---|---|
on_predict_start | يتم تفعيله عند بدء عملية التنبؤ. |
on_predict_batch_start | يتم تفعيله في بداية كل دفعة تنبؤ. |
on_predict_postprocess_end | يتم تفعيله في نهاية معالجة ما بعد التنبؤ. |
on_predict_batch_end | يتم تفعيله في نهاية كل دفعة تنبؤ. |
on_predict_end | يتم تفعيله عند انتهاء عملية التنبؤ. |
Link to this sectionردود استدعاء المُصدِّر (Exporter Callbacks)#
| رد الاستدعاء | الوصف |
|---|---|
on_export_start | يتم تفعيله عند بدء عملية التصدير. |
on_export_end | يتم تفعيله عند انتهاء عملية التصدير. |
Link to this sectionالأسئلة الشائعة#
Link to this sectionما هي ردود استدعاء Ultralytics وكيف يمكنني استخدامها؟#
ردود استدعاء 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():
passLink to this sectionكيف يمكنني تخصيص روتين تدريب Ultralytics باستخدام ردود الاستدعاء؟#
قم بتخصيص روتين تدريب Ultralytics الخاص بك عن طريق إدراج منطق في مراحل معينة من عملية التدريب. يوفر Ultralytics YOLO مجموعة متنوعة من ردود استدعاء التدريب، مثل on_train_start و on_train_end و on_train_batch_end، والتي تسمح لك بإضافة مقاييس مخصصة، أو معالجة، أو تسجيل (logging).
إليك كيفية تجميد إحصائيات 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)لمزيد من التفاصيل حول الاستخدام الفعال لردود استدعاء التدريب، راجع دليل التدريب.
Link to this sectionلماذا يجب أن أستخدم ردود الاستدعاء أثناء التحقق من الصحة في Ultralytics YOLO؟#
يؤدي استخدام ردود الاستدعاء أثناء التحقق من الصحة في 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")لمزيد من الأفكار حول دمج ردود الاستدعاء في عملية التحقق الخاصة بك، راجع دليل التحقق.
Link to this sectionكيف يمكنني إرفاق رد استدعاء مخصص لوضع التنبؤ في Ultralytics YOLO؟#
لإرفاق رد استدعاء مخصص لوضع التنبؤ في 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 = model("pedestrians.mp4", stream=True, save=True)
for results in results:
passللحصول على استخدام أكثر شمولاً، راجع دليل التنبؤ، والذي يتضمن تعليمات مفصلة وخيارات تخصيص إضافية.
Link to this sectionما هي بعض الأمثلة العملية لاستخدام ردود الاستدعاء في 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("yolo26n.pt")
model.add_callback("on_predict_batch_end", on_predict_batch_end)
for result, frame in model.predict():
passاستكشف الكود المصدري لردود الاستدعاء لمزيد من الخيارات والأمثلة.