YOLO Vision 2026 :

YOLOE : détection et segmentation en temps réel de vocabulaire ouvert#

Ultralytics YOLOE (Real-Time Seeing Anything) est un modèle de détection et de segmentation d'instances à vocabulaire ouvert : au lieu d'une liste de classes fixe au moment de l'entraînement, il prend les catégories que tu veux au moment de l'inférence, sous forme de prompt textuel, d'exemple visuel ou d'un vocabulaire intégré de 4 585 noms. Basé sur les architectures Ultralytics YOLO — YOLOv8, YOLO11 et YOLO26 — et inspiré par YOLO-World, YOLOE atteint une précision zero-shot de pointe proche de la vitesse d'un YOLO à ensemble fermé.



Watch: How to use Ultralytics YOLOE-26 (New) | Open Vocabulary & Real-Time Seeing Anything 🚀

Démarrage rapide#

Nomme les classes que tu veux et lance l'exécution. YOLOE-26 renvoie des boîtes et des masques de segmentation d'instances pour des catégories sur lesquelles il n'a jamais été entraîné.

Détecte tout ce que tu peux nommer
from ultralytics import YOLOE

model = YOLOE("yoloe-26s-seg.pt")

# "double-decker bus" is not a COCO class; YOLOE resolves it from the words alone
model.set_classes(["double-decker bus", "person"])

results = model.predict("https://ultralytics.com/images/bus.jpg")
results[0].show()

Le premier appel à set_classes() télécharge un encodeur de texte ; consulte la section Installation et Prérequis avant de déployer sur une machine sans accès réseau.

Choisir un mode de prompt#

YOLOE prend en charge trois modes de prompt, et ton choix détermine quel point de contrôle (checkpoint) tu charges et à quoi ressemblent tes étiquettes de classe. Choisis la ligne qui correspond à ce que tu peux fournir au moment de l'inférence.

YOLOE détectant et segmentant des objets à partir de prompts textuels, de prompts visuels et de son vocabulaire sans prompt

ModePoint de contrôle (Checkpoint)Ce que tu fournisNoms de classe dans les résultatsÀ utiliser lorsque
Prompt textuel*-seg.ptNoms de classe sous forme de chaînes de caractèresExactement les noms que tu as passésTu peux décrire la cible avec des mots — le choix habituel
Prompt visuel*-seg.ptBoîtes d'exemple sur une image de référenceGénérique object0, object1, …Tu ne peux pas exprimer la cible avec des mots : une pièce spécifique, un logo ou un défaut
Sans prompt*-seg-pf.ptRienNoms issus du vocabulaire intégré de 4 585 nomsTu fais du catalogage ou de l'exploration et tu ne sais pas quoi chercher à l'avance
Deux surprises courantes
  • Les prompts visuels ne transportent pas tes étiquettes. Les identifiants de classe dans visual_prompts regroupent les exemples entre eux ; le modèle les rapporte sous les noms object0, object1, et ainsi de suite. Mappe-les toi-même vers tes propres noms.
  • Les points de contrôle sans prompt rejettent set_classes(). Appeler cette fonction sur un modèle *-seg-pf.pt génère AssertionError: Prompt-free model does not support setting classes. Please try with Text/Visual prompt models.. Charge plutôt un point de contrôle *-seg.pt lorsque tu as besoin de tes propres classes.

Installation et prérequis#

YOLOE est fourni dans le package principal d'Ultralytics :

pip install -U ultralytics

Le prompt textuel nécessite un encodeur de texte en plus, et celui-ci est récupéré lors de la première utilisation plutôt qu'au moment de l'installation :

  • Le premier appel à set_classes() installe ultralytics/CLIP depuis GitHub avec pip (qui fournit le tokeniseur) et télécharge un encodeur de texte TorchScript dans le répertoire de travail actuel. YOLOE-26 récupère mobileclip2_b.ts, soit environ 254 Mo ; YOLOE-11 et YOLOE-v8 récupèrent mobileclip_blt.ts. Exécute le téléchargement une seule fois depuis le répertoire à partir duquel tu lanceras tes scripts, ou copie le fichier dedans, sinon il sera téléchargé à nouveau.
  • Les deux étapes nécessitent un accès réseau, alors effectue une prédiction avec prompt avant de déployer sur une machine hors ligne ou isolée (air-gapped).
  • Les prompts visuels et les points de contrôle sans prompt ne nécessitent aucun encodeur de texte.

Les points de contrôle YOLOE-26 nécessitent ultralytics 8.4.0 ou une version plus récente ; les familles YOLOE-11 et YOLOE-v8 sont disponibles dans les versions antérieures. Une prédiction avec prompt textuel permet de tester l'ensemble du parcours — téléchargement du point de contrôle, installation de CLIP, encodeur de texte, inférence :

