Ultralytics ileYOLO PyTorch Dışa Aktarma
PyTorch üretim ortamına dağıtmak, genellikle her hedef için farklı bir dışa aktarıcı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 ve benzeri. Her aracın kendine özgü API'si, bağımlılık sorunları ve çıktı kuralları vardır.
Ultralytics , birden fazla arka ucu tek bir tutarlı arayüz altında birleştiren bağımsız dışa aktarma araçları Ultralytics . Herhangi bir torch.nn.Module, şunlar dahil timm görüntü modelleri, torchvision sınıflandırıcılar ve algılayıcılar ya da kendi özel mimarilerinizle ONNX, TorchScript, OpenVINO, CoreML, NCNN, PaddlePaddle, MNN, ExecuTorchve TensorFlow SavedModel her bir arka ucu ayrı ayrı öğrenmeden.
YOLO Ultralytics Neden Ultralytics Kullanmalısınız?
- 10 farklı format için tek bir API: Onlarca çağrı kuralı yerine tek bir kuralı öğrenin.
- Ortak kullanım alanı: ihracat yardımcıları şu konumda bulunur
ultralytics.utils.exportBöylece, arka uç paketleri yüklendikten sonra tüm formatlarda aynı çağrı düzenini kullanmaya devam edebilirsiniz. - YOLO larıyla aynı kod yapısı: Her Ultralytics YOLO aynı yardımcı işlevler kullanılır.
- FP16 ve INT8 niceleme, bunu destekleyen formatlar için yerleşik olarak sunulmaktadır (OpenVINO, CoreML, MNN, NCNN).
- CPU üzerinde çalışır: Dışa aktarma işlemi için GPU ; bu sayede herhangi bir dizüstü bilgisayarda yerel olarak çalıştırabilirsiniz.
Hızlı Başlangıç
En hızlı yol, iki satırlık bir dışa aktarımdır ONNX YOLO olmadan ve bunun ötesinde herhangi bir kurulum gerektirmeden 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 Biçimleri
torch2* işlevler standart bir torch.nn.Module ve örnek bir girdi tensor. MNN, TF SavedModel ve TF Graph, ara bir ONNX Keras artefaktı üzerinden işlenir. Her iki durumda da YOLO herhangi bir öznitelik gerekmez.
| Format | İşlev | Kurulum | Çıktı |
|---|---|---|---|
| ONNX | torch2onnx() | pip install onnx | .onnx dosyası |
| TorchScript | torch2torchscript() | PyTorch ile birlikte gelir | .torchscript dosyası |
| OpenVINO | torch2openvino() | pip install openvino | _openvino_model/ dizin |
| CoreML | torch2coreml() | pip install coremltools | .mlpackage |
| TF SavedModel | onnx2saved_model() | Aşağıdaki ayrıntılı gerekliliklere bakınız | _saved_model/ dizin |
| TF Grafik | keras2pb() | Aşağıdaki ayrıntılı gerekliliklere bakınız | .pb dosyası |
| NCNN | torch2ncnn() | pip install ncnn pnnx | _ncnn_model/ dizin |
| MNN | onnx2mnn() | pip install MNN | .mnn dosyası |
| PaddlePaddle | torch2paddle() | pip install paddlepaddle x2paddle | _paddle_model/ dizin |
| ExecuTorch | torch2executorch() | pip install executorch | _executorch_model/ dizin |
ONNX : Ara format ONNX
MNN, TF SavedModelve TF Graph dışa aktarımları, ara adım ONNX üzerinden gerçekleştirilir. ONNX 'e dışa aktarın, ardından dönüştürün.
Meta verilerin eklenmesi
Bazı dışa aktarma işlevleri isteğe bağlı bir metadata sözlük (örneğin, torch2torchscript(..., metadata={"author": "me"})) formatın desteklediği durumlarda, dışa aktarılan yapı öğesine özel anahtar-değer çiftleri ekleyen.
Adım Adım Örnekler
Aşağıdaki tüm örneklerde aynı yapılandırma kullanılmaktadır: timm paketinden alınan, değerlendirme modunda çalışan önceden eğitilmiş bir ResNet-18 modeli:
import timm
import torch
model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)
Her zaman arayın model.eval() dışa aktarmadan önce
Okulu bırakma, toplu normalleştirme (batch normalization)ve diğer sadece tren verilerini içeren katmanlar, çıkarım sırasında farklı davranır. Atlama .eval() hatalı çıktılar içeren veriler üretir.
ONNX'e Aktar
from ultralytics.utils.export import torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
Dinamik parti boyutu için bir dynamic sözlük:
torch2onnx(model, im, output_file="resnet18_dyn.onnx", dynamic={"images": {0: "batch_size"}})
Varsayılan opset şudur: 14 ve varsayılan giriş adı şudur: "images". Şununla geçersiz kılın: opset, input_names, veya output_names argümanlar.
TorchScript'e aktar
Ekstra bağımlılık gerekmez. Kullanım alanları torch.jit.trace perde arkasında.
from ultralytics.utils.export import torch2torchscript
torch2torchscript(model, im, output_file="resnet18.torchscript")
OpenVINO'ya aktar
from ultralytics.utils.export import torch2openvino
ov_model = torch2openvino(model, im, output_dir="resnet18_openvino_model")
Dizin, sabit bir ad içeren model.xml ve model.bin çift:
resnet18_openvino_model/
├── model.xml
└── model.bin
Geç dynamic=True dinamik giriş şekilleri için, half=True FP16 için, ya da int8=True INT8 niceleme için. INT8 ayrıca bir calibration_dataset argüman.
Gerekli openvino>=2024.0.0 (veya >=2025.2.0 macOS 15.4 ve üzeri sürümlerde) ve torch>=2.1.
CoreML'e aktar
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 sınıflandırma modeller, sınıf adlarından oluşan bir listeyi classifier_names CoreML modeline bir sınıflandırma başlığı eklemek için.
Gerekli coremltools>=9.0, torch>=1.11ve numpy<=2.3.5. Windows'ta desteklenmemektedir.
BlobWriter not loaded hata
coremltools>=9.0 macOS ve Linux'ta Python .10–3.13 sürümleri için works. Daha yeni Python yerel C uzantısı yüklenemiyor. CoreML için Python .10–3.13 sürümlerini kullanın.
TensorFlow SavedModel'e aktar
TF SavedModel , ara adım ONNX üzerinden gerçekleştirilir:
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")
Bu işlev bir Keras modeli döndürür ve ayrıca TFLite oluşturur (.tflite) çıktı dizininde:
resnet18_saved_model/
├── saved_model.pb
├── variables/
├── resnet18_float32.tflite
├── resnet18_float16.tflite
└── resnet18_int8.tflite
Gereksinimler:
tensorflow>=2.0.0,<=2.19.0onnx2tf>=1.26.3,<1.29.0tf_keras<=2.19.0sng4onnx>=1.0.1onnx_graphsurgeon>=0.3.26(şununla yükleyin--extra-index-url https://pypi.ngc.nvidia.com)ai-edge-litert>=1.2.0,<1.4.0macOS'ta (ai-edge-litert>=1.2.0(diğer platformlarda)onnxslim>=0.1.71onnx>=1.12.0,<2.0.0protobuf>=5
TensorFlow Graph'a Aktar
Yukarıdaki SavedModel aktarımının devamı olarak, elde edilen Keras modelini dondurulmuş bir modele dönüştürün .pb grafik:
from pathlib import Path
from ultralytics.utils.export import keras2pb
keras2pb(keras_model, output_file=Path("resnet18_saved_model/resnet18.pb"))
NCNN'ye aktar
from ultralytics.utils.export import torch2ncnn
torch2ncnn(model, im, output_dir="resnet18_ncnn_model")
Dizin, sabit adlı param ve bin dosyalarının yanı sıra bir Python içerir:
resnet18_ncnn_model/
├── model.ncnn.param
├── model.ncnn.bin
└── model_ncnn.py
torch2ncnn() şunları kontrol eder ncnn ve pnnx ilk kullanımda.
MNN'ye aktar
MNN dışa aktarma işlemi için girdi olarak bir ONNX gerekir. ONNX formatına dışa aktarın, ardından dönüştürün:
from ultralytics.utils.export import onnx2mnn, torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
onnx2mnn("resnet18.onnx", output_file="resnet18.mnn")
Destekler half=True FP16 için ve int8=True INT8 niceleme için. Gereklilikler: MNN>=2.9.6 ve torch>=1.10.
PaddlePaddle'a aktar
from ultralytics.utils.export import torch2paddle
torch2paddle(model, im, output_dir="resnet18_paddle_model")
Dizin, PaddlePaddle ve parametre dosyalarını içerir:
resnet18_paddle_model/
├── model.pdmodel
└── model.pdiparams
Gerekli x2paddle ve platformunuz için uygun PaddlePaddle :
paddlepaddle-gpu>=3.0.0,<3.3.0CUDA üzerindepaddlepaddle==3.0.0ARM64 CPUpaddlepaddle>=3.0.0,<3.3.0diğer işlemcilerde
NVIDIA 'da desteklenmemektedir.
ExecuTorch'a aktar
from ultralytics.utils.export import torch2executorch
torch2executorch(model, im, output_dir="resnet18_executorch_model")
Dışa aktarılan .pte dosya çıktı dizinine kaydedilir:
resnet18_executorch_model/
└── model.pte
Gerekli torch>=2.9.0 ve buna uygun bir ExecuTorch çalışma zamanı (pip install executorch). Çalışma zamanı kullanımı için bkz. ExecuTorch entegrasyonu.
Dışa Aktarılan Modeli Doğrulayın
Dışa aktarımdan sonra, yayına almadan önce orijinal PyTorch sayısal tutarlılığı kontrol edin. Şu komutla hızlı bir işlevsellik testi yapın: ONNXBackend kaynak: ultralytics.nn.backends çıktıları karşılaştırır ve izleme veya niceleme hatalarını erken aşamada bildirir:
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
Beklenen fark
FP32 formatında yapılan aktarımlarda, maksimum mutlak fark şu değerin altında olmalıdır 1e-5. Daha büyük sapmalar, desteklenmeyen işlemler, hatalı girdi biçimi veya modelin değerlendirme modunda olmamasına işaret eder. FP16 ve INT8 formatlarında dışa aktarılan verilerde toleranslar daha esnektir. Rastgele tensörler yerine gerçek verilerle doğrulama yapın.
Diğer çalışma ortamlarında girdi tensor farklı olabilir. Örneğin OpenVINO, modelin ileri yönlü 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 düzensiz:
torch2onnxvetorch2openvinoçoklu girişli modeller için örnek tensörlerden oluşan bir tuple veya listeyi kabul eder.torch2torchscript,torch2coreml,torch2ncnn,torch2paddlevetorch2executorchtek bir girdi tensor varsayalım. - ExecuTorch'un gereksinimleri
flatc: ExecuTorch çalışma zamanı ortamı için FlatBuffers derleyicisi gereklidir. Şu komutla yükleyin:brew install flatbuffersmacOS'ta veyaapt install flatbuffers-compilerUbuntu'da. - Ultralytics aracılığıyla herhangi bir çıkarım yapılmamaktadır: Dışa aktarılanYOLO şu yol üzerinden yeniden yüklenemez
YOLO()çıkarım için. Her format için ilgili yerel çalışma zamanını kullanın (ONNX Runtime, OpenVINO, vb.). - YOLO formatlar: Axelera ve Sony IMX500 dışa aktarımları, YOLO model özellikleri gerektirir ve genel modeller için kullanılamaz.
- Platforma özgü formatlar: TensorRT NVIDIA GPU gerektirir. RKNN şunu gerektirir
rknn-toolkit2SDK (sadece Linux). Edge TPU şunu gerektiriredgetpu_compilerikili dosya (yalnızca Linux).
SSS
Ultralytics ile hangi modelleri dışa aktarabilirim?
Herhangi bir torch.nn.Module. Buna timm, torchvision veya herhangi bir özel PyTorch dahildir. Model değerlendirme modunda olmalıdır (model.eval()) dışa aktarımdan önce. ONNX OpenVINO , çoklu girdi modelleri için örnek tensörlerden oluşan bir tuple OpenVINO kabul eder.
Hangi dışa aktarma biçimleri GPU olmadan çalışır?
Desteklenen tüm formatlar (TorchScript, ONNX, OpenVINO, CoreML, TF SavedModel, TF Graph, NCNN, PaddlePaddle, MNN, ExecuTorch) CPU üzerinde dışa aktarılabilir. Dışa aktarma işlemi için GPU . TensorRT , NVIDIA GPU gerektiren tek TensorRT .
Hangi Ultralytics ihtiyacım var?
Ultralytics kullanın >=8.4.38ve şunları içeren ultralytics.utils.export modül ve standartlaştırılmış output_file/output_dir argümanlar.
Bir TorchVision modelini iOS CoreML 'e aktarabilir miyim?
Evet. TorchVision sınıflandırıcıları, dedektörleri ve segmentasyon modelleri şu formatlara aktarılabilir: .mlpackage aracılığıyla torch2coreml. Görüntü sınıflandırma modelleri için, sınıf adlarından oluşan bir listeyi classifier_names sınıflandırma modülünde çalıştırmak için. Dışa aktarma işlemini macOS veya Linux üzerinde gerçekleştirin. CoreML Windows'ta CoreML . Bkz. CoreML iOS ayrıntılar için.
Dışa aktardığım modeli INT8 veya FP16'ya nicelleştirebilir miyim?
Evet, çeşitli formatlar için. Devam half=True FP16 için veya int8=True OpenVINO, CoreML, MNN veya NCNNye dışa aktarırken INT8 için. OpenVINO 'da INT8 OpenVINO bir calibration_dataset için argüman eğitim sonrası niceleme. Her bir formatın entegrasyon sayfasına bakarak nicelemeyle ilgili artıları ve eksileri inceleyin.