Dağıtım için dışa aktar
best.pt dosyasını ONNX, OpenVINO, TensorRT, CoreML, LiteRT veya QNN biçimine aktar, ardından dağıtıma almadan önce dışa aktarılan modelin PyTorch modeliyle eşleştiğini doğrula.
best.pt modelini çalıştırmak için Python ve PyTorch gerekir; telefonlarda, tarayıcılarda, Jetson cihazlarında ve üretim sunucularında bunlar genellikle bulunmaz. Export mode, tek bir çağrıyla modeli bu çalışma zamanlarında kullanılabilecek, kendi kendine yeten bir dosyaya dönüştürür. Ancak dosyanın yüklenmesi, doğru olduğu anlamına gelmez; özensiz bir karşılaştırma doğru dışa aktarmayı bozuk gösterebilir veya bozuk olanı gizleyebilir.
Bu derste hap modelini ONNX biçimine aktaracak, aynı YOLO API üzerinden çalıştıracak, eşleşen ayarlarla kutular ve doğrulama mAP değeri bakımından PyTorch modeliyle eşleştiğini kanıtlayacak ve hedefinin gerektirdiği biçimi seçeceksin: ONNX, OpenVINO, TensorRT, CoreML, LiteRT veya QNN.
Uygulamalı
Uygulamalı Örnek: ONNX Biçimine Aktar#

yolo export model=runs/detect/pills_v1/weights/best.pt format=onnxPyTorch: starting from 'runs/detect/pills_v1/weights/best.pt' with input shape (1, 3, 320, 320) BCHW and output shape(s) (1, 5, 2100) (5.2 MB)
ONNX: export success ✅ 0.9s, saved as 'runs/detect/pills_v1/weights/best.onnx' (9.3 MB)
Predict: yolo predict task=detect model=runs/detect/pills_v1/weights/best.onnx imgsz=320
Validate: yolo val task=detect model=runs/detect/pills_v1/weights/best.onnx imgsz=320 data=my_dataset/data.yamlSatır satır:
input shape (1, 3, 320, 320): bir görüntü, 3 renk kanalı, sabit 320×320 kare — dosyaya gömülü eğitimimgszdeğeri.output shape(s) (1, 5, 2100): 2.100 aday kutu için 4 kutu değeri ve 1 sınıf skoru; varsayılan olarak NMS grafiğin dışında çalışır.9.3 MB: ONNX dosyası FP32 ağırlıkları depolar, bu nedenle FP16.ptdosyasından daha büyüktür.Predict:/Validate:: dışa aktarılan dosya için, doğruimgszdeğerini önceden kullanan hazır komutlar.
Çoğu gereksinim için birkaç argüman yeterlidir; geri kalanları ONNX entegrasyon kılavuzunda bulabilirsin.
| Argüman | Varsayılan | Kullanım amacı |
|---|---|---|
imgsz | Eğitim boyutu | Farklı bir sabit giriş boyutuyla dışa aktar; ör. imgsz=640 |
dynamic | False | Tek bir sabit şekil yerine değişken giriş boyutlarını kabul et |
quantize | Yok (FP32) | FP16 ağırlıklar için 16 (yolo26n.onnx boyutu 9.5 MB'tan 4.8 MB'a düşürür); biçimin desteklediği durumlarda INT8 için 8 |
nms | Yok | nms=True, NMS'yi grafiğe gömer; böylece çalışma zamanı son kutuları döndürür |
Uygulamalı Örnek: Dışa Aktarmanın Eşleştiğini Kanıtla#
YOLO sınıfı dışa aktarılan dosyaları da yükler; böylece önceki predict kodu değişmeden çalışır. Her iki dosyayı da aynı doğrulama görüntüsünde karşılaştır:
from ultralytics import YOLO
image = "my_dataset/images/val/Frame_144.jpg"
pt = YOLO("runs/detect/pills_v1/weights/best.pt")(image, rect=False, verbose=False)[0] # square input, like ONNX
onnx = YOLO("runs/detect/pills_v1/weights/best.onnx")(image, verbose=False)[0]
print(f"pt: {len(pt.boxes)} pills, mean conf {pt.boxes.conf.mean():.3f}")
print(f"onnx: {len(onnx.boxes)} pills, mean conf {onnx.boxes.conf.mean():.3f}")
print(f"max box difference: {(pt.boxes.xyxy - onnx.boxes.xyxy).abs().max():.4f} px")pt: 25 pills, mean conf 0.870
onnx: 25 pills, mean conf 0.870
max box difference: 0.0002 pxSayı aynı, güven aynı, kutular pikselin küçük bir kesri kadar farkla özdeş. Şimdi daha güçlü kontrolü, tüm veri bölümü üzerinde doğrulamayı yap:
from ultralytics import YOLO
pt = YOLO("runs/detect/pills_v1/weights/best.pt").val(data="my_dataset/data.yaml", rect=False, verbose=False)
onnx = YOLO("runs/detect/pills_v1/weights/best.onnx").val(data="my_dataset/data.yaml", verbose=False)
print(f".pt mAP50-95 {pt.box.map:.4f}")
print(f".onnx mAP50-95 {onnx.box.map:.4f}").pt mAP50-95 0.6570
.onnx mAP50-95 0.6570Özdeş. (.pt dosyasının varsayılan dikdörtgen doğrulama puanı 0.659 oldu: dışa aktarmadan değil, giriş dolgusundan kaynaklanan küçük bir fark.)
Eşleştiğini doğruladıktan sonra, dağıtıma almadan önce gerçek hızını öğrenmek için hedef cihazda yolo benchmark ile süre ölçümü yap.
Hedefin için bir biçim seç#

