Ultralytics YOLO27:

كيفية عرض نتائج استدلال YOLO في طرفية VSCode#

صورة من موقع libsixel.

الدافع#

عند الاتصال بجهاز بعيد عبر SSH، لا يكون تصور نتائج الصور بالطريقة المعتادة ممكنًا، أو يتطلب نقل البيانات إلى جهاز محلي مزود بواجهة رسومية. يمكن للطرفية المدمجة في VSCode عرض الصور مباشرة، ما يتيح لك فحص نتائج التنبؤ في المكان الذي تشغّل فيه الاستدلال، من دون نسخ الملفات مرة أخرى إلى حاسوبك المحمول. يوضح هذا الدليل كيفية تفعيل الإعداد، وربط التعليمات البرمجية، ويجيب عن الأسئلة الشائعة.

Linux وmacOS فقط

متوافق فقط مع Linux وmacOS. راجع مستودع VSCode، أو تحقّق من حالة المشكلة، أو راجع الوثائق للحصول على تحديثات حول دعم Windows لعرض الصور في الطرفية باستخدام sixel.

البروتوكولان المتوافقان مع VSCode لعرض الصور باستخدام الطرفية المدمجة هما sixel وiTerm. سيوضح هذا الدليل كيفية استخدام بروتوكول sixel.

الإجراء#

  1. أولًا، يجب تفعيل الإعدادين terminal.integrated.enableImages وterminal.integrated.gpuAcceleration في VSCode.

    "terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on"
    "terminal.integrated.enableImages": true

    VSCode enable terminal images setting

  2. ثبّت مكتبة python-sixel في بيئتك الافتراضية. هذه المكتبة عبارة عن فرع من مكتبة PySixel التي لم تعد قيد الصيانة.

    pip install sixel
  3. حمّل نموذجًا ونفّذ الاستدلال، ثم ارسم النتائج وخزّنها في متغير. راجع صفحة وضع التنبؤ لمزيد من المعلومات حول وسيطات الاستدلال والعمل مع النتائج.

    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolo26n.pt")
    
    # Run inference on an image
    results = model.predict(source="ultralytics/assets/bus.jpg")
    
    # Plot inference results
    plot = results[0].plot()  # (1)!
    1. راجع معلمات طريقة الرسم للاطلاع على الوسيطات الممكنة التي يمكن استخدامها.
  4. استخدم الآن OpenCV لتحويل np.ndarray إلى بيانات bytes. ثم استخدم io.BytesIO لإنشاء كائن «شبيه بالملف».

    import io
    
    import cv2
    
    # Results image as bytes
    im_bytes = cv2.imencode(
        ".png",  # (1)!
        plot,
    )[1].tobytes()  # (2)!
    
    # Image bytes as a file-like object
    mem_file = io.BytesIO(im_bytes)
    1. يمكن أيضًا استخدام امتدادات صور أخرى.
    2. المطلوب فقط هو الكائن ذو الفهرس 1 من الكائنات المُعادة.
  5. أنشئ مثيلًا من SixelWriter، ثم استخدم طريقة .draw() لرسم الصورة في الطرفية.

    from sixel import SixelWriter
    
    # Create sixel writer object
    w = SixelWriter()
    
    # Draw the sixel image in the terminal
    w.draw(mem_file)

مثال على نتائج الاستدلال#

YOLO inference results displayed in terminal

لم تُختبر مقاطع الفيديو وملفات GIF

لم يُختبر استخدام هذا المثال مع مقاطع الفيديو أو إطارات GIF المتحركة. أجرِ المحاولة على مسؤوليتك الخاصة.

مثال كامل على التعليمات البرمجية#

import io

import cv2
from sixel import SixelWriter

from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.pt")

# Run inference on an image
results = model.predict(source="ultralytics/assets/bus.jpg")

# Plot inference results
plot = results[0].plot()  # (3)!

# Results image as bytes
im_bytes = cv2.imencode(
    ".png",  # (1)!
    plot,
)[1].tobytes()  # (2)!

