Exporter des modèles YOLO vers LiteRT pour un déploiement sur les appareils edge et le Web#
LiteRT (abréviation de Lite Runtime) est le runtime haute performance de Google pour l’IA embarquée. C’est la nouvelle génération de TensorFlow Lite (TFLite), dont il constitue le nouveau nom, et il utilise le même format de modèle .tflite. Avec LiteRT, un seul modèle Ultralytics YOLO exporté peut être déployé sur les appareils mobiles, embarqués et edge, ainsi que dans le navigateur : il couvre tous les cas d’utilisation pris en charge séparément par les anciens formats d’export tflite et tfjs, désormais réunis sous une même solution.
À regarder : Comment exporter Ultralytics YOLO26 vers Google LiteRT | Déployer l’IA de vision sur Android et iOS | IA mobile 📱🚀
Le format d’export LiteRT optimise tes modèles pour des tâches comme la détection d’objets, la segmentation, l’estimation de pose et la classification, afin qu’ils s’exécutent rapidement et hors ligne sur une large gamme d’appareils.
Le plugin Ultralytics YOLO officiel pour Flutter exécute directement sur Android les exports LiteRT .tflite — inférence en temps réel avec la caméra, prédiction sur une seule image, accélération GPU et téléchargement automatique du modèle pour les sept tâches YOLO26, dont Depth. Pour les appareils Apple, utilise l’export CoreML ; pour les NPU Qualcomm Snapdragon, consulte l’intégration Qualcomm QNN.
Exporte les modèles de classification au format imgsz=224. Exporte les modèles de détection, de segmentation, de segmentation sémantique, de profondeur, de pose et OBB au format imgsz=640. Cette norme 224/640 est commune aux ressources mobiles officielles LiteRT, CoreML et QNN.
Le package NPM officiel Ultralytics YOLO exécute directement dans le navigateur, via LiteRT.js, les exports LiteRT .tflite — sans serveur ni Python. Il offre l’inférence en temps réel par webcam, la prédiction sur une seule image et l’accélération WebGPU (avec basculement automatique vers CPU/WASM) pour six tâches YOLO26 (détection, segmentation, segmentation sémantique, classification, pose, OBB). Avec WebGPU, il est souvent environ 2 fois plus rapide qu’ONNX Runtime Web.
npm i @ultralytics/yolo @litertjs/corePourquoi exporter vers LiteRT ?#
LiteRT est un framework open source conçu pour l’inférence sur appareil, également appelée informatique en périphérie. Il fournit aux développeurs les outils nécessaires pour exécuter des modèles entraînés sur des appareils mobiles, embarqués et IoT, des ordinateurs traditionnels et — grâce à LiteRT.js — directement dans les navigateurs Web et Node.js.
Un seul format de modèle, toutes les plateformes cibles :
- Mobile et embarqué : Android, iOS, Linux embarqué et microcontrôleurs (MCU).
- Accélérateurs edge : compatible avec le Coral Edge TPU pour accélérer davantage le traitement.
- Navigateur et Node.js : LiteRT.js exécute le même modèle
.tflitesur le Web avec l’accélération WebGPU/WASM, ce qui évite d’avoir à effectuer un export TensorFlow.js distinct.
Fonctionnalités clés des modèles LiteRT#
- Optimisation sur l’appareil : réduit la latence en traitant les données localement, renforce la confidentialité en évitant de transmettre des données personnelles et réduit la taille du modèle pour économiser de l’espace.
- Prise en charge de plusieurs plateformes : fonctionne sur Android, iOS, Linux embarqué, les microcontrôleurs et les navigateurs web modernes.
- Accélération matérielle : exploite XNNPACK sur CPU et l’accélération GPU via OpenCL, Metal et WebGPU. Le délégué GPU s’exécute en FP16 par défaut pour gagner encore en vitesse.
- Quantification : prend en charge FP32, INT8 statique (
quantize=8, poids int8 + activations int8), INT16 statique pour les activations (quantize="w8a16", poids int8 + activations int16 pour une meilleure précision) et INT8 dynamique (quantize="w8a32", poids int8 + activations FP32, sans données d’étalonnage requises) afin de compresser les modèles et d’accélérer l’inférence avec une perte minime de précision. - Prise en charge de divers langages : compatible avec Java/Kotlin, Swift, Objective-C, C++, Python et JavaScript.
Performances mesurées#
Matériel : Xiaomi 17 avec 12 Go de mémoire LPDDR5X et Android 16 / API 36. Son Snapdragon 8 Elite Gen 5 gravé en 3 nm (SM8850) intègre un CPU Qualcomm Oryon à 8 cœurs (2 cœurs Prime jusqu’à 4,6 GHz et 6 cœurs Performance jusqu’à 3,62 GHz), un GPU Adreno et un NPU Hexagon.
| Modèle | Tâche | taille (pixels) | CPU w8a32 LiteRT (ms) | GPU w8a32 LiteRT (ms) |
|---|---|---|---|---|
| YOLO26n | Détection | 640 | 52.2 1.8 / 48.1 / 2.4 | 15.8 2.3 / 8.9 / 4.6 |
| YOLO26n-seg | Segmentation | 640 | 73.4 1.8 / 65.6 / 6.0 | 33.2 1.8 / 23.8 / 7.6 |
| YOLO26n-sem | Sémantique | 640 | 61.2 1.8 / 51.1 / 8.3 | 34.2 1.8 / 24.0 / 8.3 |
| YOLO26n-depth | Profondeur | 640 | 124.4 1.9 / 115.1 / 7.4 | 23.0 1.8 / 13.5 / 7.7 |
| YOLO26n-cls | Classification | 224 | 4.4 0.4 / 4.0 / 0.0 | 3.1 0.8 / 2.1 / 0.2 |
| YOLO26n-pose | Pose | 640 | 57.4 1.8 / 53.8 / 1.8 | 16.6 2.7 / 10.1 / 3.9 |
| YOLO26n-obb | OBB | 640 | 50.3 1.8 / 47.2 / 1.4 | 11.7 1.8 / 7.8 / 2.0 |
- Les valeurs de vitesse correspondent aux latences en rafale pour une seule image — la moyenne de 15 exécutions après 3 exécutions de préchauffage sur
bus.jpg, mesurée avec le plugin Flutter d’Ultralytics0.6.10et les ressources normaliséesv0.6.6. L’ordre CPU/GPU alternait entre les tâches lors d’un balayage séquentiel unique. Les journaux natifs ont confirmé que chaque ligne CPU utilisait LiteRT CPU/XNNPACK et que chaque ligne GPU déléguait l’intégralité du graphe à LiteRT OpenCL (LITERT_CL). - L’exportation LiteRT trace directement le modèle PyTorch et produit un
.tfliteNCHW avec une entrée flottante — le délégué GPU compile l’intégralité du graphe (ici, les sept tâches s’exécutent sur le GPU Adreno) etw8a32ne nécessite aucune donnée d’étalonnage. Les utilisateurs doivent consulter les formes des tenseurs et les noms des signatures plutôt que de supposer la disposition NHWC historique d’onnx2tf ou les noms de sortieIdentity; ils doivent préparer les données RGB directement au format planaire CHW ou les transposer avant l’inférence. Les exportations sémantiques renvoient des logits NCHW et nécessitent un argmax de classe côté hôte. Les ressources Android officielles sont hébergées dans la versionv0.6.6de yolo-flutter-app, et le document sur les performances Flutter contient le rapport détaillé du benchmark. - Les résultats correspondants du NPU Hexagon Snapdragon et du CPU/GPU LiteRT sont disponibles dans l’intégration Qualcomm QNN.
- Compare les résultats du CPU et de l’accélérateur Apple dans l’intégration CoreML.
Les tests sur les appareils suivants utilisent les mêmes ressources normalisées v0.6.6.
Google Pixel 10#
Matériel : Google Pixel 10 avec 12 Go de mémoire et Android 16 / API 36. Son Google Tensor G5 gravé en 3 nm intègre un CPU à 8 cœurs (1 cœur Prime jusqu’à 3,78 GHz, 5 cœurs Performance jusqu’à 3,05 GHz et 2 cœurs Efficiency jusqu’à 2,25 GHz), un GPU PowerVR D-Series et un TPU Google. Les fréquences des cœurs et le nom du pilote GPU ont été relevés sur l’appareil de benchmark, car Google ne les publie pas dans les spécifications indiquées.
| Modèle | Tâche | taille (pixels) | CPU w8a32 LiteRT (ms) | GPU w8a32 LiteRT (ms) |
|---|---|---|---|---|
| YOLO26n | Détection | 640 | 53.3 1.5 / 50.2 / 1.6 | 45.5 3.8 / 37.7 / 4.0 |
| YOLO26n-seg | Segmentation | 640 | 87.7 1.8 / 78.5 / 7.5 | 50.9 3.0 / 36.9 / 10.9 |
| YOLO26n-sem | Sémantique | 640 | 68.6 1.5 / 59.0 / 8.0 | 71.6 1.5 / 59.5 / 10.6 |
| YOLO26n-depth | Profondeur | 640 | 120.3 1.5 / 112.5 / 6.3 | 52.5 2.0 / 37.5 / 13.0 |
| YOLO26n-cls | Classification | 224 | 4.0 0.3 / 3.4 / 0.2 | 17.6 0.9 / 16.7 / 0.1 |
| YOLO26n-pose | Pose | 640 | 59.7 1.5 / 57.0 / 1.2 | 46.6 3.8 / 39.2 / 3.5 |
| YOLO26n-obb | OBB | 640 | 52.0 1.5 / 48.9 / 1.7 | 45.5 4.0 / 38.5 / 2.9 |
Benchmark : moyenne de 15 appels predict() après 3 exécutions de préchauffage sur bus.jpg, avec ultralytics_yolo 0.6.10 et les ressources officielles v0.6.6. L’ordre CPU/GPU alterne entre les tâches lors d’un balayage séquentiel unique. Les journaux natifs ont confirmé que chaque ligne CPU utilisait LiteRT CPU/XNNPACK et que chaque ligne GPU déléguait l’intégralité du graphe à LiteRT OpenCL (LITERT_CL).
Samsung Galaxy S26#
Matériel : Samsung Galaxy S26 (SM-S942B) avec 12 Go de mémoire et Android 16 / API 36. Son Exynos 2600 gravé en 2 nm intègre un CPU Armv9.3 à 10 cœurs (1 cœur C1-Ultra jusqu’à 3,8 GHz, 3 cœurs C1-Pro performants jusqu’à 3,26 GHz et 6 cœurs C1-Pro économes jusqu’à 2,76 GHz), un GPU Xclipse 960 et un NPU Samsung.
| Modèle | Tâche | taille (pixels) | CPU w8a32 LiteRT (ms) | GPU w8a32 LiteRT (ms) |
|---|---|---|---|---|
| YOLO26n | Détection | 640 | 36.7 1.3 / 33.8 / 1.7 | 16.4 1.4 / 12.3 / 2.6 |
| YOLO26n-seg | Segmentation | 640 | 54.6 1.2 / 48.0 / 5.3 | 32.8 1.3 / 24.5 / 7.0 |
| YOLO26n-sem | Sémantique | 640 | 47.8 1.2 / 38.4 / 8.1 | 34.2 1.3 / 24.9 / 8.0 |
| YOLO26n-depth | Profondeur | 640 | 92.9 1.2 / 84.8 / 6.9 | 33.5 1.3 / 22.4 / 9.8 |
| YOLO26n-cls | Classification | 224 | 2.7 0.2 / 2.3 / 0.2 | 2.6 0.2 / 2.4 / 0.0 |
| YOLO26n-pose | Pose | 640 | 42.8 1.3 / 40.5 / 1.0 | 18.4 1.4 / 14.1 / 2.9 |
| YOLO26n-obb | OBB | 640 | 37.5 1.3 / 35.1 / 1.2 | 18.8 2.5 / 14.6 / 1.8 |
Benchmark : moyenne de 15 appels predict() après 3 exécutions de préchauffage sur bus.jpg, avec ultralytics_yolo 0.6.10 et les ressources officielles v0.6.6. L’ordre CPU/GPU alterne entre les tâches lors d’un balayage séquentiel unique. Les journaux natifs ont confirmé que chaque ligne CPU utilisait LiteRT CPU/XNNPACK et que chaque ligne GPU déléguait l’intégralité du graphe à LiteRT OpenCL (LITERT_CL).
Xiaomi 17T Pro#
Matériel : Xiaomi 17T Pro (2602EPTC0G) avec 12 Go de mémoire LPDDR5X et Android 16 / API 36. Son MediaTek Dimensity 9500 gravé en 3 nm (MT6993) intègre un CPU Armv9.3 à 8 cœurs (1 cœur C1-Ultra jusqu’à 4,21 GHz, 3 cœurs C1-Premium jusqu’à 3,5 GHz et 4 cœurs C1-Pro jusqu’à 2,7 GHz), un GPU Mali-G1 Ultra MC12 et un NPU MediaTek 990.
| Modèle | Tâche | taille (pixels) | CPU w8a32 LiteRT (ms) | GPU w8a32 LiteRT (ms) |
|---|---|---|---|---|
| YOLO26n | Détection | 640 | 45.4 1.3 / 42.1 / 2.0 | 26.6 1.9 / 22.0 / 2.7 |
| YOLO26n-seg | Segmentation | 640 | 126.2 2.6 / 113.9 / 9.7 | 46.7 2.6 / 33.3 / 10.8 |
| YOLO26n-sem | Sémantique | 640 | 117.9 2.6 / 98.8 / 16.5 | 74.3 2.6 / 54.7 / 17.0 |
| YOLO26n-depth | Profondeur | 640 | 182.4 2.5 / 167.6 / 12.3 | 47.8 2.5 / 32.3 / 12.9 |
| YOLO26n-cls | Classification | 224 | 6.2 0.4 / 5.3 / 0.4 | 7.4 0.4 / 6.9 / 0.1 |
| YOLO26n-pose | Pose | 640 | 97.6 2.5 / 93.3 / 1.8 | 28.6 2.5 / 23.3 / 2.8 |
| YOLO26n-obb | OBB | 640 | 91.5 2.6 / 85.8 / 3.2 | 27.5 2.7 / 21.8 / 2.9 |
Benchmark : moyenne de 15 appels predict() après 3 exécutions de préchauffage sur bus.jpg, avec ultralytics_yolo 0.6.10 et les ressources officielles v0.6.6. L’ordre CPU/GPU alterne entre les tâches lors d’un balayage séquentiel unique. Les journaux natifs ont confirmé que chaque ligne CPU utilisait LiteRT CPU/XNNPACK et que chaque ligne GPU déléguait l’intégralité du graphe à LiteRT OpenCL (LITERT_CL).
Tâches prises en charge#
L’exportation LiteRT prend en charge les sept tâches Ultralytics. La segmentation sémantique et l’estimation de profondeur sont disponibles uniquement avec YOLO26, la seule famille qui propose ces têtes.
| Tâche | YOLOv8 | YOLO11 | YOLO26 |
|---|---|---|---|
| Détecter | ✅ | ✅ | ✅ |
| Segmenter | ✅ | ✅ | ✅ |
| Sémantique | ❌ | ❌ | ✅ |
| Profondeur | ❌ | ❌ | ✅ |
| Classifier | ✅ | ✅ | ✅ |
| Pose | ✅ | ✅ | ✅ |
| OBB | ✅ | ✅ | ✅ |
Exporter vers LiteRT : convertir ton modèle YOLO#
Tu peux améliorer l’efficacité de l’exécution sur l’appareil et élargir les options de déploiement en convertissant tes modèles au format LiteRT.
Installation#
Pour installer le package requis, exécute :
# Install the required package for YOLO
pip install ultralyticsPour obtenir des instructions détaillées et connaître les bonnes pratiques, consulte notre guide d’installation d’Ultralytics. Si tu rencontres des difficultés, consulte notre guide des problèmes courants.
L’exportation LiteRT est actuellement prise en charge sur Linux x86_64 et macOS. Le modèle .tflite exporté fonctionne lui-même sur toutes les plateformes prises en charge par LiteRT (mobile, embarquées, périphériques et navigateur).
Utilisation#
Tous les modèles Ultralytics YOLO prennent en charge l’exportation dès le départ. Le format LiteRT prend en charge les modes Exporter, Prédire et Valider, ce qui te permet d’exporter un modèle, puis de le charger pour lancer l’inférence ou valider localement sa précision.
from ultralytics import YOLO
# Charger un modèle YOLO26
model = YOLO("yolo26n.pt")
# Exporter le modèle au format LiteRT
model.export(format="litert", imgsz=640) # crée 'yolo26n.tflite' ; utilise imgsz=224 pour la classificationfrom ultralytics import YOLO
model = YOLO("yolo26n.pt")
# INT8 dynamique : poids int8, activations FP32 - aucune donnée d’étalonnage requise
model.export(format="litert", quantize="w8a32", imgsz=640) # crée 'yolo26n_w8a32.tflite'
# INT8 statique : poids int8 + activations int8 - nécessite des données d’étalonnage
model.export(format="litert", quantize=8, data="coco8.yaml", imgsz=640) # crée 'yolo26n_int8.tflite'
# w8a16 statique : poids int8 + activations int16 (précision supérieure) - nécessite des données d’étalonnage
model.export(format="litert", quantize="w8a16", data="coco8.yaml", imgsz=640) # crée 'yolo26n_w8a16.tflite'from ultralytics import YOLO
# Charger le modèle LiteRT exporté
model = YOLO("yolo26n.tflite")
# Exécuter l’inférence
results = model("https://ultralytics.com/images/bus.jpg")from ultralytics import YOLO
# Charger le modèle LiteRT exporté
model = YOLO("yolo26n.tflite")
# Valider la précision sur le jeu de données COCO8
metrics = model.val(data="coco8.yaml")Arguments d’exportation#
| Argument | Type | Valeur par défaut | Description |
|---|---|---|---|
format | str | 'litert' | Format cible du modèle exporté, qui définit sa compatibilité avec différents environnements de déploiement. |
imgsz | int ou tuple | 640 | Taille d’image souhaitée pour l’entrée du modèle. Peut être un entier pour les images carrées ou un tuple (height, width) pour définir des dimensions spécifiques. |
quantize | int ou str | None | Précision de quantification : 8 (INT8 statique, poids int8 + activations int8 ; nécessite les données d’étalonnage data/fraction), 'w8a16' (statique, poids int8 + activations int16 ; nécessite les données d’étalonnage data/fraction), 'w8a32' (INT8 dynamique, poids int8 + activations FP32 ; aucun étalonnage requis) ou 32/non défini (FP32). FP16 n’est pas exporté séparément (voir la remarque ci-dessous). Remplace les indicateurs half/int8 obsolètes. |
batch | int | 1 | Indique la taille de 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. |
data | str | None | Fichier YAML du jeu de données utilisé pour l’étalonnage INT8 ; pour la classification, utilise plutôt un répertoire de jeu de données ou un nom de jeu de données intégré. S’il n’est pas indiqué avec quantize=8 ou 'w8a16', Ultralytics sélectionne le jeu de données d’étalonnage par défaut pour la tâche du modèle. |
fraction | float, int ou list | 1.0 | Sous-ensemble de calibration exprimé en ratio, en nombre d’images ou en listes [train, val, test] de ratios/de nombres. Les listes de deux éléments laissent test complet, tandis que 0 l’ignore. |
device | str | None | Indique l’appareil utilisé pour l’exportation. L’exportation LiteRT s’exécute sur CPU (device=cpu). |
Contrairement à l’exportation historique tflite, LiteRT ne nécessite pas d’exportation FP16 distincte. Un modèle .tflite FP32 s’exécute en demi-précision à l’exécution lorsqu’un délégué GPU est utilisé (WebGPU, OpenCL, Metal) — c’est l’approche officielle de LiteRT pour l’inférence FP16.
Pour en savoir plus sur le processus d’export, consulte la page de la documentation Ultralytics consacrée à l’export.
Déployer des modèles YOLO LiteRT exportés#
Après avoir exporté ton modèle Ultralytics YOLO vers LiteRT, tu peux le déployer sur différentes plateformes. La méthode la plus rapide pour le vérifier localement est celle de YOLO("yolo26n.tflite") présentée ci-dessus. Pour le déployer dans d’autres environnements, consulte les ressources suivantes :
Mobile et systèmes embarqués#
- Android : guide de démarrage rapide pour intégrer LiteRT dans des applications Android.
- iOS : guide pour intégrer et déployer des modèles LiteRT dans des applications iOS.
- Linux embarqué et Raspberry Pi : exécute des modèles LiteRT sur des ordinateurs monocartes, avec une accélération facultative par un Coral Edge TPU.
- Microcontrôleurs : déploie sur des MCU disposant de seulement quelques kilo-octets de mémoire — le runtime principal occupe environ 16 Ko sur un Arm Cortex-M3.
Navigateur et Node.js (LiteRT.js)#
- Présentation de LiteRT.js : exécute le même modèle
.tflitedirectement dans le navigateur avec l'accélération WebGPU/WASM, sans calcul côté serveur et en conservant les données sur l'appareil de l'utilisateur. - Exemples de bout en bout : exemples pratiques et tutoriels pour implémenter LiteRT sur mobile, en périphérie et sur le Web.
Résumé#
Dans ce guide, nous avons vu comment exporter des modèles Ultralytics YOLO au format LiteRT. En regroupant le déploiement mobile/en périphérie (anciennement TFLite) et le déploiement dans le navigateur (anciennement TF.js) dans un seul modèle .tflite, LiteRT rend tes modèles YOLO plus rapides, plus compacts et portables sur pratiquement toutes les cibles exécutant les modèles sur l'appareil.
Pour en savoir plus, consulte la documentation officielle de LiteRT.
Par ailleurs, si tu souhaites découvrir d'autres intégrations Ultralytics YOLO, consulte notre page des guides d'intégration, qui regorge de ressources utiles.
FAQ#
Utilise la bibliothèque Ultralytics pour exporter un modèle YOLO au format LiteRT (
.tflite). Commence par installer le package :pip install ultralyticsExporte ensuite ton modèle :
from ultralytics import YOLO # Charger un modèle YOLO26 model = YOLO("yolo26n.pt") # Exporter le modèle au format LiteRT model.export(format="litert", imgsz=640) # utiliser imgsz=224 pour la classificationPour les utilisateurs de la CLI :
yolo export model=yolo26n.pt format=litert imgsz=640 # use imgsz=224 for classificationPour plus de détails, consulte le guide d'exportation Ultralytics.
LiteRT est le nouveau nom de TensorFlow Lite : le même format de modèle
.tflite, la même lignée de runtime, renommée par Google. Dans Ultralytics, le format d'exportation uniquelitertcouvre désormais les deux cas d'utilisation qui nécessitaient auparavant deux formats distincts :- L'ancien format
tflite→ déploiement sur mobile, en systèmes embarqués et en périphérie. - L'ancien format
tfjs→ déploiement dans les navigateurs et avec Node.js, désormais pris en charge par LiteRT.js, qui exécute le même fichier.tflite.
Si tu possèdes déjà un fichier
.tflite, tu peux le charger directement avecYOLO("model.tflite"); il s'exécutera via le backend LiteRT.- L'ancien format
Oui. Exporte ton modèle au format LiteRT, puis exécute-le sur un Raspberry Pi pour accélérer l'inférence. Pour optimiser davantage, envisage un Coral Edge TPU. Pour connaître la procédure détaillée, consulte notre guide de déploiement sur Raspberry Pi.
Oui. LiteRT.js exécute le même modèle exporté
.tflitedirectement dans un navigateur Web ou une application Node.js, avec l'accélération WebGPU/WASM. Cette solution remplace l'ancien workflow TensorFlow.js : il n'y a pas d'exportation distincte pour le navigateur ; il suffit de déployer ton modèle LiteRT avec le runtime LiteRT.js.Oui, à l'exécution. Un modèle LiteRT FP32 s'exécute automatiquement en FP16 lorsqu'il est lancé sur un délégué GPU (WebGPU, OpenCL ou Metal), conformément à l'approche officielle de LiteRT. Tu n'as donc pas besoin d'une exportation FP16 dédiée ; pour réduire davantage la taille, utilise la quantification INT8 avec
quantize=8.Si tu rencontres des erreurs lors de l'exportation de modèles YOLO vers LiteRT, voici quelques solutions courantes :
- Vérifie la plateforme : l'exportation LiteRT est prise en charge sous Linux x86_64 et macOS. Vérifie que ton environnement correspond.
- Vérifie la compatibilité des packages : assure-toi d'utiliser une version compatible d'Ultralytics. Consulte notre guide d'installation.
- Problèmes de quantification : si tu utilises la quantification INT8, vérifie que le chemin d'accès à ton jeu de données est correctement indiqué dans le paramètre
data.
Pour obtenir d'autres conseils de dépannage, consulte notre guide des problèmes courants.