yolo predict model=yoloe-26s-seg.pt source="https://ultralytics.com/images/bus.jpg" classes="person"

Pour ignorer complètement le téléchargement de l'encodeur de texte au moment de l'inférence, intègre les prompts dans les poids une bonne fois pour toutes et réutilise-les — voir Réutiliser les embeddings de prompt.

Vue d'ensemble de l'architecture#

YOLOE Architecture

YOLOE conserve la structure YOLO standard — une backbone (colonne vertébrale) convolutionnelle pour l'extraction de caractéristiques, un neck pour la fusion multi-échelle, et une tête découplée sans ancrage prédisant les classes et les boîtes — et ajoute trois modules, un par mode de prompt :

  • Re-parameterizable Region-Text Alignment (RepRTA) affine les embeddings de texte provenant de CLIP via un petit réseau auxiliaire. Ce réseau s'exécute une fois par appel à set_classes() et est éliminé lors de l'exportation, ce qui ne coûte rien par image. Ce qui s'exécute à chaque passe avant (forward pass), c'est la comparaison des embeddings de prompt stockés avec les caractéristiques de région ; consulte la section Limitations pour connaître le coût avec un grand ensemble de prompts.
  • Semantic-Activated Visual Prompt Encoder (SAVPE) encode les caractéristiques sémantiques et d'activation à partir d'une boîte d'exemple, conditionnant le modèle sur des objets qui lui ressemblent. C'est le parcours à un seul exemple (one-shot) pour les cibles difficiles à nommer, telles qu'un logo ou une pièce spécifique.
  • Lazy Region-Prompt Contrast (LRPC) met en correspondance les embeddings de région avec un vocabulaire intégré de 4 585 noms, de sorte que les points de contrôle sans prompt reconnaissent les objets sans prompt externe ni encodeur de texte.

La segmentation d'instances provient d'une branche de masques sur la tête de détection, comme dans YOLOv8-Seg, et chaque prédiction transporte un masque sur results[0].masks. Une fois le modèle exporté, les modules pour le monde ouvert sont reparamétrés en une tête YOLO standard, de sorte que le fichier exporté exécute le parcours de détection/segmentation ordinaire.

Modèles disponibles#

Chaque point de contrôle ci-dessous est un modèle de segmentation d'instances et prend en charge val, predict, export et track. Charge un fichier *-seg.pt pour le prompting textuel ou visuel et un fichier *-seg-pf.pt pour l'inférence sans prompt ; ils ne sont pas interchangeables, voir Choisir un mode de prompt. Seuls les fichiers *-seg.pt prennent en charge l'entraînement (train) ; un point de contrôle sans prompt est produit à partir d'un modèle entraîné par prompt textuel, voir Entraîner les modèles officiels à partir de zéro.

Performances de YOLOE sur LVIS#

Résultats zero-shot sur le jeu minival de LVIS à 640 pixels, issus du papier de recherche d'Ultralytics YOLO26.

Prompts textuels et visuels#

Chaque cellule de précision et de paramètres se lit comme suit : prompt textuel / prompt visuel ; les FLOPs sont donnés une seule fois. Les paramètres et les FLOPs correspondent à la configuration de détection évaluée par le papier de recherche. La précision est le chiffre Non-E2E du papier, le seul protocole rapporté pour chaque modèle de la comparaison ; la tête de bout en bout (end-to-end) de YOLOE-26 la devance d'au maximum 1,1 AP sous les prompts textuels et de 2,6 AP sous les prompts visuels.

ModèlemAP50-95mAPrmAPcmAPfparams
(M)
FLOPs
(B)
YOLOE-26n24.7 / 21.920.5 / 17.624.1 / 22.326.1 / 22.43.9 / 3.16.1
YOLOE-26s30.8 / 28.623.9 / 25.129.6 / 27.833.0 / 29.910.7 / 11.021.9
YOLOE-26m35.4 / 33.931.1 / 33.434.7 / 34.036.9 / 33.821.3 / 25.170.6
YOLOE-26l37.8 / 36.335.1 / 37.637.6 / 36.238.5 / 36.125.5 / 29.389.0
YOLOE-26x40.6 / 38.537.4 / 35.340.9 / 38.841.0 / 38.855.2 / 65.2197.7
YOLOE-11s27.5 / 26.321.4 / 22.526.8 / 27.129.3 / 26.410.7 / 10.922.7
YOLOE-11m33.0 / 31.426.9 / 27.132.5 / 31.934.5 / 31.721.0 / 24.870.4
YOLOE-11l35.2 / 33.729.1 / 28.135.0 / 34.636.5 / 33.826.0 / 29.889.5
YOLOE-v8s27.9 / 26.222.3 / 21.327.8 / 27.729.0 / 25.712.3 / 12.629.8
YOLOE-v8m32.6 / 31.026.9 / 27.031.9 / 31.734.4 / 31.126.4 / 28.480.7
YOLOE-v8l35.9 / 34.233.2 / 33.234.8 / 34.637.3 / 34.143.5 / 47.3167.6

