Modellexport mit Ultralytics YOLO#
Einführung#
Das oberste Ziel beim Trainieren eines Modells ist dessen Bereitstellung für praktische Anwendungen. Der Exportmodus in Ultralytics YOLO26 bietet vielfältige Optionen, um dein trainiertes Modell in verschiedene Formate zu exportieren und so auf unterschiedlichen Plattformen und Geräten bereitzustellen. Dieser umfassende Leitfaden erläutert die Feinheiten des Modellexports und zeigt, wie du maximale Kompatibilität und Leistung erreichst.
Eine Vorschau der noch nicht veröffentlichten Version YOLO27 enthält Informationen zur geplanten Exportunterstützung.
Ansehen: So exportierst du Ultralytics YOLO26 für die Bereitstellung in verschiedene Formate | ONNX, TensorRT, CoreML 🚀
Warum den Exportmodus von YOLO26 wählen?#
- Vielseitigkeit: Export in mehrere Formate, darunter ONNX, TensorRT, CoreML und weitere.
- Leistung: Erzielen Sie mit TensorRT eine bis zu fünffach höhere GPU-Geschwindigkeit und mit ONNX oder OpenVINO eine bis zu dreifach höhere CPU-Geschwindigkeit.
- Kompatibilität: Stelle dein Modell so bereit, dass es auf zahlreichen Hardware- und Softwareumgebungen eingesetzt werden kann.
- Benutzerfreundlichkeit: Eine einfache CLI und Python-API ermöglichen einen schnellen und unkomplizierten Modellexport.
Anwendungsbeispiele#
Exportiere ein YOLO26n-Modell in ein anderes Format wie ONNX oder TensorRT. Eine vollständige Liste der Exportargumente findest du im Abschnitt „Argumente“ weiter unten.
from ultralytics import YOLO
# Ein Modell laden
model = YOLO("yolo26n.pt") # Ein offizielles Modell laden
model = YOLO("path/to/best.pt") # Ein benutzerdefiniert trainiertes Modell laden
# Modell exportieren
model.export(format="onnx")Argumente#
Diese Tabelle enthält ausführliche Informationen zu den Konfigurationen und Optionen für den Export von YOLO-Modellen in verschiedene Formate. Diese Einstellungen sind entscheidend, um Leistung, Größe und Kompatibilität des exportierten Modells auf verschiedenen Plattformen und in unterschiedlichen Umgebungen zu optimieren. Durch die richtige Konfiguration ist das Modell optimal und effizient für den Einsatz in der vorgesehenen Anwendung vorbereitet.
| Argument | Typ | Standard | Beschreibung |
|---|---|---|---|
format | str | 'torchscript' | Zielformat für das exportierte Modell, etwa 'onnx', 'torchscript', 'engine' (TensorRT) oder ein anderes Format. Jedes Format ermöglicht die Kompatibilität mit unterschiedlichen Bereitstellungsumgebungen. |
name | str | None | Hardwarezielname für Formate, die eines erfordern: 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'), Qualcomm-QNN-HTP-Ziel (Standardwert ist '73') oder AMD-Xilinx-Versal-AI-Edge-Series-Gen-2-Gerät (Standardwert ist 've2-xc2ve3858', das VEK385-Evaluierungskit). Unterscheidet sich vom Run-Namenspaar project/name, das andere Modi verwenden. |
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. Wird kein Wert übergeben, verwendet der Export erneut die im geladenen Prüfpunkt gespeicherte Trainingsgröße: In den offiziellen YOLO26-Prüfpunkten ist für depth 768, für classify 224, für OBB 1024 und für die übrigen Aufgaben 640 gespeichert. Bei einem weitertrainierten Modell wird die jeweilige Trainingsgröße imgsz übernommen. Ein aus einer YAML-Datei erstelltes Modell hat keine gespeicherte Trainingsgröße und verwendet 640. |
optimize | bool | False | Aktiviert eine stärkere Compileroptimierung für DEEPX. Dadurch verringert sich die Inferenzlatenz, während sich die Kompilierungszeit erhöht. |
quantize | int oder str | None | Quantisierungspräzision: 16 (FP16; verringert die Modellgröße und kann die Inferenz auf unterstützter Hardware beschleunigen) oder 8 (INT8/PTQ; komprimiert das Modell weiter und verursacht nur minimale Einbußen bei der Genauigkeit, vor allem für Edge-Geräte; benötigt die Kalibrierung data/fraction); 32/nicht gesetzt bedeutet FP32. Ein mit quantize=8 trainierter Prüfpunkt wird immer als INT8 exportiert: onnx und engine exportieren anhand der darin enthaltenen Wertebereiche ohne Kalibrierung; andere Formate oder Präzisionen werden abgelehnt. 'w8a8' und 'w16a16' sind Aliase für 8 und 16. Die gemischten Präzisionen 'w8a16' (INT8-Gewichte mit 16-Bit-Aktivierungen: CoreML, LiteRT, QNN) und 'w8a32' (dynamisches INT8: LiteRT) werden nur von diesen Formaten akzeptiert. Ersetzt die veralteten Flags half/int8 (half=True → 16, int8=True → 8, weiterhin mit einer Warnung zur Veraltung akzeptiert). Zulässig sind nur Präzisionen, die das Zielformat unterstützt (siehe unten). |
dynamic | bool | False | Ermöglicht dynamische Eingabegrößen für TorchScript-, ONNX-, OpenVINO-, TensorRT-, CoreML- und MNN-Exporte und erhöht so die Flexibilität bei unterschiedlichen Bildabmessungen. |
simplify | bool | True | Vereinfacht den zwischengeschalteten ONNX-Graphen mit onnxslim für Exporte, die einen solchen Graphen erstellen (siehe Exportformate). Das kann Leistung und Kompatibilität mit Inferenz-Engines verbessern. |
opset | int | None | Gibt die ONNX-Operatorensatz-Version für Exporte an, die einen ONNX-Graphen erstellen (siehe Exportformate), damit die Kompatibilität mit unterschiedlichen ONNX-Parsern und Laufzeitumgebungen gewährleistet ist. Wenn kein Wert gesetzt ist, 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 schafft so einen Ausgleich zwischen Speicherbedarf und Leistung. Verwende None, damit TensorRT automatisch bis zur maximalen Gerätegröße Speicher zuweist. |
nms | bool, optional | None | None exportiert rohe Viele-zu-eins-Vorhersagen für eine externe NMS; True bindet NMS ein, sofern unterstützt; False wählt den NMS-freien Kopf, sofern verfügbar. Integrierte NMS in CoreML unterstützt detect, segment und pose mit statischen Formen. Weitere Informationen findest du in der Anleitung zur End-to-End-Erkennung. |
conf | float | None | Konfidenzschwellenwert für alle Fälle, in denen beim Export NMS erzeugt wird: nms=True-Exporte, nicht durchgängige detect-Exporte für Hailo sowie detect-, pose- und segment-Exporte für IMX, die intern nms=True erzwingen. Wenn kein Wert gesetzt ist, wird standardmäßig 0.25 verwendet. |
iou | float | 0.7 | IoU-Schwellenwert für alle Fälle, in denen beim Export NMS erzeugt wird: nms=True-Exporte, nicht durchgängige detect-Exporte für Hailo sowie detect-, pose- und segment-Exporte für IMX, die intern nms=True erzwingen. |
max_det | int | 300 | Maximale Anzahl der Erkennungen, die in der Ausgabe des exportierten Modells erhalten bleibt. Gilt für nms=True-Exporte in allen Formaten außer der detect-Funktion von CoreML, deren native NMS-Pipeline keine Obergrenze für Erkennungen hat. Gilt außerdem für NMS-freie End-to-End-Erkennungsexporte (YOLO26, YOLOv10; begrenzt auf die Anzahl verfügbarer Anker) und detect-, pose- sowie segment-Exporte für IMX. |
agnostic_nms | bool | False | Aktiviert klassenunabhängige NMS in allen Fällen, in denen NMS beim Export über die standardmäßige Pipeline nms=True erzeugt wird, einschließlich der eigenen NMS-Stufe von CoreML. Dabei werden sich überlappende Boxen mit niedrigeren Konfidenzwerten klassenübergreifend unterdrückt, nicht nur innerhalb derselben Klasse. Die Einstellung wird von den eigenen erzeugten NMS-Konfigurationen von Hailo und IMX nicht berücksichtigt. Diese bieten keine klassenunabhängige Option und bleiben unabhängig von diesem Flag klassenabhängig. Bei NMS-freien End-to-End-Exporten (YOLO26, YOLOv10) ist die Option ebenfalls fest eingebunden; dort verhindert sie lediglich, dass dieselbe Erkennung mit mehreren Klassenbezeichnungen erscheint (Duplikate mit IoU=1.0), und unterdrückt keine unterschiedlichen Boxen anhand eines IoU-Schwellenwerts. |
batch | int | 1 | Legt die Batchgröße für die Inferenz des Exportmodells oder die maximale Anzahl von Bildern fest, die das exportierte Modell im Modus predict gleichzeitig verarbeitet. Bei Formaten, deren Exportargumente kein batch enthalten (Edge TPU, IMX500, DEEPX, Hailo, AMD Xilinx), wird Batch 1 exportiert; andere Werte werden abgelehnt. |
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 | Erhöht den Protokollierungsgrad des TensorRT-Builders während des Exports mit format='engine' auf VERBOSE. Andere Exportformate ignorieren diese Option. |
data | str | None | Pfad zur YAML-Datei des Datensatzes, die für die INT8-Quantisierungskalibrierung unerlässlich ist. Für die Klassifizierung wird stattdessen ein Dataset-Verzeichnis oder der Name eines integrierten Datensatzes verwendet. Ist bei aktivierter INT8-Quantisierung kein Pfad angegeben, wählt Ultralytics bei Bedarf einen aufgabenspezifischen Kalibrierungsdatensatz aus oder verwendet den Standarddatensatz für die Aufgabe des Modells. Ein mit quantize=8 trainierter Prüfpunkt enthält eigene INT8-Wertebereiche und benötigt keine Kalibrierungsdaten. |
split | str | 'val' | Datensatz-Split ('train', 'val' oder 'test'), der zum Erstellen des INT8-Kalibrierungsdatenladers aus data verwendet wird. |
fraction | float, int oder list | 1.0 | Für die INT8-Kalibrierung verwendete Teilmenge des Datensatzes: ein Verhältnis, eine Bildanzahl oder Werte aus [train, val, test]. 1 steht für den vollständigen Split; Ganzzahlen über 1 geben die Bildanzahl an. Nur beim optionalen Testeintrag bedeuten 0/0.0, dass keine Daten verwendet werden. Bei Listen mit zwei Einträgen bleibt test vollständig. |
Mit diesen Parametern kannst du den Exportprozess an bestimmte Anforderungen anpassen, etwa an die Bereitstellungsumgebung, Hardwarebeschränkungen und Leistungsziele. Die Auswahl des geeigneten Formats und der passenden Einstellungen ist entscheidend, um das beste Gleichgewicht zwischen Modellgröße, Geschwindigkeit und Genauigkeit zu erzielen.
Exportformate#
Die verfügbaren Exportformate für YOLO26 findest du in der Tabelle unten. Mit dem Argument format kannst du in jedes beliebige Format exportieren, z. B. mit format='onnx' oder format='engine'. Vorhersagen oder Validierungen lassen sich direkt mit exportierten Modellen ausführen, z. B. mit yolo predict model=yolo26n.onnx. Nach Abschluss des Exports werden Beispiele zur Verwendung deines Modells angezeigt. Modelle lassen sich auch ohne lokale Einrichtung direkt im Browser auf der Ultralytics Platform exportieren.
| 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 |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, 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 |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, 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 |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n_xilinx_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, device |
nms=None gibt standardmäßig Rohdaten für die externe NMS aus. Lege nms=False fest, um einen verfügbaren Kopf ohne NMS auszuwählen; nicht unterstützte Formate greifen auf ihren nativen Ausgabepfad zurück. Die obigen Einträge nms kennzeichnen Formate, die NMS mit nms=True integrieren können.
Für die meisten Formate sind Pakete erforderlich, die nicht mit ultralytics installiert werden. Fehlt ein Paket, wird es beim Export zur Laufzeit mit uv oder pip installiert; unter Linux kommt für Systempakete, etwa Java für IMX, apt zum Einsatz. Der Edge-TPU-Compiler wird ohne apt oder sudo heruntergeladen. Wenn die Umgebung unverändert bleiben soll, beispielsweise in einem Container-Image, CI-Auftrag oder Produktionsdienst, setze YOLO_AUTOINSTALL=False. Der Export prüft weiterhin, ob Pakete fehlen, und meldet dies, verändert die Umgebung jedoch nicht und schlägt fehl, bis die Pakete installiert sind.
export YOLO_AUTOINSTALL=FalseQuantisierungsoptionen#
Verwende das Argument quantize, um die Exportgenauigkeit festzulegen. Zeichenfolgenwerte unterscheiden nicht zwischen Groß- und Kleinschreibung, und Ultralytics vereinheitlicht akzeptierte Aliasnamen vor dem Export:
| Angeforderte 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 „unset“, außer bei CoreML-NMS-ML-Programmen, deren Standard FP16 ist |
"w8a16" | "w8a16" | INT8-Gewichte mit 16-Bit-Aktivierungen (FP16; INT16 bei LiteRT) |
"w8a32" | "w8a32" | INT8-Gewichte mit FP32-Aktivierungen (dynamisches INT8 bei LiteRT, keine Kalibrierung erforderlich) |
Die veralteten Flags half=True und int8=True werden mit Deprecation-Warnungen weiterhin akzeptiert und an quantize=16 und quantize=8 weitergeleitet.
Nicht jedes Exportformat unterstützt jede Genauigkeit. Explizite Anforderungen an quantize führen entweder zu einem Export mit der angegebenen Genauigkeit oder schlagen vor dem Export fehl:
| Format | FP32 (32/nicht gesetzt) | FP16 (16) | INT8 (8) | W8A16 ("w8a16") | Hinweise |
|---|---|---|---|---|---|
| PyTorch | ✅ | Nicht zutreffend | Nicht zutreffend | Nicht zutreffend | Natives Trainings-/Checkpoint-Format. |
| TorchScript | ✅ | ✅ nur GPU | ❌ | ❌ | Für den FP16-TorchScript-Export ist device=0 erforderlich; der CPU-Export erfolgt in FP32. |
| ONNX | ✅ | ✅ | ✅ | ❌ | Für INT8 werden die statische Quantisierung von ONNX Runtime und Kalibrierungsdaten verwendet. |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | Für INT8 wird die Quantisierung nach dem Training mit NNCF verwendet. |
| TensorRT | ✅ | ✅ | ✅ | ❌ | Für INT8 werden repräsentative Kalibrierungsdaten benötigt. |
| CoreML | ✅¹ | ✅ | ✅ | ✅ | CoreML INT8 ist eine Gewichtsquantisierung; W8A16 verwendet INT8-Gewichte mit FP16-Aktivierungen. ¹ Nicht konfigurierte NMS-ML-Programme verwenden standardmäßig FP16, und Segmentierungs-/Pose-Exporte von nms=True sind immer FP16. |
| Core AI | ✅ | ✅ | ❌ | ❌ | Standardmäßig FP32 oder ein FP16-.aimodel-Asset mit quantize=16; kein INT8-Pfad. |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | Beim INT8-Export wird die TensorFlow-Kalibrierung verwendet. |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | Keine Umwandlung der Genauigkeit beim Export. |
| Edge TPU | ❌ | ❌ | ✅ automatisch | ❌ | Für Edge TPU ist INT8 erforderlich; die Option wird automatisch aktiviert, wenn sie nicht gesetzt ist. |
| LiteRT | ✅ | ❌ | ✅ | ✅ | Bei statischem INT8 (8) und "w8a16" (INT8-Gewichte + INT16-Aktivierungen) werden Kalibrierungsdaten verwendet; außerdem wird dynamisches INT8 mit "w8a32" unterstützt (keine Kalibrierung erforderlich). quantize=16 ist kein eigenständiger Export; ein FP32-Modell wird zur Laufzeit über den GPU-Delegaten in FP16 ausgeführt. |
| PaddlePaddle | ✅ | ❌ | ❌ | ❌ | Keine Umwandlung der Genauigkeit beim Export. |
| MNN | ✅ | ✅ | ✅ | ❌ | INT8 ist eine Gewichtsquantisierung, die bei der MNN-Konvertierung erfolgt. |
| NCNN | ✅ | ✅ | ❌ | ❌ | Laufzeitformat für Mobilgeräte und eingebettete Systeme. |
| IMX500 | ❌ | ❌ | ✅ automatisch | ❌ | Für IMX500 ist eine Quantisierung erforderlich; INT8 wird automatisch aktiviert, wenn die Option nicht gesetzt ist. |
| RKNN | ❌ | ✅ abhängig vom Chip | ✅ | ❌ | RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B unterstützen FP16 oder INT8; Varianten von RV1103/RV1106 unterstützen nur INT8. |
| ExecuTorch | ✅ | ❌ | ❌ | ❌ | Keine Umwandlung der Genauigkeit beim Export. |
| Axelera | ❌ | ❌ | ✅ automatisch | ❌ | Für den Axelera-Export ist INT8 erforderlich; die Option wird automatisch aktiviert, wenn sie nicht gesetzt ist. |
| DEEPX | ❌ | ❌ | ✅ automatisch | ❌ | Für den DEEPX-Export ist INT8 erforderlich; die Option wird automatisch aktiviert, wenn sie nicht gesetzt ist. |
| Qualcomm QNN | ❌ | ❌ | ❌ | ✅ automatisch | Der QNN-HTP-Export ist fest auf INT8-Gewichte mit 16-Bit-Aktivierungen eingestellt. |
| Hailo | ❌ | ❌ | ✅ automatisch | ❌ | Für den Hailo-Export ist INT8 erforderlich; die Option wird automatisch aktiviert, wenn sie nicht gesetzt ist. |
| Huawei Ascend | ❌ | ✅ automatisch | ❌ | ❌ | Ascend-AI-Core-Faltungen akzeptieren nur FP16-/INT8-Eingaben, daher kompiliert ATC in FP16; die Option wird automatisch aktiviert, wenn sie nicht gesetzt ist. |
| AMD Xilinx | ❌ | ❌ | ✅ automatisch | ❌ | Für den AMD-Xilinx-Export ist Vitis AI INT8 (VINT8) erforderlich; die Option wird automatisch aktiviert, wenn sie nicht festgelegt ist. |
Stelle für INT8- und W8A16-Exporte repräsentative Kalibrierungsdaten mit data bereit, beispielsweise data="coco8.yaml", sofern die Zielintegration kein Standardverhalten oder eine automatische Aktivierung dokumentiert. Das LiteRT-Verfahren "w8a32" (dynamisches INT8) benötigt keine Kalibrierungsdaten.
Quantisierungsbewusstes Training#
Bei den obigen INT8-Exporten kommt die Quantisierung nach dem Training (PTQ) zum Einsatz: Die Wertebereiche werden bei einem einzigen Kalibrierungsdurchlauf über data ermittelt. Beim quantisierungsbewussten Training (QAT) werden stattdessen durch Feinabstimmung mit Fake-Quantisierung im Trainingsablauf Gewichte gelernt, die INT8 tolerieren. Dadurch lässt sich der Genauigkeitsverlust ausgleichen, der allein durch die Kalibrierung entsteht. Übergib quantize=8 an train, um einen vortrainierten Checkpoint feinabzustimmen, und exportiere ihn anschließend 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) # # Die Wertebereiche werden mit dem Checkpoint gespeichert; Kalibrierungsdaten sind nicht erforderlich.Verwende beim Feinabstimmen eines vortrainierten Checkpoints eine niedrige Lernrate. QAT kann die Genauigkeit zunächst verringern, und der Nutzen gegenüber der Quantisierung nach dem Training hängt vom Modell, Datensatz und Trainingsbudget ab. Vergleiche das exportierte Modell sowohl mit dem ursprünglichen Checkpoint als auch mit einem nach dem Training quantisierten Export. Werte für Fake-Quantisierung während des Trainings belegen nicht die Genauigkeit im Einsatz.
Wie viel sich QAT lohnt, hängt davon ab, wie gut die Kalibrierung des Export-Backends mit dem Modell funktioniert. Die folgenden Werte zeigen mAP50-95 auf COCO val2017, gemessen mit TensorRT-10.16-Engines bei imgsz=640 und Batchgröße 1. Jeder QAT-Checkpoint wurde mit epochs=20 patience=3 trainiert:
| 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 gegenüber FP32, während die Quantisierung nach dem Training bei yolo26n 0,010 und bei den größeren Modellen 0,038 bis 0,057 kostet. QAT bringt beim kleinsten Modell, bei dem die Kalibrierung bereits gut funktioniert, also fast keinen Vorteil; bei den übrigen Modellen beträgt der Vorteil 0,030 bis 0,044. Bei einem anderen Datensatz, Exportformat oder einer anderen TensorRT-Version sind andere Werte zu erwarten. Miss daher selbst nach.
Für QAT-Modelle ist compile=False erforderlich; die quantisierten Module von ModelOpt unterstützen torch.compile nicht.
Die abschließenden Ausgabefaltungen des Heads bleiben absichtlich im Gleitkommaformat, um den Genauigkeitsverlust durch INT8 zu begrenzen; TensorRT aktiviert FP16-Mischpräzision für nicht quantisierte Layer. QAT läuft über NVIDIA TensorRT Model Optimizer, der beim ersten Einsatz automatisch installiert wird und zum Laden des resultierenden Checkpoints ebenfalls installiert sein muss. Die Wertebereiche werden mit dem Checkpoint gespeichert, und Exporte mit onnx und engine geben sie als Q/DQ-Knoten aus; andere Formate greifen stattdessen auf die Kalibrierung zurück und lehnen einen QAT-Checkpoint ab.
Wie geht es weiter?#
In der Integrationsanleitung für dein Bereitstellungsziel – etwa für ONNX, TensorRT, CoreML und weitere Formate in der vollständigen Integrationsübersicht – erfährst du, wie du das exportierte Modell ausführst.
Häufig gestellte Fragen#
Mit Ultralytics lässt sich ein YOLO26-Modell unkompliziert ins ONNX-Format exportieren. Dafür stehen sowohl Python- als auch CLI-Verfahren zur Verfügung.
Beispielfrom ultralytics import YOLO # Ein Modell laden model = YOLO("yolo26n.pt") # Ein offizielles Modell laden model = YOLO("path/to/best.pt") # Ein benutzerdefiniert trainiertes Modell laden # Modell exportieren model.export(format="onnx")Weitere Informationen zum Ablauf, einschließlich erweiterter Optionen wie dem Umgang mit unterschiedlichen Eingabegrößen, findest du in der ONNX-Integrationsanleitung.
Der Export von Modellen mit TensorRT bringt deutliche Leistungsverbesserungen. Mit TensorRT exportierte YOLO26-Modelle können eine bis zu fünffache GPU-Beschleunigung erreichen und eignen sich daher ideal für Echtzeit-Inferenzanwendungen.
- Vielseitigkeit: Optimiere Modelle für eine bestimmte Hardwarekonfiguration.
- Geschwindigkeit: Erziele durch fortschrittliche Optimierungen eine schnellere Inferenz.
- Kompatibilität: Integriere Modelle nahtlos in NVIDIA-Hardware.
Weitere Informationen zur Integration von TensorRT findest du in der TensorRT-Integrationsanleitung.
Die INT8-Quantisierung ist eine hervorragende Möglichkeit, das Modell zu komprimieren und die Inferenz zu beschleunigen, insbesondere auf Edge-Geräten. So aktivierst du die INT8-Quantisierung:
Beispielfrom ultralytics import YOLO model = YOLO("yolo26n.pt") # Ein Modell laden model.export(format="onnx", quantize=8, data="coco8.yaml")Die INT8-Quantisierung kann auf Formate wie ONNX, TensorRT, OpenVINO, CoreML, Rockchip RKNN und AMD Xilinx angewendet werden. Für optimale Quantisierungsergebnisse gib über den Parameter
dataeinen repräsentativen Datensatz an. Unter Quantisierungsoptionen findest du die akzeptierten Werte fürquantizeund die unterstützten Formate.Eine dynamische Eingabegröße ermöglicht dem exportierten Modell, Bilder mit unterschiedlichen Abmessungen zu verarbeiten. Das sorgt für Flexibilität und eine effiziente Verarbeitung in verschiedenen Anwendungsfällen. Wenn du in Formate wie ONNX oder TensorRT exportierst, kann sich das Modell mit aktivierter dynamischer Eingabegröße nahtlos an unterschiedliche Eingabeformen anpassen.
Aktiviere diese Funktion beim Export mit dem Flag
dynamic=True:Beispielfrom ultralytics import YOLO model = YOLO("yolo26n.pt") model.export(format="onnx", dynamic=True)Eine dynamische Eingabegröße ist besonders nützlich für Anwendungen, bei denen die Eingabeabmessungen variieren können, beispielsweise bei der Videoverarbeitung oder bei der Verarbeitung von Bildern aus verschiedenen Quellen.
PyTorch-Modelle und dynamische Exporte verwenden standardmäßig Padding auf das kleinste Rechteck, während statische Exporte auf die vollständige Größe
imgszauffüllen. Dadurch können sich Erkennungen nahe dem Konfidenzschwellwert unterscheiden. Verwenderect=Falsefür die native Inferenz, um Ergebnisse wie bei einem statischen Export zu erhalten, oder exportiere mitdynamic=True, sofern unterstützt.Für die Optimierung der Modellleistung ist es entscheidend, die Exportargumente zu verstehen und richtig zu konfigurieren:
format:Zielformat des exportierten Modells (z. B.onnx,torchscript,saved_model).imgsz:Gewünschte Bildgröße für die Modelleingabe (z. B.640oder(height, width)).quantize:Quantisierungsgenauigkeit, z. B.8/"int8",16/"fp16",32/"fp32"oder die unterstützten Verfahren mit gemischter Gewichts-/Aktivierungsgenauigkeit"w8a16"und"w8a32"(dynamisches INT8 bei LiteRT). Weitere Informationen findest du unter Quantisierungsoptionen.dynamic:Akzeptiert variable Eingabegrößen bei Formaten, die dynamische Formen unterstützen, etwa ONNX, OpenVINO und TensorRT.nms:Wählt Roh-Ausgaben für externe NMS (None), integrierte NMS (True) oder den NMS-freien Head (False) aus.device:Gerät, auf dem das Modell während des Exports nachverfolgt wird, z. B.cpuoder0für die erste CUDA-GPU; FP16-TorchScript erfordert eine GPU.
Für die Bereitstellung auf bestimmten Hardwareplattformen solltest du spezialisierte Exportformate verwenden, etwa TensorRT für NVIDIA-GPUs, CoreML für Apple-Geräte oder Edge TPU für Google-Coral-Geräte.
Wenn du ein YOLO-Modell in Formate wie ONNX oder TensorRT exportierst, hängt die Struktur des Ausgabetensors von der Modellaufgabe ab. Für eigene Inferenzimplementierungen ist es wichtig, diese Ausgaben zu verstehen.
Für YOLO26-Erkennungsmodelle (z. B.
yolo26n.pt), die mitnms=Falseexportiert werden, erzeugen unterstützte Formate eine NMS-freie Ausgabe mit der Form(batch_size, max_detections, 6)und[x1, y1, x2, y2, confidence, class_id]Werten. Bei der Standardeinstellungmax_det=300ist dies üblicherweise(batch_size, 300, 6). Einige Formate mit Einschränkungen greifen automatisch auf das herkömmliche Ausgabelayout zurück, wenn Operatoren für die End-to-End-Verarbeitung nicht unterstützt werden.Standardmäßig (
nms=None) exportieren Erkennungsmodelle, einschließlich YOLO26, rohe One-to-many-Vorhersagen: Die Ausgabe ist üblicherweise ein einzelner Tensor mit der Form(batch_size, 4 + num_classes, num_predictions), dessen Kanäle die Boxkoordinaten und die Bewertungen pro Klasse darstellen.num_predictionshängt von der Eingabeauflösung beim Export ab und kann dynamisch sein. Im Leitfaden zur End-to-End-Erkennung erfährst du, welche Formate die End-to-End-Ausgabe beibehalten.Bei Segmentierungsmodellen (z. B.
yolo26n-seg.pt) erhältst du üblicherweise zwei Ausgaben: Der erste Tensor hat die Form(batch_size, 4 + num_classes + mask_dim, num_predictions)(Boxen, Klassenbewertungen und Maskenkoeffizienten), der zweite Tensor hat die Form(batch_size, mask_dim, proto_h, proto_w)und enthält Maskenprototypen, die zusammen mit den Koeffizienten zur Erzeugung von Instanzmasken verwendet werden. Die Größen hängen von der Eingabeauflösung beim Export ab und können dynamisch sein.Bei Posenmodellen (z. B.
yolo26n-pose.pt) hat der Ausgabetensor üblicherweise die Form(batch_size, 4 + num_classes + keypoint_dims, num_predictions).keypoint_dimshängt von der Posenspezifikation ab (z. B. von der Anzahl der Schlüsselpunkte und davon, ob Konfidenzwerte enthalten sind), währendnum_predictionsvon der Eingabeauflösung beim Export abhängt und dynamisch sein kann.Die Beispiele in den ONNX-Inferenzbeispielen veranschaulichen, wie du diese Ausgaben für jeden Modelltyp verarbeiten kannst.
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 es mitformat=engineund führe die TensorRT-Engine in einer TensorRT-C++-Anwendung aus. Wenn du eine eigene C++-Nachverarbeitung verwendest, muss das Layout des Ausgabetensors zu deiner Aufgabe und den Exporteinstellungen passen. Standardmäßige YOLO26-Erkennungsexporte liefern rohe Vorhersagetensoren, für die eine externe NMS erforderlich ist. Exportiere mitnms=False, um NMS-freie Erkennungen mit der Form(batch, max_det, 6)zu erhalten, oder mitnms=True, um NMS in unterstützte Formate einzubetten.Beim Export mit
quantize=16(FP16) oderquantize=8(INT8) werden die meisten Tensoren in eine niedrigere Genauigkeit umgewandelt, um die Modellgröße zu reduzieren und die Leistung zu verbessern. Ist jedochnms=Falseaktiviert, wird die Nachverarbeitung (einschließlich der Klassenindizes) direkt in den exportierten Graphen eingebettet.Der Tensor
output0enthält Klassenindizes, die intern als Gleitkommazahlen dargestellt werden. Aufgrund der begrenzten Mantissenpräzision kann FP16 ganzzahlige Werte über 2048 nicht zuverlässig darstellen. Um möglichen Präzisionsverlust oder falsche Klassen-IDs zu vermeiden, bleibtoutput0absichtlich im FP32-Format.Wenn du vollständige FP16-Ausgaben benötigst, exportiere mit
nms=Noneauf einer GPU und führe die Nachverarbeitung extern durch. FP16-ONNX-Exporte auf der CPU behalten unabhängig davon FP32-Eingaben und -Ausgaben bei; nur der interne Graph wird umgewandelt.