Ultralytics YOLO27:
Get Started

Ultralytics YOLO26 على NVIDIA Jetson باستخدام DeepStream SDK وTensorRT#



شاهد: كيفية استخدام نماذج Ultralytics YOLO26 مع NVIDIA Deepstream على Jetson Orin NX 🚀

يقدم هذا الدليل الشامل شرحًا تفصيليًا لنشر Ultralytics YOLO26 على أجهزة NVIDIA Jetson باستخدام DeepStream SDK وTensorRT. نستخدم هنا TensorRT لتحقيق أقصى أداء للاستدلال على منصة Jetson.

يشرح هذا الدليل خطوات إعداد DeepStream لـ YOLO26، ومعايرة INT8، وإعداد تدفقات متعددة، ونتائج الاختبارات المعيارية.

NVIDIA DeepStream SDK on Jetson platform
ملاحظة

اختُبر هذا الدليل على NVIDIA Jetson Orin Nano Super Developer Kit الذي يعمل بإصدار JetPack من JP6.1، وعلى Seeed Studio reComputer J4012، المستند إلى NVIDIA Jetson Orin NX بسعة 16GB والذي يعمل بإصدار JetPack من JP5.1.3، وعلى Seeed Studio reComputer J1020 v2، المستند إلى NVIDIA Jetson Nano بسعة 4GB والذي يعمل بإصدار JetPack من JP4.6.4. ومن المتوقع أن يعمل على جميع أجهزة NVIDIA Jetson، بما في ذلك أحدث الأجهزة والإصدارات القديمة.

ما هو NVIDIA DeepStream؟#

إن DeepStream SDK من NVIDIA مجموعة أدوات متكاملة لتحليلات التدفق، مبنية على GStreamer لمعالجة عدة مستشعرات بالذكاء الاصطناعي وفهم الفيديو والصوت والصور. وهي مثالية لمطوري الذكاء الاصطناعي البصري وشركاء البرمجيات والشركات الناشئة ومصنعي المعدات الأصلية الذين يطورون تطبيقات وخدمات IVA (تحليلات الفيديو الذكية). ويمكنك الآن إنشاء مسارات معالجة للتدفق تدمج الشبكات العصبية ومهام المعالجة المعقدة الأخرى، مثل التتبع وترميز الفيديو وفك ترميزه وعرضه. تتيح هذه المسارات إجراء تحليلات آنية لبيانات الفيديو والصور والمستشعرات. ويوفر دعم DeepStream للمنصات المتعددة طريقة أسرع وأسهل لتطوير تطبيقات وخدمات الذكاء الاصطناعي البصري محليًا، وعلى الحافة، وفي السحابة.

المتطلبات الأساسية#

قبل البدء باتباع هذا الدليل:

نصيحة

استخدمنا في هذا الدليل طريقة حزم Debian لتثبيت DeepStream SDK على جهاز Jetson. يمكنك أيضًا زيارة DeepStream SDK على Jetson (مؤرشف) للوصول إلى الإصدارات القديمة من DeepStream.

إعداد DeepStream لـ YOLO26#

نستخدم هنا مستودع GitHub marcoslucianops/DeepStream-Yolo، الذي يتضمن دعم NVIDIA DeepStream SDK لنماذج YOLO. ونقدّر جهود marcoslucianops ومساهماته!

  1. ثبّت Ultralytics مع التبعيات اللازمة

    pip install ultralytics onnx onnxslim
  2. استنسخ مستودع DeepStream-Yolo

    cd ~
    git clone https://github.com/marcoslucianops/DeepStream-Yolo
  3. نزّل نموذج كشف Ultralytics YOLO26 (.pt) الذي تختاره من مشروع YOLO26. نستخدم هنا yolo26s.pt.

    wget https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo26s.pt
ملاحظة

يمكنك أيضًا استخدام نموذج YOLO26 مُدرَّب خصيصًا.

  1. حوّل النموذج إلى ONNX وأنشئ الملف labels.txt الذي يقرأ DeepStream منه أسماء الفئات

    from ultralytics import YOLO
    
    model = YOLO("yolo26s.pt")
    model.export(format="onnx", nms=False, agnostic_nms=True)  # ⁨ينشئ 'yolo26s.onnx'⁩
    with open("labels.txt", "w") as f:
        f.write("\n".join(model.names.values()))
