تصدير النموذج باستخدام Ultralytics YOLO#
مقدمة#
الهدف النهائي من تدريب النموذج هو نشره في تطبيقات العالم الحقيقي. يوفر وضع التصدير في Ultralytics YOLO26 مجموعة متنوعة من الخيارات لتصدير النموذج المدرب الخاص بك إلى صيغ مختلفة، مما يجعله قابلاً للنشر عبر منصات وأجهزة متعددة. يهدف هذا الدليل الشامل إلى إرشادك خلال تفاصيل تصدير النموذج، مع توضيح كيفية تحقيق أقصى قدر من التوافق والأداء.
Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀
لماذا تختار وضع التصدير في YOLO26؟#
- التعددية: التصدير إلى تنسيقات متعددة تشمل ONNX وTensorRT وCoreML والمزيد.
- الأداء: احصل على تسریع حتى 5 أضعاف على وحدة معالجة الرسومات (GPU) باستخدام TensorRT وتسريع حتى 3 أضعاف على وحدة المعالجة المركزية (CPU) باستخدام ONNX أو OpenVINO.
- التوافق: اجعل نموذجك قابلاً للنشر عالمياً عبر العديد من بيئات الأجهزة والبرمجيات.
- سهولة الاستخدام: واجهة سطر أوامر (CLI) بسيطة وواجهة برمجة تطبيقات (API) بلغة Python لتصدير النموذج بسرعة وسهولة.
الميزات الرئيسية لوضع التصدير#
إليك بعض الوظائف البارزة:
- تصدير بنقرة واحدة: أوامر بسيطة للتصدير إلى صيغ مختلفة.
- تصدير الدفعات (Batch Export): تصدير نماذج قادرة على الاستدلال بالدفعات.
- استدلال محسّن: يتم تحسين النماذج المصدرة للحصول على أوقات استدلال أسرع.
- فيديوهات تعليمية: أدلة ودروس متعمقة للحصول على تجربة تصدير سلسة.
أمثلة الاستخدام#
قم بتصدير نموذج YOLO26n إلى صيغة مختلفة مثل ONNX أو TensorRT. راجع قسم الوسائط أدناه للحصول على قائمة كاملة بوسائط التصدير.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom-trained model
# Export the model
model.export(format="onnx")الوسائط (Arguments)#
يفصل هذا الجدول التكوينات والخيارات المتاحة لتصدير نماذج YOLO إلى صيغ مختلفة. تعتبر هذه الإعدادات حاسمة لتحسين أداء النموذج المصدر وحجمه وتوافقه عبر مختلف المنصات والبيئات. يضمن التكوين الصحيح أن النموذج جاهز للنشر في التطبيق المقصود بأعلى كفاءة.
| الوسيط | النوع | الافتراضي | الوصف |
|---|---|---|---|
format | str | 'torchscript' | التنسيق المستهدف للنموذج المُصدَّر، مثل 'onnx'، أو 'torchscript'، أو 'engine' (TensorRT)، أو غيرها. يتيح كل تنسيق التوافق مع بيئات نشر مختلفة. |
name | str | None | اسم الهدف المادي للتنسيقات التي تتطلب واحداً: معمكية Hailo ('hailo8'، 'hailo8l'، 'hailo10h'، 'hailo15h'، 'hailo15l'؛ الافتراضي هو 'hailo8l')، شريحة Rockchip RKNN (الافتراضي هو 'rk3588')، وحدة Huawei Ascend SoC (--soc_version لـ CANN؛ الافتراضي هو 'Ascend310B4')، أو هدف Qualcomm QNN HTP (الافتراضي هو '73'). يختلف عن زوج تسمية التشغيل project/name المستخدم بواسطة الأوضاع الأخرى. |
imgsz | int أو tuple | 640 | حجم الصورة المطلوب لإدخال النموذج. يمكن أن يكون رقماً صحيحاً للصور المربعة (على سبيل المثال، 640 لـ 640×640) أو مجموعة (height, width) للأبعاد المحددة. عندما لا يتم تمريره، يعيد التصدير استخدام حجم التدريب المسجل في نقطة التحقق المحملة: تسجل نقاط التحقق الرسمية لـ YOLO26 768 للعمق، و224 للتصنيف، و1024 لـ OBB و640 للمهام الأخرى، بينما تسجل عملية الضبط الدقيق أي imgsz تم التدريب عليها. النموذج المبني من ملف YAML ليس لديه حجم تدريب مسجل ويستخدم 640. |
keras | bool | False | يمكّن التصدير إلى تنسيق Keras لـ TensorFlow SavedModel، مما يوفر التوافق مع خدمة TensorFlow وواجهات برمجة التطبيقات (APIs). |
optimize | bool | False | تمكين تحسين المترجم (compiler optimization) بشكل أعلى لـ DEEPX، مما يقلل من زمن انتقال الاستدلال (inference latency) بينما يزيد من وقت التجميع (compilation time). |
quantize | int أو str | None | دقة التقييس: 16 (FP16، يقلل من حجم النموذج ويمكن أن يسرع الاستدلال على الأجهزة المدعومة) أو 8 (INT8/PTQ، يضغط النموذج بشكل أكبر مع الحد الأدنى من فقدان الدقة، في المقام الأول لـ أجهزة الحافة (edge devices)؛ يحتاج إلى معايرة data/fraction)؛ يعتبر 32/غير المعين هو FP32. تقبل تنسيقات التصدير التي تدعم دقة الوزن/التنشيط المختلطة أيضًا تدوين 'w8a8'/'w16a16'/'w8a16'/'w8a32'. يحل محل علامات half/int8 المُهملة (half=True ← 16، int8=True ← 8، لا تزال مقبولة مع تحذير بالإهمال). يُسمح فقط بالدقات التي يدعمها التنسيق المستهدف (انظر أدناه). |
dynamic | bool | False | يسمح بأحجام مدخلات ديناميكية لتصديرات TorchScript و ONNX و OpenVINO و TensorRT و CoreML، مما يعزز المرونة في التعامل مع أبعاد الصور المتغيرة. |
simplify | bool | True | يبسط رسم البياني المتوسط لـ ONNX مع onnxslim للصادرات التي تبني واحدًا (انظر تنسيقات التصدير)، مما قد يحسن الأداء والتوافق مع محركات الاستدلال. |
opset | int | None | يحدد إصدار opset لـ ONNX للصادرات التي تبني رسم بياني ONNX (انظر تنسيقات التصدير)، للتوافق مع محللات ومُشغلات ONNX المختلفة. إذا لم يتم تعيينه، فإنه يستخدم أحدث إصدار مدعوم. |
workspace | float أو None | None | يُعيّن الحد الأقصى لحجم مساحة العمل بـ GiB لتحسينات TensorRT، مما يوازن بين استخدام الذاكرة والأداء. استخدم None للتخصيص التلقائي بواسطة TensorRT حتى الحد الأقصى للجهاز. |
nms | bool | False | يضيف إلغاء القمع غير الأقصى (NMS) إلى النموذج المُصدَّر عندما يكون مدعومًا (انظر تنسيقات التصدير)، مما يحسن كفاءة معالجة الكشف اللاحقة. غير متاح لنماذج end2end. بالنسبة لـ CoreML، مدعوم فقط لنماذج الكشف. |
conf | float | None | عتبة الثقة المستخدمة في أي مكان يتم فيه إنشاء NMS وقت التصدير: صادرات nms=True؛ صادرات الكشف التي ليست من طرف إلى طرف لـ Hailo؛ وصادرات الكشف وتحديد الوضع والتقسيم لـ IMX، والتي تفرض nms=True داخليًا. تعود افتراضيًا إلى 0.25 عند عدم التحديد، باستثناء صادرات IMX، التي تعود افتراضيًا إلى 0.001. |
iou | float | 0.7 | عتبة IoU المستخدمة في أي مكان يتم فيه إنشاء NMS وقت التصدير: صادرات nms=True؛ صادرات الكشف التي ليست من طرف إلى طرف لـ Hailo؛ وصادرات الكشف وتحديد الوضع والتقسيم لـ IMX، والتي تفرض nms=True داخليًا. |
max_det | int | 300 | الحد الأقصى لعدد الاكتشافات المحتفظ بها في مخرجات النموذج المصدر. ينطبق على صادرات nms=True في كل تنسيق باستثناء CoreML، الذي لا يحتوي خط أنابيب NMS الخاص به على حد أقصى للاكتشاف، بالإضافة إلى صادرات الكشف من طرف إلى طرف الخالية من NMS (YOLO26 وYOLOv10، والمقيدة بعدد المراسي المتاحة) وصادرات الكشف وتحديد الوضع والتقسيم لـ IMX. |
agnostic_nms | bool | False | يُفَعِّل NMS المستقل عن الفئة أينما تم إنشاء NMS وقت التصدير من خلال خط أنابيب nms=True القياسي، بما في ذلك مرحلة NMS الخاصة بـ CoreML، حيث يكتم الصناديق المتراكبة ذات النقاط الأقل عبر الفئات المختلفة بدلاً من الفئة نفسها فقط. لا يتم دعم ذلك بواسطة تكوينات NMS التي تم إنشاؤها بواسطة Hailo أو IMX، والتي ليس لها خيار مستقل عن الفئة وتظل واعية بالفئة بغض النظر عن هذا العلامة. كما أنه مدمج في عمليات التصدير ذات النهاية إلى النهاية الخالية من NMS (YOLO26، YOLOv10)، حيث يمنع فقط ظهور نفس الاكتشاف تحت تسميات فئات متعددة (نسخ متطابقة IoU=1.0)، وليس كتم عتبة IoU بين الصناديق المتميزة. |
batch | int | 1 | يحدد حجم استدلال دفعة نموذج التصدير أو الحد الأقصى لعدد الصور التي سيعالجها النموذج المُصدَّر بالتزامن في وضع predict. بالنسبة لصادرات Edge TPU، يتم تعيين هذا تلقائيًا إلى 1. |
device | str | None | يحدد جهاز التصدير: وحدة معالجة رسومات GPU (device=0)، أو وحدة معالجة مركزية CPU (device=cpu)، أو MPS لسيليكون Apple (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. |
verbose | bool | False | يرفع مستوى سجل منشئ TensorRT إلى درجة الخطورة VERBOSE أثناء تصدير format='engine'. تتجاهله تنسيقات التصدير الأخرى. |
data | str | None | المسار إلى ملف YAML لـ مجموعة البيانات، وهو أساسي لمعايرة التكميم INT8؛ وبدلاً من ذلك، يقبل التصنيف دليل مجموعة البيانات أو اسم مجموعة بيانات مدمج. إذا لم يتم تحديده مع تفعيل INT8، فإن Ultralytics يختار مجموعة بيانات معايرة خاصة بالمهمة حيثما لزم الأمر، أو يرجع إلى مجموعة بيانات افتراضية لمهمة النموذج. |
split | str | 'val' | تقسيم مجموعة البيانات ('train'، أو 'val'، أو 'test') المستخدم لبناء مُحمِّل بيانات معايرة التكميم INT8 من data. |
fraction | float أو int أو list | 1.0 | الجزئية الفرعية لمجموعة البيانات المستخدمة لمعايرة INT8: نسبة، أو عدد صور، أو نسب/أعداد [train, val]. يحدد الرقم الصحيح 1 صورة واحدة، بينما يحدد الرقم العشري 1.0 كل الصور. تقيد القائمة train أو val؛ بينما تظل test كاملة. |
end2end | bool | None | يتجاوز وضع النهاية إلى النهاية في نماذج YOLO التي تدعم الاستدلال الخالي من NMS (YOLO26، YOLOv10). يتيح لك تعيينه إلى False تصدير هذه النماذج لتكون متوافقة مع خط أنابيب المعالجة اللاحقة القائم على NMS التقليدي. انظر دليل الكشف من النهاية إلى النهاية للحصول على التفاصيل. |
يتيح ضبط هذه المعلمات تخصيص عملية التصدير لتناسب المتطلبات المحددة، مثل بيئة النشر، وقيود الأجهزة، وأهداف الأداء. يعد اختيار التنسيق والإعدادات المناسبة أمراً ضرורياً لتحقيق أفضل توازن بين حجم النموذج، والسرعة، والدقة.
تنسيقات التصدير#
تتوفر تنسيقات تصدير YOLO26 في الجدول أدناه. يمكنك التصدير إلى أي تنسيق باستخدام الوسيطة format، أي format='onnx' أو format='engine'. يمكنك إجراء التنبؤ أو التحقق من الصحة مباشرة على النماذج المصدرة، أي yolo predict model=yolo26n.onnx. تظهر أمثلة الاستخدام لنموذجك بعد اكتمال التصدير. يمكن أيضاً تصدير النماذج مباشرة من المتصفح على Ultralytics Platform دون أي إعداد محلي.
| التنسيق | وسيط format | النموذج | البيانات الوصفية | الوسائط (Arguments) |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz، quantize، dynamic، simplify، opset، nms، batch، data، fraction، device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz، quantize، dynamic، nms، batch، data، fraction، device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz، quantize، dynamic، simplify، opset، workspace، nms، batch، data، fraction، device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz، keras، quantize، opset، nms، batch، data، fraction، device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz، batch، device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz، batch، dynamic، quantize، simplify، opset، nms، device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz، batch، name، quantize، simplify، opset، data، fraction، device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz، batch، device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz، batch، name، quantize، simplify، opset، data، fraction، device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz، name، quantize، data، fraction، simplify، conf، iou |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz، batch، quantize |
خيارات التكميم (Quantization Options)#
استخدم الوسيطة 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 | ✅ | ✅ GPU فقط | ❌ | ❌ | تصدير FP16 TorchScript يتطلب device=0؛ تصدير وحدة المعالجة المركزية (CPU) يكون FP32. |
| ONNX | ✅ | ✅ | ✅ | ❌ | يستخدم INT8 تقنية التكميم الثابت في ONNX Runtime وبيانات المعايرة. |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | يستخدم INT8 تقنية التكميم بعد التدريب من NNCF. |
| TensorRT | ✅ | ✅ | ✅ | ❌ | يتطلب INT8 بيانات معايرة تمثيلية. |
| CoreML | ✅¹ | ✅ | ✅ | ✅ | تنسيق CoreML INT8 هو تكميم للأوزان؛ بينما يستخدم W8A16 أوزان INT8 مع تفعيلات FP16. ¹برامج NMS ML غير المعينة تعتمد افتراضياً على FP16. |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | يستخدم تصدير INT8 معايرة TensorFlow. |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | لا يوجد تحويل للدقة أثناء وقت التصدير. |
| Edge TPU | ❌ | ❌ | ✅ تلقائي | ❌ | يتطلب Edge TPU صيغة INT8؛ يتم تفعيلها تلقائياً عند تركها غير محددة. |
| 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-بت. |
| LiteRT | ✅ | ❌ | ✅ | ✅ | تستخدم INT8 الثابتة (8) و"w8a16" (أوزان int8 + تنشيطات int16) بيانات المعايرة؛ كما تدعم "w8a32" INT8 الديناميكية (بدون معايرة). quantize=16 ليس تصديراً منفصلاً؛ نموذج FP32 يعمل بـ FP16 وقت التشغيل عبر مفوض وحدة معالجة الرسومات (GPU). |
| Huawei Ascend | ❌ | ✅ تلقائي | ❌ | ❌ | تقبل عمليات الالتفاف في نواة Ascend AI مدخلات من نوع FP16/INT8 فقط، لذا يقوم محول ATC بتجميع نماذج FP16؛ ويتم تفعيل هذه الخاصية تلقائياً إذا لم يتم ضبطها. |
بالنسبة لتصديرات INT8 وW8A16، قم بتوفير بيانات معايرة تمثيلية باستخدام data، مثل data="coco8.yaml"، ما لم توثق تكاملات الهدف سلوكاً افتراضياً أو مُمكّناً تلقائياً. لا يحتاج مخطط LiteRT "w8a32" (INT8 ديناميكي) إلى بيانات معايرة.
ما هي الخطوة التالية#
ابحث عن دليل تكامل هدف نشرك — ONNX وTensorRT وCoreML والمزيد موجودة في قائمة التكاملات الكاملة — لمعرفة كيفية تشغيل النموذج المصدر.
الأسئلة الشائعة#
تصدير نموذج YOLO26 إلى صيغة ONNX أمر مباشر مع Ultralytics. فهو يوفر كلاً من طرق Python و CLI لتصدير النماذج.
مثالfrom ultralytics import YOLO # Load a model model = YOLO("yolo26n.pt") # load an official model model = YOLO("path/to/best.pt") # load a custom-trained model # Export the model model.export(format="onnx")لمزيد من التفاصيل حول العملية، بما في ذلك الخيارات المتقدمة مثل التعامل مع أحجام المدخلات المختلفة، راجع دليل تكامل ONNX.
يوفر استخدام TensorRT لتصدير النموذج تحسينات كبيرة في الأداء. يمكن لنماذج YOLO26 المصدرة إلى TensorRT تحقيق زيادة في سرعة GPU تصل إلى 5 أضعاف، مما يجعلها مثالية لتطبيقات الاستدلال في الوقت الفعلي.
- تعدد الاستخدامات: تحسين النماذج لإعدادات أجهزة محددة.
- السرعة: تحقيق استدلال أسرع من خلال تحسينات متقدمة.
- التوافق: التكامل بسلاسة مع أجهزة NVIDIA.
لمعرفة المزيد حول دمج TensorRT، راجع دليل تكامل TensorRT.
يعد تكميم INT8 طريقة ممتازة لضغط النموذج وتسريع الاستدلال، خاصة على أجهزة الحافة. إليك كيفية تمكين تكميم INT8:
مثالfrom ultralytics import YOLO model = YOLO("yolo26n.pt") # Load a model model.export(format="onnx", quantize=8, data="coco8.yaml")يمكن تطبيق تكميم INT8 على تنسیقات مثل ONNX وTensorRT وOpenVINO وCoreML وRockchip RKNN. للحصول على نتائج تكميم مثالية، توفير مجموعة بيانات تمثيلية باستخدام معلمة
data. انظر خيارات التكميم لمعرفة قيمquantizeالمقبولة والتنسيقات المدعومة.يتيح حجم المدخلات الديناميكي للنموذج المصدر التعامل مع أبعاد صور مختلفة، مما يوفر المرونة ويحسن كفاءة المعالجة لحالات الاستخدام المختلفة. عند التصدير إلى تنسيقات مثل ONNX أو TensorRT، يضمن تمكين حجم المدخلات الديناميكي قدرة النموذج على التكيف مع أشكال المدخلات المختلفة بسلاسة.
تمكين هذه الميزة، استخدم علامة
dynamic=Trueأثناء التصدير:مثالfrom ultralytics import YOLO model = YOLO("yolo26n.pt") model.export(format="onnx", dynamic=True)تعد ميزة تغيير حجم المدخلات ديناميكياً مفيدة بشكل خاص للتطبيقات التي قد تختلف فيها أبعاد المدخلات، مثل معالجة الفيديو أو عند التعامل مع صور من مصادر مختلفة.
يعد فهم وسائط التصدير وتكوينها أمراً بالغ الأهمية لتحسين أداء النموذج:
format:التنسيق المستهدف للنموذج المصدر (مثلonnx،torchscript،tensorflow).imgsz:حجم الصورة المطلوب لمدخلات النموذج (مثل640أو(height, width)).quantize:دقة التكميم، مثل8/"int8"،16/"fp16"،32/"fp32"، أو مخططات الوزن/التنشيط المختلطة"w8a16"و"w8a32"(LiteRT INT8 ديناميكي) على التنسيقات المدعومة. انظر خيارات التكميم.optimize:يتيح تحسين المترجم بشكل أكبر لتصديرات DEEPX.
للنشر على منصات الأجهزة المحددة، فكر في استخدام تنسيقات تصدير متخصصة مثل TensorRT لوحدات معالجة الرسومات من NVIDIA، أو CoreML لأجهزة Apple، أو Edge TPU لأجهزة Google Coral.
عند تصدير نموذج YOLO إلى صيغ مثل ONNX أو TensorRT، يعتمد هيكل مصفوفة الإخراج على مهمة النموذج. يعد فهم هذه المخرجات مهماً لتنفيذات الاستدلال المخصصة.
بالنسبة لـ نماذج كشف YOLO26 (مثل
yolo26n.pt)، يتم تمكين التصدير من البداية إلى النهاية افتراضياً في التنسيقات التي تدعمه، بحيث يكون شكل الإخراج مثل(batch_size, max_detections, 6)بقيم[x1, y1, x2, y2, confidence, class_id]. مع استخدامmax_det=300الافتراضي، يكون هذا عادة(batch_size, 300, 6). تعود بعض التنسيقات المقيدة تلقائياً إلى تخطيط الإخراج التقليدي عندما تكون مشغلات البداية إلى النهاية غير مدعومة.بالنسبة لنماذج الكشف التي ليست من البداية إلى النهاية، أو نماذج YOLO26 المصدرة باستخدام
end2end=False، يكون الإخراج عادة موترًا واحدًا على شكل(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 من البداية إلى النهاية(batch, max_det, 6)، بينما تُرجع التصديرات التي ليست من البداية إلى النهاية موترات التنبؤ الخام التي تتطلب معالجة لاحقة خارجية.عند التصدير باستخدام
quantize=16(FP16) أوquantize=8(INT8)، يتم تحويل معظم الموترات إلى دقة أقل لتقليل حجم النموذج وتحسين الأداء. ومع ذلك، عند تمكينend2end=True، يتم تضمين المعالجة اللاحقة (بما في ذلك مؤشرات الفئات) مباشرة في الرسم البياني المصدر.يحتوي موتر
output0على مؤشرات الفئات، والتي يتم تمثيلها داخليًا كقيم عائمة. لا يمكن لـ FP16 تمثيل القيم الصحيحة التي تزيد عن 2048 بشكل موثوق بسبب دقة المانتيسا المحدودة لديه. لتجنب أي فقد محتمل للدقة أو معرفات فئات غير صحيحة، يتم الاحتفاظ بـoutput0في FP32 عن قصد.هذا السلوك متوقع وينطبق أيضاً على التصديرات ذات الدقة المنخفضة أو المكممة حيث يجب الحفاظ على دقة فهرس الفئة.
إذا كانت مخرجات FP16 الكاملة مطلوبة، قم بالتصدير باستخدام
end2end=Falseوقم بإجراء المعالجة اللاحقة خارجيًا.