Ultralytics YOLO27: انضم إلى قائمة الانتظار.
Get Started
درّب أول نموذج YOLO لديك·التنبؤ·الدرس 2/10
الدرسمبتدئ

التنبؤ على صورة

شغّل نموذج YOLO26 مدرّبًا مسبقًا من Python، واقرأ الفئات ودرجات الثقة ومربعات البكسل من النتائج، واضبط الوسائط التي تعالج معظم حالات عدم الكشف.

يبدأ كل استخدام فعلي للكاشف — مثل عدّ المخزون على رف، أو قص الوجوه لطمسها، أو إرسال المربعات إلى واجهة JSON — بقراءة كائن النتيجة قراءة صحيحة. إذا أخطأت في تفصيل واحد، مثل استخدام فهرس أسماء الفئات مع موتر، فسيتعطل تطبيقك عند أول صورة.

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

النتيجة

يمكنك كتابة نص برمجي بلغة Python يشغّل YOLO26 على الصور ويطبع اسم فئة كل كشف ودرجة الثقة ومربع البكسل، كما ستعرف الوسيط الذي يعالج كل نوع من حالات عدم الكشف.

المسار السريع
إذا كنت تعرف الأساسيات بالفعل، فإليك النسخة المختصرة.
  1. حمّل مرة واحدة: model = YOLO('yolo26n.pt')، ثم result = model(source)[0].

  2. كرّر على result.boxes؛ وحوّل باستخدام int(box.cls) وfloat(box.conf) وbox.xyxy[0].tolist().

  3. اربط فهارس الفئات بأسمائها باستخدام result.names[int(box.cls)].

  4. اضبط conf وiou وimgsz وclasses لكل استدعاء.

عملي

تنبأ واطبع كل كشف#

كشوف Ultralytics YOLO على ممشى بمحاذاة الواجهة البحرية: مربعات معنونة بدرجات ثقة حول أشخاص ودراجات وكلب وسيارات

يؤدي استدعاء النموذج بمصدر إلى تشغيل وضع التنبؤ وإرجاع قائمة تضم كائن 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.

اضبط التنبؤ#

تلائم القيم الافتراضية معظم الصور. وعندما لا تلائمها، غيّر وسيطًا واحدًا في كل مرة:

المشكلة الملحوظةالوسيطافتراضيالتغيير
حالات عدم الكشف: جسم تراه من دون أن يُرسم حوله مربعconf0.25خفّض القيمة، مثل 0.1
إيجابيات كاذبة: مربعات حول لا شيءconf0.25ارفع القيمة، مثل 0.5
مربعان حول جسم واحدiou0.7خفّض: عتبة التداخل (IoU) في NMS لدمج المربعات المكررة
عدم كشف الأجسام الصغيرة والبعيدةimgsz640ارفع القيمة، مثل 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 واستخدم حلقة: تصل النتائج واحدة تلو الأخرى. يتناول درس الفيديو هذا الموضوع بالتفصيل.

جرّبه

اكتب top3.py: حمّل yolo26n.pt مرة واحدة، وشغّله على bus.jpg وzidane.jpg وعلى صورة من اختيارك، واطبع عدد الكشوف لكل صورة والفئات الثلاث الأعلى ثقة. ثم أعد تشغيل الصورة التي تضم أقل عدد من الكشوف عند conf=0.1 واكتب جملة واحدة عمّا ظهر.

متى يُعدّ مكتملًا
تكون قد أتممت الدرس عند تحقق جميع الشروط التالية.
  • يطبع نصك البرمجي عدد الكشوف وأفضل ثلاث فئات مع درجات الثقة لكل صورة، من دون KeyError.

  • قارنت صورة واحدة عند conf=0.25 وconf=0.1 وسجّلت ما تغيّر.

  • يمكنك تحديد الوسيط الذي ستغيّره لمعالجة حالات عدم الكشف والمربعات المكررة والأجسام الصغيرة.

عرض الحل
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 إشارة توقف.

ما الخطوة التالية

استخدمت أصغر نموذج. بعد ذلك، قرر حجم YOLO26 الذي ينبغي لمشروعك تدريبه ونشره فعليًا.

سجّل الدخول لحفظ التقدم