Ultralytics YOLO27:
Get Started

تصدير النماذج باستخدام Ultralytics YOLO#

Ultralytics YOLO ecosystem and integrations

مقدمة#

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

راجع معاينة YOLO27 غير المُصدرة للاطلاع على دعم التصدير المخطط له.



شاهد: كيفية تصدير Ultralytics YOLO26 بتنسيقات مختلفة للنشر | ONNX وTensorRT وCoreML 🚀

لماذا تختار وضع التصدير في YOLO26؟#

  • التنوع: صدّر إلى تنسيقات متعددة، بما فيها ONNX وTensorRT وCoreML وغيرها.
  • الأداء: احصل على زيادة في سرعة GPU تصل إلى 5 أضعاف باستخدام TensorRT، وزيادة في سرعة CPU تصل إلى 3 أضعاف باستخدام ONNX أو OpenVINO.
  • التوافق: اجعل نشر نموذجك ممكنًا على نطاق واسع عبر العديد من بيئات الأجهزة والبرامج.
  • سهولة الاستخدام: واجهة CLI وواجهة API في Python بسيطتان لتصدير النماذج بسرعة وسهولة.

أمثلة الاستخدام#

صدّر نموذج YOLO26n إلى تنسيق آخر مثل ONNX أو TensorRT. راجع قسم الوسائط أدناه للاطلاع على القائمة الكاملة لوسائط التصدير.

مثال
from ultralytics import YOLO

# ⁨تحميل نموذج⁩
model = YOLO("yolo26n.pt")  # ⁨حمّل نموذجًا رسميًا⁩
model = YOLO("path/to/best.pt")  # ⁨حمّل نموذجًا مخصصًا مدرّبًا⁩

# ⁨صدّر النموذج⁩
model.export(format="onnx")

الوسيطات#

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

