Ultralytics YOLO27 :
Get Started

Exportation de modèles avec Ultralytics YOLO#

Ultralytics YOLO ecosystem and integrations

Introduction#

L’objectif ultime de l’entraînement d’un modèle est son déploiement dans des applications concrètes. Le mode d’exportation d’Ultralytics YOLO26 offre un éventail polyvalent d’options pour exporter ton modèle entraîné vers différents formats, afin de pouvoir le déployer sur diverses plateformes et différents appareils. Ce guide complet te présente les subtilités de l’exportation de modèles et explique comment optimiser la compatibilité et les performances.

Consulte l’aperçu de YOLO27 non encore publié pour découvrir les formats d’exportation prévus.



Regarder : Comment exporter Ultralytics YOLO26 dans différents formats pour le déploiement | ONNX, TensorRT, CoreML 🚀

Pourquoi choisir le mode d’exportation de YOLO26 ?#

  • Polyvalence : exportation vers plusieurs formats, notamment ONNX, TensorRT, CoreML et bien d’autres.
  • Performances : jusqu’à 5 fois plus de vitesse sur GPU avec TensorRT et 3 fois plus de vitesse sur CPU avec ONNX ou OpenVINO.
  • Compatibilité : déploie ton modèle dans de nombreux environnements matériels et logiciels.
  • Facilité d’utilisation : une CLI et une API Python simples pour exporter rapidement et facilement tes modèles.

Exemples d'utilisation#

Exporte un modèle YOLO26n vers un autre format, comme ONNX ou TensorRT. Consulte la section Arguments ci-dessous pour obtenir la liste complète des arguments d’exportation.

Exemple
from ultralytics import YOLO

# Charger un modèle
model = YOLO("yolo26n.pt")  # charger un modèle officiel
model = YOLO("path/to/best.pt")  # charger un modèle entraîné personnalisé

# Exporter le modèle
model.export(format="onnx")

Arguments#

Ce tableau détaille les configurations et les 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 dans différents environnements. Une configuration appropriée garantit que le modèle est prêt à être déployé dans l’application prévue avec une efficacité optimale.