Sans prompt#

Les points de contrôle sans prompt répondent à partir de leur vocabulaire intégré sans qu'aucun prompt ne soit fourni. Chaque cellule de précision se lit bout en bout / Non-E2E, les deux protocoles selon lesquels le papier évalue YOLOE-26 ; la page YOLO26 cite la colonne Non-E2E.

ModèlemAP50-95mAPrmAPcmAPfparams
(M)
FLOPs
(B)
YOLOE-26n-pf16.6 / 17.715.7 / 15.815.3 / 16.417.9 / 19.22.35.3
YOLOE-26s-pf21.4 / 22.616.2 / 20.220.1 / 20.923.5 / 24.59.020.8
YOLOE-26m-pf25.7 / 26.426.7 / 24.524.0 / 25.026.9 / 27.919.468.4
YOLOE-26l-pf27.2 / 28.026.3 / 25.725.7 / 26.828.7 / 29.523.686.8
YOLOE-26x-pf29.9 / 31.127.5 / 28.929.1 / 30.731.1 / 31.753.1194.4

Sous les prompts textuels et visuels, les modèles YOLOE-26 surpassent leurs équivalents YOLOE-11 et YOLOE-v8 à chaque échelle correspondante sur le mAP50-95, tout en restant sous la ligne des v8 en termes de paramètres et de FLOPs. Sur la même division, le papier rapporte YOLO-Worldv2 à 24,4 (S), 32,4 (M) et 35,5 (L), et les détecteurs basés sur les Transformers GLIP-T à 26,0, GDINO-T à 27,4 et DetCLIP-T à 34,4, chacun embarquant de 155 à 232 millions de paramètres. Le papier original de YOLOE ajoute deux résultats pour les modèles à l'échelle v8 qu'il a introduits. Sur LVIS, YOLOE-v8s bat YOLO-Worldv2-S de 3,5 AP pour un tiers du coût d'entraînement et 1,4× la vitesse d'inférence. Transféré vers COCO, YOLOE-v8l gagne 0,6 AP de boîte et 0,4 AP de masque par rapport au YOLOv8-L à ensemble fermé avec un temps d'entraînement près de 4× inférieur.

Chiffres du papier de recherche vs points de contrôle publiés

Le papier YOLO26 évalue une configuration de détection. Les poids publiés sont des points de contrôle de segmentation et comportent une branche de masques, SAVPE et la projection de texte par-dessus, de sorte qu'un modèle chargé yoloe-26l-seg.pt indique 35,4 M et 142,0 B plutôt que les 25,5 M et 89,0 B ci-dessus. Dans les deux cas, le chiffre des FLOPs exclut la similarité région-texte, de sorte que le coût réel augmente avec la taille de l'ensemble de prompts même si la colonne ne bouge pas ; voir Limitations.

Exemples d'utilisation#

Chaque exemple YOLOE ci-dessous s'exécute à partir de l'API Python. La prédiction par prompt textuel, la validation, l'exportation, le suivi et l'entraînement simple fonctionnent également depuis la CLI ; les recettes de fine-tuning et le prompting visuel passent une classe d'entraîneur ou de prédicteur en argument, ce que seule l'API Python accepte.

Utilisation pour l'entraînement#

Affine (fine-tune) n'importe quel point de contrôle publié *-seg.pt sur ton propre jeu de données YOLO. Cela suit principalement la procédure d'entraînement YOLO standard ; la différence réside dans l'entraîneur que tu passes. YOLOEPESegTrainer intègre tes noms de classe dans la tête et effectue le fine-tuning à partir de là, ce qui est exactement ce que tu veux pour tes propres étiquettes ; l'entraîneur par défaut ne s'entraîne pas sur tes noms de classe.



Watch: How to Train YOLOE on Car Parts Segmentation Dataset | Open-Vocabulary Model, Prediction & Export 🚀
Exemple
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer

model = YOLOE("yoloe-26s-seg.pt")

results = model.train(
    data="coco128-seg.yaml",
    epochs=80,
    patience=10,
    trainer=YOLOEPESegTrainer,  # <- Important: the fine-tuning trainer, not the default
)
Entraîner plutôt un modèle de détection