المعاملالنوعالافتراضيالوصف
formatstr'torchscript'التنسيق المستهدف للنموذج المصدّر، مثل 'onnx' أو 'torchscript' أو 'engine' (TensorRT) أو غيرها. يتيح كل تنسيق التوافق مع بيئات النشر المختلفة.
namestrNoneاسم الهدف العتادي للصيغ التي تتطلبه: بنية Hailo ('hailo8'، 'hailo8l'، 'hailo10h'، 'hailo15h'، 'hailo15l'؛ القيمة الافتراضية هي 'hailo8l')، شريحة Rockchip RKNN (القيمة الافتراضية هي 'rk3588')، نظام Huawei Ascend على شريحة (SoC) (أحد مكونات CANN، --soc_version؛ القيمة الافتراضية هي 'Ascend310B4')، هدف Qualcomm QNN HTP (القيمة الافتراضية هي '73')، أو جهاز AMD Xilinx Versal AI Edge Series Gen 2 (القيمة الافتراضية هي 've2-xc2ve3858'، وهي مجموعة التقييم VEK385). يختلف هذا عن زوج تسمية التشغيل project/name المستخدم في الأوضاع الأخرى.
imgszint أو tuple640حجم الصورة المطلوب لمدخل النموذج. يمكن أن يكون عددًا صحيحًا للصور المربعة (مثل 640 لصورة بقياس 640×640)، أو صفًا (height, width) لأبعاد محددة. إذا لم يُمرر هذا الخيار، يعيد التصدير استخدام حجم التدريب المسجل في نقطة التحقق المحمّلة: تسجل نقاط التحقق الرسمية لـYOLO26 القيمة 768 لمهمة العمق، و224 للتصنيف، و1024 لمهمة OBB، و640 للمهام الأخرى؛ أما النموذج الدقيق فيسجل قيمة imgsz التي دُرّب عليها. ولا يسجل النموذج المبني من ملف YAML حجم تدريب، لذا يستخدم 640.
optimizeboolFalseيفعّل تحسينًا أعلى للمترجم البرمجي في DEEPX، ما يقلل زمن استجابة الاستدلال مع زيادة وقت الترجمة.
quantizeint أو strNoneدقة التكميم: 16 (FP16، يقلّل حجم النموذج وقد يسرّع الاستدلال على الأجهزة المدعومة) أو 8 (INT8/PTQ، يضغط النموذج أكثر مع انخفاض طفيف في الدقة، ويُستخدم أساسًا في الأجهزة الطرفية؛ ويتطلب معايرة data/fraction)؛ أما 32/غير المحدد فيعني FP32. تُصدَّر نقطة التحقق المدرَّبة باستخدام quantize=8 دائمًا بدقة INT8: ويعتمد التصدير عبر onnx وengine على النطاقات التي تتضمنها نقطة التحقق، دون معايرة، وتُرفض التنسيقات أو درجات الدقة الأخرى. 'w8a8' و'w16a16' اسمان بديلان لـ8 و16؛ ولا تُقبل دقتا المزج 'w8a16' (أوزان INT8 مع تنشيطات 16 بت: CoreML، LiteRT، QNN) و'w8a32' (INT8 ديناميكي: LiteRT) إلا في التنسيقات المحددة لكل منهما. ويحلّ هذا الخيار محلّ العَلَمَين المتقادمين half/int8 (half=True → 16، int8=True → 8، ولا يزال العَلَمان مقبولين مع تحذير من إهمالهما). لا يُسمح إلا بدرجات الدقة التي يدعمها التنسيق المستهدف (انظر أدناه).
dynamicboolFalseيتيح أحجام مدخلات ديناميكية لتصديرات TorchScript وONNX وOpenVINO وTensorRT وCoreML وMNN، ما يعزز المرونة في التعامل مع أبعاد الصور المتفاوتة.
simplifyboolTrueيبسّط الرسم البياني الوسيط لـONNX باستخدام onnxslim في عمليات التصدير التي تنشئ رسمًا بيانيًا كهذا (راجع تنسيقات التصدير)، ما قد يحسن الأداء والتوافق مع محركات الاستدلال.
opsetintNoneيحدد إصدار ONNX opset لعمليات التصدير التي تنشئ رسمًا بيانيًا لـONNX (راجع تنسيقات التصدير)، لضمان التوافق مع محللات وبيئات تشغيل ONNX المختلفة. إذا لم يُضبط، فسيُستخدم أحدث إصدار مدعوم.
workspacefloat أو NoneNoneيحدد الحد الأقصى لحجم مساحة العمل بالغيغابايت لتحسينات TensorRT، مع الموازنة بين استخدام الذاكرة والأداء. استخدم None لتخصيص الذاكرة تلقائيًا بواسطة TensorRT حتى الحد الأقصى للجهاز.
nmsbool، اختياريNoneيصدّر None تنبؤات خامًا من واحد إلى متعدد لإجراء NMS خارجيًا؛ ويضمّن True NMS حيثما كان مدعومًا؛ بينما يختار False الرأس الخالي من NMS عند توفره. يدعم NMS المضمّن في CoreML مهام detect وsegment وpose بأشكال ثابتة. راجع دليل الاكتشاف الشامل.
conffloatNoneعتبة الثقة المستخدمة عند إنشاء NMS وقت التصدير: تصديرات nms=True، وتصديرات detect غير الشاملة من Hailo، وتصديرات detect وpose وsegment من IMX، التي تفرض داخليًا nms=True. القيمة الافتراضية هي 0.25 إذا لم تُضبط.
ioufloat0.7عتبة IoU المستخدمة عند إنشاء NMS وقت التصدير: تصديرات nms=True، وتصديرات detect غير الشاملة من Hailo، وتصديرات detect وpose وsegment من IMX، التي تفرض داخليًا nms=True.
max_detint300الحد الأقصى لعدد الاكتشافات المحتفظ بها في مخرجات النموذج المصدّر. ينطبق على تصديرات nms=True في جميع التنسيقات باستثناء اكتشاف CoreML، إذ لا يتضمن مسار NMS الأصلي فيه حدًا أقصى للاكتشافات؛ وينطبق أيضًا على تصديرات الاكتشاف الشامل الخالية من NMS (YOLO26 وYOLOv10، مع تحديد الحد بعدد المراسي المتاحة) وتصديرات detect وpose وsegment من IMX.
agnostic_nmsboolFalseيفعّل NMS غير المرتبط بالفئة في كل موضع يُنشأ فيه NMS وقت التصدير عبر المسار القياسي nms=True، بما في ذلك مرحلة NMS الخاصة بـCoreML، فيكبت الصناديق المتداخلة ذات الدرجات الأقل عبر الفئات المختلفة بدلًا من الاقتصار على الفئة نفسها. لا ينطبق هذا الخيار على إعدادات NMS التي ينشئها Hailo أو IMX، إذ لا تتضمن خيارًا لعدم الارتباط بالفئة وتظل تراعي الفئات بصرف النظر عن هذا العلم. كما يُضمّن هذا الخيار في التصديرات الشاملة الخالية من NMS (YOLO26 وYOLOv10)، حيث لا يفعل سوى منع ظهور الاكتشاف نفسه تحت تسميات فئات متعددة (التكرارات ذات IoU=1.0)، ولا يجري كبتًا قائمًا على عتبة IoU بين الصناديق المختلفة.
batchint1يحدد حجم دفعة الاستدلال لتصدير النموذج، أو الحد الأقصى لعدد الصور التي يعالجها النموذج المُصدّر بالتزامن في وضع predict. تصدّر الصيغ التي لا تتضمن batch ضمن وسيطات التصدير دفعة بحجم 1 (Edge TPU وIMX500 وDEEPX وHailo وAMD Xilinx)، وترفض القيم الأخرى.
devicestrNoneيحدد الجهاز المستخدم للتصدير: GPU (device=0)، أو CPU (device=cpu)، أو MPS لأجهزة Apple silicon (device=mps)، أو NPU من Huawei Ascend (device=npu أو device=npu:0)، أو DLA لأجهزة NVIDIA Jetson (device=dla:0 أو device=dla:1). تستخدم تصديرات TensorRT GPU تلقائيًا، لكن TensorRT 11.0 لا يدعم DLA.
verboseboolFalseيرفع سجل منشئ TensorRT إلى مستوى VERBOSE أثناء تصدير format='engine'. وتتجاهله تنسيقات التصدير الأخرى.
datastrNoneمسار ملف YAML الخاص بـمجموعة البيانات، وهو ضروري لمعايرة تكميم INT8؛ أما التصنيف فيتطلب دليل مجموعة بيانات أو اسم مجموعة بيانات مضمنة. إذا لم يُحدّد هذا الخيار مع تفعيل INT8، تختار Ultralytics مجموعة بيانات معايرة خاصة بالمهمة عند الحاجة، أو تستخدم مجموعة البيانات الافتراضية لمهمة النموذج. تتضمن نقطة التحقق المدرّبة باستخدام quantize=8 نطاقات INT8 الخاصة بها، ولا تحتاج إلى بيانات معايرة.
splitstr'val'جزء مجموعة البيانات ('train' أو 'val' أو 'test') المستخدم لإنشاء أداة تحميل بيانات معايرة تكميم INT8 من data.
fractionfloat أو int أو list1.0مجموعة بيانات المعايرة الفرعية لتكميم INT8: نسبة مئوية أو عدد صور أو قيم [train, val, test]. تعني 1 استخدام الجزء كاملًا، والأعداد الصحيحة الأكبر من 1 هي أعداد الصور، ولا يقبل الإدخال الاختباري الاختياري وحده القيمتين 0/0.0 بمعنى عدم استخدام أي صور. وتُبقي القوائم ذات العنصرين test كاملًا.