ArgumentTypeValeur par défautDescription
formatstr'torchscript'Format cible du modèle exporté, par exemple 'onnx', 'torchscript', 'engine' (TensorRT) ou autres. Chaque format permet la compatibilité avec différents environnements de déploiement.
namestrNoneNom du matériel cible pour les formats qui en ont besoin : architecture Hailo ('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l' ; valeur par défaut : 'hailo8l'), puce Rockchip RKNN (valeur par défaut : 'rk3588'), SoC Huawei Ascend (un CANN --soc_version ; valeur par défaut : 'Ascend310B4'), cible Qualcomm QNN HTP (valeur par défaut : '73') ou appareil AMD Xilinx Versal AI Edge Series Gen 2 (valeur par défaut : 've2-xc2ve3858', le kit d’évaluation VEK385). Différent de la paire de nommage d’exécution project/name utilisée par les autres modes.
imgszint ou tuple640Taille d'image souhaitée pour l'entrée du modèle. Peut être un entier pour les images carrées (p. ex. 640 pour 640×640) ou un tuple (height, width) pour des dimensions précises. Si elle n'est pas indiquée, 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 profondeur, 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 pour son entraînement. Un modèle créé à partir d'un fichier YAML ne possède pas de taille d'entraînement enregistrée et utilise 640.
optimizeboolFalseActive une optimisation plus poussée du compilateur pour DEEPX, ce qui réduit la latence d'inférence tout en augmentant le temps de compilation.
quantizeint ou strNonePré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 périphériques ; nécessite les données de calibration data/fraction) ; 32/non défini correspond à FP32. Un point de contrôle entraîné avec quantize=8 est toujours exporté en INT8 : onnx et engine sont exportés à partir des plages qu'il contient, sans calibration, et les autres formats ou précisions sont refusés. 'w8a8' et 'w16a16' sont des alias de 8 et 16 ; les précisions mixtes 'w8a16' (poids INT8 avec activations 16 bits : CoreML, LiteRT, QNN) et 'w8a32' (INT8 dynamique : LiteRT) sont acceptées uniquement par ces formats. Remplace les indicateurs obsolètes half/int8 (half=True → 16, int8=True → 8, toujours acceptés avec un avertissement de dépréciation). Seules les précisions prises en charge par le format cible sont autorisées (voir ci-dessous).
dynamicboolFalsePermet d'utiliser des tailles d'entrée dynamiques pour les exportations TorchScript, ONNX, OpenVINO, TensorRT, CoreML et MNN, offrant une plus grande flexibilité pour traiter des images de dimensions variées.
simplifyboolTrueSimplifie le graphe ONNX intermédiaire avec onnxslim pour les exportations qui en génèrent un (voir Formats d'exportation), ce qui peut améliorer les performances et la compatibilité avec les moteurs d'inférence.
opsetintNoneIndique la version d'opset ONNX pour les exportations qui génèrent un graphe ONNX (voir Formats d'exportation), afin d'assurer la compatibilité avec différents analyseurs et environnements d'exécution ONNX. Si aucune valeur n'est définie, utilise la dernière version prise en charge.
workspacefloat ou NoneNoneDéfinit la taille maximale de l'espace de travail, en Gio, pour les optimisations TensorRT, afin d'équilibrer l'utilisation mémoire et les performances. Utilise None pour laisser TensorRT allouer automatiquement jusqu'à la mémoire maximale de l'appareil.
nmsbool, facultatifNoneNone exporte les prédictions brutes un-vers-plusieurs pour une NMS externe ; True intègre la NMS lorsque cette option est prise en charge ; False sélectionne la tête sans NMS lorsqu'elle est disponible. La NMS intégrée de CoreML prend en charge la détection, la segmentation et la pose avec des dimensions statiques. Consulte le guide sur la détection de bout en bout.
conffloatNoneSeuil de confiance utilisé partout où une NMS est générée lors de l'exportation : les exportations nms=True ; les exportations de détection Hailo non exécutées de bout en bout ; et les exportations de détection, de pose et de segmentation IMX, qui imposent en interne nms=True. La valeur par défaut est 0.25 si aucune valeur n'est définie.
ioufloat0.7Seuil d'IoU utilisé partout où une NMS est générée lors de l'exportation : les exportations nms=True ; les exportations de détection Hailo non exécutées de bout en bout ; et les exportations de détection, de pose et de segmentation IMX, qui imposent en interne nms=True.
max_detint300Nombre maximal de détections conservées dans la sortie du modèle exporté. S'applique aux exportations nms=True dans tous les formats, sauf à la détection CoreML, dont le pipeline NMS natif ne limite pas le nombre de détections, 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 IMX.
agnostic_nmsboolFalseActive la NMS indépendante des classes partout où une NMS est générée à l'exportation via le pipeline standard nms=True, y compris à l'étape NMS propre à CoreML ; les boîtes qui se chevauchent et dont le score est inférieur sont ainsi supprimées même si elles appartiennent à des classes différentes, 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 pas d'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 la même détection d'apparaître sous plusieurs étiquettes de classe (doublons IoU=1.0), sans appliquer de suppression fondée sur un seuil IoU entre des boîtes distinctes.
batchint1Définit la taille du lot d’inférence du modèle exporté ou le nombre maximal d’images que le modèle exporté traite simultanément en mode predict. Les formats dont les arguments d’export ne comprennent pas batch (Edge TPU, IMX500, DEEPX, Hailo, AMD Xilinx) exportent avec un lot de 1 et rejettent les autres valeurs.
devicestrNoneIndique l'appareil 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 exportations TensorRT utilisent automatiquement le GPU, mais TensorRT 11.0 ne prend pas en charge DLA.
verboseboolFalseAugmente le niveau de détail des journaux du constructeur TensorRT à VERBOSE pendant l'exportation format='engine'. Les autres formats d'exportation ignorent cette option.
datastrNoneChemin vers le fichier YAML du jeu de données, indispensable à la calibration de la quantification INT8 ; pour la classification, indique plutôt un répertoire de jeu de données ou le nom d'un jeu de données intégré. Si cette valeur n'est pas spécifiée alors que la quantification INT8 est activée, Ultralytics sélectionne un jeu de données de calibration adapté à la tâche, si nécessaire, ou utilise le jeu de données par défaut correspondant à la tâche du modèle. Un point de contrôle entraîné avec quantize=8 contient ses propres plages INT8 et ne nécessite pas de données de calibration.
splitstr'val'Partition du jeu de données ('train', 'val' ou 'test') utilisée pour créer le chargeur de données de calibration de la quantification INT8 à partir de data.
fractionfloat, int ou list1.0Sous-ensemble du jeu de données utilisé pour la calibration INT8 : un ratio, un nombre d'images ou des valeurs [train, val, test]. 1 représente la partition complète ; les entiers supérieurs à 1 correspondent à des nombres d'images ; seules les entrées de test facultatives acceptent 0/0.0 pour signifier aucune image. Les listes de deux éléments conservent la partition test complète.