| Hedef | Biçim | Notlar |
|---|---|---|
| Taşınabilir varsayılan: Linux, Windows ve Mac kullanan sunucular ve masaüstü bilgisayarlar | onnx | CPU veya GPU üzerinde ONNX Runtime; doğrulaması en hızlı dışa aktarma |
| NVIDIA GPU'ları ve Jetson | engine (TensorRT) | NVIDIA'da en hızlı; dışa aktarma cihazda yapılır. TensorRT ile optimizasyon bölümüne bak. |
| Intel CPU'ları ve tümleşik GPU'lar | openvino | Intel çekirdekleriyle gerçek CPU hız kazanımları. CPU'da OpenVINO bölümüne bak. |
| iPhone, iPad ve Mac uygulamaları | coreml | Yerel; Apple Neural Engine'i kullanır |
| Android ve diğer mobil veya gömülü cihazlar | litert | Mobil cihazlar için INT8 önerilir |
| Snapdragon NPU'ları | qnn | Hexagon HTP hızlandırması; varsayılan olarak 16 bit etkinleştirmelerle INT8 ağırlıkları kullanılır; name ile HTP mimarisini seç |
| Web tarayıcısı | ONNX Runtime Web ile onnx | Daha küçük modeller gerçekçi bir seçenek: n ve s |
from ultralytics import YOLO
model = YOLO("runs/detect/pills_v1/weights/best.pt")
model.export(format="onnx") # platformlar arası: ONNX Runtime
model.export(format="openvino") # Intel CPU / tümleşik GPU
model.export(format="engine", quantize=16) # NVIDIA TensorRT, FP16 (hedef GPU'da çalıştır)
model.export(format="coreml") # Apple iOS / macOS
model.export(format="litert", quantize=8, data="my_dataset/data.yaml") # Android / uç cihaz, INT8
model.export(format="qnn", name="73", data="my_dataset/data.yaml") # Qualcomm Snapdragon NPU (HTP v73); kendi verilerinle kalibrasyon yapHer dışa aktarma, ağırlıkların yanına şunları yazar: best.onnx, best_openvino_model/, best.engine ve bu şekilde devam eder. Sonunda başka bir biçim kullanacak olsan bile ONNX ile başla: doğrulaması en hızlı olan biçimdir ve diğer bazı araç zincirleri için girdi görevi görür. Dağıtım seçenekleri kılavuzu tüm biçimleri karşılaştırır, Dağıtım Hedefi Seç ise karar verme sürecinde sana yol gösterir.
Model niceleme, boyut ve hız karşılığında hassasiyetten ödün verir. FP16 (quantize=16), doğruluk neredeyse hiç değişmeden dosya boyutunu yarıya indirir. INT8 (quantize=8) dosyayı daha da küçültür ve hızı artırır; ancak değer aralıklarını seçmek için dışa aktarma işleminin üzerinde çalıştırdığı temsili kareler olan kalibrasyon görüntülerini gerektirir; Ultralytics en az 300 görüntü kullanılmasını önerir. INT8 modelini kullanıma almadan önce mutlaka doğrula: doğruluk kaybı, modele ve kalibrasyon kümesine bağlı olarak ihmal edilebilir düzeyde de büyük de olabilir.
Bu Hatalardan Kaçın#
Belirti: .pt modeli Frame_144.jpg üzerinde 35 hap buluyor, ONNX dosyası ise 25 tane buluyor ve dışa aktarma bozuk görünüyor. Neden: PyTorch çıkarımı her görüntüyü, stride ile hizalanan en küçük dikdörtgene (bu 16:9 kareler için 192×320) doldururken statik ONNX modeli her zaman 320×320 kare girdi alır. Farklı girdi, düşük güvenli tespitlerin değişmesi demektir. Çözüm: Karşılaştırma yaparken .pt modeline rect=False değerini geçir; örneğin parity.py kullan.
Belirti: best.onnx öğesine imgsz=640 geçiriyorsun, ancak günlükte hâlâ 320x320 yazıyor. Neden: Statik bir dışa aktarımın, dışa aktarma sırasında belirlenen tek bir girdi boyutu vardır. Çözüm: Çalıştıracağın boyutta (imgsz=640) dışa aktar veya dynamic=True ile dışa aktar.
A100 üzerinde oluşturulan bir .engine, Jetson Orin üzerinde çalışmaz ve TensorRT yükseltmesinden sonra da çalışmayabilir. Hedef cihazda, kullanacağı TensorRT sürümüyle dışa aktar. ONNX taşınabilir; motorlar taşınabilir değildir.
INT8 dışa aktarımında data parametresini belirtmezsen Ultralytics uyarı verir, ardından varsayılan COCO8 örneğiyle kalibrasyon yapar — haplarına hiç benzemeyen sekiz görüntüyle. Kendi verini geçir: model.export(format="litert", quantize=8, data="my_dataset/data.yaml").
Ürünü yayına aldın#
Artık eğitilmiş bir best.pt modelin, temel modelle karşılaştırmanın yanında doğrulama kanıtların, çalışma ortamına uygun bir dışa aktarım dosyan ve dışa aktarılan modelin orijinaliyle eşleştiğini gösteren kanıtın var. Böylece tüm döngüyü tamamladın: veri, eğitim, doğrulama, dışa aktarma ve dağıtım. Üretim ekipleri bu döngüyü belirli aralıklarla yürütür. Üretimde Ultralytics YOLO, doğruladığın dışa aktarımla devam eder; optimize edilmiş çalışma ortamlarını, izleme işlem hatlarını, çoklu akış sunumunu ve izlemeyi ele alır.
Çözümü göster
from ultralytics import YOLO
# Train
model = YOLO("yolo26n.pt")
model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_e2e")
# Validate
metrics = model.val()
print(f"mAP50-95 = {metrics.box.map:.3f}") # 0.659
# Export
model.export(format="onnx")parity.py: pt 25 pills, onnx 25 pills, max box difference 0.0002 px
without rect: pt 35 pills (192x320 input) vs onnx 25 (320x320): input mismatch, not an export bug
val_export.py: .pt 0.6570, .onnx 0.6570
Target: Intel laptop CPU -> openvino, for faster CPU inference than ONNX Runtime