يتيح ضبط هذه المعلمات تخصيص عملية التصدير لتلبية متطلبات محددة، مثل بيئة النشر وقيود الأجهزة وأهداف الأداء. ويُعد اختيار التنسيق والإعدادات المناسبة ضروريًا لتحقيق أفضل توازن بين حجم النموذج وسرعته ودقته.

تنسيقات التصدير#

تتوفر تنسيقات التصدير لـ YOLO26 في الجدول أدناه. يمكنك التصدير إلى أي تنسيق باستخدام الوسيط format، مثل format='onnx' أو format='engine'. ويمكنك إجراء التنبؤ أو التحقق مباشرةً على النماذج المُصدّرة، مثل yolo predict model=yolo26n.onnx. تُعرض أمثلة الاستخدام الخاصة بنموذجك بعد اكتمال التصدير. ويمكن أيضًا تصدير النماذج مباشرةً من المتصفح عبر منصة Ultralytics دون أي إعداد محلي.

التنسيقوسيط formatالنموذجالبيانات الوصفيةالوسيطات
PyTorch-yolo26n.pt✅-
TorchScripttorchscriptyolo26n.torchscript✅imgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n.onnx✅imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device
OpenVINOopenvinoyolo26n_openvino_model/✅imgsz, quantize, dynamic, nms, batch, data, fraction, device
TensorRTengineyolo26n.engine✅imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device
CoreMLcoremlyolo26n.mlpackage✅imgsz, dynamic, quantize, nms, batch, device
Apple Core AIcoreaiyolo26n.aimodel✅imgsz, batch, quantize
TF SavedModelsaved_modelyolo26n_saved_model/✅imgsz, quantize, opset, nms, batch, data, fraction, device
TF GraphDefpbyolo26n.pb❌imgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n_edgetpu.tflite✅imgsz, quantize, opset, data, fraction, device
LiteRTlitertyolo26n.tflite✅imgsz, quantize, batch, data, fraction, device
PaddlePaddlepaddleyolo26n_paddle_model/✅imgsz, batch, device
MNNmnnyolo26n.mnn✅imgsz, batch, dynamic, quantize, simplify, opset, nms, device
NCNNncnnyolo26n_ncnn_model/✅imgsz, quantize, batch, device
IMX500imxyolo26n_imx_model/✅imgsz, quantize, data, fraction, nms, device
RKNNrknnyolo26n_rknn_model/✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
ExecuTorchexecutorchyolo26n_executorch_model/✅imgsz, batch, device
Axeleraaxelerayolo26n_axelera_model/✅imgsz, batch, quantize, data, fraction, device
DEEPXdeepxyolo26n_deepx_model/✅imgsz, quantize, simplify, opset, data, optimize, device
Qualcomm QNNqnnyolo26n_qnn.onnx✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
Hailohailoyolo26n_hailo_model/✅imgsz, name, quantize, data, fraction, simplify, conf, iou, device
Huawei Ascendascendyolo26n_ascend_model/✅imgsz, batch, name, quantize, opset, simplify, nms, device
AMD Xilinxxilinxyolo26n_xilinx_model/✅imgsz, name, quantize, data, fraction, opset, simplify, device