Le réglage de ces paramètres permet d’adapter le processus d’exportation à des exigences spécifiques, telles que l’environnement de déploiement, les contraintes matérielles et les objectifs de performance. Il est essentiel de choisir le format et les paramètres appropriés pour trouver le meilleur équilibre entre la taille du modèle, sa vitesse et sa précision.

Formats d’exportation#

Les formats d’exportation disponibles pour YOLO26 figurent dans le tableau ci-dessous. Tu peux exporter vers n’importe quel format à l’aide de l’argument format, par exemple format='onnx' ou format='engine'. Tu peux effectuer des prédictions ou valider directement sur les modèles exportés, par exemple avec yolo predict model=yolo26n.onnx. Des exemples d’utilisation de ton modèle s’affichent une fois l’exportation terminée. Les modèles peuvent également être exportés directement depuis le navigateur sur Ultralytics Platform, sans configuration locale.

FormatArgument formatModèleMétadonnéesArguments
PyTorch-yolo26n.pt✅-
TorchScripttorchscriptyolo26n.torchscript✅imgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n.onnx✅imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device
OpenVINOopenvinoyolo26n_openvino_model/✅imgsz, quantize, dynamic, nms, batch, data, fraction, device
TensorRTengineyolo26n.engine✅imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device
CoreMLcoremlyolo26n.mlpackage✅imgsz, dynamic, quantize, nms, batch, device
Apple Core AIcoreaiyolo26n.aimodel✅imgsz, batch, quantize
TF SavedModelsaved_modelyolo26n_saved_model/✅imgsz, quantize, opset, nms, batch, data, fraction, device
TF GraphDefpbyolo26n.pb❌imgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n_edgetpu.tflite✅imgsz, quantize, opset, data, fraction, device
LiteRTlitertyolo26n.tflite✅imgsz, quantize, batch, data, fraction, device
PaddlePaddlepaddleyolo26n_paddle_model/✅imgsz, batch, device
MNNmnnyolo26n.mnn✅imgsz, batch, dynamic, quantize, simplify, opset, nms, device
NCNNncnnyolo26n_ncnn_model/✅imgsz, quantize, batch, device
IMX500imxyolo26n_imx_model/✅imgsz, quantize, data, fraction, nms, device
RKNNrknnyolo26n_rknn_model/✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
ExecuTorchexecutorchyolo26n_executorch_model/✅imgsz, batch, device
Axeleraaxelerayolo26n_axelera_model/✅imgsz, batch, quantize, data, fraction, device
DEEPXdeepxyolo26n_deepx_model/✅imgsz, quantize, simplify, opset, data, optimize, device
Qualcomm QNNqnnyolo26n_qnn.onnx✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
Hailohailoyolo26n_hailo_model/✅imgsz, name, quantize, data, fraction, simplify, conf, iou, device
Huawei Ascendascendyolo26n_ascend_model/✅imgsz, batch, name, quantize, opset, simplify, nms, device
AMD Xilinxxilinxyolo26n_xilinx_model/✅imgsz, name, quantize, data, fraction, opset, simplify, device

nms=None produit par défaut des sorties brutes pour la NMS externe. Définis nms=False pour sélectionner une tête disponible sans NMS ; les formats non pris en charge utilisent leur voie de sortie native. Les entrées nms ci-dessus désignent les formats qui peuvent intégrer la NMS avec nms=True.

