İçeriğe geç

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İşlevKurulumÇıktı
ONNXtorch2onnx()pip install onnx.onnx dosyası
TorchScripttorch2torchscript()PyTorch ile birlikte gelir.torchscript dosyası
OpenVINOtorch2openvino()pip install openvino_openvino_model/ dizin
CoreMLtorch2coreml()pip install coremltools.mlpackage
TF SavedModelonnx2saved_model()Aşağıdaki ayrıntılı gerekliliklere bakınız_saved_model/ dizin
TF Grafikkeras2pb()Aşağıdaki ayrıntılı gerekliliklere bakınız.pb dosyası
NCNNtorch2ncnn()pip install ncnn pnnx_ncnn_model/ dizin
MNNonnx2mnn()pip install MNN.mnn dosyası
PaddlePaddletorch2paddle()pip install paddlepaddle x2paddle_paddle_model/ dizin
ExecuTorchtorch2executorch()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.0
  • onnx2tf>=1.26.3,<1.29.0
  • tf_keras<=2.19.0
  • sng4onnx>=1.0.1
  • onnx_graphsurgeon>=0.3.26 (şununla yükleyin --extra-index-url https://pypi.ngc.nvidia.com)
  • ai-edge-litert>=1.2.0,<1.4.0 macOS'ta (ai-edge-litert>=1.2.0 (diğer platformlarda)
  • onnxslim>=0.1.71
  • onnx>=1.12.0,<2.0.0
  • protobuf>=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.0 CUDA üzerinde
  • paddlepaddle==3.0.0 ARM64 CPU
  • paddlepaddle>=3.0.0,<3.3.0 diğ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: torch2onnx ve torch2openvino çoklu girişli modeller için örnek tensörlerden oluşan bir tuple veya listeyi kabul eder. torch2torchscript, torch2coreml, torch2ncnn, torch2paddleve torch2executorch tek 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 flatbuffers macOS'ta veya apt install flatbuffers-compiler Ubuntu'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-toolkit2 SDK (sadece Linux). Edge TPU şunu gerektirir edgetpu_compiler ikili 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.



📅 0 gün önce oluşturuldu ✏️ 0 gün önce güncellendi
raimbekovm

Yorumlar