وسيطات التصدير

يصدّر nms=False رأسًا خاليًا من NMS، ويُبقي agnostic_nms=True فئة واحدة لكل عملية كشف، كي لا يرسم cluster-mode=4 (من دون تجميع) في إعداد DeepStream مربعًا مرتين. أضف imgsz=1280 لتغيير حجم الاستدلال (الافتراضي: 640)، وbatch=4 لتحديد حجم دفعة قدره 4 (حجم الدفعة المُصدَّرة ثابت، لذا يجب أن يطابق batch-size في إعداد DeepStream)، وopset=12 لاستخدام TensorRT 8.2 أو إصدار أقدم (DeepStream 6.0.1 والإصدارات الأقدم). راجع وسيطات التصدير للاطلاع على القائمة الكاملة.

  1. انسخ ملف النموذج المُنشأ .onnx والملف labels.txt إلى المجلد DeepStream-Yolo

    cp yolo26s.onnx labels.txt ~/DeepStream-Yolo
    cd ~/DeepStream-Yolo
  2. اضبط إصدار CUDA وفقًا لإصدار JetPack المثبّت

    بالنسبة إلى JetPack 4.6.4:

    export CUDA_VER=10.2

    بالنسبة إلى JetPack 5.1.3:

    export CUDA_VER=11.4

    بالنسبة إلى JetPack 6.1:

    export CUDA_VER=12.6

    بالنسبة إلى JetPack 7.1:

    export CUDA_VER=13.0
  3. جمّع المكتبة

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
  4. عدّل الملف config_infer_primary_yolo26.txt وفقًا لنموذجك (لـ YOLO26s ذي 80 فئة)

    [property]
    ...
    onnx-file=yolo26s.onnx
    ...
    num-detected-classes=80
    ...
    parse-bbox-func-name=NvDsInferParseYolo
    ...
إعدادات دقة YOLO26

يغيّر YOLO26 حجم الإدخال باستخدام الحشو من المنتصف، ويعمل من دون NMS. لتحقيق أفضل دقة، أضف ما يلي إلى قسم [property] في config_infer_primary_yolo26.txt:

[property]
...
maintain-aspect-ratio=1
symmetric-padding=1
cluster-mode=4
...
  1. عدّل الملف deepstream_app_config

    ...
    [primary-gie]
    ...
    config-file=config_infer_primary_yolo26.txt
  2. يمكنك أيضًا تغيير مصدر الفيديو في الملف deepstream_app_config. يُحمّل هنا ملف فيديو افتراضي

    ...
    [source0]
    ...
    uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4

تشغيل الاستدلال#

deepstream-app -c deepstream_app_config.txt
ملاحظة

سيستغرق إنشاء ملف محرك TensorRT وقتًا طويلًا قبل بدء الاستدلال. لذا يُرجى التحلي بالصبر.

YOLO26 with deepstream
نصيحة

إذا أردت تحويل النموذج إلى دقة FP16، فما عليك سوى ضبط model-engine-file=model_b1_gpu0_fp16.engine وnetwork-mode=2 داخل config_infer_primary_yolo26.txt

معايرة INT8#

إذا أردت استخدام دقة INT8 للاستدلال، فاتبع الخطوات التالية:

ملاحظة

لا يعمل INT8 حاليًا مع TensorRT 10.x. اختُبر هذا القسم من الدليل باستخدام TensorRT 8.x، ومن المتوقع أن يعمل.

  1. اضبط متغير البيئة OPENCV

    export OPENCV=1
  2. جمّع المكتبة

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
  3. لمجموعة بيانات COCO، نزّل val2017، وفك ضغطه، وانقله إلى المجلد DeepStream-Yolo

  4. أنشئ دليلًا جديدًا لصور المعايرة

    mkdir calibration
  5. نفّذ الأمر التالي لاختيار 1000 صورة عشوائية من مجموعة بيانات COCO لإجراء المعايرة

    for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do
      cp ${jpg} calibration/
    done
