تصدير TFLite وONNX وCoreML وTensorRT#
📚 يشرح هذا الدليل كيفية تصدير نموذج YOLOv5 🚀 مدرّب من PyTorch إلى تنسيقات متنوعة للنشر، بما فيها ONNX وTensorRT وCoreML وغيرها.
قبل البدء#
استنسخ المستودع وثبّت requirements.txt في بيئة Python>=3.8.0، بما في ذلك PyTorch>=1.8. تُنزّل النماذج ومجموعات البيانات تلقائيًا من إصدار YOLOv5 الأحدث.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installللاطلاع على مثال لتصدير TensorRT (يتطلب GPU)، راجع قسم الملحق في دفتر الملاحظات على Colab.
تنسيقات التصدير المدعومة#
يُدعم الاستدلال باستخدام YOLOv5 رسميًا بـ 12 تنسيقًا:
- صدّر إلى ONNX أو OpenVINO لزيادة سرعة CPU بمقدار يصل إلى 3 أضعاف. راجع معايير أداء CPU.
- صدّر إلى TensorRT لزيادة سرعة GPU بمقدار يصل إلى 5 أضعاف. راجع معايير أداء GPU.
| التنسيق | export.py --include | النموذج |
|---|---|---|
| PyTorch | - | yolov5s.pt |
| TorchScript | torchscript | yolov5s.torchscript |
| ONNX | onnx | yolov5s.onnx |
| OpenVINO | openvino | yolov5s_openvino_model/ |
| TensorRT | engine | yolov5s.engine |
| CoreML | coreml | yolov5s.mlpackage |
| TensorFlow SavedModel | saved_model | yolov5s_saved_model/ |
| TensorFlow GraphDef | pb | yolov5s.pb |
| TensorFlow Lite | tflite | yolov5s.tflite |
| TensorFlow Edge TPU | edgetpu | yolov5s_edgetpu.tflite |
| TensorFlow.js | tfjs | yolov5s_web_model/ |
| PaddlePaddle | paddle | yolov5s_paddle_model/ |
المعايير المرجعية#
أُجريت المعايير أدناه على Colab Pro باستخدام دفتر YOLOv5 التعليمي . لإعادة إجرائها:
python benchmarks.py --weights yolov5s.pt --imgsz 640 --device 0GPU من نوع V100 على Colab Pro#
benchmarks: weights=/content/yolov5/yolov5s.pt, imgsz=640, batch_size=1, data=/content/yolov5/data/coco128.yaml, device=0, half=False, test=False
Checking setup...
YOLOv5 🚀 v6.1-135-g7926afc torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)
Setup complete ✅ (8 CPUs, 51.0 GB RAM, 46.7/166.8 GB disk)
Benchmarks complete (458.07s)
Format mAP@0.5:0.95 Inference time (ms)
0 PyTorch 0.4623 10.19
1 TorchScript 0.4623 6.85
2 ONNX 0.4623 14.63
3 OpenVINO NaN NaN
4 TensorRT 0.4617 1.89
5 CoreML NaN NaN
6 TensorFlow SavedModel 0.4623 21.28
7 TensorFlow GraphDef 0.4623 21.22
8 TensorFlow Lite NaN NaN
9 TensorFlow Edge TPU NaN NaN
10 TensorFlow.js NaN NaNCPU على Colab Pro#
benchmarks: weights=/content/yolov5/yolov5s.pt, imgsz=640, batch_size=1, data=/content/yolov5/data/coco128.yaml, device=cpu, half=False, test=False
Checking setup...
YOLOv5 🚀 v6.1-135-g7926afc torch 1.10.0+cu111 CPU
Setup complete ✅ (8 CPUs, 51.0 GB RAM, 41.5/166.8 GB disk)
Benchmarks complete (241.20s)
Format mAP@0.5:0.95 Inference time (ms)
0 PyTorch 0.4623 127.61
1 TorchScript 0.4623 131.23
2 ONNX 0.4623 69.34
3 OpenVINO 0.4623 66.52
4 TensorRT NaN NaN
5 CoreML NaN NaN
6 TensorFlow SavedModel 0.4623 123.79
7 TensorFlow GraphDef 0.4623 121.57
8 TensorFlow Lite 0.4623 316.61
9 TensorFlow Edge TPU NaN NaN
10 TensorFlow.js NaN NaNتصدير نموذج YOLOv5 مدرّب#
يصدّر هذا الأمر نموذج YOLOv5s مدرّبًا مسبقًا إلى تنسيقي TorchScript وONNX. yolov5s.pt هو النموذج «الصغير»، وهو ثاني أصغر النماذج المتاحة. وتشمل الخيارات الأخرى yolov5n.pt وyolov5m.pt وyolov5l.pt وyolov5x.pt، إضافة إلى نظائرها من P6، مثل yolov5s6.pt، أو نقطة تحقق خاصة بك من التدريب المخصص، مثل runs/train/exp/weights/best.pt. للاطلاع على تفاصيل جميع النماذج المتاحة، راجع الجدول في ملف README.
python export.py --weights yolov5s.pt --include torchscript onnxأضف --half لتصدير النماذج بدقة FP16 النصفية لتقليل أحجام الملفات، راجع التفاصيل.
المخرجات:
export: data=data/coco128.yaml, weights=['yolov5s.pt'], imgsz=[640, 640], batch_size=1, device=cpu, half=False, inplace=False, train=False, keras=False, optimize=False, int8=False, dynamic=False, simplify=False, opset=12, verbose=False, workspace=4, nms=False, agnostic_nms=False, topk_per_class=100, topk_all=100, iou_thres=0.45, conf_thres=0.25, include=['torchscript', 'onnx']
YOLOv5 🚀 v6.2-104-ge3e5122 Python-3.8.0 torch-1.12.1+cu113 CPU
Downloading https://github.com/ultralytics/yolov5/releases/download/v6.2/yolov5s.pt to yolov5s.pt...
100% 14.1M/14.1M [00:00<00:00, 274MB/s]
Fusing layers...
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients
PyTorch: starting from yolov5s.pt with output shape (1, 25200, 85) (14.1 MB)
TorchScript: starting export with torch 1.12.1+cu113...
TorchScript: export success ✅ 1.7s, saved as yolov5s.torchscript (28.1 MB)
ONNX: starting export with onnx 1.12.0...
ONNX: export success ✅ 2.3s, saved as yolov5s.onnx (28.0 MB)
Export complete (5.5s)
Results saved to /content/yolov5
Detect: python detect.py --weights yolov5s.onnx
Validate: python val.py --weights yolov5s.onnx
PyTorch Hub: model = torch.hub.load('ultralytics/yolov5', 'custom', 'yolov5s.onnx')
Visualize: https://netron.app/ستُحفَظ النماذج المُصدَّرة بجوار نموذج PyTorch الأصلي:

يُوصى باستخدام عارض Netron لتصوير النماذج المُصدَّرة:

أمثلة على استخدام النماذج المُصدَّرة#
يشغّل detect.py الاستدلال على النماذج المُصدَّرة:
python detect.py --weights yolov5s.pt # PyTorch
python detect.py --weights yolov5s.torchscript # TorchScript
python detect.py --weights yolov5s.onnx # ONNX Runtime or OpenCV DNN with --dnn
python detect.py --weights yolov5s_openvino_model # OpenVINO
python detect.py --weights yolov5s.engine # TensorRT
python detect.py --weights yolov5s.mlpackage # CoreML (macOS only)
python detect.py --weights yolov5s_saved_model # TensorFlow SavedModel
python detect.py --weights yolov5s.pb # TensorFlow GraphDef
python detect.py --weights yolov5s.tflite # TensorFlow Lite
python detect.py --weights yolov5s_edgetpu.tflite # TensorFlow Edge TPU
python detect.py --weights yolov5s_paddle_model # PaddlePaddleيشغّل val.py التحقق من صحة النماذج المُصدَّرة:
python val.py --weights yolov5s.pt # PyTorch
python val.py --weights yolov5s.torchscript # TorchScript
python val.py --weights yolov5s.onnx # ONNX Runtime or OpenCV DNN with --dnn
python val.py --weights yolov5s_openvino_model # OpenVINO
python val.py --weights yolov5s.engine # TensorRT
python val.py --weights yolov5s.mlpackage # CoreML (macOS only)
python val.py --weights yolov5s_saved_model # TensorFlow SavedModel
python val.py --weights yolov5s.pb # TensorFlow GraphDef
python val.py --weights yolov5s.tflite # TensorFlow Lite
python val.py --weights yolov5s_edgetpu.tflite # TensorFlow Edge TPU
python val.py --weights yolov5s_paddle_model # PaddlePaddleاستخدم PyTorch Hub مع نماذج YOLOv5 المُصدَّرة:
import torch
# Model
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.pt")
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.torchscript") # TorchScript
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.onnx") # بيئة تشغيل ONNX
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s_openvino_model") # OpenVINO
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.engine") # TensorRT
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.mlpackage") # CoreML (لـ macOS فقط)
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s_saved_model") # TensorFlow SavedModel
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.pb") # TensorFlow GraphDef
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s.tflite") # TensorFlow Lite
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s_edgetpu.tflite") # TensorFlow Edge TPU
model = torch.hub.load("ultralytics/yolov5", "custom", "yolov5s_paddle_model") # PaddlePaddle
# Images
img = "https://ultralytics.com/images/zidane.jpg" # أو ملف، Path، PIL، OpenCV، numpy، قائمة
# Inference
results = model(img)
# Results
results.print() # or .show(), .save(), .crop(), .pandas()، إلخ.الاستدلال باستخدام OpenCV DNN#
الاستدلال باستخدام OpenCV ونماذج ONNX:
python export.py --weights yolov5s.pt --include onnx
python detect.py --weights yolov5s.onnx --dnn # detect
python val.py --weights yolov5s.onnx --dnn # validateالاستدلال باستخدام C++#
أمثلة على الاستدلال باستخدام YOLOv5 وOpenCV DNN بلغة C++ على نموذج ONNX مُصدَّر:
- https://github.com/Hexmagic/ONNX-yolov5/blob/master/src/test.cpp
- https://github.com/doleron/yolov5-opencv-cpp-python
أمثلة على الاستدلال باستخدام YOLOv5 وOpenVINO بلغة C++:
- https://github.com/dacquaviva/yolov5-openvino-cpp-python
- https://github.com/UNeedCryDear/yolov5-seg-opencv-onnxruntime-cpp
الاستدلال في متصفح الويب باستخدام TensorFlow.js#
البيئات المدعومة#
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، وكل منها مثبت مسبقًا به التبعيات الأساسية مثل CUDA وCUDNN وPython وPyTorch، لتتمكن من بدء مشاريعك.
- دفاتر GPU مجانية:
- Google Cloud: دليل البدء السريع لـ GCP
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: دليل البدء السريع لـ Docker
حالة المشروع#
تشير هذه الشارة إلى اجتياز جميع اختبارات التكامل المستمر (CI) الخاصة بـ إجراءات YOLOv5 على GitHub بنجاح. وتتحقق اختبارات CI بدقة من وظائف YOLOv5 وأدائه في جوانب رئيسية متعددة: التدريب والتحقق والاستدلال والتصدير واختبارات الأداء. وهي تضمن التشغيل المتسق والموثوق على macOS وWindows وUbuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل إيداع جديد.
الأسئلة الشائعة#
استخدم ONNX أو OpenVINO للنشر على CPU، إذ يقدّمان سرعة تصل إلى 3 أضعاف سرعة PyTorch، واستخدم TensorRT مع وحدات GPU من NVIDIA، إذ يقدّم سرعة تصل إلى 5 أضعاف. يستهدف CoreML أجهزة Apple، بينما يستهدف TensorFlow Lite أو Edge TPU أجهزة Android وعتاد Coral.
أضف
--half. تتطلب الدقة النصفية GPU في معظم التنسيقات، لذا مرّر--device 0أيضًا؛ أما CoreML فهو استثناء، إذ يمكنه التصدير بدقة FP16 على CPU.نعم. أضف
--dynamic. يتضمن تصدير ONNX محاور ديناميكية للدفعة والارتفاع والعرض، ويُتتبَّع على CPU، لذا احذف--device 0. أما تصدير TensorRT فيُبقي حجم الصورة ثابتًا ويغيّر بُعد الدفعة فقط: ولا يزال يتطلب--device 0، ويحدد--batch-sizeأكبر دفعة تقبلها وحدة الاستدلال.مرّر الملف المُصدَّر إلى
detect.py --weightsأوval.py --weightsأوtorch.hub.load("ultralytics/yolov5", "custom", "yolov5s.onnx"). يختار YOLOv5 الواجهة الخلفية الصحيحة استنادًا إلى امتداد الملف.