يعتمد nms=None على المخرجات الأولية لإجراء NMS خارجي. اضبط nms=False لتحديد رأس متاح خالٍ من NMS؛ وتعود التنسيقات غير المدعومة إلى مسار المخرجات الأصلي الخاص بها. تحدد إدخالات nms أعلاه التنسيقات التي يمكنها تضمين NMS باستخدام nms=True.

التثبيت التلقائي لتبعيات التصدير

تتطلب معظم التنسيقات حزمًا لا تُثبّت مع ultralytics. عند غياب إحدى هذه الحزم، يثبّتها التصدير أثناء التشغيل باستخدام uv أو pip، وعلى Linux يستخدم apt لتثبيت حزم النظام مثل Java لـ IMX. يُنزّل مترجم Edge TPU دون استخدام apt أو sudo. للحفاظ على ثبات البيئة، كما في صورة حاوية أو مهمة CI أو خدمة إنتاج، اضبط YOLO_AUTOINSTALL=False. عندئذٍ يواصل التصدير التحقق من الحزم الناقصة والإبلاغ عنها، لكنه لا يغيّر البيئة، ويتوقف حتى تثبيتها.

export YOLO_AUTOINSTALL=False

خيارات التكميم#

استخدم الوسيط quantize لطلب دقة التصدير. ولا تراعي القيم النصية حالة الأحرف، وتوحّد Ultralytics الأسماء المستعارة المقبولة قبل التصدير:

القيم المطلوبةالقيمة المعتمدةالمعنى
8, "8", "int8", "w8a8"8أوزان وتنشيطات INT8
16, "16", "fp16", "w16a16"16أوزان وتنشيطات FP16
32, "32", "fp32", "w32a32"32تصدير FP32؛ مماثل لعدم التعيين، باستثناء برامج CoreML NMS ML، التي تستخدم FP16 افتراضيًا
"w8a16""w8a16"أوزان INT8 مع تنشيطات بدقة 16 بت (FP16؛ وINT16 في LiteRT)
"w8a32""w8a32"أوزان INT8 مع تنشيطات FP32 (INT8 ديناميكي في LiteRT، دون الحاجة إلى المعايرة)

لا يزال قبول العلامتين القديمتين half=True وint8=True ممكنًا، مع إصدار تحذيرات بإهمالهما وتحويلهما إلى quantize=16 وquantize=8.

لا تدعم جميع تنسيقات التصدير كل مستويات الدقة. وتؤدي طلبات quantize الصريحة إما إلى استخدام مستوى الدقة المطلوب أو إلى الفشل قبل التصدير:

التنسيقFP32 (32/غير محدد)FP16 (16)INT8 (8)W8A16 ("w8a16")ملاحظات
PyTorch✅غير متاحغير متاحغير متاحتنسيق التدريب/نقاط التحقق الأصلي.
TorchScript✅✅ وحدة معالجة الرسومات فقط❌❌يتطلب تصدير TorchScript بدقة FP16 استخدام device=0؛ أما التصدير على وحدة المعالجة المركزية فيكون بدقة FP32.
ONNX✅✅✅❌يستخدم INT8 التكميم الثابت في ONNX Runtime وبيانات المعايرة.
OpenVINO✅✅✅❌يستخدم INT8 التكميم بعد التدريب عبر NNCF.
TensorRT✅✅✅❌يتطلب INT8 بيانات معايرة ممثلة.
CoreML✅¹✅✅✅تكميم CoreML INT8 هو تكميم للأوزان؛ ويستخدم W8A16 أوزان INT8 مع تنشيطات FP16. ¹ تستخدم برامج NMS ML غير المحددة FP16 افتراضيًا، كما أن عمليات تصدير nms=True للتقسيم/تقدير الوضعية تكون دائمًا بدقة FP16.
Core AI✅✅❌❌يستخدم FP32 افتراضيًا، أو أصلًا بدقة FP16 عبر .aimodel مع quantize=16؛ ولا يتوفر مسار INT8.
TF SavedModel✅❌✅❌يستخدم تصدير INT8 معايرة TensorFlow.
TF GraphDef✅❌❌❌لا يوجد تحويل للدقة أثناء التصدير.
Edge TPU❌❌✅ تلقائي❌يتطلب Edge TPU استخدام INT8؛ ويُفعّل تلقائيًا إذا لم يُحدَّد.
LiteRT✅❌✅✅يستخدم INT8 الثابت (8) و"w8a16" (أوزان int8 مع تنشيطات int16) بيانات المعايرة؛ كما يدعم INT8 الديناميكي "w8a32" (دون معايرة). لا يمثل quantize=16 عملية تصدير منفصلة؛ إذ يعمل نموذج FP32 بدقة FP16 أثناء التشغيل عبر مفوض GPU.
PaddlePaddle✅❌❌❌لا يوجد تحويل للدقة أثناء التصدير.
MNN✅✅✅❌يُنفَّذ تكميم INT8 للأوزان من خلال تحويل MNN.
NCNN✅✅❌❌تنسيق تشغيل للأجهزة المحمولة/المضمنة.
IMX500❌❌✅ تلقائي❌يتطلب IMX500 التكميم؛ ويُفعّل INT8 تلقائيًا إذا لم يُحدَّد.
RKNN❌✅ يعتمد على الشريحة✅❌تدعم RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B دقة FP16 أو INT8؛ أما إصدارات RV1103/RV1106 فتدعم INT8 فقط.
ExecuTorch✅❌❌❌لا يوجد تحويل للدقة أثناء التصدير.
Axelera❌❌✅ تلقائي❌يتطلب تصدير Axelera استخدام INT8؛ ويُفعّل تلقائيًا إذا لم يُحدَّد.
DEEPX❌❌✅ تلقائي❌يتطلب تصدير DEEPX استخدام INT8؛ ويُفعّل تلقائيًا إذا لم يُحدَّد.
Qualcomm QNN❌❌❌✅ تلقائيتصدير QNN HTP ثابت على أوزان INT8 مع تنشيطات بدقة 16 بت.
Hailo❌❌✅ تلقائي❌يتطلب تصدير Hailo استخدام INT8؛ ويُفعّل تلقائيًا إذا لم يُحدَّد.
Huawei Ascend❌✅ تلقائي❌❌لا تقبل عمليات الالتفاف في Ascend AI Core إلا مدخلات FP16/INT8، لذا يترجم ATC النموذج إلى FP16؛ ويُفعّل تلقائيًا إذا لم يُحدَّد.
AMD Xilinx❌❌✅ تلقائي❌يتطلب تصدير AMD Xilinx استخدام Vitis AI INT8 (VINT8)، ويُفعّل هذا الخيار تلقائيًا إذا لم يُحدّد.

في عمليات تصدير INT8 وW8A16، قدّم بيانات معايرة ممثلة باستخدام data، مثل data="coco8.yaml"، ما لم توثّق عملية التكامل المستهدفة سلوكًا افتراضيًا أو تفعيلًا تلقائيًا. ولا يحتاج مخطط "w8a32" في LiteRT (INT8 الديناميكي) إلى بيانات معايرة.

التدريب الواعي بالتكميم#

تُعد عمليات تصدير INT8 أعلاه تكميمًا بعد التدريب (PTQ): إذ تُرصد النطاقات خلال تمريرة معايرة واحدة على data. أما التدريب الواعي بالتكميم (QAT)، فيعلّم الأوزان تحمّل INT8 عبر الضبط الدقيق باستخدام التكميم الوهمي ضمن حلقة التدريب، ما يستعيد الدقة التي تفقدها المعايرة وحدها. مرّر quantize=8 إلى train لضبط نقطة تحقق مدرّبة مسبقًا بدقة، ثم صدّرها بالطريقة المعتادة:

مثال
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(
    data="coco.yaml",
    quantize=8,
    epochs=5,
    batch=64,
    optimizer="AdamW",
    lr0=0.00001,
    lrf=0.1,
    warmup_epochs=0.5,
    cos_lr=True,
    mosaic=0.0,
)
model.export(format="engine", quantize=8)  # ⁨تنتقل النطاقات مع نقطة التحقق، لذا لا حاجة إلى بيانات معايرة⁩

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

تعتمد جدوى QAT على مدى جودة تعامل المعايرة الخاصة بواجهة التصدير الخلفية مع النموذج. القيم أدناه هي mAP50-95 على COCO val2017، مقاسةً باستخدام محركات TensorRT 10.16 عند imgsz=640 وحجم دفعة 1، حيث دُرّبت كل نقطة تحقق لـ QAT باستخدام epochs=20 patience=3:

النموذجمحرك FP32محرك INT8 بتكميم PTQمحرك INT8 بتكميم QAT
yolo26n0.40320.39340.3935
yolo26s0.47940.44120.4711
yolo26m0.52690.46960.5137
yolo26l0.54400.48890.5307
yolo26x0.57010.51380.5527

تتراوح خسارة QAT بين 0.008 و0.017 من mAP50-95 مقارنةً بـ FP32 عبر النطاق كله، بينما تبلغ خسارة التكميم بعد التدريب 0.010 على yolo26n و0.038 إلى 0.057 على النماذج الأكبر. لذا لا يحقق QAT سوى فائدة ضئيلة جدًا على أصغر نموذج، حيث تعمل المعايرة جيدًا بالفعل، ويحقق تحسنًا قدره 0.030 إلى 0.044 على النماذج الأخرى. توقّع نتائج مختلفة عند استخدام مجموعة بيانات أو تنسيق تصدير أو إصدار TensorRT آخر، وقِس النتائج بنفسك.

تتطلب نماذج QAT استخدام compile=False؛ إذ لا تدعم الوحدات المكمّمة في ModelOpt استخدام torch.compile.

تُترك عمليات الالتفاف النهائية في مخرجات الرأس عمدًا بدقة عائمة للحد من خسارة دقة INT8؛ ويُفعّل TensorRT الدقة المختلطة FP16 لطبقاته غير المكمّمة. يُنفَّذ QAT عبر NVIDIA TensorRT Model Optimizer، الذي يُثبَّت تلقائيًا عند الاستخدام لأول مرة، ويلزم تثبيته لتحميل نقطة التحقق الناتجة. تنتقل تلك النطاقات مع نقطة التحقق، وتُصدر عمليتا التصدير onnx وengine هذه النطاقات على هيئة عُقد Q/DQ؛ أما التنسيقات الأخرى فتقرأ بيانات المعايرة بدلًا من ذلك، وترفض نقطة تحقق QAT.

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