Installation automatique des dépendances d’exportation

La plupart des formats nécessitent des packages qui ne sont pas installés avec ultralytics. Si un package est manquant, l’exportation l’installe à l’exécution avec uv ou pip, et sous Linux avec apt pour les packages système tels que Java pour IMX. Le compilateur Edge TPU est téléchargé sans apt ni sudo. Pour conserver un environnement fixe, par exemple dans une image de conteneur, une tâche CI ou un service de production, définis YOLO_AUTOINSTALL=False. L’exportation vérifie alors toujours la présence des packages manquants et les signale, mais ne modifie pas l’environnement et échoue tant que ces packages ne sont pas installés.

export YOLO_AUTOINSTALL=False

Options de quantification#

Utilise l’argument quantize pour définir 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 demandéesValeur canoniqueSignification
8, "8", "int8", "w8a8"8Poids et activations INT8
16, "16", "fp16", "w16a16"16Poids et activations FP16
32, "32", "fp32", "w32a32"32Exportation FP32 ; identique à une valeur non définie, sauf pour les programmes ML NMS de CoreML, qui utilisent FP16 par défaut
"w8a16""w8a16"Poids INT8 avec activations 16 bits (FP16 ; INT16 sur LiteRT)
"w8a32""w8a32"Poids INT8 avec activations FP32 (INT8 dynamique LiteRT, sans calibration nécessaire)

Les anciens indicateurs half=True et int8=True sont toujours acceptés avec des avertissements de dépréciation et redirigés vers quantize=16 et quantize=8.

Tous les formats d’exportation ne prennent pas en charge toutes les précisions. Les demandes explicites quantize produisent la précision demandée ou échouent avant l’exportation :

FormatFP32 (32/non défini)FP16 (16)INT8 (8)W8A16 ("w8a16")Remarques
PyTorch✅S. O.S. O.S. O.Format natif d’entraînement et de point de contrôle.
TorchScript✅✅ GPU uniquement❌❌L’exportation TorchScript en FP16 nécessite device=0 ; l’exportation sur CPU est en FP32.
ONNX✅✅✅❌INT8 utilise la quantification statique d’ONNX Runtime et des données de calibration.
OpenVINO✅✅✅❌INT8 utilise la quantification post-entraînement de NNCF.
TensorRT✅✅✅❌INT8 nécessite des données de calibration représentatives.
CoreML✅¹✅✅✅La quantification INT8 de CoreML porte sur les poids ; W8A16 utilise des poids INT8 avec des activations FP16. ¹ Les programmes ML NMS non définis utilisent FP16 par défaut, et les exportations nms=True pour la segmentation et la pose sont toujours en FP16.
Core AI✅✅❌❌FP32 par défaut ou ressource FP16 .aimodel avec quantize=16 ; aucune option INT8.
TF SavedModel✅❌✅❌L’exportation INT8 utilise la calibration TensorFlow.
TF GraphDef✅❌❌❌Aucune conversion de précision lors de l’exportation.
Edge TPU❌❌✅ automatique❌Edge TPU nécessite INT8 ; cette option est activée automatiquement si elle n’est pas définie.
LiteRT✅❌✅✅INT8 statique (8) et "w8a16" (poids int8 + activations int16) utilisent des données de calibration ; LiteRT prend également en charge l’INT8 dynamique "w8a32" (sans calibration). quantize=16 ne correspond pas à une exportation distincte ; un modèle FP32 s’exécute en FP16 à l’exécution via le délégué GPU.
PaddlePaddle✅❌❌❌Aucune conversion de précision lors de l’exportation.
MNN✅✅✅❌INT8 correspond à une quantification des poids effectuée lors de la conversion MNN.
NCNN✅✅❌❌Format d’exécution pour mobile et systèmes embarqués.
IMX500❌❌✅ automatique❌IMX500 nécessite une quantification ; INT8 est activé automatiquement si l’option n’est pas définie.
RKNN❌✅ selon la puce✅❌RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B prennent en charge FP16 ou INT8 ; les variantes RV1103/RV1106 sont limitées à INT8.
ExecuTorch✅❌❌❌Aucune conversion de précision lors de l’exportation.
Axelera❌❌✅ automatique❌L’exportation Axelera nécessite INT8 ; cette option est activée automatiquement si elle n’est pas définie.
DEEPX❌❌✅ automatique❌L’exportation DEEPX nécessite INT8 ; cette option est activée automatiquement si elle n’est pas définie.
Qualcomm QNN❌❌❌✅ automatiqueL’exportation QNN HTP utilise toujours des poids INT8 avec des activations 16 bits.
Hailo❌❌✅ automatique❌L’exportation Hailo nécessite INT8 ; cette option est activée automatiquement si elle n’est pas définie.
Huawei Ascend❌✅ automatique❌❌Les convolutions Ascend AI Core n’acceptent que des entrées FP16/INT8 ; ATC compile donc en FP16. Cette option est activée automatiquement si elle n’est pas définie.
AMD Xilinx❌❌✅ automatique❌L’export AMD Xilinx nécessite Vitis AI INT8 (VINT8) ; cette option est activée automatiquement si elle n’est pas définie.

