تخطي إلى المحتوى

كيفية تصديرPyTorch YOLO باستخدام Ultralytics

عادةً ما يعني نشر PyTorch في بيئة الإنتاج التعامل مع أداة تصدير مختلفة لكل هدف: torch.onnx.export بالنسبة إلى ONN ONNX، coremltools بالنسبة لأجهزة Apple، onnx2tf بالنسبة إلى TensorFlow، pnnx بالنسبة NCNN وهكذا دواليك. لكل أداة واجهة برمجة تطبيقات (API) خاصة بها، وخصائص التبعية الخاصة بها، وقواعد الإخراج الخاصة بها.

Ultralytics أدوات تصدير مستقلة تجمع بين عدة أنظمة خلفية ضمن واجهة واحدة متسقة. يمكنك تصدير أي torch.nn.Module، بما في ذلك تيم نماذج الصور، تورشفيجن أجهزة التصنيف والكشف، أو البنى المخصصة الخاصة بك، من أجل ONNX, TorchScript, OpenVINO, CoreML, NCNN, PaddlePaddle, MNN, ExecuTorch، و TensorFlow SavedModel دون الحاجة إلى تعلم كل نظام خلفي على حدة.

لماذا يُستخدم Ultralytics YOLO ؟

  • واجهة برمجة تطبيقات واحدة تغطي 10 تنسيقات: تعلم طريقة استدعاء واحدة بدلاً من عشرات الطرق.
  • سطح المرافق المشتركة: يعيش مساعدو التصدير تحت ultralytics.utils.export، لذا بمجرد تثبيت حزم الخلفية، يمكنك الحفاظ على نفس نمط الاستدعاء عبر جميع التنسيقات.
  • نفس مسار الكود المستخدم في YOLO : تعتمد جميعYOLO Ultralytics على نفس الأدوات المساعدة.
  • تتضمن ميزات التكمية FP16 و INT8 بشكل مدمج للتنسيقات التي تدعمها (OpenVINO، CoreML، MNN، NCNN).
  • يعمل على CPU: لا GPU خطوة التصدير نفسها استخدام GPU ، لذا يمكنك تشغيلها محليًّا على أي جهاز كمبيوتر محمول.

بدء سريع

أسرع طريقة هي التصدير في سطرين إلى ONNX دون الحاجة إلى YOLO ودون أي إعدادات أخرى pip install ultralytics onnx timm:

import timm
import torch

from ultralytics.utils.export import torch2onnx

model = timm.create_model("resnet18", pretrained=True).eval()
torch2onnx(model, torch.randn(1, 3, 224, 224), output_file="resnet18.onnx")

تنسيقات التصدير المدعومة

في torch2* تأخذ الدوال قيمة قياسية torch.nn.Module ومثال على tensor الإدخال. تمر شبكات MNN و TF SavedModel و TF Graph عبر ملف ONNX Keras وسيط. ولا توجد حاجة إلى أي سمات YOLO في أي من الحالتين.

التنسيقالوظيفةتثبيتالناتج
ONNXtorch2onnx()pip install onnx.onnx ملف
TorchScripttorch2torchscript()مضمنة في PyTorch.torchscript ملف
OpenVINOtorch2openvino()pip install openvino_openvino_model/ دليل
CoreMLtorch2coreml()pip install coremltools.mlpackage
TF SavedModelonnx2saved_model()انظر المتطلبات التفصيلية أدناه_saved_model/ دليل
مخطط TFkeras2pb()انظر المتطلبات التفصيلية أدناه.pb ملف
NCNNtorch2ncnn()pip install ncnn pnnx_ncnn_model/ دليل
MNNonnx2mnn()pip install MNN.mnn ملف
PaddlePaddletorch2paddle()pip install paddlepaddle x2paddle_paddle_model/ دليل
ExecuTorchtorch2executorch()pip install executorch_executorch_model/ دليل

ONNX وسيط

MNN، TF SavedModel، و TF Graph يتم تصديرها عبر ONNX وسيطة. قم بالتصدير إلى ONNX ثم قم بالتحويل.

تضمين البيانات الوصفية

