تصدير النموذج باستخدام Ultralytics YOLO
مقدمة
الهدف النهائي من تدريب النموذج هو نشره في تطبيقات واقعية. يوفر وضع التصدير (Export mode) في 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")الوسائط
يفصّل هذا الجدول التكوينات والخيارات المتاحة لتصدير نماذج YOLO إلى تنسيقات مختلفة. تعتبر هذه الإعدادات ضرورية لتحسين أداء النموذج المُصدّر وحجمه وتوافقه عبر مختلف المنصات والبيئات. يضمن التكوين المناسب أن النموذج جاهز للنشر في التطبيق المقصود بكفاءة مثالية.
| المعامل | النوع | الافتراضي | الوصف |
|---|---|---|---|
format | str | 'torchscript' | التنسيق المستهدف للنموذج المصدر، مثل 'onnx'، 'torchscript'، 'engine' (TensorRT)، أو غيرها. كل تنسيق يتيح التوافق مع بيئات النشر المختلفة. |
imgsz | int أو tuple | 640 | حجم الصورة المطلوب لإدخال النموذج. يمكن أن يكون عدداً صحيحاً للصور المربعة (مثل 640 لـ 640×640) أو صفاً (height, width) لأبعاد محددة. |
keras | bool | False | يفعل التصدير إلى تنسيق Keras لـ TensorFlow SavedModel، مما يوفر التوافق مع خدمة TensorFlow وواجهات البرمجة. |
optimize | bool | False | يطبق التحسين للأجهزة المحمولة عند التصدير إلى TorchScript، مما قد يقلل من حجم النموذج ويحسن أداء الاستنتاج. غير متوافق مع تنسيق NCNN أو أجهزة CUDA. بالنسبة لـ DeepX، يفعل تحسين مترجم أعلى يقلل من زمن انتقال الاستنتاج ويزيد من وقت التجميع. |
half | bool | False | يفعل تكميم FP16 (نصف الدقة)، مما يقلل من حجم النموذج وربما يسرع الاستنتاج على الأجهزة المدعومة. غير متوافق مع تكميم INT8 أو الصادرات الخاصة بـ CPU فقط. متاح فقط لتنسيقات معينة، مثل ONNX (انظر أدناه). |
int8 | bool | False | يفعل تكميم INT8، مما يزيد من ضغط النموذج ويسرع الاستنتاج مع فقدان ضئيل في الدقة، بشكل أساسي لـ أجهزة الحافة. عند استخدامه مع TensorRT، يقوم بتكميم ما بعد التدريب (PTQ). |
dynamic | bool | False | يسمح بأحجام إدخال ديناميكية لصادرات TorchScript، وONNX، وOpenVINO، وTensorRT، وCoreML، مما يعزز المرونة في التعامل مع أبعاد الصور المتغيرة. يتم ضبطه تلقائياً على True عند استخدام TensorRT مع INT8. |
simplify | bool | True | يبسط رسم النموذج لصادرات ONNX باستخدام onnxslim، مما قد يحسن الأداء والتوافق مع محركات الاستنتاج. |
opset | int | None | يحدد إصدار ONNX opset للتوافق مع محللات ومحركات ONNX المختلفة. إذا لم يتم ضبطه، يستخدم أحدث إصدار مدعوم. |
workspace | float أو None | None | يحدد الحد الأقصى لحجم مساحة العمل بوحدة GiB لتحسينات TensorRT، مما يوازن بين استخدام الذاكرة والأداء. استخدم None للتخصيص التلقائي بواسطة TensorRT حتى الحد الأقصى للجهاز. |
nms | bool | False | يضيف خاصية قمع الحد الأقصى غير (NMS) إلى النموذج المصدر عند دعمها (راجع تنسيقات التصدير)، مما يحسن كفاءة معالجة الكشف اللاحقة. غير متاح للنماذج من النهاية إلى النهاية (end2end). |
batch | int | 1 | يحدد حجم استنتاج الدفعة للنموذج المصدر أو الحد الأقصى لعدد الصور التي سيعالجها النموذج المصدر في وقت واحد في وضع predict. بالنسبة لصادرات Edge TPU، يتم ضبط هذا تلقائياً على 1. |
device | str | None | يحدد الجهاز للتصدير: GPU (device=0)، أو CPU (device=cpu)، أو MPS لأجهزة Apple silicon (device=mps)، أو Huawei Ascend NPU (device=npu أو device=npu:0)، أو DLA لـ NVIDIA Jetson (device=dla:0 أو device=dla:1). صادرات TensorRT تستخدم GPU تلقائياً. |
data | str | 'coco8.yaml' | مسار ملف إعداد مجموعة البيانات، وهو ضروري لمعايرة تكميم INT8. إذا لم يتم تحديده مع تفعيل INT8، فسيتم استخدام coco8.yaml كخيار احتياطي للمعايرة. |
fraction | float | 1.0 | يحدد جزء مجموعة البيانات المستخدم لمعايرة تكميم INT8. يسمح بالمعايرة على مجموعة فرعية من مجموعة البيانات الكاملة، وهو مفيد للتجارب أو عند محدودية الموارد. إذا لم يتم تحديده مع تفعيل INT8، فسيتم استخدام مجموعة البيانات الكاملة. |
end2end | bool | None | يتجاوز وضع النهاية إلى النهاية في نماذج YOLO التي تدعم الاستنتاج بدون NMS (YOLO26, YOLOv10). ضبطه على False يتيح لك تصدير هذه النماذج لتكون متوافقة مع خط أنابيب المعالجة اللاحقة التقليدي القائم على NMS. راجع دليل الكشف من النهاية إلى النهاية للحصول على التفاصيل. |
يسمح ضبط هذه المعلمات بتخصيص عملية التصدير لتناسب متطلبات محددة، مثل بيئة النشر، وقيود الأجهزة، وأهداف الأداء. يعد اختيار التنسيق والإعدادات المناسبة أمراً ضرورياً لتحقيق أفضل توازن بين حجم النموذج والسرعة والدقة.
تنسيقات التصدير
تنسيقات تصدير YOLO26 المتاحة موجودة في الجدول أدناه. يمكنك التصدير إلى أي تنسيق باستخدام وسيطة format، مثل format='onnx' أو format='engine'. يمكنك التنبؤ أو التحقق مباشرة على النماذج المُصدّرة، مثل yolo predict model=yolo26n.onnx. يتم عرض أمثلة الاستخدام لنموذجك بعد اكتمال التصدير. يمكن أيضاً تصدير النماذج مباشرة من المتصفح على منصة Ultralytics دون أي إعداد محلي.
| التنسيق | وسيط format | النموذج | البيانات الوصفية | الوسائط |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, half, dynamic, optimize, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, half, dynamic, simplify, opset, nms, batch, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, half, dynamic, int8, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, half, dynamic, simplify, workspace, int8, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, half, int8, nms, batch, device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, int8, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, batch, device |
| TF Lite | tflite | yolo26n.tflite | ✅ | imgsz, half, int8, nms, batch, data, fraction, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, int8, data, fraction, device |
| TF.js | tfjs | yolo26n_web_model/ | ✅ | imgsz, half, int8, nms, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, int8, half, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, half, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, int8, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, int8, data, fraction, device |
| DeepX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, int8, data, optimize, device |
الأسئلة الشائعة
كيف أقوم بتصدير نموذج YOLO26 إلى تنسيق ONNX؟
تصدير نموذج 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 لتصدير النماذج؟
يوفر استخدام TensorRT لتصدير النماذج تحسينات كبيرة في الأداء. يمكن لنماذج YOLO26 المُصدّرة إلى TensorRT تحقيق تسريع يصل إلى 5 أضعاف على GPU، مما يجعلها مثالية لتطبيقات الاستنتاج في الوقت الفعلي.
- تعدد الاستخدامات: تحسين النماذج لإعداد أجهزة محدد.
- السرعة: تحقيق استنتاج أسرع من خلال تحسينات متقدمة.
- التوافق: التكامل بسلاسة مع أجهزة NVIDIA.
لمعرفة المزيد حول تكامل TensorRT، راجع دليل تكامل TensorRT.
كيف أقوم بتمكين تكميم INT8 عند تصدير نموذج YOLO26 الخاص بي؟
يعد تكميم INT8 وسيلة ممتازة لضغط النموذج وتسريع الاستنتاج، خاصة على أجهزة الحافة (edge devices). إليك كيفية تمكين تكميم INT8:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # Load a model
model.export(format="engine", int8=True)يمكن تطبيق تكميم INT8 على تنسيقات مختلفة، مثل TensorRT و OpenVINO و CoreML. للحصول على نتائج تكميم مثالية، قم بتوفير مجموعة بيانات تمثيلية باستخدام المعلمة data.
لماذا يعد حجم الإدخال الديناميكي مهماً عند تصدير النماذج؟
يسمح حجم الإدخال الديناميكي للنموذج المُصدّر بالتعامل مع أبعاد صور متغيرة، مما يوفر المرونة ويحسن كفاءة المعالجة لحالات الاستخدام المختلفة. عند التصدير إلى تنسيقات مثل 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)).half:يُمكّن تكميم FP16، مما يقلل حجم النموذج وربما يسرع الاستنتاج.optimize:يطبق تحسينات محددة للأجهزة المحمولة أو البيئات المقيدة.int8:يُمكّن تكميم INT8، وهو مفيد للغاية لعمليات النشر في الذكاء الاصطناعي على الحافة.
للنشر على منصات أجهزة محددة، فكر في استخدام تنسيقات تصدير متخصصة مثل TensorRT لوحدات معالجة الرسومات NVIDIA، أو CoreML لأجهزة Apple، أو Edge TPU لأجهزة Google Coral.
ماذا تمثل موترات الإخراج (output tensors) في نماذج YOLO المُصدّرة؟
عندما تقوم بتصدير نموذج YOLO إلى تنسيقات مثل ONNX أو TensorRT، يعتمد هيكل موتر الإخراج على مهمة النموذج. يعد فهم هذه المخرجات مهماً لتطبيقات الاستنتاج المخصصة.
بالنسبة لـ نماذج الكشف (على سبيل المثال، yolo26n.pt)، يكون الإخراج عادةً عبارة عن موتر واحد بشكل (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 كيفية معالجة هذه المخرجات لكل نوع نموذج.
لماذا يكون output0 بصيغة FP32 عند التصدير مع half=True و end2end=True؟
عند التصدير مع half=True (أو int8=True)، يتم تحويل معظم الموترات إلى دقة أقل لتقليل حجم النموذج وتحسين الأداء. ومع ذلك، عند تمكين end2end=True، يتم تضمين المعالجة اللاحقة (بما في ذلك فهارس الفئات) مباشرة في الرسم البياني المُصدّر.
يحتوي موتر output0 على فهارس الفئات، والتي يتم تمثيلها داخلياً كقيم فاصلة عائمة. لا يمكن لـ FP16 تمثيل قيم الأعداد الصحيحة فوق 2048 بشكل موثوق بسبب دقة المانتيسّا المحدودة. لتجنب فقدان الدقة المحتمل أو معرفات الفئات غير الصحيحة، يتم الإبقاء على output0 في FP32 عن قصد.
هذا السلوك متوقع وينطبق أيضاً على التصديرات ذات الدقة المنخفضة أو المكممة حيث يجب الحفاظ على دقة فهرس الفئة.
إذا كانت مخرجات FP16 كاملة مطلوبة، قم بالتصدير مع end2end=False وقم بإجراء المعالجة اللاحقة خارجياً.