Chaque point de contrôle publié est un modèle de segmentation. Pour entraîner un détecteur, construis le modèle à partir du fichier YAML correspondant, charge les poids de segmentation de la même échelle, et remplace-les par l'entraîneur de détection. Tout le reste reste inchangé.

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPETrainer

model = YOLOE("yoloe-26s.yaml").load("yoloe-26s-seg.pt")

results = model.train(data="coco128.yaml", epochs=80, patience=10, trainer=YOLOEPETrainer)

Utilisation pour la prédiction#

L'appel de prompt textuel est celui présenté dans le Guide de démarrage rapide. Les deux autres modes ont chacun besoin d'un argument supplémentaire :

Exemple

Les prompts visuels montrent un exemple au modèle au lieu d'en décrire un. visual_prompts prend un tableau bboxes de boîtes d'exemple et un tableau cls d'identifiants de classe, à raison d'un par boîte. Les identifiants sont des regroupements temporaires, et non des étiquettes — ils doivent se suivre à partir de 0, et les résultats reviennent sous la forme object0, object1, … plutôt que sous les noms que tu as choisis.

Les boîtes d'exemple peuvent se trouver sur l'image sur laquelle tu fais la prédiction :

import numpy as np

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

model = YOLOE("yoloe-26l-seg.pt")

# One example box per target, each with its own class ID
visual_prompts = {
    "bboxes": np.array([[221.52, 405.8, 344.98, 857.54], [120, 425, 160, 445]]),  # person, glasses
    "cls": np.array([0, 1]),
}

results = model.predict(
    "ultralytics/assets/bus.jpg",
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)
results[0].show()

Ou sur une image de référence séparée passée en tant que refer_image, auquel cas bboxes et cls décrivent des objets dans cette référence, et non dans la cible :

import numpy as np

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

model = YOLOE("yoloe-26l-seg.pt")

visual_prompts = {"bboxes": np.array([[221.52, 405.8, 344.98, 857.54]]), "cls": np.array([0])}  # person

results = model.predict(
    "ultralytics/assets/zidane.jpg",  # Target image
    refer_image="ultralytics/assets/bus.jpg",  # Where the example boxes live
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)
results[0].show()

# refer_image also sets the classes permanently, so later calls need no prompts at all
results = model("ultralytics/assets/bus.jpg")
model.export(format="onnx")  # And the export keeps them
Remarque

Quand source est une vidéo ou un flux, la première trame devient automatiquement le refer_image, de sorte que les prompts que tu passes sont appliqués à cette trame et répercutés dans le reste de la vidéo. Passe explicitement refer_image pour choisir une autre trame.

À la fois source et refer_image acceptent directement des tenseurs torch, ce qui est utile lorsque les images proviennent déjà d'un pipeline existant. Fournis les boîtes dans les coordonnées en pixels du tenseur lui-même :

import numpy as np
import torch

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

model = YOLOE("yoloe-11l-seg.pt")

img_tensor = torch.rand(1, 3, 480, 480)  # (1, 3, H, W) float tensor in [0, 1]
visual_prompts = {"bboxes": np.array([[10, 10, 50, 50]]), "cls": np.array([0])}

results = model.predict(
    img_tensor,
    refer_image=img_tensor,
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
    imgsz=640,
)

Pour faire des prédictions sur plusieurs images à la fois, imbrique les prompts un niveau plus profondément : un tableau bboxes et un tableau cls par image source, dans le même ordre que les sources.

import numpy as np

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

model = YOLOE("yoloe-26l-seg.pt")

visual_prompts = {
    "bboxes": [
        np.array([[221.52, 405.8, 344.98, 857.54], [120, 425, 160, 445]]),  # bus.jpg: person, glasses
        np.array([[150, 200, 1150, 700]]),  # zidane.jpg: person
    ],
    "cls": [np.array([0, 1]), np.array([0])],
}

results = model.predict(
    ["ultralytics/assets/bus.jpg", "ultralytics/assets/zidane.jpg"],
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)
results[0].show()

Utilisation pour la validation#

La validation s'exécute comme pour n'importe quel autre modèle sur un jeu de données de segmentation :

Exemple
from ultralytics import YOLOE

model = YOLOE("yoloe-26l-seg.pt")  # or yoloe-26s/m-seg.pt for other sizes

metrics = model.val(data="coco128-seg.yaml")

Deux variantes du même appel couvrent les autres modes de prompt :

  • Prompts visuelsmodel.val(data="coco128-seg.yaml", load_vp=True) extrait un embedding visuel par catégorie directement à partir du jeu de données. Ajoute refer_data="coco.yaml" pour récupérer les embeddings d'un jeu de données différent, qui doit comporter exactement les mêmes catégories.
  • Sans prompt — charge un point de contrôle *-seg-pf.pt et passe single_cls=True.