Pour les exportations INT8 et W8A16, fournis des données de calibration représentatives avec data, par exemple data="coco8.yaml", sauf si l’intégration cible documente un comportement par défaut ou une activation automatique. Le mode LiteRT "w8a32" (INT8 dynamique) ne nécessite pas de données de calibration.

Entraînement sensible à la quantification#

Les exportations INT8 ci-dessus utilisent la quantification post-entraînement (PTQ) : les plages sont observées lors d’un seul passage de calibration sur data. L’entraînement sensible à la quantification (QAT) apprend plutôt des poids qui tolèrent INT8 en affinant le modèle avec une fausse quantification dans la boucle d’entraînement, ce qui permet de récupérer la précision perdue lors de la calibration seule. Transmets quantize=8 à train pour affiner un point de contrôle préentraîné, puis exporte-le comme d’habitude :

Exemple
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)  # les plages sont conservées avec le point de contrôle, aucune donnée de calibration n’est nécessaire

Utilise un faible taux d’apprentissage pour affiner un point de contrôle préentraîné. Le QAT peut d’abord réduire la précision, et son avantage par rapport à la quantification post-entraînement dépend du modèle, du jeu de données et du budget d’entraînement. Valide le modèle exporté en le comparant au point de contrôle d’origine et à une exportation quantifiée après entraînement ; les scores de fausse quantification obtenus pendant l’entraînement ne permettent pas d’établir la précision en déploiement.

L’intérêt du QAT dépend de la capacité de la calibration propre au moteur d’exportation à traiter le modèle. Les valeurs ci-dessous correspondent au mAP50-95 sur COCO val2017, mesuré avec des moteurs TensorRT 10.16 à imgsz=640 et avec un lot de taille 1 ; chaque point de contrôle QAT a été entraîné avec epochs=20 patience=3 :

ModèleMoteur FP32Moteur INT8 PTQMoteur INT8 QAT
yolo26n0.40320.39340.3935
yolo26s0.47940.44120.4711
yolo26m0.52690.46960.5137
yolo26l0.54400.48890.5307
yolo26x0.57010.51380.5527

Le QAT entraîne une baisse de 0.008 à 0.017 du mAP50-95 par rapport au FP32 sur toute la gamme, tandis que la quantification post-entraînement entraîne une baisse de 0.010 avec yolo26n et de 0.038 à 0.057 sur les modèles plus grands. Le QAT n’apporte donc presque rien au plus petit modèle, pour lequel la calibration fonctionne déjà bien, et améliore le résultat de 0.030 à 0.044 sur les autres. Attends-toi à des chiffres différents avec un autre jeu de données, format d’exportation ou version de TensorRT ; effectue tes propres mesures.

Les modèles QAT nécessitent compile=False ; les modules quantifiés de ModelOpt ne prennent pas en charge torch.compile.

Les convolutions finales de sortie de la tête restent volontairement en virgule flottante afin de limiter la perte de précision INT8 ; TensorRT active la précision mixte FP16 pour ses couches non quantifiées. Le QAT s’exécute avec NVIDIA TensorRT Model Optimizer, installé automatiquement lors de la première utilisation, et cet outil doit être installé pour charger le point de contrôle obtenu. Ces plages sont conservées avec le point de contrôle et les exportations onnx et engine les émettent sous forme de nœuds Q/DQ ; les autres formats utilisent plutôt les données de calibration et refusent les points de contrôle QAT.