ملاحظة

توصي NVIDIA باستخدام 500 صورة على الأقل لتحقيق دقة جيدة. في هذا المثال، اختيرت 1000 صورة لتحسين الدقة (كلما زاد عدد الصور، زادت الدقة). يمكنك تحديد العدد باستخدام head -1000. فعلى سبيل المثال، لاختيار 2000 صورة، استخدم head -2000. قد تستغرق هذه العملية وقتًا طويلًا.

  1. أنشئ الملف calibration.txt متضمنًا جميع الصور المحددة

    realpath calibration/*jpg > calibration.txt
  2. اضبط متغيرات البيئة

    export INT8_CALIB_IMG_PATH=calibration.txt
    export INT8_CALIB_BATCH_SIZE=1
ملاحظة

تؤدي القيم الأعلى لـ INT8_CALIB_BATCH_SIZE إلى دقة أكبر وسرعة معايرة أعلى. اضبط القيمة وفقًا لذاكرة GPU لديك.

  1. حدّث الملف config_infer_primary_yolo26.txt

    من

    ...
    model-engine-file=model_b1_gpu0_fp32.engine
    #int8-calib-file=calib.table
    ...
    network-mode=0
    ...

    إلى

    ...
    model-engine-file=model_b1_gpu0_int8.engine
    int8-calib-file=calib.table
    ...
    network-mode=1
    ...

تشغيل استدلال INT8#

نفّذ الأمر نفسه لإنشاء محرك INT8 وبدء الاستدلال:

deepstream-app -c deepstream_app_config.txt

إعداد تدفقات متعددة#



شاهد: كيفية تنفيذ الاستدلال متعدد التدفقات باستخدام Ultralytics YOLO26 وNVIDIA DeepStream على Jetson Orin 🚀

لإعداد عدة تدفقات ضمن تطبيق DeepStream واحد، أجرِ التغييرات التالية على الملف deepstream_app_config.txt:

  1. غيّر عدد الصفوف والأعمدة لإنشاء عرض شبكي يتناسب مع عدد التدفقات المطلوبة. على سبيل المثال، لإضافة 4 تدفقات، يمكننا إضافة صفين وعمودين.

    [tiled-display]
    rows=2
    columns=2
  2. أضف مجموعة [sourceN] منفصلة لكل تدفق، مع uri وnum-sources=1 خاصين به.

    [source0]
    enable=1
    type=3
    uri=file:///path/to/video1.mp4
    num-sources=1
    
    [source1]
    enable=1
    type=3
    uri=file:///path/to/video2.mp4
    num-sources=1
    
    [source2]
    enable=1
    type=3
    uri=file:///path/to/video3.mp4
    num-sources=1
    
    [source3]
    enable=1
    type=3
    uri=file:///path/to/video4.mp4
    num-sources=1

تشغيل الاستدلال متعدد التدفقات#

نفّذ الأمر نفسه لتشغيل جميع التدفقات في العرض الشبكي:

deepstream-app -c deepstream_app_config.txt
DeepStream multi-camera streaming configuration

نتائج الاختبارات المعيارية#

تلخص الاختبارات المعيارية التالية أداء نماذج YOLO11 بمستويات دقة TensorRT المختلفة، مع حجم إدخال 640x640 على NVIDIA Jetson Orin NX بسعة 16GB. يستخدم YOLO26 سير عمل التصدير والاستدلال في DeepStream نفسه الموضح أعلاه.

رسم بياني للمقارنة#

NVIDIA Jetson DeepStream performance benchmarks

جدول مقارنة مفصل#

الأداء
التنسيقالحالةوقت الاستدلال (ms/im)
TensorRT (FP32)✅8.64
TensorRT (FP16)✅5.27
TensorRT (INT8)✅4.54

شكر وتقدير#

أُعدّ هذا الدليل في البداية بمساهمة صديقينا Lakshantha وElaine من Seeed Studio.

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

  • لإعداد Ultralytics YOLO26 على جهاز NVIDIA Jetson، عليك أولًا تثبيت DeepStream SDK المتوافق مع إصدار JetPack لديك. اتبع الخطوات الواردة في دليل البدء السريع لإعداد NVIDIA Jetson لنشر YOLO26.

  • يُحسّن استخدام TensorRT مع YOLO26 النموذج للاستدلال، مما يقلل زمن الاستجابة بدرجة كبيرة ويزيد معدل الإنتاجية على أجهزة NVIDIA Jetson. ويوفر TensorRT استدلال التعلم العميق عالي الأداء ومنخفض زمن الاستجابة من خلال دمج الطبقات ومعايرة الدقة والضبط التلقائي للنوى. وينتج عن ذلك تنفيذ أسرع وأكثر كفاءة، وهو مفيد خصوصًا للتطبيقات الآنية مثل تحليلات الفيديو والآلات ذاتية التشغيل.

  • نعم، يتوافق دليل نشر Ultralytics YOLO26 باستخدام DeepStream SDK وTensorRT مع جميع أجهزة NVIDIA Jetson. ويشمل ذلك أجهزة مثل Jetson Orin NX بسعة 16GB مع JetPack 5.1.3، وJetson Nano بسعة 4GB مع JetPack 4.6.4. راجع قسم إعداد DeepStream لـ YOLO26 للاطلاع على الخطوات التفصيلية.

  • صدّر النموذج باستخدام مُصدِّر Ultralytics مع رأس خالٍ من NMS، وأنشئ الملف labels.txt الذي يقرأ DeepStream منه أسماء الفئات:

    from ultralytics import YOLO
    
    model = YOLO("yolo26s.pt")
    model.export(format="onnx", nms=False, agnostic_nms=True)  # ⁨ينشئ 'yolo26s.onnx'⁩
    with open("labels.txt", "w") as f:
        f.write("\n".join(model.names.values()))

    أضف opset=12 لاستخدام TensorRT 8.2 أو إصدار أقدم (DeepStream 6.0.1 والإصدارات الأقدم). لمزيد من التفاصيل حول تحويل النماذج، راجع قسم تصدير النماذج.

  • لتشغيل استدلال INT8، عاير النموذج باستخدام مجموعة صور ممثلة، وبدّل إعداد DeepStream إلى وضع INT8. نزّل صور COCO val2017، واختر نحو 1000 صورة للمعايرة، واضبط متغيري البيئة INT8_CALIB_IMG_PATH وINT8_CALIB_BATCH_SIZE، ثم حدّث config_infer_primary_yolo26.txt باستخدام model-engine-file=model_b1_gpu0_int8.engine وint8-calib-file=calib.table وnetwork-mode=1. راجع قسم معايرة INT8 للاطلاع على الخطوات كاملة. يتطلب INT8 حاليًا TensorRT 8.x.

  • لمعالجة عدة تدفقات في تطبيق DeepStream واحد، عدّل الملف deepstream_app_config.txt لإضافة شبكة عرض متجانبة وإدراج URI لكل مصدر. اضبط rows وcolumns ضمن [tiled-display] لإنشاء الشبكة، وأضف مجموعة [sourceN] منفصلة لكل تدفق، مع uri وnum-sources=1 خاصين بها، ثم اضبط الشبكة لتناسب عدد التدفقات. راجع قسم إعداد تدفقات متعددة للاطلاع على مثال كامل.

  • يختلف أداء نماذج YOLO11 على NVIDIA Jetson Orin NX بسعة 16GB بحسب مستويات دقة TensorRT. فعلى سبيل المثال، تحقق نماذج YOLO11s ما يلي:

    • دقة FP32: 14.53 ms/im، و68.8 FPS
    • دقة FP16: 7.91 ms/im، و126 FPS
    • دقة INT8: 6.05 ms/im، و165 FPS

    تؤكد هذه الاختبارات المعيارية كفاءة وقدرات استخدام نماذج YOLO11 المحسّنة باستخدام TensorRT على أجهزة NVIDIA Jetson. لمزيد من التفاصيل، راجع قسم نتائج الاختبارات المعيارية.

التعليقات