للتعرّف على كيفية تشغيل النموذج المُصدّر، اطّلع على دليل التكامل الخاص بوجهة النشر — تتوفر أدلة ONNX وTensorRT وCoreML وغيرها ضمن قائمة عمليات التكامل الكاملة.

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

  • يُعد تصدير نموذج YOLO26 إلى تنسيق ONNX أمرًا مباشرًا باستخدام Ultralytics. وتتيح المنصة طريقتَي Python وCLI لتصدير النماذج.

    مثال
    from ultralytics import YOLO
    
    # ⁨تحميل نموذج⁩
    model = YOLO("yolo26n.pt")  # ⁨حمّل نموذجًا رسميًا⁩
    model = YOLO("path/to/best.pt")  # ⁨حمّل نموذجًا مخصصًا مدرّبًا⁩
    
    # ⁨صدّر النموذج⁩
    model.export(format="onnx")

    لمزيد من التفاصيل حول العملية، بما في ذلك الخيارات المتقدمة مثل التعامل مع أحجام الإدخال المختلفة، راجع دليل تكامل ONNX.

  • يوفر استخدام TensorRT لتصدير النماذج تحسينات كبيرة في الأداء. إذ يمكن لنماذج YOLO26 المُصدّرة إلى TensorRT تحقيق تسريع يصل إلى 5 أضعاف على GPU، ما يجعلها مثالية لتطبيقات الاستدلال في الوقت الفعلي.

    • تعدد الاستخدامات: حسّن النماذج لتناسب إعدادًا محددًا للأجهزة.
    • السرعة: حقق استدلالًا أسرع من خلال التحسينات المتقدمة.
    • التوافق: تكامل بسلاسة مع أجهزة NVIDIA.

    لمعرفة المزيد حول تكامل TensorRT، راجع دليل تكامل TensorRT.

  • يُعد تكميم INT8 وسيلة ممتازة لضغط النموذج وتسريع الاستدلال، لا سيما على الأجهزة الطرفية. إليك كيفية تفعيل تكميم INT8:

    مثال
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")  # ⁨تحميل نموذج⁩
    model.export(format="onnx", quantize=8, data="coco8.yaml")

    يمكن تطبيق تكميم INT8 على صيغ مثل ONNX وTensorRT وOpenVINO وCoreML وRockchip RKNN وAMD Xilinx. للحصول على أفضل نتائج التكميم، وفّر مجموعة بيانات تمثيلية باستخدام المعلمة data. راجع خيارات التكميم لمعرفة القيم المقبولة لـquantize والصيغ المدعومة.

  • يتيح حجم الإدخال الديناميكي للنموذج المُصدّر التعامل مع أبعاد صور متفاوتة، ما يوفر مرونة ويحسّن كفاءة المعالجة لمختلف حالات الاستخدام. وعند التصدير إلى تنسيقات مثل ONNX أو TensorRT، يضمن تفعيل حجم الإدخال الديناميكي قدرة النموذج على التكيّف بسلاسة مع أشكال الإدخال المختلفة.

    لتفعيل هذه الميزة، استخدم العلامة dynamic=True أثناء التصدير:

    مثال
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    model.export(format="onnx", dynamic=True)

    يكون تحديد حجم الإدخال ديناميكيًا مفيدًا بوجه خاص للتطبيقات التي قد تتفاوت فيها أبعاد الإدخال، مثل معالجة الفيديو أو التعامل مع صور من مصادر مختلفة.

  • تستخدم نماذج PyTorch وعمليات التصدير الديناميكية الحشو بالمستطيل الأدنى افتراضيًا، بينما تحشو عمليات التصدير الثابتة إلى imgsz كامل؛ لذا قد تختلف الكشوف القريبة من عتبة الثقة. استخدم rect=False للاستدلال الأصلي لمطابقة تصدير ثابت، أو صدّر باستخدام dynamic=True حيثما كان ذلك مدعومًا.

  • يُعد فهم وسيطات التصدير وضبطها أمرًا أساسيًا لتحسين أداء النموذج:

    • format: تنسيق الهدف للنموذج المُصدّر (مثل onnx وtorchscript وsaved_model).
    • imgsz: حجم الصورة المطلوب لإدخال النموذج (مثل 640 أو (height, width)).
    • quantize: دقة التكميم، مثل 8/"int8" أو 16/"fp16" أو 32/"fp32"، أو مخططات الأوزان/التنشيطات المختلطة "w8a16" و"w8a32" (INT8 ديناميكي في LiteRT) على التنسيقات المدعومة. راجع خيارات التكميم.
    • dynamic: يقبل أحجام إدخال متغيرة في التنسيقات التي تدعم الأشكال الديناميكية، مثل ONNX وOpenVINO وTensorRT.
    • nms: يختار المخرجات الخام لاستخدام NMS خارجي (None)، أو NMS مضمّن (True)، أو الرأس الخالي من NMS (False).
    • device: الجهاز المستخدم لتتبّع النموذج أثناء التصدير، مثل cpu أو 0 لاستخدام أول GPU عبر CUDA؛ ويتطلب TorchScript بدقة FP16 استخدام GPU.

    للنشر على منصات أجهزة محددة، فكّر في استخدام تنسيقات تصدير متخصصة مثل TensorRT لوحدات GPU من NVIDIA، وCoreML لأجهزة Apple، وEdge TPU لأجهزة Google Coral.

  • عند تصدير نموذج YOLO إلى تنسيقات مثل ONNX أو TensorRT، تعتمد بنية موتر الإخراج على مهمة النموذج. ويُعد فهم هذه المخرجات مهمًا لتنفيذ الاستدلال المخصص.

    بالنسبة إلى نماذج الكشف YOLO26 (مثل yolo26n.pt) المُصدَّرة باستخدام nms=False، تنتج التنسيقات المدعومة مخرجات لا تستخدم NMS، بأبعاد مثل (batch_size, max_detections, 6) وبقيم [x1, y1, x2, y2, confidence, class_id]. ومع max_det=300 الافتراضي، تكون هذه عادةً (batch_size, 300, 6). وتعود بعض التنسيقات المقيّدة تلقائيًا إلى تخطيط المخرجات التقليدي عندما لا تكون عوامل التشغيل الشاملة من البداية إلى النهاية مدعومة.

    افتراضيًا (nms=None)، تُصدِّر نماذج الكشف، بما فيها YOLO26، تنبؤات خامًا من نوع one-to-many: تكون المخرجات عادةً موترًا واحدًا بأبعاد مثل (batch_size, 4 + num_classes, num_predictions)، حيث تمثل القنوات إحداثيات الصناديق ودرجات كل فئة، وتعتمد num_predictions على دقة الإدخال المستخدمة في التصدير (وقد تكون ديناميكية). يوضح دليل الكشف الشامل من البداية إلى النهاية التنسيقات التي تحتفظ بمخرجات الكشف الشامل من البداية إلى النهاية.

    بالنسبة إلى نماذج التقسيم (مثل yolo26n-seg.pt)، ستحصل عادةً على مخرجين: الموتر الأول بأبعاد مثل (batch_size, 4 + num_classes + mask_dim, num_predictions) (الصناديق ودرجات الفئات ومعاملات الأقنعة)، والموتر الثاني بأبعاد مثل (batch_size, mask_dim, proto_h, proto_w)، ويحتوي على نماذج أولية للأقنعة تُستخدم مع المعاملات لإنشاء أقنعة المثيلات. وتعتمد الأحجام على دقة الإدخال المستخدمة في التصدير (وقد تكون ديناميكية).

    بالنسبة إلى نماذج الوضعيات (مثل yolo26n-pose.pt)، تكون أبعاد موتر الإخراج عادةً مثل (batch_size, 4 + num_classes + keypoint_dims, num_predictions)، وتعتمد keypoint_dims على مواصفات الوضعية (مثل عدد النقاط المفتاحية وما إذا كانت الثقة مضمنة)، بينما تعتمد num_predictions على دقة الإدخال المستخدمة في التصدير (وقد تكون ديناميكية).

    توضح الأمثلة الواردة في أمثلة الاستدلال باستخدام ONNX كيفية معالجة هذه المخرجات لكل نوع من النماذج.

  • لا توفر Ultralytics حاليًا واجهة API مخصصة للاستدلال باستخدام C++ لنماذج YOLO. لنشر النماذج باستخدام C++، صدِّر النموذج إلى تنسيق تشغيل مثل ONNX أو TensorRT أو TorchScript أو MNN، ثم حمِّل الملف المُصدَّر باستخدام واجهة C++ الأصلية لبيئة التشغيل المعنية.

    على سبيل المثال، صدِّر نموذج كشف باستخدام yolo export model=yolo26n.pt format=onnx وشغِّل الملف .onnx باستخدام ONNX Runtime بلغة C++، أو صدِّره باستخدام format=engine وشغِّل محرّك TensorRT من تطبيق TensorRT بلغة C++. عند استخدام معالجة لاحقة مخصصة بلغة C++، طابق تخطيط موتر الإخراج مع المهمة وإعدادات التصدير؛ إذ تُرجع صادرات الكشف الافتراضية لـ YOLO26 موترات تنبؤ خامًا تتطلب تطبيق NMS خارجيًا. صدِّر باستخدام nms=False للحصول على اكتشافات لا تستخدم NMS بأبعاد (batch, max_det, 6)، أو باستخدام nms=True لتضمين NMS في التنسيقات المدعومة.

  • عند التصدير باستخدام quantize=16 (FP16) أو quantize=8 (INT8)، تُحوَّل معظم الموترات إلى دقة أقل لتقليل حجم النموذج وتحسين الأداء. لكن عند تفعيل nms=False، تُضمَّن المعالجة اللاحقة (بما فيها فهارس الفئات) مباشرةً في الرسم البياني المُصدَّر.

    يحتوي موتر output0 على فهارس الفئات، التي تُمثَّل داخليًا بقيم الفاصلة العائمة. ولا يستطيع FP16 تمثيل القيم الصحيحة التي تتجاوز 2048 تمثيلًا موثوقًا به، بسبب محدودية دقة المانتيسا. لتجنب فقدان الدقة المحتمل أو معرّفات الفئات غير الصحيحة، يُحتفظ عمدًا بـ output0 بدقة FP32.

    إذا كانت المخرجات بدقة FP16 بالكامل مطلوبة، فصدِّر باستخدام nms=None على وحدة GPU ونفِّذ المعالجة اللاحقة خارجيًا. وتحتفظ صادرات ONNX بدقة FP16 على وحدة CPU بمدخلات ومخرجات FP32 على أي حال، إذ لا تحوّل إلا الرسم البياني الداخلي.

التعليقات