Et ensuite ?#

Consulte le guide d’intégration correspondant à ta cible de déploiement — ONNX, TensorRT, CoreML et bien d’autres figurent dans la liste complète des intégrations — pour savoir comment exécuter le modèle exporté.

FAQ#

  • Avec Ultralytics, l’exportation d’un modèle YOLO26 au format ONNX est simple. Tu peux exporter les modèles avec Python ou la CLI.

    Exemple
    from ultralytics import YOLO
    
    # Charger un modèle
    model = YOLO("yolo26n.pt")  # charger un modèle officiel
    model = YOLO("path/to/best.pt")  # charger un modèle entraîné personnalisé
    
    # Exporter le modèle
    model.export(format="onnx")

    Pour en savoir plus sur le processus, notamment sur les options avancées comme la gestion de différentes tailles d’entrée, consulte le guide d’intégration ONNX.

  • L’utilisation de TensorRT pour l’exportation de modèles améliore considérablement les performances. Les modèles YOLO26 exportés vers TensorRT peuvent atteindre une accélération GPU jusqu’à 5 fois supérieure, ce qui en fait une solution idéale pour les applications d’inférence en temps réel.

    • Polyvalence : optimise les modèles pour une configuration matérielle précise.
    • Vitesse : accélère l’inférence grâce à des optimisations avancées.
    • Compatibilité : s’intègre facilement au 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 périphériques. Voici comment activer la quantification INT8 :

    Exemple
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")  # Charger un modèle
    model.export(format="onnx", quantize=8, data="coco8.yaml")

    La quantification INT8 peut être appliquée à des formats comme ONNX, TensorRT, OpenVINO, CoreML, Rockchip RKNN et AMD Xilinx. Pour obtenir des résultats de quantification optimaux, fournis un jeu de données représentatif avec le paramètre data. Consulte les options de quantification pour connaître les valeurs quantize acceptées et les formats pris en charge.

  • La taille d’entrée dynamique permet au modèle exporté de traiter des images de dimensions variables, ce qui offre de la flexibilité et optimise l’efficacité du traitement selon les cas d’utilisation. Lors d’une exportation vers des formats comme ONNX ou TensorRT, l’activation de la taille d’entrée dynamique permet au modèle de s’adapter facilement à différentes formes d’entrée.

    Pour activer cette fonctionnalité, utilise l’indicateur dynamic=True lors de l’exportation :

    Exemple
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    model.export(format="onnx", dynamic=True)

    La taille d’entrée dynamique est particulièrement utile pour les applications où les dimensions d’entrée peuvent varier, comme le traitement vidéo ou l’analyse d’images provenant de différentes sources.

  • Par défaut, les modèles PyTorch et les exportations dynamiques utilisent le rembourrage en rectangle minimal, tandis que les exportations statiques ajoutent du rembourrage jusqu’à atteindre le imgsz complet ; les détections proches du seuil de confiance peuvent donc différer. Utilise rect=False pour effectuer l’inférence native et obtenir des résultats similaires à une exportation statique, ou exporte avec dynamic=True lorsque cette option est prise en charge.

  • Comprendre et configurer les arguments d’exportation est essentiel pour optimiser les performances d’un modèle :

    • format: Format cible du modèle exporté (par exemple, onnx, torchscript, saved_model).
    • imgsz: Taille d’image souhaitée pour l’entrée du modèle (par exemple, 640 ou (height, width)).
    • quantize: Précision de quantification, par exemple 8/"int8", 16/"fp16", 32/"fp32", ou les modes mixtes poids/activations "w8a16" et "w8a32" (INT8 dynamique LiteRT) pour les formats pris en charge. Consulte les options de quantification.
    • dynamic: Accepte des tailles d’entrée variables dans les formats prenant en charge les formes dynamiques, comme ONNX, OpenVINO et TensorRT.
    • nms: Sélectionne les sorties brutes pour une NMS externe (None), une NMS intégrée (True) ou une tête sans NMS (False).
    • device: Appareil utilisé pour tracer le modèle pendant l’exportation, par exemple cpu ou 0 pour le premier GPU CUDA ; TorchScript FP16 nécessite un GPU.

    Pour un déploiement sur des plateformes matérielles spécifiques, pense à utiliser des formats d’exportation spécialisés comme 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 comme ONNX ou TensorRT, la structure du tenseur de sortie dépend de la tâche du modèle. Il est important de comprendre ces sorties pour implémenter des inférences personnalisées.

    Pour les modèles de détection YOLO26 (p. ex. yolo26n.pt) exportés avec nms=False, les formats pris en charge produisent une sortie sans NMS de forme (batch_size, max_detections, 6) avec [x1, y1, x2, y2, confidence, class_id] valeurs. Avec le max_det=300 par défaut, cette sortie est généralement (batch_size, 300, 6). Certains formats soumis à des contraintes 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, notamment YOLO26, exportent des prédictions brutes un-vers-plusieurs : la sortie est généralement un seul tenseur de forme (batch_size, 4 + num_classes, num_predictions), dont les canaux représentent les coordonnées des boîtes et les scores par classe, et num_predictions dépend de la résolution d'entrée de l'exportation (et peut être dynamique). Le guide de la détection de bout en bout indique quels formats conservent la sortie de bout en bout.

    Pour les modèles de segmentation (p. ex. 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 par classe et coefficients de masque), et le second tenseur, de forme (batch_size, mask_dim, proto_h, proto_w), qui contient les prototypes de masque utilisés avec les coefficients pour générer les 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 (p. ex. yolo26n-pose.pt), le tenseur de sortie a généralement la forme (batch_size, 4 + num_classes + keypoint_dims, num_predictions), où keypoint_dims dépend de la spécification de pose (p. ex. du nombre de points clés et de l'inclusion ou non de la confiance), et num_predictions dépend de la résolution d'entrée de l'exportation (et peut être dynamique).

    Les exemples de la page Exemples d'inférence ONNX montrent comment traiter ces sorties pour chaque type de modèle.

  • Ultralytics ne fournit actuellement pas d'API d'inférence C++ dédiée aux modèles YOLO. Pour les déploiements en C++, exporte le modèle vers un format d'exécution comme ONNX, TensorRT, TorchScript ou MNN, puis charge l'artefact exporté avec l'API C++ native de ce moteur d'exécution.

    Par exemple, exporte un modèle de détection avec yolo export model=yolo26n.pt format=onnx et exécute le fichier .onnx avec ONNX Runtime C++, ou exporte avec format=engine et exécute le moteur TensorRT depuis une application C++ TensorRT. Lorsque tu utilises un post-traitement C++ personnalisé, veille à ce que la disposition du tenseur de sortie corresponde à la tâche et aux paramètres d'exportation ; les exportations de détection YOLO26 par défaut renvoient des tenseurs de prédiction bruts qui nécessitent une NMS externe. Exporte avec nms=False pour obtenir des détections sans NMS de forme (batch, max_det, 6), ou avec nms=True pour intégrer la NMS dans les formats pris en charge.

  • Lors d'une exportation avec quantize=16 (FP16) ou quantize=8 (INT8), la plupart des tenseurs sont convertis en précision réduite afin de diminuer la taille du modèle et d'améliorer ses performances. Toutefois, lorsque nms=False est activé, le post-traitement (y compris les indices de classe) est intégré directement au graphe exporté.

    Le tenseur output0 contient les indices de classe, qui sont représentés en interne sous forme de nombres à virgule flottante. En raison de la précision limitée de sa mantisse, FP16 ne peut pas représenter de manière fiable les valeurs entières supérieures à 2048. Pour éviter une éventuelle perte de précision ou des ID de classe incorrects, output0 est volontairement conservé en FP32.

    Si tu as besoin de sorties entièrement en FP16, exporte avec nms=None sur un GPU et effectue le post-traitement à l'extérieur. Les exportations ONNX FP16 sur CPU conservent dans tous les cas des entrées et des sorties FP32 ; seule la représentation interne du graphe est convertie.

Commentaires