Utilisation de l'exportation#

Les plongements de l'invite peuvent être enregistrés une seule fois et réutilisés lors de la production d'exportations statiques telles que ONNX, OpenVINO, TensorRT, CoreML, LiteRT et RKNN. Le profil NPZ est chargé par le modèle PyTorch d'origine avant l'exportation ; ce n'est pas une entrée d'exécution supplémentaire et le modèle exporté ne nécessite pas le fichier NPZ.

Les modèles exportés sont statiques

Les classes configurées avec set_classes() (ou via refer_image pour les prompts visuels) sont intégrées (baked) dans les poids exportés. Une fois exporté, le modèle ne peut plus accepter de nouveaux prompts : appeler set_classes() ou passer visual_prompts=... à predict() sur un modèle exporté chargé échouera. Pour modifier les classes détectées, réexporte à partir du point de contrôle d'origine .pt en configurant les nouveaux prompts. Le fichier exporté se comporte comme un modèle YOLO standard et peut également être chargé avec YOLO() au lieu de YOLOE().

Réutilise les plongements de l'invite
from ultralytics import YOLOE

model = YOLOE("yoloe-26n-seg.pt")
model.set_classes(["person", "bus"])
model.save_prompt_embeddings("person-bus.npz")

# The profile is bound to the source checkpoint and can be reused for later exports.
model = YOLOE("yoloe-26n-seg.pt")
model.load_prompt_embeddings("person-bus.npz")
model.export(format="onnx")

Le même profil d'invite peut également configurer un modèle de détection seule construit à partir de l'architecture YOLOE correspondante. Cela supprime la branche de masque tout en conservant les classes invitées :

from ultralytics import YOLOE

model = YOLOE("yoloe-26n.yaml").load("yoloe-26n-seg.pt")
model.load_prompt_embeddings("person-bus.npz")
model.export(format="rknn", name="rk3588", quantize=16)

Utilisation pour le suivi#

Les classes dotées de prompts se reportent directement dans le suivi (tracking), ce qui te permet de suivre des objets sur lesquels le traqueur n'a jamais été entraîné :

Exemple
from ultralytics import YOLOE

model = YOLOE("yoloe-26s-seg.pt")
model.set_classes(["forklift", "pallet"])

# persist=True keeps track IDs stable across frames
for result in model.track("path/to/video.mp4", stream=True, persist=True):
    print(result.boxes.id)

Comment se positionne YOLOE#

YOLOE se situe entre un détecteur à ensemble fermé et un modèle de vocabulaire ouvert lourd. Trois comparaisons permettent de décider s'il s'agit du bon choix :

  • Par rapport à un YOLO à ensemble fermé. Une fois les prompts configurés, YOLOE prédit via le parcours de détection/segmentation ordinaire et s'exporte comme n'importe quel autre modèle. Ce qu'il apporte, c'est la capacité de changer la liste des classes au moment de l'inférence au lieu de réentraîner ; ce que cela coûte, c'est une précision zero-shot nettement inférieure à celle d'un modèle entraîné sur tes propres classes.
  • Par rapport aux familles YOLOE précédentes. YOLOE-26 hérite de la tête de bout en bout sans NMS de YOLO26 et couvre cinq échelles (n/s/m/l/x) contre les trois précédentes (s/m/l), tout en prenant la tête à chaque échelle correspondante en termes de performances.
  • Par rapport aux détecteurs à vocabulaire ouvert basés sur les Transformers. GLIP et OWL-ViT exécutent un Transformer vision-langage lors de l'inférence. YOLOE encode les prompts une seule fois, puis les compare aux caractéristiques régionales au sein d'une tête convolutionnelle.

Les alternatives les plus proches prennent toutes un prompt textuel, mais seuls YOLOE et SAM 3 renvoient des masques, et les trois répondent à des questions différentes :

YOLOESAM 3YOLO-World
Conçu pourDétection et segmentation en temps réel de classes nomméesSegmentation de concepts et suivi guidable par promptDétection open-vocabulary en temps réel
MasquesOui, avec les points de contrôle *-seg.ptOuiNon, boîtes uniquement
Prompts visuelsOui (SAVPE)OuiNon
Mode sans promptOui, vocabulaire de 4 585 nomsNonNon
Choisis-le quandTu as besoin de débit et peux nommer les classesTu as besoin de la segmentation de concepts la plus performante et peux allouer la puissance de calculTu y es déjà — consulte la note de migration ci-dessous

Tu arrives de YOLO-World ? L'API a la même structure : remplace YOLOWorld par YOLOE, charge un point de contrôle *-seg.pt, et conserve ton appel set_classes() tel quel. Tu obtiens des masques et des prompts visuels ; la note d'export concernant les classes gelées s'applique aux deux.

