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.export altı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.

FormatFonksiyonKurulumÇıktı
ONNXtorch2onnx()pip install onnx.onnx dosyası olduğunda çalışır
TorchScripttorch2torchscript()PyTorch ile birlikte gelir.torchscript dosyası olduğunda çalışır
OpenVINOtorch2openvino()pip install openvino_openvino_model/dizin
CoreMLtorch2coreml()pip install coremltools.mlpackage
TF SavedModelonnx2saved_model()aşağıdaki ayrıntılı gereksinimlere bak_saved_model/dizin
TF Frozen Graphkeras2pb()aşağıdaki ayrıntılı gereksinimlere bak.pb dosyası olduğunda çalışır
NCNNtorch2ncnn()pip install ncnn pnnx_ncnn_model/dizin
MNNonnx2mnn()pip install MNN.mnn dosyası olduğunda çalışır
PaddlePaddletorch2paddle()pip install paddlepaddle x2paddle_paddle_model/dizin
ExecuTorchtorch2executorch()pip install executorch_executorch_model/dizin
ara format olarak ONNX

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.

Meta veri gömme

Ç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)
Dışa aktarmadan önce mutlaka `model.eval()` çağır

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.bin

Dinamik 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.

`BlobWriter not loaded` hatası

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.tflite

Gereksinimler:

  • 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 (macOS üzerinde --extra-index-url https://pypi.ngc.nvidia.com)
  • ai-edge-litert>=1.2.0,<1.4.0 ile yükle (ai-edge-litert>=1.2.0 diğer platformlarda)
  • onnxslim>=0.1.71
  • onnx>=1.12.0,<2.0.0
  • protobuf>=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.py

torch2ncnn() 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.0 ve platformun için doğru PaddlePaddle dağıtımı:
  • paddlepaddle==3.0.0 CUDA üzerinde
  • paddlepaddle>=3.0.0,<3.3.0 ARM64 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-5
Beklenen fark

FP32 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: torch2onnx ve torch2openvino birden fazla girişi olan modeller için örnek tensörlerin bir demetini veya listesini kabul eder. torch2torchscript, torch2coreml, torch2ncnn, torch2paddle, torch2executorch tek bir giriş tensörü varsayar.
  • ExecuTorch şuna ihtiyaç duyar flatc: ExecuTorch çalışma zamanı, FlatBuffers derleyicisini gerektirir. Şununla kur brew install flatbuffers macOS üzerinde veya apt install flatbuffers-compiler Ubuntu ü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-toolkit2 SDK (sadece Linux). Edge TPU şununla çalışır: edgetpu_compiler ikili 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.

Yorumlar