Modellexport mit Ultralytics YOLO#
Einleitung#
Das ultimative Ziel beim Trainieren eines Modells besteht darin, es für reale Anwendungen bereitzustellen. Der Exportmodus in Ultralytics YOLO26 bietet eine vielseitige Auswahl an Optionen, um dein trainiertes Modell in verschiedene Formate zu exportieren, sodass es auf verschiedenen Plattformen und Geräten eingesetzt werden kann. Diese umfassende Anleitung führt dich durch die Nuancen des Modellexports und zeigt, wie du maximale Kompatibilität und Leistung erreichst.
Siehe die unreleased YOLO27 preview für die geplante Exportunterstützung.
Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀
Warum solltest du den Exportmodus von YOLO26 wählen?#
- Vielseitigkeit: Export in mehrere Formate, einschließlich ONNX, TensorRT, CoreML und weiteren.
- Leistung: Erziele bis zu 5-fache GPU-Beschleunigung mit TensorRT und 3-fache CPU-Beschleunigung mit ONNX oder OpenVINO.
- Kompatibilität: Mache dein Modell universell auf zahlreichen Hard- und Softwareumgebungen einsetzbar.
- Benutzerfreundlichkeit: Einfache CLI und Python API für einen schnellen und unkomplizierten Modellexport.
Hauptfunktionen des Exportmodus#
Hier sind einige der herausragenden Funktionen:
- Ein-Klick-Export: Einfache Befehle zum Exportieren in verschiedene Formate.
- Batch-Export: Exportiere Modelle, die für Batch-Inferenz geeignet sind.
- Optimierte Inferenz: Exportierte Modelle sind für schnellere Inferenzzeiten optimiert.
- Tutorial-Videos: Ausführliche Anleitungen und Tutorials für einen reibungslosen Export.
Verwendungsbeispiele#
Exportiere ein YOLO26n-Modell in ein anderes Format wie ONNX oder TensorRT. Eine vollständige Liste der Exportargumente findest du im Abschnitt „Argumente“ unten.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom-trained model
# Export the model
model.export(format="onnx")Argumente#
Diese Tabelle beschreibt die Konfigurationen und Optionen, die für den Export von YOLO-Modellen in verschiedene Formate verfügbar sind. Diese Einstellungen sind entscheidend für die Optimierung der Leistung, der Größe und der Kompatibilität des exportierten Modells über verschiedene Plattformen und Umgebungen hinweg. Eine ordnungsgemäße Konfiguration stellt sicher, dass das Modell mit optimaler Effizienz für die Bereitstellung in der vorgesehenen Anwendung bereit ist.
| Argument | Typ | Standardwert | Beschreibung |
|---|---|---|---|
format | str | 'torchscript' | Zielformat für das exportierte Modell, z. B. 'onnx', 'torchscript', 'engine' (TensorRT) oder andere. Jedes Format ermöglicht die Kompatibilität mit unterschiedlichen Bereitstellungsumgebungen. |
name | str | None | Name des Hardwareziels für Formate, die eines benötigen: Hailo-Architektur ('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l'; Standardwert ist 'hailo8l'), Rockchip-RKNN-Chip (Standardwert ist 'rk3588'), Huawei Ascend SoC (ein CANN---soc_version; Standardwert ist 'Ascend310B4') oder Qualcomm-QNN-HTP-Ziel (Standardwert ist '73'). Nicht zu verwechseln mit dem aus project/name bestehenden Paar zur Benennung von Läufen, das von anderen Modi verwendet wird. |
imgsz | int oder tuple | 640 | Gewünschte Bildgröße für die Modelleingabe. Kann eine Ganzzahl für quadratische Bilder sein (z. B. 640 für 640×640) oder ein Tupel (height, width) für bestimmte Abmessungen. Wenn keine Größe übergeben wird, verwendet der Export erneut die im geladenen Checkpoint gespeicherte Trainingsgröße: Die offiziellen YOLO26-Checkpoints speichern 768 für Tiefe, 224 für Klassifizierung, 1024 für OBB und 640 für die übrigen Aufgaben, während ein Fine-Tuning den Wert imgsz speichert, mit dem trainiert wurde. Ein aus einer YAML-Datei erstelltes Modell hat keine gespeicherte Trainingsgröße und verwendet 640. |
keras | bool | False | Aktiviert den Export in das Keras-Format für TensorFlow SavedModel und ermöglicht die Kompatibilität mit TensorFlow Serving und APIs. |
optimize | bool | False | Aktiviert eine höhere Compileroptimierung für DEEPX, wodurch die Inferenzlatenz reduziert, die Kompilierungszeit jedoch erhöht wird. |
quantize | int oder str | None | Quantisierungsgenauigkeit: 16 (FP16, reduziert die Modellgröße und kann die Inferenz auf unterstützter Hardware beschleunigen) oder 8 (INT8/PTQ, komprimiert das Modell weiter bei minimalem Genauigkeitsverlust, primär für Edge-Geräte; erfordert die Kalibrierung data/fraction); 32/nicht gesetzt ist FP32. Ein mit quantize=8 trainierter Checkpoint exportiert immer INT8: onnx und engine exportieren aus den darin enthaltenen Bereichen ohne Kalibrierung, und andere Formate oder Genauigkeiten werden abgelehnt. Exportformate, die gemischte Gewichts-/Aktivierungsgenauigkeit unterstützen, akzeptieren auch die Notation 'w8a8'/'w16a16'/'w8a16'/'w8a32'. Ersetzt die veralteten half/int8-Flags (half=True → 16, int8=True → 8, werden weiterhin mit einer Veraltungswarnung akzeptiert). Nur vom Zielformat unterstützte Genauigkeiten sind zulässig (siehe unten). |
dynamic | bool | False | Ermöglicht dynamische Eingabegrößen für TorchScript-, ONNX-, OpenVINO-, TensorRT- und CoreML-Exporte und erhöht dadurch die Flexibilität bei der Verarbeitung unterschiedlicher Bildabmessungen. |
simplify | bool | True | Vereinfacht den Zwischengraphen von ONNX mit onnxslim für die Exporte, die einen solchen Graphen erstellen (siehe Exportformate), und kann dadurch Leistung und Kompatibilität mit Inferenz-Engines verbessern. |
opset | int | None | Gibt die ONNX-Opset-Version für die Exporte an, die einen ONNX-Graphen erstellen (siehe Exportformate), um die Kompatibilität mit verschiedenen ONNX-Parsern und Laufzeitumgebungen sicherzustellen. Wenn nicht festgelegt, wird die neueste unterstützte Version verwendet. |
workspace | float oder None | None | Legt die maximale Workspace-Größe in GiB für TensorRT-Optimierungen fest und bildet einen Kompromiss zwischen Speichernutzung und Leistung. Verwende None, damit TensorRT automatisch bis zum Gerätemaximum Speicher zuweist. |
nms | bool, optional | None | None exportiert rohe One-to-Many-Vorhersagen für externes NMS; True bettet NMS ein, wo dies unterstützt wird; False wählt den NMS-freien Kopf aus, sofern verfügbar. In CoreML eingebettetes NMS unterstützt Detect, Segment und Pose mit statischen Formen. Siehe den End-to-End Detection guide. |
conf | float | None | Konfidenzschwellwert, der überall verwendet wird, wo NMS während des Exports erzeugt wird: bei nms=True-Exporten, Hailos End-to-End-freien Erkennungsexporten sowie IMXs Erkennungs-, Posenschätzungs- und Segmentierungsexporten, die intern nms=True erzwingen. Wenn nicht gesetzt, ist der Standardwert 0.25. |
iou | float | 0.7 | IoU-Schwellwert, der überall verwendet wird, wo NMS während des Exports erzeugt wird: bei nms=True-Exporten, Hailos End-to-End-freien Erkennungsexporten sowie IMXs Erkennungs-, Posenschätzungs- und Segmentierungsexporten, die intern nms=True erzwingen. |
max_det | int | 300 | Maximale Anzahl an Detektionen, die in der Ausgabe des exportierten Modells beibehalten werden. Gilt für nms=True-Exporte in jedem Format außer CoreML-Detektion (deren native NMS-Pipeline kein Detektionslimit hat) sowie NMS-freie End-to-End-Detektionsexporte (YOLO26, YOLOv10, begrenzt auf die Anzahl der verfügbaren Anker) und die Detektions-, Posen- und Segmentexporte von IMX. |
agnostic_nms | bool | False | Aktiviert klassenunabhängige NMS überall dort, wo NMS während des Exports über die standardmäßige nms=True-Pipeline erzeugt wird, einschließlich der eigenen NMS-Phase von CoreML. Dabei werden sich überlappende Boxen mit niedrigeren Werten über verschiedene Klassen hinweg statt nur innerhalb derselben Klasse unterdrückt. Wird von den eigenen erzeugten NMS-Konfigurationen von Hailo oder IMX nicht berücksichtigt; diese verfügen über keine klassenunabhängige Option und bleiben unabhängig von diesem Flag klassenabhängig. Ist außerdem in NMS-freie End-to-End-Exporte (YOLO26, YOLOv10) integriert, wo es nur verhindert, dass dieselbe Erkennung unter mehreren Klassenbezeichnungen erscheint (Duplikate mit IoU=1.0), nicht jedoch die Unterdrückung anhand eines IoU-Schwellwerts zwischen unterschiedlichen Boxen. |
batch | int | 1 | Gibt die Batchgröße für die Inferenz des exportierten Modells oder die maximale Anzahl von Bildern an, die das exportierte Modell im Modus predict gleichzeitig verarbeitet. Bei Edge-TPU-Exporten wird dieser Wert automatisch auf 1 gesetzt. |
device | str | None | Gibt das Gerät für den Export an: GPU (device=0), CPU (device=cpu), MPS für Apple-Silicon (device=mps), Huawei Ascend NPU (device=npu oder device=npu:0) oder DLA für NVIDIA Jetson (device=dla:0 oder device=dla:1). TensorRT-Exporte verwenden automatisch die GPU, TensorRT 11.0 unterstützt DLA jedoch nicht. |
verbose | bool | False | Setzt die Protokollierungsstufe des TensorRT-Builders während des format='engine'-Exports auf VERBOSE. Andere Exportformate ignorieren diese Einstellung. |
data | str | None | Pfad zum Dataset-YAML, essenziell für die INT8-Quantisierungskalibrierung; die Klassifikation nimmt stattdessen ein Dataset-Verzeichnis oder einen integrierten Dataset-Namen entgegen. Wenn bei aktiviertem INT8 nicht angegeben, wählt Ultralytics wo erforderlich ein aufgabenspezifisches Kalibrierungs-Dataset aus oder greift auf das Standard-Dataset für die Modellaufgabe zurück. Ein mit quantize=8 trainierter Checkpoint bringt eigene INT8-Bereiche mit und benötigt keine Kalibrierungsdaten. |
split | str | 'val' | Dataset-Aufteilung ('train', 'val' oder 'test'), die zum Erstellen des INT8-Quantisierungskalibrierungs-Dataloaders aus data verwendet wird. |
fraction | float, int oder list | 1.0 | Für die INT8-Kalibrierung verwendete Dataset-Teilmenge: ein Verhältnis, eine Bildanzahl oder [train, val, test]-Werte. 1 bedeutet die vollständige Aufteilung, Ganzzahlen über 1 sind Bildanzahlen, und nur der optionale Testeintrag akzeptiert 0/0.0 für „keine“. Listen mit zwei Einträgen lassen test vollständig. |
Das Anpassen dieser Parameter ermöglicht eine Personalisierung des Exportprozesses entsprechend spezifischer Anforderungen wie Einsatzumgebung, Hardwarebeschränkungen und Leistungszielen. Die Auswahl des geeigneten Formats und der passenden Einstellungen ist unerlässlich, um die beste Balance zwischen Modellgröße, Geschwindigkeit und Genauigkeit zu erreichen.
Exportformate#
Die verfügbaren YOLO26-Exportformate sind in der folgenden Tabelle aufgeführt. Du kannst in jedes Format exportieren, indem du das Argument format verwendest, d. h. format='onnx' oder format='engine'. Du kannst direkt mit exportierten Modellen vorhersagen oder validieren, d. h. yolo predict model=yolo26n.onnx. Anwendungsbeispiele werden für dein Modell nach Abschluss des Exports angezeigt. Modelle können auch direkt aus dem Browser auf der Ultralytics Platform ohne lokale Einrichtung exportiert werden.
| Format | Argument format | Modell | Metadaten | Argumente |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz, batch, quantize |
nms=None verwendet standardmäßig Rohausgaben für externes NMS. Setze nms=False, um einen verfügbaren NMS-freien Kopf auszuwählen; nicht unterstützte Formate greifen auf ihren nativen Ausgabepfad zurück. Die Einträge nms oben identifizieren Formate, die NMS mit nms=True einbetten können.
Die meisten Formate benötigen Pakete, die nicht mit ultralytics installiert werden. Wenn eines fehlt, installiert das Exportmodul es zur Laufzeit mit uv oder pip und unter Linux mit apt für Systempakete wie den Edge TPU-Compiler oder Java für IMX. Um die Umgebung unverändert zu halten, zum Beispiel in einem Container-Image, CI-Job oder Produktionsdienst, setze YOLO_AUTOINSTALL=False. Das Exportmodul überprüft dann weiterhin, ob Pakete fehlen, meldet diese, lässt die Umgebung jedoch unverändert und bricht mit einem Fehler ab, bis die Pakete installiert sind.
export YOLO_AUTOINSTALL=FalseQuantisierungsoptionen#
Verwende das Argument quantize, um die Exportpräzision anzufordern. String-Werte ignorieren die Groß- und Kleinschreibung, und Ultralytics bereinigt akzeptierte Aliase vor dem Export:
| Anfrage-Werte | Kanonischer Wert | Bedeutung |
|---|---|---|
8, "8", "int8", "w8a8" | 8 | INT8-Gewichte und -Aktivierungen |
16, "16", "fp16", "w16a16" | 16 | FP16-Gewichte und -Aktivierungen |
32, "32", "fp32", "w32a32" | 32 | FP32-Export; entspricht dem nicht festgelegten Zustand, außer bei CoreML-NMS-ML-Programmen, die standardmäßig FP16 verwenden |
"w8a16" | "w8a16" | INT8-Gewichte mit 16-Bit-Aktivierungen (FP16; INT16 auf LiteRT) |
"w8a32" | "w8a32" | INT8-Gewichte mit FP32-Aktivierungen (dynamisches INT8 von LiteRT, keine Kalibrierung erforderlich) |
Die veralteten Flags half=True und int8=True werden weiterhin mit Deprecation-Warnungen akzeptiert und an quantize=16 sowie quantize=8 weitergeleitet.
Nicht jedes Exportformat unterstützt jede Präzision. Explizite Anfragen für quantize führen entweder zu dieser Präzision oder schlagen vor dem Export fehl:
| Format | FP32 (32/nicht festgelegt) | FP16 (16) | INT8 (8) | W8A16 ("w8a16") | Hinweise |
|---|---|---|---|---|---|
| PyTorch | ✅ | Nicht verfügbar | Nicht verfügbar | Nicht verfügbar | Natives Trainings-/Checkpoint-Format. |
| TorchScript | ✅ | ✅ Nur GPU | ❌ | ❌ | Der FP16-TorchScript-Export erfordert device=0; der CPU-Export erfolgt in FP32. |
| ONNX | ✅ | ✅ | ✅ | ❌ | INT8 verwendet statische Quantisierung und Kalibrierungsdaten von ONNX Runtime. |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | INT8 verwendet die NNCF-Post-Training-Quantisierung. |
| TensorRT | ✅ | ✅ | ✅ | ❌ | INT8 benötigt repräsentative Kalibrierungsdaten. |
| CoreML | ✅¹ | ✅ | ✅ | ✅ | CoreML INT8 ist eine Gewichtsquantisierung; W8A16 verwendet INT8-Gewichte mit FP16-Aktivierungen. ¹Nicht festgelegte NMS-ML-Programme verwenden standardmäßig FP16. |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | Der INT8-Export verwendet die TensorFlow-Kalibrierung. |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | Keine Präzisionskonvertierung zum Exportzeitpunkt. |
| Edge TPU | ❌ | ❌ | ✅ auto | ❌ | Edge TPU erfordert INT8; es wird automatisch aktiviert, wenn es nicht festgelegt ist. |
| PaddlePaddle | ✅ | ❌ | ❌ | ❌ | Keine Präzisionskonvertierung zum Exportzeitpunkt. |
| MNN | ✅ | ✅ | ✅ | ❌ | INT8 ist eine Gewichtsquantisierung durch MNN-Konvertierung. |
| NCNN | ✅ | ✅ | ❌ | ❌ | Mobile/eingebettete Laufzeitformat. |
| IMX500 | ❌ | ❌ | ✅ auto | ✅ | IMX500 erfordert Quantisierung; INT8 wird automatisch aktiviert, wenn es nicht festgelegt ist. |
| RKNN | ❌ | ✅ chipabhängig | ✅ | ❌ | RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B unterstützen FP16 oder INT8; RV1103/RV1106-Varianten sind nur für INT8 ausgelegt. |
| ExecuTorch | ✅ | ❌ | ❌ | ❌ | Keine Präzisionskonvertierung zum Exportzeitpunkt. |
| Axelera | ❌ | ❌ | ✅ auto | ❌ | Der Axelera-Export erfordert INT8; er wird automatisch aktiviert, wenn er nicht festgelegt ist. |
| DEEPX | ❌ | ❌ | ✅ auto | ❌ | Der DEEPX-Export erfordert INT8; er wird automatisch aktiviert, wenn er nicht festgelegt ist. |
| Qualcomm QNN | ❌ | ❌ | ❌ | ✅ auto | Der QNN-HTP-Export ist fest auf INT8-Gewichte mit 16-Bit-Aktivierungen eingestellt. |
| LiteRT | ✅ | ❌ | ✅ | ✅ | Statisches INT8 (8) und "w8a16" (INT8-Gewichte + int16-Aktivierungen) verwenden Kalibrierungsdaten; es wird auch das dynamische INT8 von "w8a32" unterstützt (keine Kalibrierung). quantize=16 ist kein separater Export; ein FP32-Modell läuft zur Laufzeit über das GPU-Delegat in FP16. |
| Hailo | ❌ | ❌ | ✅ auto | ❌ | Der Hailo-Export erfordert INT8; er wird automatisch aktiviert, wenn keine Einstellung vorgenommen wurde. |
| Huawei Ascend | ❌ | ✅ auto | ❌ | ❌ | Ascend AI Core-Faltungen akzeptieren nur FP16/INT8-Eingaben, daher kompiliert ATC in FP16; dies wird automatisch aktiviert, wenn es nicht festgelegt ist. |
| Core AI | ✅ | ✅ | ❌ | ❌ | FP32 standardmäßig oder ein FP16-.aimodel-Asset mit quantize=16; kein INT8-Pfad. |
Stelle für INT8- und W8A16-Exporte repräsentative Kalibrierungsdaten mit data bereit, wie z. B. data="coco8.yaml", es sei denn, die Zielintegration dokumentiert ein Standard- oder automatisch aktiviertes Verhalten. Das Schema "w8a32" (dynamisches INT8) von LiteRT benötigt keine Kalibrierungsdaten.
Quantization-Aware Training#
Die obigen INT8-Exporte sind eine Post-Training-Quantisierung (PTQ): Die Wertebereiche werden in einem einzigen Kalibrierungsdurchlauf über data ermittelt. Das Quantization-Aware Training (QAT) lernt stattdessen Gewichte, die INT8 tolerieren, indem es durch ein Fine-Tuning mit Fake-Quantisierung in der Schleife erfolgt, wodurch die Genauigkeit wiederhergestellt wird, die die reine Kalibrierung verliert. Übergebe quantize=8 an train, um einen vortrainierten Checkpoint abzustimmen, und exportiere ihn dann wie gewohnt:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(
data="coco.yaml",
quantize=8,
epochs=5,
batch=64,
optimizer="AdamW",
lr0=0.00001,
lrf=0.1,
warmup_epochs=0.5,
cos_lr=True,
mosaic=0.0,
)
model.export(format="engine", quantize=8) # ranges travel with the checkpoint, no calibration data neededVerwende beim Fine-Tuning eines vortrainierten Checkpoints eine kleine Lernrate. Das QAT kann die Genauigkeit anfangs verringern, und sein Vorteil gegenüber der Post-Training-Quantisierung hängt vom Modell, dem Datensatz und dem Trainingsbudget ab. Validiere das exportierte Modell sowohl anhand des ursprünglichen Checkpoints als auch anhand eines post-training-quantisierten Exports; die Fake-Quantization-Ergebnisse während des Trainings spiegeln nicht die Bereitstellungsgenauigkeit wider.
Wie viel QAT bringt, hängt davon ab, wie gut die eigene Kalibrierung des Export-Backends mit dem Modell umgeht. Die folgenden Werte sind mAP50-95 auf COCO val2017, gemessen mit TensorRT 10.16-Engines bei imgsz=640 und Batch 1, wobei jeder QAT-Checkpoint mit epochs=20 patience=3 trainiert wurde:
| Modell | FP32-Engine | PTQ-INT8-Engine | QAT-INT8-Engine |
|---|---|---|---|
yolo26n | 0.4032 | 0.3934 | 0.3935 |
yolo26s | 0.4794 | 0.4412 | 0.4711 |
yolo26m | 0.5269 | 0.4696 | 0.5137 |
yolo26l | 0.5440 | 0.4889 | 0.5307 |
yolo26x | 0.5701 | 0.5138 | 0.5527 |
QAT kostet über den gesamten Bereich 0,008 bis 0,017 mAP50-95 im Vergleich zu FP32, während die Post-Training-Quantisierung 0,010 bei yolo26n und 0,038 bis 0,057 bei den größeren Modellen kostet. QAT bringt beim kleinsten Modell also fast nichts, wo die Kalibrierung bereits gut funktioniert, und 0,030 bis 0,044 beim Rest. Erwarte andere Zahlen bei einem anderen Datensatz, Exportformat oder einer anderen TensorRT-Version und messe selbst nach.
QAT-Modelle erfordern compile=False; die quantisierten Module von ModelOpt unterstützen torch.compile nicht.
Die letzten Faltungsschichten des Kopfes werden absichtlich in Float belassen, um den Genauigkeitsverlust bei INT8 zu begrenzen; TensorRT aktiviert die gemischte FP16-Präzision für seine unquantisierten Schichten. QAT läuft über den NVIDIA TensorRT Model Optimizer, der bei der ersten Verwendung automatisch installiert wird, und der resultierende Checkpoint benötigt dessen Installation zum Laden. Diese Bereiche werden mit dem Checkpoint übertragen, und Exporte über onnx und engine geben sie als Q/DQ-Knoten aus; andere Formate lesen stattdessen die Kalibrierung ein und lehnen einen QAT-Checkpoint ab.
Wie geht es weiter?#
Finde den Integrationsleitfaden für dein Bereitstellungsziel — ONNX, TensorRT, CoreML und weitere findest du in der vollständigen Integrationsliste —, um zu erfahren, wie du das exportierte Modell ausführen kannst.
FAQ#
Das Exportieren eines YOLO26-Modells in das ONNX-Format ist mit Ultralytics unkompliziert. Es bietet sowohl Python- als auch CLI-Methoden zum Exportieren von Modellen.
Beispielfrom ultralytics import YOLO # Load a model model = YOLO("yolo26n.pt") # load an official model model = YOLO("path/to/best.pt") # load a custom-trained model # Export the model model.export(format="onnx")Weitere Details zum Prozess, einschließlich fortgeschrittener Optionen wie dem Umgang mit unterschiedlichen Eingabegrößen, findest du im ONNX-Integrationsleitfaden.
Die Verwendung von TensorRT für den Modellexport bietet erhebliche Leistungsverbesserungen. Nach TensorRT exportierte YOLO26-Modelle können eine bis zu 5-fache GPU-Beschleunigung erreichen, was sie ideal für Echtzeit-Inferenzanwendungen macht.
- Vielseitigkeit: Optimiere Modelle für ein spezifisches Hardwaresetup.
- Geschwindigkeit: Erziele eine schnellere Inferenz durch fortgeschrittene Optimierungen.
- Kompatibilität: Integriere dich nahtlos in NVIDIA-Hardware.
Um mehr über die Integration von TensorRT zu erfahren, siehe den TensorRT-Integrationsleitfaden.
Die INT8-Quantisierung ist eine hervorragende Möglichkeit, das Modell zu komprimieren und die Inferenz zu beschleunigen, insbesondere auf Edge-Geräten. So kannst du die INT8-Quantisierung aktivieren:
Beispielfrom ultralytics import YOLO model = YOLO("yolo26n.pt") # Load a model model.export(format="onnx", quantize=8, data="coco8.yaml")Die INT8-Quantisierung kann auf Formate wie ONNX, TensorRT, OpenVINO, CoreML und Rockchip RKNN angewendet werden. Um optimale Quantisierungsergebnisse zu erzielen, stelle einen repräsentativen Datensatz über den Parameter
databereit. Siehe Quantisierungsoptionen für akzeptiertequantize-Werte und unterstützte Formate.Eine dynamische Eingabegröße ermöglicht es dem exportierten Modell, mit unterschiedlichen Bildabmessungen umzugehen, was Flexibilität bietet und die Verarbeitungseffizienz für verschiedene Anwendungsfälle optimiert. Beim Export in Formate wie ONNX oder TensorRT sorgt das Aktivieren der dynamischen Eingabegröße dafür, dass sich das Modell nahtlos an verschiedene Eingabeformen anpassen kann.
Um diese Funktion zu aktivieren, verwende das Flag
dynamic=Truewährend des Exports:Beispielfrom ultralytics import YOLO model = YOLO("yolo26n.pt") model.export(format="onnx", dynamic=True)Die dynamische Eingabegrößenanpassung ist besonders nützlich für Anwendungen, bei denen die Eingabedimensionen variieren können, wie etwa bei der Videoverarbeitung oder beim Verarbeiten von Bildern aus verschiedenen Quellen.
Das Verständnis und die Konfiguration von Exportargumenten sind entscheidend für die Optimierung der Modellleistung:
format:Das Zielformat für das exportierte Modell (z. B.onnx,torchscript,saved_model).imgsz:Gewünschte Bildgröße für die Modelleingabe (z. B.640oder(height, width)).quantize:Quantisierungspräzision, wie8/"int8",16/"fp16",32/"fp32"oder die gemischten Gewichts-/Aktivierungsschemata"w8a16"und"w8a32"(LiteRT dynamisches INT8) auf unterstützten Formaten. Siehe Quantisierungsoptionen.optimize:Ermöglicht eine höhere Compiler-Optimierung für DEEPX-Exporte.
Für die Bereitstellung auf spezifischen Hardwareplattformen solltest du spezialisierte Exportformate wie TensorRT für NVIDIA-GPUs, CoreML für Apple-Geräte oder Edge TPU für Google Coral-Geräte in Betracht ziehen.
Wenn du ein YOLO-Modell in Formate wie ONNX oder TensorRT exportierst, hängt die Struktur des Ausgabetensors von der Modellaufgabe ab. Das Verständnis dieser Ausgaben ist für benutzerdefinierte Inferenzimplementierungen wichtig.
Für YOLO26-Erkennungsmodelle (z. B.
yolo26n.pt), die mitnms=Falseexportiert wurden, erzeugen unterstützte Formate eine NMS-freie Ausgabe im Format(batch_size, max_detections, 6)mit[x1, y1, x2, y2, confidence, class_id]-Werten. Mit dem Standardwertmax_det=300entspricht dies meist(batch_size, 300, 6). Einige eingeschränkte Formate greifen automatisch auf das traditionelle Ausgabeformat zurück, wenn End-to-End-Operatoren nicht unterstützt werden.Standardmäßig (
nms=None) exportieren Erkennungsmodelle einschließlich YOLO26 rohe One-to-Many-Vorhersagen: Die Ausgabe ist typischerweise ein einzelner Tensor mit der Form(batch_size, 4 + num_classes, num_predictions), bei dem die Kanäle die Box-Koordinaten sowie klassenbezogene Scores darstellen, undnum_predictionshängt von der Export-Eingabeauflösung ab (und kann dynamisch sein). Der Leitfaden zur End-to-End-Erkennung behandelt, welche Formate die End-to-End-Ausgabe beibehalten.Für Segmentierungsmodelle (z. B.
yolo26n-seg.pt) erhältst du normalerweise zwei Ausgaben: den ersten Tensor, der wie(batch_size, 4 + num_classes + mask_dim, num_predictions)geformt ist (Boxen, Klassenscores und Maskenkoeffizienten), und den zweiten Tensor, der wie(batch_size, mask_dim, proto_h, proto_w)geformt ist und Maskenprototypen enthält, die zusammen mit den Koeffizienten verwendet werden, um Instanzmasken zu generieren. Die Größen hängen von der Export-Eingabeauflösung ab (und können dynamisch sein).Für Pose-Modelle (z. B.
yolo26n-pose.pt) ist der Ausgabetensor typischerweise wie(batch_size, 4 + num_classes + keypoint_dims, num_predictions)geformt, wobeikeypoint_dimsvon der Pose-Spezifikation (z. B. Anzahl der Keypoints und ob die Konfidenz enthalten ist) undnum_predictionsvon der Export-Eingabeauflösung abhängt (und dynamisch sein kann).Die Beispiele im ONNX-Inferenzbeispiele veranschaulichen, wie diese Ausgaben für jeden Modelltyp verarbeitet werden.
Ultralytics bietet derzeit keine dedizierte C++-Inferenz-API für YOLO-Modelle an. Für C++-Bereitstellungen exportierst du das Modell in ein Laufzeitformat wie ONNX, TensorRT, TorchScript oder MNN und lädst das exportierte Artefakt anschließend mit der nativen C++-API dieser Laufzeitumgebung.
Exportiere beispielsweise ein Erkennungsmodell mit
yolo export model=yolo26n.pt format=onnxund führe die Datei.onnxmit ONNX Runtime C++ aus, oder exportiere mitformat=engineund führe die TensorRT-Engine über eine TensorRT-C++-Anwendung aus. Wenn du eine benutzerdefinierte C++-Nachbearbeitung verwendest, stimme das Ausgabe-Tensor-Layout auf deine Aufgabe und deine Exporteinstellungen ab; standardmäßige YOLO26-Erkennungsexporte geben rohe Vorhersagetensoren zurück, die ein externes NMS erfordern. Exportiere mitnms=Falsefür NMS-freie Erkennungen in der Form(batch, max_det, 6)oder mitnms=True, um NMS in unterstützten Formaten einzubetten.Beim Exportieren mit
quantize=16(FP16) oderquantize=8(INT8) werden die meisten Tensoren in eine geringere Präzision konvertiert, um die Modellgröße zu reduzieren und die Leistung zu verbessern. Wenn jedochnms=Falseaktiviert ist, wird die Nachbearbeitung (einschließlich Klassenindizes) direkt in den exportierten Graph eingebettet.Der
output0-Tensor enthält Klassenindizes, die intern als Gleitkommawerte dargestellt werden. FP16 kann aufgrund seiner begrenzten Mantissenpräzision ganzzahlige Werte über 2048 nicht zuverlässig darstellen. Um potenziellen Präzisionsverlust oder falsche Klassen-IDs zu vermeiden, wirdoutput0absichtlich in FP32 gehalten.Dieses Verhalten ist so vorgesehen und gilt auch für Exporte mit niedrigerer Präzision oder quantisierte Exporte, bei denen die Wiedergabetreue der Klassenindizes gewahrt bleiben muss.
Wenn vollständige FP16-Ausgaben erforderlich sind, exportiere mit
nms=Noneund führe die Nachbearbeitung extern durch.