التنبؤ على صورة
شغّل نموذج YOLO26 مدرّبًا مسبقًا من Python، واقرأ الفئات ودرجات الثقة ومربعات البكسل من النتائج، واضبط الوسائط التي تعالج معظم حالات عدم الكشف.
يبدأ كل استخدام فعلي للكاشف — مثل عدّ المخزون على رف، أو قص الوجوه لطمسها، أو إرسال المربعات إلى واجهة JSON — بقراءة كائن النتيجة قراءة صحيحة. إذا أخطأت في تفصيل واحد، مثل استخدام فهرس أسماء الفئات مع موتر، فسيتعطل تطبيقك عند أول صورة.
يعرف نموذج YOLO26 المخصّص لـالكشف والمدرّب مسبقًا الفئات الثمانين في COCO بالفعل. في هذا الدرس، ستشغّل وضع التنبؤ من Python، وتستخرج كل الحقول المفيدة من النتائج، وتتعلّم أي وسيط ينبغي تغييره لمعالجة حالات الإخفاق في الكشف، والاكتشافات المكررة، والأجسام الصغيرة. وسيُرجع نموذجك المدرّب لاحقًا كائن النتائج نفسه.
عملي
تنبأ واطبع كل كشف#

يؤدي استدعاء النموذج بمصدر إلى تشغيل وضع التنبؤ وإرجاع قائمة تضم كائن Results واحدًا لكل صورة. عند استخدام صورة واحدة، اقرأ results[0].
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
for box in result.boxes:
name = result.names[int(box.cls)]
conf = float(box.conf)
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{name:>8} {conf:.2f} ({x1:.0f}, {y1:.0f}) -> ({x2:.0f}, {y2:.0f})")
result.save("bus_annotated.jpg")الناتج الفعلي من predict.py، بعد سطر السجل المعتاد:
bus 0.88 (0, 230) -> (803, 751)
person 0.87 (49, 398) -> (240, 902)
person 0.86 (223, 405) -> (345, 861)
person 0.85 (670, 395) -> (810, 880)
person 0.65 (0, 553) -> (60, 871)طريقة قراءته:
bus 0.88: اسم الفئة ودرجة الثقة. تُرتَّب المربعات حسب درجة الثقة، من الأعلى إلى الأدنى.(0, 230) -> (803, 751): إحداثيا الزاويتين العلوية اليسرى والسفلية اليمنى بالبكسل في الصورة الأصلية ذات الأبعاد 810×1080، ونقطة الأصل عند أعلى اليسار. يمكنك استخدام هذه الإحداثيات مباشرةً للقص أو الرسم.person 0.65عند(0, 553): يحصل الشخص الخامس، المقطوع عند الحافة اليسرى، على درجة أقل. وهذا شائع مع الأجسام الظاهرة جزئيًا.
يحفظ result.save() الصورة المشروحة؛ ويفتحها result.show() في نافذة.
تعرّف إلى محتوى النتيجة#
تعيد كل مهمة النوع نفسه من Results؛ ولا تختلف سوى الحقول المعبأة. تجد كامل التفاصيل في دليل استخدام Python.
| السمة | يحتوي على |
|---|---|
boxes | الكشوف: xyxy بالبكسل، وxywhn بتنسيق المركز المُطبَّع، وconf، وcls، وid عند التتبّع |
masks, keypoints, obb, probs | مخرجات نماذج التقسيم والوضعية وOBB والتصنيف (None لنموذج كشف) |
names | قاموس يربط فهرس الفئة ← اسم الفئة |
orig_img, orig_shape | صورة الإدخال كمصفوفة NumPy، وارتفاعها × عرضها |
speed | زمن المعالجة المسبقة والاستدلال والمعالجة اللاحقة بالمللي ثانية |
path, save_dir | مصدر الإدخال ومكان كتابة المخرجات |
في اكتشاف الأجسام، ستحتاج غالبًا إلى boxes، أي الصناديق المحيطة. يعيد result.summary() الكشوف نفسها على هيئة قائمة من القواميس العادية، جاهزة لواجهة JSON.
اضبط التنبؤ#
تلائم القيم الافتراضية معظم الصور. وعندما لا تلائمها، غيّر وسيطًا واحدًا في كل مرة:
| المشكلة الملحوظة | الوسيط | افتراضي | التغيير |
|---|---|---|---|
| حالات عدم الكشف: جسم تراه من دون أن يُرسم حوله مربع | conf | 0.25 | خفّض القيمة، مثل 0.1 |
| إيجابيات كاذبة: مربعات حول لا شيء | conf | 0.25 | ارفع القيمة، مثل 0.5 |
| مربعان حول جسم واحد | iou | 0.7 | خفّض: عتبة التداخل (IoU) في NMS لدمج المربعات المكررة |
| عدم كشف الأجسام الصغيرة والبعيدة | imgsz | 640 | ارفع القيمة، مثل 1280 (تُقرَّب إلى أقرب مضاعف للعدد 32) |
| تهمّك بعض الفئات فقط | classes | الكل | مثلًا، classes=[0] للأشخاص |
| العتاد غير المناسب | device | تلقائي | cpu أو mps أو فهرس GPU مثل 0 |
تغيّر الثقة النتيجة، وليس العدد فحسب. على صورة الحافلة نفسها:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model("https://ultralytics.com/images/bus.jpg", conf=0.5, classes=[0]) # 4 persons
model("https://ultralytics.com/images/bus.jpg", conf=0.1) # 5 أشخاص، وحافلة واحدة، وإشارة توقف واحدةعند conf=0.1، يرصد النموذج أيضًا إشارة توقف لم يكن واثقًا منها. يُعد خفض conf أسرع طريقة لرؤية ما كاد النموذج أن يكتشفه. تجد بقية الوسائط في مرجع الإعدادات.
عندما يعود التنبؤ فارغًا، اتبع مسار الفحص الآتي:
شغّل على صور متعددة#
مرّر قائمة أو مجلدًا أو نمط glob مثل "photos/*.jpg". يستخدم التنبؤ batch=1 افتراضيًا؛ اضبط batch لمعالجة عدة صور في النموذج دفعة واحدة، وهو أسرع بكثير على GPU:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, batch=2):
print(result.path, len(result.boxes), result.verbose())image0.jpg 5 4 persons, 1 bus,
image1.jpg 3 2 persons, 1 tie,تجنّب هذه الأخطاء#
العَرَض: KeyError: tensor([5.]). السبب: box.cls وbox.conf موتران من PyTorch، وresult.names قاموس مفاتيحه int. الحل: حوّل أولًا: result.names[int(box.cls)] وfloat(box.conf) وbox.xyxy[0].tolist().
العَرَض: دالة مساعدة تستدعي YOLO("yolo26n.pt") داخل الدالة وتعمل ببطء. على وحدة CPU في حاسوب محمول، استغرق إعادة التحميل لكل صورة 71 ms، مقابل 25 ms عند تحميل النموذج مرة واحدة. الحل: أنشئ النموذج مرة واحدة عند بدء التشغيل، وأعد استخدامه لكل صورة.
يجمع model(list_or_folder) كل كائنات Results في الذاكرة قبل الإرجاع. للمجلدات الكبيرة وكل مقاطع الفيديو، مرّر stream=True واستخدم حلقة: تصل النتائج واحدة تلو الأخرى. يتناول درس الفيديو هذا الموضوع بالتفصيل.
عرض الحل
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load once
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, verbose=False):
top3 = sorted(result.summary(), key=lambda d: d["confidence"], reverse=True)[:3]
print(f"{result.path}: {len(result.boxes)} detections")
for d in top3:
print(f" {d['name']:>8} {d['confidence']:.2f}")image0.jpg: 5 detections
bus 0.90
person 0.85
person 0.85
image1.jpg: 3 detections
person 0.89
person 0.79
tie 0.59يعيد summary() الأسماء العادية والقيم العشرية بالفعل، لذا لا توجد موترات لتحويلها. تختلف درجات الثقة قليلًا عن predict.py لأن قائمة الصور تُحشى إلى شكل موحّد. عند conf=0.1، يضيف bus.jpg إشارة توقف.