تقبل العديد من وظائف التصدير معلمة اختيارية metadata قاموس (على سبيل المثال، torch2torchscript(..., metadata={"author": "me"})) التي تدمج أزواجًا مخصصة من القيم والمفاتيح في الملف النهائي الذي تم تصديره، حيثما يدعم التنسيق ذلك.

أمثلة تفصيلية

يستخدم كل مثال من الأمثلة التالية نفس الإعدادات، وهي شبكة ResNet-18 مدربة مسبقًا من مكتبة timm في وضع التقييم:

import timm
import torch

model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)

اتصل دائمًا model.eval() قبل التصدير

التسرب من الدراسة، تطبيع الدفعة، وتختلف طريقة عمل الطبقات الأخرى المخصصة للقطارات فقط أثناء عملية الاستدلال. تخطي .eval() ينتج مخرجات غير صحيحة.

تصدير إلى ONNX

from ultralytics.utils.export import torch2onnx

torch2onnx(model, im, output_file="resnet18.onnx")

للحصول على حجم دفعة ديناميكي، قم بتمرير dynamic القاموس:

torch2onnx(model, im, output_file="resnet18_dyn.onnx", dynamic={"images": {0: "batch_size"}})

قيمة opset الافتراضية هي 14 واسم المدخلات الافتراضي هو "images". استبدل بـ opset, input_names، أو output_names الحجج.

تصدير إلى TorchScript

لا توجد متطلبات إضافية. الاستخدامات torch.jit.trace ما وراء الكواليس.

from ultralytics.utils.export import torch2torchscript

torch2torchscript(model, im, output_file="resnet18.torchscript")

تصدير إلى OpenVINO

from ultralytics.utils.export import torch2openvino

ov_model = torch2openvino(model, im, output_dir="resnet18_openvino_model")

يحتوي الدليل على اسم ثابت model.xml و model.bin زوج:

resnet18_openvino_model/
├── model.xml
└── model.bin

تجاوز dynamic=True بالنسبة للأشكال الديناميكية للمدخلات، half=True بالنسبة لـ FP16، أو int8=True لتكمية INT8. كما تتطلب INT8 calibration_dataset وسيطة.

يتطلب openvino>=2024.0.0 (أو >=2025.2.0 على نظام macOS 15.4+) و torch>=2.1.

تصدير إلى CoreML

import coremltools as ct

from ultralytics.utils.export import torch2coreml

inputs = [ct.TensorType("input", shape=(1, 3, 224, 224))]
ct_model = torch2coreml(model, inputs, im, output_file="resnet18.mlpackage")

ل التصنيف النماذج، قم بتمرير قائمة بأسماء الفئات إلى classifier_names لإضافة عنوان تصنيف إلى CoreML .

يتطلب coremltools>=9.0, torch>=1.11، و numpy<=2.3.5. غير مدعوم في نظام التشغيل Windows.

BlobWriter not loaded خطأ

coremltools>=9.0 يدعم الإصدارات من Python . Python إلى 3.13 على أنظمة macOS وLinux. أما في Python الأحدث Python ، فلا يتم تحميل ملحق C الأصلي. استخدم Python . Python –3.13 CoreML .

التصدير إلىSavedModel في TensorFlow

يتمSavedModel TF SavedModel عبر ONNX وسيطة:

from ultralytics.utils.export import onnx2saved_model, torch2onnx

torch2onnx(model, im, output_file="resnet18.onnx")
keras_model = onnx2saved_model("resnet18.onnx", output_dir="resnet18_saved_model")

تُرجع الدالة نموذج Keras وتقوم أيضًا بإنشاء TFLite (.tflite) داخل دليل الإخراج:

resnet18_saved_model/
├── saved_model.pb
├── variables/
├── resnet18_float32.tflite
├── resnet18_float16.tflite
└── resnet18_int8.tflite