Cas d'utilisation et applications#

La détection open-vocabulary supprime l'étape de réentraînement par classe, ce qui importe le plus lorsque la liste cible n'est pas connue à l'avance :

  • Détection en monde ouvertrobotique et systèmes de sécurité qui rencontrent des objets qu'aucun humain n'a énumérés au moment de l'entraînement.
  • Détection one-shot à partir d'un exemple — les prompts visuels identifient une partie spécifique, un logo ou un défaut à partir d'une seule boîte de référence, ce qui est utile en inspection industrielle.
  • Catalogage à traîne longue — le vocabulaire intégré de 4 585 noms est suffisamment vaste pour la surveillance de la biodiversité ou les inventaires de détail.
  • Amorçage de jeux de données — pré-étiquette des images avec des boîtes et des masques avant une vérification humaine, puis entraîne un modèle rapide à ensemble fermé sur le résultat.
  • Segmentation de cibles arbitraires — les points de contrôle *-seg.pt publiés renvoient un masque avec chaque prédiction, de sorte que l'imagerie médicale et l'analyse satellitaire obtiennent un résultat précis au pixel près sans second modèle.

Un modèle courant combine deux modes : exécuter le mode sans prompt une première fois pour découvrir ce qui est présent, puis basculer sur les prompts textuels pour les catégories qui comptent.

Limites#

YOLOE sacrifie de la précision au profit de la capacité à modifier les classes au moment de l'inférence. Les conséquences à connaître avant de t'engager :

  • La précision zéro-shot est nettement inférieure à celle d'un modèle entraîné sur tes classes. Les points de contrôle avec prompt se situent approximativement dans la plage de 22 à 40 mAP sur minival de LVIS ; un modèle YOLO à ensemble fermé entraîné sur tes propres données surpassera cela sur ces classes. Tourne-toi vers YOLOE pour couvrir des classes pour lesquelles tu ne peux pas t'entraîner, et non pour remplacer l'entraînement.
  • Les catégories rares constituent le point faible. La colonne mAPr dans Performances indique spécifiquement la précision sur les classes rares de LVIS, et sous l'effet des prompts textuels, elle se situe sous les colonnes des classes courantes et fréquentes dans chaque ligne. Vérifie-la plutôt que le mAP global lorsque tes cibles sont inhabituelles.
  • Un prompt décrit une apparence, pas des relations. La détection fonctionne en comparant les caractéristiques des régions à l'embedding du prompt, de sorte que les prompts qui dépendent de l'état, du contexte ou de la comparaison — « endommagé », « le plus à gauche », « celui qui est porté » — ne disposent d'aucun point d'ancrage fiable pour effectuer la correspondance. Préfère un vocabulaire proche des noms de catégories du quotidien.
  • De grands ensembles de prompts augmentent la latence. Les embeddings des prompts sont calculés une seule fois, mais ils sont comparés aux caractéristiques de la région à chaque passage avant. Mesuré sur CPU avec yoloe-26s-seg.pt, un passage avant augmente d'environ 19 % en passant de 80 à 1 203 classes et d'environ 89 % avec le vocabulaire complet de 4 585 noms. Les FLOPs signalés ne bougent pas du tout, car la similarité région-texte n'est pas comptabilisée, donc le profil ne t'avertira pas.
  • Les noms de classes font office d'espaces réservés tant que tu n'as pas fourni de prompt. Un point de contrôle *-seg.pt fraîchement chargé indique nc=80 avec des noms numériques ("0", "1", ...), alors appelle set_classes() avant de lire les étiquettes. Les points de contrôle sans prompt fournissent le vocabulaire complet déjà renseigné.

Notes de déploiement#

  • Matériel. L'inférence nécessite un GPU NVIDIA doté de 4 à 8 Go de VRAM ; les échelles n et s s'exécutent sur des GPU de périphérie tels que Jetson ou sur CPU à résolution réduite. Le réglage fin nécessite un seul GPU.
  • La NMS est agnostique aux classes par défaut. YOLOE prédit avec agnostic_nms=True. Sur YOLOE-11 et YOLOE-v8, cela supprime les boîtes superposées aux scores plus faibles entre différentes classes plutôt que seulement au sein de la même classe, ce qui évite les doublons lorsqu'un objet correspond à plusieurs catégories. Les modèles YOLOE-26 de bout en bout n'appliquent aucune suppression IoU ; là, le mode agnostique conserve uniquement la seule meilleure classe par ancre au lieu de laisser une seule ancre émettre plusieurs étiquettes de classe. Passe agnostic_nms=False pour contourner ce comportement.
  • Traitement par lots. L'inférence par lots fonctionne directement, et les prompts visuels peuvent différer d'une image à l'autre dans le même appel.

