Exportation de modèles avec Ultralytics YOLO#
Introduction#
L'objectif ultime de l'entraînement d'un modèle est de le déployer pour des applications concrètes. Le mode d'exportation d'Ultralytics YOLO26 offre une gamme polyvalente d'options pour exporter ton modèle entraîné vers différents formats, ce qui le rend déployable sur de multiples plateformes et appareils. Ce guide complet a pour but de t'accompagner à travers les nuances de l'exportation de modèles, en montrant comment atteindre une compatibilité et des performances maximales.
Consulte l'aperçu non publié de YOLO27 pour connaître la prise en charge des exportations prévues.
Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀
Pourquoi choisir le mode d'exportation de YOLO26 ?#
- Polyvalence : Exporte vers de multiples formats, y compris ONNX, TensorRT, CoreML, et bien d'autres.
- Performance : Obtiens jusqu'à 5 fois d'accélération GPU avec TensorRT et 3 fois d'accélération CPU avec ONNX ou OpenVINO.
- Compatibilité : Rends ton modèle universellement déployable sur de nombreux environnements matériels et logiciels.
- Simplicité d'utilisation : Une interface en ligne de commande et une API Python simples pour une exportation de modèle rapide et directe.
Fonctionnalités clés du mode d'exportation#
Voici quelques-unes des fonctionnalités phares :
- Exportation en un clic : Des commandes simples pour exporter vers différents formats.
- Exportation par lots : Exporte des modèles capables d'effectuer des inférences par lots.
- Inférence optimisée : Les modèles exportés sont optimisés pour des temps d'inférence plus rapides.
- Tutoriels vidéo : Des guides approfondis et des tutoriels pour une expérience d'exportation fluide.
Exemples d’utilisation#
Exporte un modèle YOLO26n vers un format différent tel que ONNX ou TensorRT. Consulte la section des arguments ci-dessous pour obtenir la liste complète des arguments d'exportation.
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")Arguments#
Ce tableau détaille les configurations et options disponibles pour exporter des modèles YOLO vers différents formats. Ces paramètres sont essentiels pour optimiser les performances, la taille et la compatibilité du modèle exporté sur diverses plateformes et environnements. Une configuration correcte garantit que le modèle est prêt pour le déploiement dans l'application visée avec une efficacité optimale.
| Argument | Type | Valeur par défaut | Description |
|---|---|---|---|
format | str | 'torchscript' | Format cible du modèle exporté, tel que 'onnx', 'torchscript', 'engine' (TensorRT) ou d’autres. Chaque format assure la compatibilité avec différents environnements de déploiement. |
name | str | None | Nom de la cible matérielle pour les formats qui en nécessitent une : architecture Hailo ('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l' ; valeur par défaut : 'hailo8l'), puce Rockchip RKNN (valeur par défaut : 'rk3588'), SoC Huawei Ascend (un --soc_version CANN ; valeur par défaut : 'Ascend310B4') ou cible Qualcomm QNN HTP (valeur par défaut : '73'). À distinguer de la paire de noms d’exécution project/name utilisée par d’autres modes. |
imgsz | int ou tuple | 640 | Taille d’image souhaitée pour l’entrée du modèle. Il peut s’agir d’un entier pour les images carrées (par ex. 640 pour 640×640) ou d’un tuple (height, width) pour des dimensions spécifiques. Lorsqu’elle n’est pas fournie, l’exportation réutilise la taille d’entraînement enregistrée dans le point de contrôle chargé : les points de contrôle YOLO26 officiels enregistrent 768 pour la détection, 224 pour la classification, 1024 pour OBB et 640 pour les autres tâches, tandis qu’un modèle affiné enregistre la valeur imgsz utilisée lors de son entraînement. Un modèle construit à partir d’un fichier YAML ne possède aucune taille d’entraînement enregistrée et utilise 640. |
keras | bool | False | Active l’exportation au format Keras pour TensorFlow SavedModel, assurant la compatibilité avec le service et les API TensorFlow. |
optimize | bool | False | Active une optimisation supérieure du compilateur pour DEEPX, réduisant la latence d’inférence tout en augmentant le temps de compilation. |
quantize | int ou str | None | Précision de quantification : 16 (FP16, réduit la taille du modèle et peut accélérer l’inférence sur le matériel pris en charge) ou 8 (INT8/PTQ, compresse davantage le modèle avec une perte minimale de précision, principalement pour les appareils en périphérie ; nécessite la calibration data/fraction) ; 32/non défini correspond à FP32. Les formats d’exportation qui prennent en charge une précision mixte des poids et des activations acceptent également la notation 'w8a8'/'w16a16'/'w8a16'/'w8a32'. Remplace les indicateurs obsolètes half/int8 (half=True → 16, int8=True → 8, toujours acceptés avec un avertissement d’obsolescence). Seules les précisions prises en charge par le format cible sont autorisées (voir ci-dessous). |
dynamic | bool | False | Autorise des tailles d’entrée dynamiques pour les exportations TorchScript, ONNX, OpenVINO, TensorRT et CoreML, ce qui améliore la flexibilité lors du traitement de dimensions d’image variables. |
simplify | bool | True | Simplifie le graphe ONNX intermédiaire avec onnxslim pour les exportations qui en construisent un (voir Formats d’exportation), ce qui peut améliorer les performances et la compatibilité avec les moteurs d’inférence. |
opset | int | None | Indique la version de l’opset ONNX pour les exportations qui construisent un graphe ONNX (voir Formats d’exportation), afin d’assurer la compatibilité avec différents analyseurs et runtimes ONNX. Si elle n’est pas définie, la dernière version prise en charge est utilisée. |
workspace | float ou None | None | Définit la taille maximale de l’espace de travail en Gio pour les optimisations TensorRT, afin d’équilibrer l’utilisation de la mémoire et les performances. Utilise None pour une allocation automatique par TensorRT jusqu’au maximum du périphérique. |
nms | bool, optionnel | None | None exporte des prédictions brutes one-to-many pour un NMS externe ; True intègre le NMS lorsqu'il est pris en charge ; False sélectionne la tête sans NMS lorsqu'elle est disponible. Le NMS intégré CoreML prend en charge la détection, la segmentation et l'estimation de pose avec des formes statiques. Consulte le guide de détection de bout en bout. |
conf | float | None | Seuil de confiance utilisé partout où la NMS au moment de l’exportation est générée : exportations nms=True ; exportations de détection Hailo sans traitement de bout en bout ; et exportations de détection, de pose et de segmentation IMX, qui imposent nms=True en interne. La valeur par défaut est 0.25 lorsqu’elle n’est pas définie. |
iou | float | 0.7 | Seuil IoU utilisé partout où la NMS au moment de l’exportation est générée : exportations nms=True ; exportations de détection Hailo sans traitement de bout en bout ; et exportations de détection, de pose et de segmentation IMX, qui imposent nms=True en interne. |
max_det | int | 300 | Nombre maximal de détections conservées dans la sortie du modèle exporté. S'applique aux exportations nms=True dans tous les formats, à l'exception de la détection CoreML, dont le pipeline NMS natif n'a pas de limite de détection, ainsi qu'aux exportations de détection de bout en bout sans NMS (YOLO26, YOLOv10, limitées au nombre d'ancres disponibles) et aux exportations de détection, de pose et de segmentation d'IMX. |
agnostic_nms | bool | False | Active la NMS indépendante des classes partout où la NMS au moment de l’exportation est générée via le pipeline standard nms=True, y compris à l’étape NMS propre à CoreML, en supprimant les boîtes qui se chevauchent et dont le score est inférieur entre différentes classes, plutôt qu’uniquement au sein d’une même classe. Cette option n’est pas prise en compte par les configurations NMS générées par Hailo ou IMX, qui ne proposent aucune option indépendante des classes et restent sensibles aux classes quelle que soit la valeur de cet indicateur. Elle est également intégrée aux exportations de bout en bout sans NMS (YOLO26, YOLOv10), où elle empêche uniquement une même détection d’apparaître sous plusieurs étiquettes de classe (doublons IoU=1.0), sans effectuer de suppression fondée sur un seuil IoU entre des boîtes distinctes. |
batch | int | 1 | Spécifie la taille du lot pour l'inférence du modèle exporté ou le nombre maximal d'images que le modèle exporté traitera simultanément en mode predict. Pour les exports Edge TPU, cette valeur est automatiquement définie sur 1. |
device | str | None | Spécifie le périphérique utilisé pour l'exportation : GPU (device=0), CPU (device=cpu), MPS pour les puces Apple (device=mps), NPU Huawei Ascend (device=npu ou device=npu:0), ou DLA pour NVIDIA Jetson (device=dla:0 ou device=dla:1). Les exports TensorRT utilisent automatiquement le GPU, mais TensorRT 11.0 ne prend pas en charge le DLA. |
verbose | bool | False | Augmente le niveau de journalisation du générateur TensorRT à la sévérité VERBOSE pendant l'exportation format='engine'. Les autres formats d'exportation ignorent cette option. |
data | str | None | Chemin vers le YAML du jeu de données, essentiel pour l'étalonnage de la quantification INT8 ; la classification utilise à la place un répertoire de jeu de données ou le nom d'un jeu de données intégré. Si ce chemin n'est pas spécifié alors que INT8 est activé, Ultralytics sélectionne un jeu de données d'étalonnage adapté à la tâche lorsque cela est nécessaire, ou utilise le jeu de données par défaut correspondant à la tâche du modèle. |
split | str | 'val' | Partition du jeu de données ('train', 'val' ou 'test') utilisée pour créer le chargeur de données d'étalonnage de la quantification INT8 à partir de data. |
fraction | float, int ou list | 1.0 | Sous-ensemble du jeu de données utilisé pour l'étalonnage INT8 : un ratio, un nombre d'images ou des valeurs [train, val, test]. 1 désigne la partition complète, les entiers supérieurs à 1 correspondent au nombre d'images, et seule l'entrée de test facultative accepte 0/0.0 pour signifier aucune image. Les listes de deux éléments laissent test complet. |
L'ajustement de ces paramètres permet de personnaliser le processus d'exportation pour répondre à des exigences spécifiques, telles que l'environnement de déploiement, les contraintes matérielles et les objectifs de performance. La sélection du format et des paramètres appropriés est essentielle pour obtenir le meilleur équilibre entre la taille du modèle, sa vitesse et son précision.
Formats d'exportation#
Les formats d'exportation disponibles pour YOLO26 sont présentés dans le tableau ci-dessous. Tu peux exporter vers n'importe quel format en utilisant l'argument format, c'est-à-dire format='onnx' ou format='engine'. Tu peux effectuer des prédictions ou des validations directement sur les modèles exportés, c'est-à-dire yolo predict model=yolo26n.onnx. Des exemples d'utilisation sont affichés pour ton modèle une fois l'exportation terminée. Les modèles peuvent également être exportés directement depuis le navigateur sur Ultralytics Platform sans aucune configuration locale.
| Format | Argument format | Modèle | Métadonnées | Arguments |
|---|---|---|---|---|
| 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 utilise par défaut des sorties brutes pour NMS externe. Définis nms=False pour sélectionner une tête sans NMS disponible ; les formats non pris en charge reviennent à leur chemin de sortie natif. Les entrées nms ci-dessus identifient les formats capables d'intégrer NMS avec nms=True.
Options de quantification#
Utilise l'argument quantize pour demander la précision de l'exportation. Les valeurs textuelles ne sont pas sensibles à la casse, et Ultralytics normalise les alias acceptés avant l'exportation :
| Valeurs de la requête | Valeur canonique | Signification |
|---|---|---|
8, "8", "int8", "w8a8" | 8 | Poids et activations INT8 |
16, "16", "fp16", "w16a16" | 16 | Poids et activations FP16 |
32, "32", "fp32", "w32a32" | 32 | Exportation FP16 ; identique à l'absence de définition, à l'exception des programmes CoreML NMS ML, qui utilisent par défaut FP16 |
"w8a16" | "w8a16" | Poids INT8 avec activations 16 bits (FP16 ; INT16 sur LiteRT) |
"w8a32" | "w8a32" | Poids INT8 avec activations FP32 (INT8 dynamique LiteRT, aucune calibration nécessaire) |
Les anciens indicateurs half=True et int8=True sont toujours acceptés avec des avertissements de dépréciation et sont redirigés vers quantize=16 et quantize=8.
Tous les formats d'exportation ne prennent pas en charge toutes les précisions. Les requêtes explicites quantize produisent soit cette précision, soit un échec avant l'exportation :
| Format | FP32 (32/non défini) | FP16 (16) | INT8 (8) | W8A16 ("w8a16") | Remarques |
|---|---|---|---|---|---|
| PyTorch | ✅ | N/A | N/A | N/A | Format natif d'entraînement/de point de contrôle. |
| TorchScript | ✅ | ✅ GPU uniquement | ❌ | ❌ | L'exportation FP16 TorchScript nécessite device=0 ; l'exportation CPU est en FP32. |
| ONNX | ✅ | ✅ | ✅ | ❌ | INT8 utilise la quantification statique et les données de calibration d'ONNX Runtime. |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | INT8 utilise la quantification post-entraînement NNCF. |
| TensorRT | ✅ | ✅ | ✅ | ❌ | INT8 nécessite des données de calibration représentatives. |
| CoreML | ✅¹ | ✅ | ✅ | ✅ | CoreML INT8 est une quantification des poids ; W8A16 utilise des poids INT8 avec des activations FP16. ¹Les programmes NMS ML non définis utilisent par défaut FP16. |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | L'exportation INT8 utilise la calibration TensorFlow. |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | Aucune conversion de précision au moment de l'exportation. |
| Edge TPU | ❌ | ❌ | ✅ auto | ❌ | Edge TPU nécessite INT8 ; cette option est activée automatiquement lorsqu'elle n'est pas définie. |
| PaddlePaddle | ✅ | ❌ | ❌ | ❌ | Aucune conversion de précision au moment de l'exportation. |
| MNN | ✅ | ✅ | ✅ | ❌ | INT8 est une quantification des poids via la conversion MNN. |
| NCNN | ✅ | ✅ | ❌ | ❌ | Format d'exécution mobile/embarqué. |
| IMX500 | ❌ | ❌ | ✅ auto | ✅ | IMX500 nécessite une quantification ; INT8 est activé automatiquement lorsqu'il n'est pas défini. |
| RKNN | ❌ | ✅ dépendant de la puce | ✅ | ❌ | RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B prennent en charge FP16 ou INT8 ; les variantes RV1103/RV1106 sont exclusivement INT8. |
| ExecuTorch | ✅ | ❌ | ❌ | ❌ | Aucune conversion de précision au moment de l'exportation. |
| Axelera | ❌ | ❌ | ✅ auto | ❌ | L'exportation Axelera nécessite INT8 ; elle est activée automatiquement lorsqu'elle n'est pas définie. |
| DEEPX | ❌ | ❌ | ✅ auto | ❌ | L'exportation DEEPX nécessite INT8 ; elle est activée automatiquement lorsqu'elle n'est pas définie. |
| Qualcomm QNN | ❌ | ❌ | ❌ | ✅ auto | L'exportation QNN HTP est fixée à des poids INT8 avec des activations 16 bits. |
| LiteRT | ✅ | ❌ | ✅ | ✅ | INT8 statique (8) et "w8a16" (poids int8 + activations int16) utilisent des données de calibration ; prend également en charge "w8a32" INT8 dynamique (sans calibration). quantize=16 n'est pas une exportation séparée ; un modèle FP32 s'exécute en FP16 à l'exécution via le délégué GPU. |
| Hailo | ❌ | ❌ | ✅ auto | ❌ | L'exportation Hailo nécessite INT8 ; cette option est activée automatiquement si elle n'est pas définie. |
| Huawei Ascend | ❌ | ✅ auto | ❌ | ❌ | Les convolutions Ascend AI Core n'acceptent que des entrées FP16/INT8, l'ATC compile donc en FP16 ; cette option est activée automatiquement lorsqu'elle n'est pas définie. |
| Core AI | ✅ | ✅ | ❌ | ❌ | FP32 par défaut ou un actif FP16 .aimodel avec quantize=16 ; aucun chemin INT8. |
Pour les exportations INT8 et W8A16, fournis des données de calibration représentatives avec data, telles que data="coco8.yaml", sauf si l'intégration cible documente un comportement par défaut ou activé automatiquement. Le schéma "w8a32" de LiteRT (INT8 dynamique) ne nécessite aucune donnée de calibration.
Entraînement conscient de la quantification#
Les exportations INT8 ci-dessus relèvent de la quantification post-entraînement (PTQ) : les plages sont observées lors d'un unique passage de calibration sur data. L'entraînement conscient de la quantification (QAT) apprend plutôt des poids qui tolèrent l'INT8 en affinant avec une fausse quantification dans la boucle, ce que la seule calibration perd et que cela permet de récupérer. Passe quantize=8 à train pour affiner un point de contrôle pré-entraîné, puis exporte-le comme d'habitude :
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 neededUtilise un petit taux d'apprentissage lors de l'affinage d'un point de contrôle pré-entraîné. L'entraînement conscient de la quantification peut initialement réduire la précision, et son avantage par rapport à la quantification post-entraînement dépend du modèle, de l'ensemble de données et du budget d'entraînement. Valide le modèle exporté par rapport au point de contrôle d'origine et à une exportation quantifiée post-entraînement ; les scores de fausse quantification pendant l'entraînement n'établissent pas la précision du déploiement.
L'intérêt de QAT dépend de la façon dont la propre calibration du moteur d'exportation gère le modèle. Les valeurs ci-dessous sont le mAP50-95 sur COCO val2017, mesurées avec des moteurs TensorRT 10.16 à imgsz=640 et un lot de 1, où chaque point de contrôle QAT a été entraîné avec epochs=20 patience=3 :
| Modèle | Moteur FP32 | Moteur INT8 PTQ | Moteur INT8 QAT |
|---|---|---|---|
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 coûte de 0.008 à 0.017 en mAP50-95 par rapport au FP32 sur toute la gamme, tandis que la quantification post-entraînement coûte 0.010 sur yolo26n et de 0.038 à 0.057 sur les modèles plus grands. Ainsi, QAT n'apporte presque rien sur le plus petit modèle, où la calibration fonctionne déjà bien, et de 0.030 à 0.044 sur le reste. Attends-toi à des chiffres différents sur un autre jeu de données, un autre format d'exportation ou une autre version de TensorRT, et mesure tes propres résultats.
Les modèles d'entraînement conscient de la quantification nécessitent compile=False ; les modules quantifiés de ModelOpt ne prennent pas en charge torch.compile.
La tête de sortie est délibérément laissée en float pour limiter la perte de précision INT8 ; TensorRT active la précision mixte FP16 pour ses couches non quantifiées. La QAT s'exécute via NVIDIA TensorRT Model Optimizer, installé automatiquement lors de la première utilisation, et le point de contrôle résultant nécessite son installation pour être chargé. Ces plages voyagent avec le point de contrôle et les exportations onnx et engine les émettent sous forme de nœuds Q/DQ ; d'autres formats lisent la calibration à la place et rejetteront un point de contrôle QAT.
Et ensuite ?#
Trouve le guide d'intégration de ta cible de déploiement — ONNX, TensorRT, CoreML, et bien d'autres se trouvent sur la liste complète des intégrations — pour savoir comment exécuter le modèle exporté.
FAQ#
L'utilisation de TensorRT pour l'exportation de modèles offre des améliorations de performance significatives. Les modèles YOLO26 exportés vers TensorRT peuvent atteindre jusqu'à 5 fois d'accélération GPU, ce qui le rend idéal pour les applications d'inférence en temps réel.
- Polyvalence : Optimise les modèles pour une configuration matérielle spécifique.
- Vitesse : Obtenais une inférence plus rapide grâce à des optimisations avancées.
- Compatibilité : Intègre-toi en douceur avec le matériel NVIDIA.
Pour en savoir plus sur l'intégration de TensorRT, consulte le guide d'intégration TensorRT.
La quantification INT8 est un excellent moyen de compresser le modèle et d'accélérer l'inférence, en particulier sur les appareils de périphérie. Voici comment tu peux activer la quantification INT8 :
Exemplefrom ultralytics import YOLO model = YOLO("yolo26n.pt") # Load a model model.export(format="onnx", quantize=8, data="coco8.yaml")La quantification INT8 peut être appliquée à des formats tels que ONNX, TensorRT, OpenVINO, CoreML, et Rockchip RKNN. Pour des résultats de quantification optimaux, fournis un jeu de données représentatif à l'aide du paramètre
data. Consulte les Options de quantification pour connaître les valeurs dequantizeacceptées et les formats pris en charge.La taille d'entrée dynamique permet au modèle exporté de gérer des dimensions d'image variables, offrant de la flexibilité et optimisant l'efficacité du traitement pour différents cas d'utilisation. Lors de l'exportation vers des formats tels que ONNX ou TensorRT, l'activation de la taille d'entrée dynamique garantit que le modèle peut s'adapter de manière transparente à différentes formes d'entrée.
Pour activer cette fonctionnalité, utilise l'indicateur
dynamic=Truelors de l'exportation :Exemplefrom ultralytics import YOLO model = YOLO("yolo26n.pt") model.export(format="onnx", dynamic=True)Le dimensionnement dynamique des entrées est particulièrement utile pour les applications où les dimensions des entrées peuvent varier, comme le traitement vidéo ou lors de la gestion d'images provenant de différentes sources.
Comprendre et configurer les arguments d'exportation est crucial pour optimiser les performances du modèle :
format:Le format cible pour le modèle exporté (par exemple,onnx,torchscript,saved_model).imgsz:La taille d'image souhaitée pour l'entrée du modèle (par exemple,640ou(height, width)).quantize:Précision de quantification, telle que8/"int8",16/"fp16",32/"fp32", ou les schémas mixtes poids/activation"w8a16"et"w8a32"(INT8 dynamique LiteRT) sur les formats pris en charge. Consulte les Options de quantification.optimize:Active une optimisation de compilation supérieure pour les exportations DEEPX.
Pour un déploiement sur des plateformes matérielles spécifiques, envisage d'utiliser des formats d'exportation spécialisés tels que TensorRT pour les GPU NVIDIA, CoreML pour les appareils Apple, ou Edge TPU pour les appareils Google Coral.
Lorsque tu exportes un modèle YOLO vers des formats tels qu'ONNX ou TensorRT, la structure du tenseur de sortie dépend de la tâche du modèle. Comprendre ces sorties est important pour les implémentations d'inférence personnalisées.
Pour les modèles de détection YOLO26 (par exemple,
yolo26n.pt) exportés avecnms=False, les formats pris en charge produisent une sortie sans NMS de la forme(batch_size, max_detections, 6)avec des valeurs[x1, y1, x2, y2, confidence, class_id]. Avec la valeur par défautmax_det=300, il s'agit généralement de(batch_size, 300, 6). Certains formats contraints reviennent automatiquement à la disposition de sortie traditionnelle lorsque les opérateurs de bout en bout ne sont pas pris en charge.Par défaut (
nms=None), les modèles de détection, y compris YOLO26, exportent des prédictions brutes de un à plusieurs : la sortie est généralement un tenseur unique de forme(batch_size, 4 + num_classes, num_predictions)où les canaux représentent les coordonnées des boîtes plus les scores par classe, etnum_predictionsdépend de la résolution d'entrée de l'exportation (et peut être dynamique). Le guide de détection de bout en bout indique quels formats conservent la sortie de bout en bout.Pour les modèles de segmentation (par exemple,
yolo26n-seg.pt), tu obtiendras généralement deux sorties : le premier tenseur de forme(batch_size, 4 + num_classes + mask_dim, num_predictions)(boîtes, scores de classe et coefficients de masque), et le second tenseur de forme(batch_size, mask_dim, proto_h, proto_w)contenant des prototypes de masques utilisés avec les coefficients pour générer des masques d'instance. Les tailles dépendent de la résolution d'entrée de l'exportation (et peuvent être dynamiques).Pour les modèles de pose (par exemple,
yolo26n-pose.pt), le tenseur de sortie a généralement la forme de(batch_size, 4 + num_classes + keypoint_dims, num_predictions), oùkeypoint_dimsdépend de la spécification de la pose (par exemple, le nombre de points clés et si la confiance est incluse), etnum_predictionsdépend de la résolution d'entrée de l'exportation (et peut être dynamique).Les exemples des exemples d'inférence ONNX montrent comment traiter ces sorties pour chaque type de modèle.
Ultralytics ne fournit pas actuellement d'API d'inférence C++ dédiée pour les modèles YOLO. Pour les déploiements en C++, exporte le modèle vers un format d'exécution tel que ONNX, TensorRT, TorchScript ou MNN, puis charge l'artefact exporté avec l'API C++ native de ce runtime.
Par exemple, exporte un modèle de détection avec
yolo export model=yolo26n.pt format=onnxet exécute le fichier.onnxavec ONNX Runtime C++, ou exporte avecformat=engineet exécute le moteur TensorRT à partir d'une application C++ TensorRT. Lorsque tu utilises un post-traitement C++ personnalisé, fais correspondre la disposition du tenseur de sortie pour ta tâche et tes paramètres d'exportation ; les exportations de détection YOLO26 par défaut renvoient des tenseurs de prédiction bruts qui nécessitent un NMS externe. Exporte avecnms=Falsepour des détections sans NMS de forme(batch, max_det, 6), ounms=Truepour intégrer le NMS dans les formats pris en charge.Lors de l'exportation avec
quantize=16(FP16) ouquantize=8(INT8), la plupart des tenseurs sont convertis en une précision inférieure pour réduire la taille du modèle et améliorer les performances. Cependant, lorsquenms=Falseest activé, le post-traitement (y compris les indices de classe) est intégré directement dans le graphe exporté.Le tenseur
output0contient des indices de classe, qui sont représentés en interne sous forme de valeurs à virgule flottante. Le format FP16 ne peut pas représenter de manière fiable des valeurs entières supérieures à 2048 en raison de la précision limitée de sa mantisse. Pour éviter une perte de précision potentielle ou des ID de classe incorrects,output0est intentionnellement conservé en FP32.Ce comportement est attendu et s'applique également aux exportations de plus basse précision ou quantifiées où la fidélité des indices de classe doit être préservée.
Si des sorties FP16 complètes sont requises, exporte avec
nms=Noneet effectue le post-traitement en externe.
L'exportation d'un modèle YOLO26 au format ONNX est simple avec Ultralytics. Il fournit des méthodes en Python et en CLI pour exporter des modèles.
Pour plus de détails sur le processus, y compris les options avancées telles que la gestion de différentes tailles d'entrée, consulte le guide d'intégration ONNX.