تصدير النماذج باستخدام Ultralytics YOLO#
مقدمة#
الهدف النهائي من تدريب النموذج هو نشر تطبيقات العالم الحقيقي. يوفر وضع التصدير في Ultralytics YOLO26 مجموعة واسعة ومتنوعة من الخيارات لتصدير نموذجك المُدَرَّب إلى تنسيقات مختلفة، مما يجعله قابلاً للنشر عبر مختلف المنصات والأجهزة. يهدف هذا الدليل الشامل إلى إرشادك خلال تفاصيل تصدير النماذج، مُبيِّناً كيفية تحقيق أقصى قدر من التوافق والأداء.
راجع معاينة YOLO27 غير الإصدار الرسمية للاطلاع على دعم التصدير المخطط له.
Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀
لماذا تختار وضع التصدير في YOLO26؟#
- التنوع: التصدير إلى تنسيقات متعددة بما في ذلك ONNX وTensorRT وCoreML وغيرها.
- الأداء: احصل على تسريع لوحدة معالجة الرسومات يصل إلى 5 أضعاف باستخدام TensorRT وتسيير لوحدة المعالجة المركزية يصل إلى 3 أضعاف باستخدام ONNX أو OpenVINO.
- التوافق: اجعل نموذجك قابلاً للنشر عالمياً عبر العديد من بيئات الأجهزة والبرمجيات.
- سهولة الاستخدام: واجهة سطر أوامر بسيطة واجهة برمجة تطبيقات Python لتصدير النماذج بسرعة ويسر.
الميزات الرئيسية لوضع التصدير#
فيما يلي بعض الوظائف البارزة:
- التصدير بنقرة واحدة: أوامر بسيطة للتصدير إلى تنسيقات مختلفة.
- التصدير الدفعي: تصدير النماذج القادرة على الاستدلال الدفعي.
- الاستدلال المحسّن: النماذج المُصَدَّرة محسّنة لأوقات استدلال أسرع.
- فيديوهات تعليمية: أدلة متعمقة ودروس تعليمية لتجربة تصدير سلسة.
أمثلة على الاستخدام#
قم بتصدير نموذج 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")الوسائط#
يوضح هذا الجدول التكوينات والخيارات المتاحة لتصدير نماذج YOLO إلى تنسيقات مختلفة. هذه الإعدادات بالغة الأهمية لتحسين أداء النموذج المُصَدَّر وحجمه وتوافقه عبر مختلف المنصات والبيئات. يضمن التكوين السليم أن يكون النموذج جاهزاً للنشر في التطبيق المقصود بأعلى كفاءة.
| الوسيطة | النوع | الافتراضي | الوصف |
|---|---|---|---|
format | str | 'torchscript' | التنسيق المستهدف للنموذج المُصدَّر، مثل 'onnx' أو 'torchscript' أو 'engine' (TensorRT) أو غيرها. ويتيح كل تنسيق التوافق مع بيئات النشر المختلفة. |
name | str | None | اسم العتاد المستهدف للتنسيقات التي تتطلبه: بنية Hailo ('hailo8' و'hailo8l' و'hailo10h' و'hailo15h' و'hailo15l'؛ والقيمة الافتراضية 'hailo8l')، أو شريحة Rockchip RKNN (القيمة الافتراضية 'rk3588')، أو Huawei Ascend SoC (CANN --soc_version؛ والقيمة الافتراضية '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 وواجهات API. |
optimize | bool | False | يمكّن تحسينًا أعلى للمصرّف من أجل DEEPX، ما يقلل زمن استجابة الاستدلال مع زيادة وقت الترجمة. |
quantize | int أو str | None | دقة التكميم: 16 (FP16، تقلل حجم النموذج ويمكنها تسريع الاستدلال على الأجهزة المدعومة) أو 8 (INT8/PTQ، تضغط النموذج بشكل أكبر مع الحد الأدنى من فقدان الدقة، وتُستخدم أساساً لـ الأجهزة الطرفية؛ وتتطلب معايرة data/fraction)؛ بينما 32/غير المحددة فهي FP32. نقطة التحقق المُدربة باستخدام quantize=8 تصدر دائماً INT8: حيث يقوم onnx و engine بالتصدير من النطاقات التي تحملها نقطة التحقق دون معايرة، ويتم رفض التنسيقات أو الدقات الأخرى. كما تقبل تنسيقات التصدير التي تدعم دقة الأوزان/التفعيل المختلطة ترميز '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 | يحدد إصدار مجموعة عمليات ONNX للصادرات التي تنشئ مخطط ONNX (راجع تنسيقات التصدير)، لتحقيق التوافق مع محللات ONNX وبيئات التشغيل المختلفة. وإذا لم يُعيّن، يُستخدم أحدث إصدار مدعوم. |
workspace | float أو None | None | يحدد الحد الأقصى لحجم مساحة العمل بوحدة GiB لتحسينات TensorRT، محققًا توازنًا بين استخدام الذاكرة والأداء. استخدم None للتخصيص التلقائي بواسطة TensorRT حتى الحد الأقصى للجهاز. |
nms | bool، اختياري | None | يقوم None بتصدير تنبؤات الخام من واحد إلى متعدد لـ NMS الخارجي؛ ويقوم True بتضمين NMS حيثما يتم دعم ذلك؛ ويحدد False الرأس الخالي من NMS عند توفره. يدعم NMS المضمن في CoreML الكشف والتجزئة ووضعيات الحركة بأشكال ثابتة. راجع دليل الكشف من طرف إلى طرف. |
conf | float | None | عتبة الثقة المستخدمة حيثما يُنشأ NMS وقت التصدير: صادرات nms=True؛ وصادرات الاكتشاف غير الشاملة من البداية إلى النهاية في Hailo؛ وصادرات الاكتشاف والوضعية والتقسيم في IMX، التي تفرض داخليًا nms=True. وتكون القيمة الافتراضية 0.25 عند عدم التعيين. |
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) أو Huawei Ascend NPU (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 بتحديد مجموعة بيانات معايرة خاصة بالمهمة عند اللزوم، أو يعود إلى مجموعة البيانات الافتراضية لمهمة النموذج. نقطة التحقق المُدربة باستخدام quantize=8 تحمل نطاقات INT8 الخاصة بها ولا تحتاج إلى بيانات معايرة. |
split | str | 'val' | تقسيم مجموعة البيانات ('train' أو 'val' أو 'test') المستخدم لإنشاء محمّل بيانات معايرة تكميم INT8 من data. |
fraction | float أو int أو list | 1.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 | ✅ | - |
| 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 |
يفترض nms=None المخرجات الخام لـ NMS الخارجي. قم بتعيين nms=False لتحديد رأس متاح خالٍ من NMS؛ وتتراجع التنسيقات غير المدعومة إلى مسار إخراجها الأصلي. وتحدد مُدخلات nms أعلاه التنسيقات التي يمكنها تضمين NMS باستخدام nms=True.
خيارات التقسيم الكمي#
استخدم وسيط quantize لطلب دقة التصدير. قيم السلسلة النصية لا تأخذ في الاعتبار حالة الأحرف، وتقوم Ultralytics بتنقيح الأسماء المستعارة المقبولة قبل التصدير:
| قيم الطلب | القيمة المعيارية | المعنى |
|---|---|---|
8، "8"، "int8"، "w8a8" | 8 | أوزان وتنشيطات INT8 |
16، "16"، "fp16"، "w16a16" | 16 | أوزان وتنشيطات FP16 |
32، "32"، "fp32"، "w32a32" | 32 | تصدير FP16؛ وهو نفس غير المحدد باستثناء برامج 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 وبيانات المعايرة. |
| 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) بيانات المعايرة؛ ويدعم أيضاً INT8 الديناميكي "w8a32" (بدون معايرة). quantize=16 ليس تصديراً منفصلاً؛ نموذج FP32 يعمل بـ FP16 في وقت التشغيل عبر مفوض وحدة معالجة الرسومات. |
| Hailo | ❌ | ❌ | ✅ تلقائي | ❌ | يتطلب تصدير Hailo استخدام INT8، ويتم تفعيله تلقائياً عند عدم ضبطه. |
| Huawei Ascend | ❌ | ✅ تلقائي | ❌ | ❌ | تقبل عمليات التفاف نواة Ascend AI مدخلات FP16/INT8 فقط، لذا يقوم ATC بترجمة FP16؛ ويتم تمكينه تلقائياً عند عدم التحديد. |
| Core AI | ✅ | ✅ | ❌ | ❌ | FP32 افتراضياً أو أصل .aimodel بصيغة FP16 مع quantize=16؛ ولا يوجد مسار لـ INT8. |
بالنسبة لصادرات INT8 وW8A16، قم بتوفير بيانات معايرة نموذجية باستخدام data، مثل data="coco8.yaml"، ما لم يوثق تكامل الهدف سلوكاً افتراضياً أو ممكناً تلقائياً. نظام LiteRT "w8a32" (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) # ranges travel with the checkpoint, no calibration data neededاستخدم معدل تعلم صغيراً عند الضبط الدقيق لنقطة تحقق مدربة مسبقاً. يمكن للتدريب الواعي بالكمية أن يقلل الدقة مبدئياً، وتعتمد فائدته مقارنة بالكمية ما بعد التدريب على النموذج ومجموعة البيانات وميزانية التدريب. تحقق من صحة النموذج المصدر مقابل كل من نقطة التحقق الأصلية وتصدير الكمية ما بعد التدريب؛ ولا تثبت درجات الكمية المزيفة أثناء التدريب دقة النشر.
مدى جدوى التدريب الواعي بالتكميم (QAT) يعتمد على مدى جودة التعامل مع النموذج بواسطة معايرة بنية التصدير الخلفية نفسها. القيم أدناه هي قيم mAP50-95 على مجموعة بيانات COCO val2017، المقاسة باستخدام محركات TensorRT 10.16 عند imgsz=640 وحجم دفعة 1، حيث تم تدريب كل نقطة تحقق للتدريب الواعي بالتكميم (QAT) باستخدام epochs=20 patience=3:
| النموذج | محرك FP32 | محرك PTQ INT8 | محرك QAT INT8 |
|---|---|---|---|
yolo26n | 0.4032 | 0.3934 | 0.3935 |
yolo26s | 0.4794 | 0.4412 | 0.4711 |
yolo26m | 0.5269 | 0.4696 | 0.5137 |
yolo26l | 0.5440 | 0.4889 | 0.5307 |
yolo26x | 0.5701 | 0.5138 | 0.5527 |
يكلف التدريب الواعي بالتكميم (QAT) ما يتراوح بين 0.008 إلى 0.017 من مقياس mAP50-95 مقارنة بـ FP32 عبر النطاق، بينما يكلف تكميم ما بعد التدريب 0.010 على yolo26n ومن 0.038 إلى 0.057 على النماذج الأكبر حجمًا. لذا فإن التدريب الواعي بالتكميم (QAT) لا يحقق أي مكسب يُذكر تقريبًا على النموذج الأصغر، حيث تعمل المعايرة بشكل جيد بالفعل، ويوفر من 0.030 إلى 0.044 على باقي النماذج. توقع أرقامًا مختلفة على مجموعة بيانات أخرى، أو تنسيق تصدير مختلف، أو إصدار TensorRT آخر، وقم بقياس نتائجك بنفسك.
تتطلب نماذج التدريب الواعي بالكمية compile=False؛ ولا تدعم وحدات ModelOpt الكمية torch.compile.
يُترك رأس المخرجات تعمدًا بتنسيق الفاصلة العائمة (float) للحد من فقدان دقة INT8؛ إذ تُمكِّن TensorRT دقة مختلطة FP16 لطبقاتها غير المُكمَّمة. يعمل تدريب QAT عبر NVIDIA TensorRT Model Optimizer المُثبَّت تلقائيًا عند الاستخدام الأول، وتحتاج نقطة التحقق الناتجة إلى تثبيته لكي يتم تحميلها. تنتقل تلك النطاقات مع نقطة التحقق، وتصدر صادرات onnx وengine هذه النطاقات كعقد الكمية/إلغاء الكمية (Q/DQ)؛ بينما تقرأ التنسيقات الأخرى المعايرة بدلاً من ذلك وترفض نقاط تحقق QAT.
ما التالي#
ابحث عن دليل تكامل هدف نشرك — ONNX وTensorRT وCoreML وغيرها موجودة في قائمة التكاملات الكاملة — لمعرفة كيفية تشغيل النموذج المُصَدَّر.
الأسئلة الشائعة#
يعد تصدير نموذج YOLO26 إلى تنسيق ONNX أمراً مباشراً مع Ultralytics. فهي توفر طريقي Python وواجهة سطر الأوامر لتصدير النماذج.
مثال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 تحقيق تسريع لوحدة معالجة الرسومات يصل إلى 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،saved_model).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) المُصدّرة باستخدام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 تنبؤات خاماً من واحد إلى متعدد: وتكون المُخرجات عادةً عبارة عن موتر واحد بالشكل(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 حالياً واجهة برمجة تطبيقات استدلال 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وقم بإجراء المعالجة اللاحقة بشكل خارجي.