Entraînement des modèles officiels à partir de zéro#

La plupart des lecteurs n'en ont jamais besoin. Cela reproduit les points de contrôle open-vocabulary publiés à partir de Objects365, GQA et Flickr30k — environ 1,4 million d'échantillons d'entraînement sur 8× RTX 4090 — et n'a aucun lien avec le réglage fin sur tes propres données, qui est abordé dans la section Utilisation pour l'entraînement ci-dessus.

Avertissement

Chaque entraîneur qui hérite de YOLOETrainer refuse compile=True, y compris l'entraîneur par défaut YOLOESegTrainer et tous les entraîneurs à partir de zéro ci-dessous. Passe compile=False (la valeur par défaut). Les deux entraîneurs de réglage fin utilisés ci-dessus, YOLOEPESegTrainer et YOLOEPETrainer, ne comportent pas cette restriction.

L'entraînement nécessite des annotations de segmentation. Télécharge les fichiers traités ci-dessous ou génère les tiens avec le script fourni par l'équipe officielle, propulsé par SAM 2.1. La validation utilise LVIS minival.

Jeu de donnéesTypeÉchantillonsBoîtesAnnotations de segments traitées
Objects365v1Détection609k9621kobjects365_train_segm.json
GQAGrounding621k3681kfinal_mixed_train_no_coco_segm.json
Flickr30kGrounding149k641kfinal_flickr_separateGT_train_segm.json

Le modèle à prompt textuel est entraîné en premier, et les deux autres modes de prompt en sont des raffinements :

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOESegTrainerFromScratch

data = {
    "train": {
        "yolo_data": ["Objects365.yaml"],
        "grounding_data": [
            {
                "img_path": "flickr/full_images/",
                "json_file": "flickr/annotations/final_flickr_separateGT_train_segm.json",
            },
            {
                "img_path": "mixed_grounding/gqa/images",
                "json_file": "mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
            },
        ],
    },
    "val": {"yolo_data": ["lvis.yaml"]},
}

model = YOLOE("yoloe-26l-seg.yaml")
model.train(
    data=data,  # or the path to a YAML file holding the same structure
    batch=128,
    epochs=30,
    close_mosaic=2,
    optimizer="AdamW",
    lr0=2e-3,
    warmup_bias_lr=0.0,
    weight_decay=0.025,
    momentum=0.9,
    workers=4,
    trainer=YOLOESegTrainerFromScratch,
    device="0,1,2,3,4,5,6,7",
)

Les points de contrôle à prompt visuel et sans prompt démarrent à partir de ce modèle entraîné par prompt textuel et mettent à jour un module chacun. YOLOESegVPTrainer est la recette de prompt visuel et YOLOEPEFreeTrainer celle sans prompt, mais aucune des deux classes ne fige quoi que ce soit par elle-même : l'entraînement sélectif provient de la liste freeze que tu passes en parallèle, qui nomme chaque enfant de tête sauf savpe (respectivement chaque tour de classification), et l'exécution sans prompt nécessite en outre single_cls=True. Le référentiel YOLOE en amont contient les recettes complètes pour les modèles à l'échelle v8.

Une exécution sans prompt terminée est reparamétrée en un point de contrôle qui restitue ses noms sans prompt à l'inférence, en utilisant get_vocab et set_vocab :

from ultralytics import YOLOE

# Weights written by the prompt-free run and by the text-prompt run it started from. Each
# rerun creates a new directory (train-2, train-3, ...), so take the paths the runs printed.
model = YOLOE("runs/segment/train-2/weights/best.pt")  # prompt-free run, its head is already fused
text_model = YOLOE("runs/segment/train/weights/best.pt")  # text-prompt run, its head is still unfused

names = list(YOLOE("yoloe-26l-seg-pf.pt").model.names.values())  # the 4,585-name vocabulary, or your own list
vocab = text_model.get_vocab(names)

model.set_vocab(vocab, names)
model.save("yoloe-26l-seg-pf-custom.pt")  # never overwrite the released checkpoint

Citations et remerciements#

Si YOLOE a contribué à ta recherche ou projet, merci de citer l'article original par Ao Wang, Lihao Liu, Hui Chen, Zijia Lin, Jungong Han, et Guiguang Ding de l'Université Tsinghua :

Citation
@misc{wang2025yoloerealtimeseeing,
      title={YOLOE: Real-Time Seeing Anything},
      author={Ao Wang and Lihao Liu and Hui Chen and Zijia Lin and Jungong Han and Guiguang Ding},
      year={2025},
      eprint={2503.07465},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/2503.07465},
}