mem_file = io.BytesIO(im_bytes)
w = SixelWriter()
w.draw(mem_file)
  1. يمكن أيضًا استخدام امتدادات صور أخرى.
  2. المطلوب فقط هو الكائن ذو الفهرس 1 من الكائنات المُعادة.
  3. راجع معلمات طريقة الرسم للاطلاع على الوسيطات الممكنة التي يمكن استخدامها.
مسح الصورة

قد تحتاج إلى استخدام clear «لمحو» عرض الصورة في الطرفية.

الأسئلة الشائعة#

  • لعرض نتائج استدلال YOLO في طرفية VSCode على macOS أو Linux، اتبع الخطوات التالية:

    1. فعّل إعدادات VSCode المطلوبة:

      "terminal.integrated.enableImages": true
      "terminal.integrated.gpuAcceleration": "auto"
    2. ثبّت مكتبة sixel:

      pip install sixel
    3. حمّل نموذج YOLO وشغّل الاستدلال:

      from ultralytics import YOLO
      
      model = YOLO("yolo26n.pt")
      results = model.predict(source="ultralytics/assets/bus.jpg")
      plot = results[0].plot()
    4. حوّل صورة نتيجة الاستدلال إلى وحدات بايت واعرضها في الطرفية:

      import io
      
      import cv2
      from sixel import SixelWriter
      
      im_bytes = cv2.imencode(".png", plot)[1].tobytes()
      mem_file = io.BytesIO(im_bytes)
      SixelWriter().draw(mem_file)

    لمزيد من التفاصيل، راجع صفحة وضع التنبؤ.

  • لا يدعم بروتوكول sixel حاليًا إلا Linux وmacOS، لأن هاتين المنصتين تتمتعان بإمكانات طرفية أصلية متوافقة مع رسومات sixel. لا يزال دعم Windows لرسومات الطرفية باستخدام sixel قيد التطوير. للحصول على تحديثات حول توافق Windows، راجع حالة مشكلات VSCode والوثائق.

  • إذا لم يظهر أي شيء، فنفّذ عمليات التحقق التالية بالترتيب:

    1. تأكد من تفعيل كل من terminal.integrated.enableImages وterminal.integrated.gpuAcceleration، كما هو موضح في قسم الإجراء، ثم أعد تشغيل الطرفية المدمجة لتفعيل الإعدادات.
    2. تحقق من تثبيت sixel في البيئة الافتراضية نفسها التي يعمل فيها البرنامج النصي (pip install sixel).
    3. تأكد من أن plot يمثل np.ndarray صالحًا قبل ترميزه، لأن cv2.imencode يرفع خطأً إذا كانت الصورة فارغة أو ليست مصفوفة صالحة. راجع معلمات طريقة الرسم لمعرفة القيم التي يقبلها results[0].plot().

    إذا استمرت المشكلات، فراجع مستودع VSCode للاطلاع على حالة دعم صور الطرفية.

  • لم يُختبر حاليًا عرض نتائج استدلال الفيديو أو إطارات GIF المتحركة باستخدام sixel في الطرفية، وقد لا يكون مدعومًا. نوصي بالبدء بالصور الثابتة والتحقق من التوافق. جرّب نتائج الفيديو على مسؤوليتك الخاصة، مع مراعاة قيود الأداء. لمزيد من المعلومات حول رسم نتائج الاستدلال، راجع صفحة وضع التنبؤ.

  • حزمة sixel عبارة عن فرع من مكتبة PySixel غير الخاضعة للصيانة، وهي غلاف Python رفيع حول Pillow (PIL). إذا فشل import sixel أو أطلق SixelWriter().draw() خطأً، فتحقق من تثبيت الحزمة في بيئتك الافتراضية النشطة، وتأكد من توفر Pillow، وراجع مستودع python-sixel على GitHub للاطلاع على الملاحظات الخاصة بالمنصة. لمزيد من المعلومات حول إنشاء الصورة التي تمررها إلى draw()، راجع وثائق وضع التنبؤ.

التعليقات