Ultralytics YOLO27: Bekleme listesine katıl.
Get Started
İlk YOLO modelini eğit·Dağıt·Ders 10/10
Dersbaşlangıç düzeyi

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.

Sonuç

Eğitilmiş bir modeli hedef dağıtım ortamına uygun biçime aktarabilir ve bire bir eşdeğerlik kontrolüyle doğrulama yaparak dışa aktarılan modelin best.pt ile eşleştiğini kanıtlayabilirsin.

Hızlı Başlangıç
Nasıl ilerleyeceğini zaten biliyorsan, işte kısa sürüm.
  1. yolo export model=runs/detect/pills_v1/weights/best.pt format=onnx — buradan başla.

  2. Intel CPU'lar için OpenVINO; NVIDIA GPU'ları ve Jetson için TensorRT; Apple için CoreML; Android için LiteRT; Snapdragon NPU'ları için QNN.

  3. .pt ile dışa aktarılan modeli, .pt tarafında rect=False ile aynı görüntü üzerinde karşılaştır.

  4. Her ikisini de eğitimdeki imgsz değerinde doğrula; mAP50-95 eşleşmelidir.

Uygulamalı

Uygulamalı Örnek: ONNX Biçimine Aktar#

Ultralytics Platform model Dışa Aktarma sekmesinde ONNX, TensorRT, CoreML ve OpenVINO gibi dağıtım biçimleri listeleniyor

yolo export model=runs/detect/pills_v1/weights/best.pt format=onnx
PyTorch: 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.yaml

Satı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ğitim imgsz değ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 .pt dosyasından daha büyüktür.
  • Predict: / Validate:: dışa aktarılan dosya için, doğru imgsz değerini önceden kullanan hazır komutlar.

Çoğu gereksinim için birkaç argüman yeterlidir; geri kalanları ONNX entegrasyon kılavuzunda bulabilirsin.

ArgümanVarsayılanKullanım amacı
imgszEğitim boyutuFarklı bir sabit giriş boyutuyla dışa aktar; ör. imgsz=640
dynamicFalseTek bir sabit şekil yerine değişken giriş boyutlarını kabul et
quantizeYok (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
nmsYoknms=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 px

Sayı 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ç#

Ultralytics Platform yaşam döngüsü: SAM akıllı etiketlemeyle açıklama ekleme, bulut GPU'larında eğitim ve entegrasyon iş ortaklarının logolarıyla dünya genelindeki bölgelere dağıtım

HedefBiçimNotlar
Taşınabilir varsayılan: Linux, Windows ve Mac kullanan sunucular ve masaüstü bilgisayarlaronnxCPU veya GPU üzerinde ONNX Runtime; doğrulaması en hızlı dışa aktarma
NVIDIA GPU'ları ve Jetsonengine (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'laropenvinoIntel çekirdekleriyle gerçek CPU hız kazanımları. CPU'da OpenVINO bölümüne bak.
iPhone, iPad ve Mac uygulamalarıcoremlYerel; Apple Neural Engine'i kullanır
Android ve diğer mobil veya gömülü cihazlarlitertMobil cihazlar için INT8 önerilir
Snapdragon NPU'larıqnnHexagon 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 onnxDaha 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 yap

Her 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#

Farklı girdileri karşılaştırmak

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.

Statik dışa aktarma imgsz değerini yok sayar

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.

TensorRT motorları cihaza özeldir

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.

Aksini belirtmezsen INT8 kalibrasyonu COCO8 üzerinde yapılır

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.

Dene

pills_v1/weights/best.pt modelini ONNX'e aktar, ardından parity.py ve val_export.py komutlarını çalıştır. rect=False olmadan parity.py komutunu yeniden çalıştır ve .pt sayısının nasıl değiştiğini kaydet. Dört öğeyi sun: eşleşen algılama sayısı, en büyük kutu farkı, iki mAP50-95 değeri ve gerçek dağıtım hedefinin gerektirdiği biçimi ve nedenini belirten bir satır.

Commit
git add -A && git commit -m "feat(deploy): exported best.pt to onnx for production runtime"
Tamamlanma ölçütü
Aşağıdakilerin tümü doğru olduğunda dersi tamamlamış olursun.
  • runs/detect/pills_v1/weights/best.onnx mevcut ve YOLO() aracılığıyla tahmin yapıyor.

  • rect=False ile algılama sayıları eşleşiyor ve en büyük kutu farkı 1 px'in altında.

  • ONNX ve .pt doğrulamalarındaki mAP50-95 değerleri eşleşen ayarlarda aynı; ayrıca hedef biçimini ve nedenini belirttin.

Çö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
Sırada ne var

Kurs tamamlandı — İlk YOLO modelini eğit sertifikasını almak için final sınavına gir, ardından Üretimde Ultralytics YOLO ile devam et.

İlerlemeni kaydetmek için giriş yap