Pour aller plus loin, l'article original sur YOLOE est disponible sur arXiv. Le code source du projet et des ressources supplémentaires sont accessibles via leur dépôt GitHub.

FAQ#

  • Ultralytics YOLOE ajoute deux fonctionnalités que YOLO-World ne possède pas : les prompts visuels, où une boîte d'exemple remplace le nom de la classe, et les points de contrôle sans prompt qui répondent à partir d'un vocabulaire intégré de 4 585 noms sans aucun prompt. Chaque prédiction des points de contrôle *-seg.pt publiés comporte également un masque de segmentation d'instances. En matière de précision, l'article original sur YOLOE place YOLOE-v8s devant YOLO-Worldv2-S de 3,5 AP sur LVIS, pour un tiers du coût d'entraînement et 1,4× la vitesse d'inférence. La migration se résume à une modification d'une seule ligne — voir Comment se positionne YOLOE.

  • Ultralytics YOLOE prend en charge trois modes de prompt. Un prompt textuel correspond à des noms de classes sous forme de chaînes de caractères sur un point de contrôle *-seg.pt, et constitue le choix usuel. Un prompt visuel est constitué d'une ou de plusieurs boîtes d'exemple sur une image de référence, pour des cibles qu'il est difficile de formuler en mots. L'inférence sans prompt utilise un point de contrôle *-seg-pf.pt distinct qui répond à partir d'un vocabulaire intégré de 4 585 noms sans rien fournir. Les prompts textuels et visuels partagent les mêmes points de contrôle ; ceux sans prompt sont des fichiers différents et rejettent set_classes(). Consulte Choisir un mode de prompt pour la comparaison complète.

  • Commence par yoloe-26s-seg.pt : la famille YOLOE-26 devance YOLOE-11 et YOLOE-v8 à chaque échelle correspondante, et l'échelle s est la plus petite au-dessus de 30 mAP sur minival de LVIS. Passe à m, l ou x lorsque la précision sur les catégories rares importe plus que la latence — la colonne mAPr dans Performances est celle à comparer. Descends à n uniquement pour le déploiement sur les appareils de périphérie. Charge plutôt le fichier *-seg-pf.pt de la même échelle lorsque tu souhaites utiliser le vocabulaire intégré plutôt que tes propres noms de classes.

  • Des étiquettes telles que object0 et object1 signifient que la prédiction provient d'un prompt visuel, qui regroupe les boîtes d'exemple en classes temporaires numérotées au lieu de conserver tes noms. Les identifiants de classes que tu passes dans visual_prompts["cls"] effectuent uniquement ce regroupement. Le modèle les signale comme object0, object1, et ainsi de suite, dans l'ordre des identifiants que tu as assignés, alors fais correspondre ces identifiants à tes propres étiquettes sur le résultat. Si tu veux que tes noms apparaissent dans la sortie, utilise plutôt un prompt textuel.

  • Les points de contrôle sans prompt (*-seg-pf.pt) résolvent les classes via leur propre vocabulaire intégré et rejettent les prompts externes avec AssertionError: Prompt-free model does not support setting classes. Please try with Text/Visual prompt models.. Charge un point de contrôle *-seg.pt lorsque tu as besoin de ta propre liste de classes. Consulte Choisir un mode de prompt.

  • Le premier prompt textuel amène Ultralytics YOLOE à installer ultralytics/CLIP depuis GitHub avec pip et à télécharger un encodeur de texte TorchScript dans le répertoire de travail actuel — environ 254 Mo pour YOLOE-26 ; consulte Installation et prérequis pour connaître la ressource exacte par famille de modèles. Les prompts visuels et les points de contrôle sans prompt ne nécessitent ni l'un ni l'autre. Pour éviter le téléchargement sur la machine cible, définis les prompts une seule fois et enregistre-les avec save_prompt_embeddings(), ou exporte le modèle avec les classes déjà configurées.

  • Non — YOLOE intègre les classes soumises à un prompt directement dans les poids au moment de l'exportation, de sorte qu'un export chargé rejette à la fois set_classes() et visual_prompts=. Réalise une nouvelle exportation à partir du point de contrôle .pt d'origine avec les nouveaux prompts configurés. Le fichier exporté se comporte comme un modèle YOLO standard et peut être chargé avec YOLO() de la même manière qu'avec YOLOE().

  • Utilise YOLOE lorsque tu as besoin d'un débit en temps réel et que tu peux nommer les classes, et SAM 3 lorsque la qualité de la segmentation sur un concept importe plus que la vitesse. Les deux acceptent des exemples visuels ; seul YOLOE dispose d'un mode sans prompt. La comparaison complète se trouve dans Comment se positionne YOLOE.

Commentaires