المتطلبات:

  • tensorflow>=2.0.0,<=2.19.0
  • onnx2tf>=1.26.3,<1.29.0
  • tf_keras<=2.19.0
  • sng4onnx>=1.0.1
  • onnx_graphsurgeon>=0.3.26 (التثبيت باستخدام --extra-index-url https://pypi.ngc.nvidia.com)
  • ai-edge-litert>=1.2.0,<1.4.0 على نظام macOS (ai-edge-litert>=1.2.0 (على المنصات الأخرى)
  • onnxslim>=0.1.71
  • onnx>=1.12.0,<2.0.0
  • protobuf>=5

التصدير إلى مخطط TensorFlow

استكمالاً لعملية SavedModel المذكورة أعلاه، قم بتحويل نموذج Keras الذي تم إرجاعه إلى نموذج «مجمد» .pb الرسم البياني:

from pathlib import Path

from ultralytics.utils.export import keras2pb

keras2pb(keras_model, output_file=Path("resnet18_saved_model/resnet18.pb"))

التصدير إلى NCNN

from ultralytics.utils.export import torch2ncnn

torch2ncnn(model, im, output_dir="resnet18_ncnn_model")

يحتوي الدليل على ملفات param و bin ذات الأسماء الثابتة بالإضافة إلى Python :

resnet18_ncnn_model/
├── model.ncnn.param
├── model.ncnn.bin
└── model_ncnn.py

torch2ncnn() يتحقق من ncnn و pnnx عند الاستخدام لأول مرة.

تصدير إلى MNN

يتطلب تصدير MNN ONNX كمدخلات. قم بالتصدير إلى ONNX ثم قم بالتحويل:

from ultralytics.utils.export import onnx2mnn, torch2onnx

torch2onnx(model, im, output_file="resnet18.onnx")
onnx2mnn("resnet18.onnx", output_file="resnet18.mnn")

يدعم half=True بالنسبة لـ FP16 و int8=True لتكمية INT8. يتطلب MNN>=2.9.6 و torch>=1.10.

تصدير إلى PaddlePaddle

from ultralytics.utils.export import torch2paddle

torch2paddle(model, im, output_dir="resnet18_paddle_model")

يحتوي الدليل على ملفات PaddlePaddle وملفات المعلمات:

resnet18_paddle_model/
├── model.pdmodel
└── model.pdiparams

يتطلب x2paddle PaddlePaddle الصحيح لـ PaddlePaddle الخاص بنظام التشغيل الخاص بك:

  • paddlepaddle-gpu>=3.0.0,<3.3.0 على CUDA
  • paddlepaddle==3.0.0 على CPU ARM64
  • paddlepaddle>=3.0.0,<3.3.0 على معالجات أخرى

غير مدعوم على NVIDIA .

تصدير إلى ExecuTorch

from ultralytics.utils.export import torch2executorch

torch2executorch(model, im, output_dir="resnet18_executorch_model")

الملفات المصدرة .pte يتم حفظ الملف داخل دليل الإخراج:

resnet18_executorch_model/
└── model.pte

يتطلب torch>=2.9.0 ووقت تشغيل ExecuTorch مطابق (pip install executorch). للاطلاع على كيفية الاستخدام أثناء التشغيل، انظر تكامل ExecuTorch.

تحقق من النموذج الذي قمت بتصديره

بعد التصدير، تحقق من التوافق العددي مع PyTorch الأصلي قبل النشر. إجراء اختبار سريع للتأكد من ONNXBackend من ultralytics.nn.backends يقارن النتائج ويشير إلى أخطاء التتبع أو التكمية في مرحلة مبكرة:

import numpy as np
import timm
import torch

from ultralytics.nn.backends import ONNXBackend

model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)
with torch.no_grad():
    pytorch_output = model(im).numpy()

onnx_model = ONNXBackend("resnet18.onnx", device=torch.device("cpu"))
onnx_output = onnx_model.forward(im)[0]

diff = np.abs(pytorch_output - onnx_output).max()
print(f"Max difference: {diff:.6f}")  # should be < 1e-5

الفرق المتوقع

بالنسبة لعمليات التصدير بتنسيق FP32، يجب أن يكون الحد الأقصى للفرق المطلق أقل من 1e-5. تشير الاختلافات الكبيرة إلى عمليات غير مدعومة، أو شكل إدخال غير صحيح، أو نموذج غير موجود في وضع التقييم. تتميز عمليات التصدير بتنسيقات FP16 و INT8 بتفاوتات أقل دقة. قم بالتحقق من الصحة باستخدام بيانات حقيقية بدلاً من المتجهات العشوائية.

بالنسبة لبيئات التشغيل الأخرى، قد يختلف tensor المدخلات. فعلى سبيل المثال، يستخدم OpenVINO اسم حجة التوجيه في النموذج (عادةً x (بالنسبة للنماذج العامة)، في حين أن torch2onnx يتم تعيينه افتراضيًا إلى "images".

قيود معروفة

  • الدعم المتعدد المدخلات غير متكافئ: torch2onnx و torch2openvino قبول مجموعة أو قائمة من التنسورات النموذجية للنماذج ذات المدخلات المتعددة. torch2torchscript, torch2coreml, torch2ncnn, torch2paddle، و torch2executorch لنفترض وجود tensor مدخلات واحد.
  • متطلبات ExecuTorch flatc: يتطلب بيئة تشغيل ExecuTorch وجود مُترجم FlatBuffers. قم بالتثبيت باستخدام brew install flatbuffers على نظام macOS أو apt install flatbuffers-compiler على نظام أوبونتو.
  • لا يتم إجراء أي استدلال عبر Ultralytics: لا يمكن إعادة تحميلYOLO التي تم تصديرها (YOLO ) من خلال YOLO() للاستدلال. استخدم بيئة التشغيل الأصلية لكل تنسيق (ONNX, OpenVINO، إلخ).
  • التنسيقاتYOLO: تتطلب عمليات التصدير باستخدام Axelera و Sony IMX500 سمات نموذج YOLO وهي غير متاحة للنماذج العامة.
  • التنسيقات الخاصة بالمنصات: TensorRT يتطلب وحدةGPU NVIDIA . RKNN يتطلب rknn-toolkit2 حزمة أدوات التطوير (لنظام Linux فقط). Edge TPU يتطلب edgetpu_compiler ثنائي (لنظام لينكس فقط).

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

ما هي النماذج التي يمكنني تصديرها باستخدام Ultralytics؟

أي torch.nn.Module. ويشمل ذلك نماذج من timm أو torchvision أو أي PyTorch مخصص. يجب أن يكون النموذج في وضع التقييم (model.eval()) قبل التصدير. OpenVINO يقبل كل ONNX OpenVINO مجموعة من متجهات التنسور النموذجية للنماذج متعددة المدخلات.

ما هي تنسيقات التصدير التي تعمل بدون وحدة معالجة GPU؟

يمكن تصدير جميع التنسيقات المدعومة (TorchScript ONNX OpenVINO CoreML TF SavedModel، TF Graph، NCNN، PaddlePaddle MNN، ExecuTorch) باستخدام CPU. ولا GPU عملية التصدير نفسها GPU . TensorRT التنسيق الوحيد الذي يتطلب استخدامGPU NVIDIA .

ما هو Ultralytics الذي أحتاجه؟

استخدم Ultralytics >=8.4.38، والذي يشمل ultralytics.utils.export الوحدة النمطية والمعيارية output_file/output_dir الحجج.

هل يمكنني تصدير نموذج TorchVision إلى CoreML iOS ؟

نعم. يتم تصدير مصنفات ومستشعرات ونماذج التجزئة الخاصة بـ torchvision إلى .mlpackage عبر torch2coreml. بالنسبة لنماذج تصنيف الصور، قم بتمرير قائمة بأسماء الفئات إلى classifier_names للخبز في وحدة تصنيف. قم بتشغيل عملية التصدير على نظام macOS أو Linux. لا CoreML نظام Windows CoreML . انظر CoreML للحصول على تفاصيل iOS .

هل يمكنني تكمية النموذج الذي قمت بتصديره إلى INT8 أو FP16؟

نعم، لعدة تنسيقات. تابع half=True لـ FP16 أو int8=True لـ INT8 عند التصدير إلى OpenVINO أو CoreML أو MNN أو NCNN. OpenVINO يتطلب INT8 في OpenVINO calibration_dataset وسيطة لـ التكمية بعد التدريب. راجع صفحة التكامل الخاصة بكل تنسيق لمعرفة المفاضلات المتعلقة بالتكمية.



📅 تم الإنشاء قبل 0 أيام ✏️ تم التحديث قبل 0 أيام
raimbekovm

تعليقات