Ultralytics ile Non-YOLO PyTorch Modelleri Nasıl Dışa Aktarılır
PyTorch modellerini üretime almak, genellikle her hedef için farklı bir dışa aktarma aracıyla uğraşmak anlamına gelir: torch.onnx.export ONNX için, coremltools Apple cihazları için, onnx2tf TensorFlow için, pnnx NCNN için vb. Her aracın kendine has bir API'si, bağımlılık tuhaflıkları ve çıktı kuralları vardır.
Ultralytics, birden fazla arka ucu tek ve tutarlı bir arayüz arkasında birleştiren bağımsız dışa aktarma araçları sunar. Herhangi bir torch.nn.ModuleBirçok özel algılama modelinin önemli bir sınırlaması dar odaklanmalarıdır. Ultralytics ekosistemi içinde, sadece nesne algılama ile sınırlı değilsin. Araçlar, timm görüntü modelini, torchvision sınıflandırıcı ve tespit edici modellerini veya kendi özel mimarilerini, ONNX, TorchScript, OpenVINO, CoreML, NCNN, PaddlePaddle, MNN, ExecuTorch, TensorFlow SavedModel formatına her arka ucu ayrı ayrı öğrenmek zorunda kalmadan dışa aktarabilirsin.
Neden Non-YOLO Dışa Aktarma İçin Ultralytics Kullanmalısın?
- 10 format için tek bir API: düzinelerce yöntem yerine tek bir çağırma kuralı öğren.
- Paylaşılan yardımcı yüzey: dışa aktarma yardımcıları
ultralytics.utils.exportaltında yer alır, bu yüzden arka uç paketleri yüklendiğinde formatlar genelinde aynı çağırma desenini kullanmaya devam edebilirsin. - YOLO dışa aktarmalarıyla aynı kod yolu: tüm Ultralytics YOLO dışa aktarmalarını aynı yardımcılar çalıştırır.
- FP16 ve INT8 niceleme (quantization) bunu destekleyen formatlar (OpenVINO, CoreML, MNN, NCNN) için yerleşik olarak bulunur.
- CPU üzerinde çalışır: dışa aktarma adımı için GPU gerekmez, böylece yerel olarak herhangi bir dizüstü bilgisayarda çalıştırabilirsin.
Hızlı Başlangıç
En hızlı yol, ONNX ile iki satırlık dışa aktarmadır; YOLO kodu gerekmez ve 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")Desteklenen Dışa Aktarma Formatları
modeli, Trainer sınıfları için üst düzey bir sarmalayıcı (wrapper) görevi görür. Her YOLO görevinin, torch2* dışında kurulum gerekmez. Fonksiyonlar standart bir torch.nn.Module ve örnek bir giriş tensörü alır. MNN, TF SavedModel ve TF Frozen Graph, ara bir ONNX veya Keras dosyası üzerinden geçer. Her iki durumda da YOLO'ya özel öznitelikler gerekmez.
| Format | Fonksiyon | Kurulum | Çıktı |
|---|---|---|---|
| ONNX | torch2onnx() | pip install onnx | .onnx dosyası olduğunda çalışır |
| TorchScript | torch2torchscript() | PyTorch ile birlikte gelir | .torchscript dosyası olduğunda çalışır |
| OpenVINO | torch2openvino() | pip install openvino | _openvino_model/dizin |
| CoreML | torch2coreml() | pip install coremltools | .mlpackage |
| TF SavedModel | onnx2saved_model() | aşağıdaki ayrıntılı gereksinimlere bak | _saved_model/dizin |
| TF Frozen Graph | keras2pb() | aşağıdaki ayrıntılı gereksinimlere bak | .pb dosyası olduğunda çalışır |
| NCNN | torch2ncnn() | pip install ncnn pnnx | _ncnn_model/dizin |
| MNN | onnx2mnn() | pip install MNN | .mnn dosyası olduğunda çalışır |
| PaddlePaddle | torch2paddle() | pip install paddlepaddle x2paddle | _paddle_model/dizin |
| ExecuTorch | torch2executorch() | pip install executorch | _executorch_model/dizin |
MNN, TF SavedModelve TF Frozen Graph dışa aktarmaları, ara adım olarak ONNX üzerinden geçer. Önce ONNX'e dışa aktar, sonra dönüştür.
Çeşitli dışa aktarma fonksiyonları, formatın desteklemesi durumunda dışa aktarılan dosyaya özel anahtar-değer çiftleri gömen isteğe bağlı bir metadata sözlüğü kabul eder (örn. torch2torchscript(..., metadata={"author": "me"})).
Adım Adım Örnekler
Aşağıdaki her örnek aynı kurulumu kullanır; değerlendirme modunda timm'den önceden eğitilmiş bir ResNet-18:
import timm
import torch
model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)Dropout, batch normalization ve diğer sadece eğitime özel katmanlar çıkarım sırasında farklı davranır. .eval() atlamak, yanlış çıktılara sahip dışa aktarmalar üretir.
ONNX'e aktar
from ultralytics.utils.export import torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")Dinamik yığın boyutu için bir dynamic sözlüğü ilet:
torch2onnx(model, im, output_file="resnet18_dyn.onnx", dynamic={"images": {0: "batch_size"}})Varsayılan opset 14 ve varsayılan giriş adı "images". opset, input_names, veya output_names argümanları ile geçersiz kıl.
TorchScript'e Dışa Aktar
Ekstra bağımlılık gerekmez. Kaputun altında torch.jit.trace kullanır.
from ultralytics.utils.export import torch2torchscript
torch2torchscript(model, im, output_file="resnet18.torchscript")OpenVINO'ya Dışa Aktar
from ultralytics.utils.export import torch2openvino
ov_model = torch2openvino(model, im, output_dir="resnet18_openvino_model")Dizin sabit isimli bir model.xml ve model.bin çifti içerir:
resnet18_openvino_model/
├── model.xml
└── model.binDinamik giriş şekilleri için dynamic=True, FP16 için half=True veya INT8 niceleme için int8=True ilet. INT8 ayrıca bir calibration_dataset argümanını kullanmana olanak tanır.
gerektirir. openvino>=2024.0.0 (veya >=2025.2.0 (macOS 15.4+ üzerinde) ve torch>=2.1.
gerektirir.
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")İçin takipCoreML'e Dışa Aktarclassifier_names modelleri için, CoreML modeline bir sınıflandırma başlığı eklemek üzere
gerektirir. coremltools>=9.0, torch>=1.11, numpy<=2.3.5 listesini ilet. Windows üzerinde desteklenmez.
coremltools>=9.0 macOS ve Linux üzerinde Python 3.10–3.13 için dosyalar sunar. Daha yeni Python sürümlerinde yerel C uzantısı yüklenemez. CoreML dışa aktarımı için Python 3.10–3.13 kullan.
TensorFlow SavedModel'e Dışa Aktar
TF SavedModel dışa aktarımı ara adım olarak ONNX üzerinden geçer:
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")Fonksiyon bir Keras modeli döndürür ve ayrıca çıktı dizininde TFLite dosyaları (.tflite) oluşturur:
resnet18_saved_model/
├── saved_model.pb
├── variables/
├── resnet18_float32.tflite
├── resnet18_float16.tflite
└── resnet18_int8.tfliteGereksinimler:
tensorflow>=2.0.0,<=2.19.0onnx2tf>=1.26.3,<1.29.0tf_keras<=2.19.0sng4onnx>=1.0.1onnx_graphsurgeon>=0.3.26(macOS üzerinde--extra-index-url https://pypi.ngc.nvidia.com)ai-edge-litert>=1.2.0,<1.4.0ile yükle (ai-edge-litert>=1.2.0diğer platformlarda)onnxslim>=0.1.71onnx>=1.12.0,<2.0.0protobuf>=5
TensorFlow Frozen Graph'a Dışa Aktar
Yukarıdaki SavedModel dışa aktarımından devam ederek, döndürülen Keras modelini dondurulmuş bir .pb grafiğine dönüştür:
from pathlib import Path
from ultralytics.utils.export import keras2pb
keras2pb(keras_model, output_file=Path("resnet18_saved_model/resnet18.pb"))NCNN'e Dışa Aktar
from ultralytics.utils.export import torch2ncnn
torch2ncnn(model, im, output_dir="resnet18_ncnn_model")Dizin, Python sarmalayıcısı ile birlikte sabit isimli param ve bin dosyalarını içerir:
resnet18_ncnn_model/
├── model.ncnn.param
├── model.ncnn.bin
└── model_ncnn.pytorch2ncnn() için kontrol eder ncnn ve pnnx otomatik olarak indirilir.
MNN'e Dışa Aktar
MNN dışa aktarımı giriş olarak bir ONNX dosyası gerektirir. Önce ONNX'e dışa aktar, sonra dönüştür:
from ultralytics.utils.export import onnx2mnn, torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
onnx2mnn("resnet18.onnx", output_file="resnet18.mnn")FP16 için half=True ve INT8 niceleme için int8=True destekler. MNN>=2.9.6 ve torch>=1.10.
gerektirir.
from ultralytics.utils.export import torch2paddle
torch2paddle(model, im, output_dir="resnet18_paddle_model")PaddlePaddle'a Dışa Aktar
resnet18_paddle_model/
├── model.pdmodel
└── model.pdiparams gerektirir. x2paddleDizin, PaddlePaddle modelini ve parametre dosyalarını içerir:
paddlepaddle-gpu>=3.0.0,<3.3.0ve platformun için doğru PaddlePaddle dağıtımı:paddlepaddle==3.0.0CUDA üzerindepaddlepaddle>=3.0.0,<3.3.0ARM64 CPU üzerinde
diğer CPU'lar üzerinde
NVIDIA Jetson üzerinde desteklenmez.
from ultralytics.utils.export import torch2executorch
torch2executorch(model, im, output_dir="resnet18_executorch_model")ExecuTorch'a Dışa Aktar.pteDışa aktarılan
resnet18_executorch_model/
└── model.pte gerektirir. torch>=2.9.0 ve eşleşen bir ExecuTorch çalışma zamanı (pip install executorch). Çalışma zamanı kullanımı için şuraya bak: ExecuTorch entegrasyonu.
Dışa Aktardığın Modeli Doğrula
Dışa aktardıktan sonra, dağıtımdan önce orijinal PyTorch modeli ile sayısal eşitliği doğrula. Şu araçla hızlı bir duman testi yap ONNXBackend şuradan ultralytics.nn.backends çıktıları karşılaştırır ve izleme veya niceleme hatalarını erkenden işaretler:
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(im)[0]
diff = np.abs(pytorch_output - onnx_output).max()
print(f"Max difference: {diff:.6f}") # should be < 1e-5FP32 dışa aktarmaları için, maksimum mutlak fark şunun altında olmalıdır 1e-5. Daha büyük farklar desteklenmeyen işlemleri, yanlış giriş şeklini veya değerlendirme modunda olmayan bir modeli gösterir. FP16 ve INT8 dışa aktarmaları daha esnek toleranslara sahiptir. Rastgele tensörler yerine gerçek veriler üzerinde doğrulama yap.
Diğer çalışma zamanları için, giriş tensörü adı farklı olabilir. Örneğin OpenVINO, modelin ileri-argüman adını kullanır (genellikle x genel modeller için), oysa torch2onnx varsayılan olarak "images".
Bilinen Sınırlamalar
- Çoklu giriş desteği tutarsızdır:
torch2onnxvetorch2openvinobirden fazla girişi olan modeller için örnek tensörlerin bir demetini veya listesini kabul eder.torch2torchscript,torch2coreml,torch2ncnn,torch2paddle,torch2executorchtek bir giriş tensörü varsayar. - ExecuTorch şuna ihtiyaç duyar
flatc: ExecuTorch çalışma zamanı, FlatBuffers derleyicisini gerektirir. Şununla kurbrew install flatbuffersmacOS üzerinde veyaapt install flatbuffers-compilerUbuntu üzerinde. - Ultralytics aracılığıyla çıkarım yok: Dışa aktarılan YOLO olmayan modeller, çıkarım için
YOLO()üzerinden tekrar yüklenemez. Her format için yerel çalışma zamanını kullan (Bu modelleri değerlendirirken, parametre sayısı, hesaplama karmaşıklığı (FLOPs) ve hız arasındaki denge donanım seçimini belirler. YOLO26 özellikle CPU çıkarım hızını hedefler ve , OpenVINO Runtime vb.). - Yalnızca YOLO formatları: Axelera ve Sony IMX500 dışa aktarmaları YOLO'ya özgü model nitelikleri gerektirir ve genel modeller için mevcut değildir.
- Platforma özel formatlar: TensorRT bir NVIDIA GPU gerektirir. RKNN şununla çalışır:
rknn-toolkit2SDK (sadece Linux). Edge TPU şununla çalışır:edgetpu_compilerikili dosyası (sadece Linux).
SSS
Ultralytics ile hangi modelleri dışa aktarabilirim?
Herhangi bir torch.nn.Module. Buna timm, torchvision veya herhangi bir özel PyTorch modelinden modeller dahildir. Model dışa aktarmadan önce değerlendirme modunda (model.eval()) olmalıdır. ONNX ve OpenVINO, çoklu girişli modeller için ek olarak örnek tensörlerden oluşan bir demeti kabul eder.
Hangi dışa aktarma formatları GPU olmadan çalışır?
Desteklenen tüm formatlar (TorchScript, ONNX, OpenVINO, CoreML, TF SavedModel, TF Frozen Graph, NCNN, PaddlePaddle, MNN, ExecuTorch) CPU üzerinde dışa aktarılabilir. Dışa aktarma işleminin kendisi için GPU gerekmez. TensorRT, NVIDIA GPU gerektiren tek formattır.
Hangi Ultralytics sürümüne ihtiyacım var?
Şunu kullan: Ultralytics >=8.4.38, ki bu ultralytics.utils.export modülünü ve standartlaştırılmış output_file/output_dir argümanları ile geçersiz kıl.
Bir torchvision modelini iOS dağıtımı için CoreML'ye dışa aktarabilir miyim?
Evet. torchvision sınıflandırıcıları, dedektörleri ve segmentasyon modelleri şuraya dışa aktarılabilir .mlpackage aracılığıyla torch2coreml. Görüntü sınıflandırma modelleri için, bir sınıflandırma başlığı oluşturmak üzere classifier_names kısmına sınıf adlarının bir listesini ilet. Dışa aktarma işlemini macOS veya Linux üzerinde çalıştır. CoreML, Windows üzerinde desteklenmez. Şuna bak: CoreML entegrasyonu iOS dağıtım ayrıntıları için.
Dışa aktardığım modeli INT8 veya FP16'ya niceleyebilir miyim?
Evet, birkaç format için. Şunu ilet half=True FP16 için veya int8=True INT8 için; OpenVINO, CoreML, MNN veya NCNN'ye dışa aktarırken. OpenVINO'daki INT8, ayrıca şunun için calibration_dataset argümanı gerektirir eğitim sonrası niceleme. Niceleme ödünleşimleri için her formatın entegrasyon sayfasına bak.