Vai al contenuto

YOLOE: vedere qualsiasi cosa in tempo reale

Introduzione

Opzioni di prompt YOLOE

YOLOE (Real-Time Seeing Anything) è un nuovo passo avanti nei modelli YOLO a zero scatti e con prompt, progettato per il rilevamento e la segmentazione di vocabolari aperti. A differenza dei precedenti modelli YOLO limitati a categorie fisse, YOLOE utilizza messaggi di testo, immagini o vocabolario interno, consentendo il rilevamento in tempo reale di qualsiasi classe di oggetti. Costruito sulla base di YOLOv10 e ispirato a YOLO, YOLOE raggiunge prestazioni all'avanguardia a zero scatti con un impatto minimo su velocità e precisione.



Guarda: Come utilizzare YOLOE con il pacchetto Ultralytics Python : Vocabolario aperto e visione in tempo reale di qualsiasi cosa 🚀

Rispetto ai modelli YOLO precedenti, YOLOE aumenta significativamente l'efficienza e l'accuratezza. Migliora di +3,5 AP rispetto a YOLO su LVIS, utilizzando solo un terzo delle risorse di addestramento e raggiungendo una velocità di inferenza 1,4 volte superiore. Messo a punto su COCO, YOLOE-v8-large supera YOLOv8 di 0,1 mAP, utilizzando un tempo di addestramento quasi 4 volte inferiore. Questo dimostra l'eccezionale equilibrio tra precisione, efficienza e versatilità di YOLOE. Le sezioni che seguono analizzano l'architettura di YOLOE, i confronti con i benchmark e l'integrazione con il programma Ultralytics Ultralytics.

Panoramica dell'architettura

Architettura YOLOE

YOLOE mantiene la struttura standard di YOLO : una spina dorsale convoluzionale (ad esempio, CSP-Darknet) per l'estrazione delle caratteristiche, un collo (ad esempio, PAN-FPN) per la fusione multiscala e una testa di rilevamento disaccoppiata e priva di ancore (come in YOLO11) che predice objectness, classi e box in modo indipendente. YOLOE introduce tre nuovi moduli che consentono il rilevamento di vocaboli aperti:

  • Re-parameterizable Region-Text Alignment (RepRTA): supporta l'individuazione di testi suggeriti affinando le incorporazioni di testo (ad esempio, da CLIP) tramite una piccola rete ausiliaria. Al momento dell'inferenza, questa rete viene inserita nel modello principale, garantendo un overhead pari a zero. In questo modo, YOLOE rileva oggetti arbitrari etichettati con il testo (ad esempio, un "semaforo" non visto) senza penalizzazioni di runtime.

  • Semantic-Activated Visual Prompt Encoder (SAVPE): Consente il rilevamento con sollecitazione visiva tramite un ramo di incorporazione leggero. Data un'immagine di riferimento, SAVPE codifica le caratteristiche semantiche e di attivazione, condizionando il modello a rilevare oggetti visivamente simili: una capacità di rilevamento in una sola volta, utile per loghi o parti specifiche.

  • Contrasto pigro regione-prompt (LRPC): In modalità senza prompt, YOLOE esegue il riconoscimento di set aperti utilizzando embeddings interni addestrati su vocabolari di grandi dimensioni (oltre 1200 categorie da LVIS e Objects365). Senza suggerimenti o codificatori esterni, YOLOE identifica gli oggetti attraverso la ricerca della somiglianza tra gli embeddings, gestendo in modo efficiente ampi spazi di etichette durante l'inferenza.

Inoltre, YOLOE integra la segmentazione delle istanze in tempo reale estendendo la testa di rilevamento con un ramo di predizione della maschera (simile a YOLACT o YOLOv8), aggiungendo un overhead minimo.

In particolare, i moduli open-world di YOLOE non introducono alcun costo di inferenza se utilizzati come un normale YOLO a set chiuso. Dopo l'addestramento, i parametri di YOLOE possono essere ri-parametrizzati in una testa YOLO standard, conservando FLOP e velocità identiche (ad esempio, la corrispondenza con YOLO11 esattamente).

Modelli disponibili, attività supportate e modalità operative

Questa sezione illustra i modelli disponibili con i loro pesi specifici preaddestrati, i compiti che supportano e la loro compatibilità con varie modalità operative come Inferenza, Convalida, Addestramento ed Esportazione, indicate con ✅ per le modalità supportate e ❌ per le modalità non supportate.

Modelli di prompt testuale/visivo

Tipo di modello Pesi pre-addestrati Attività supportate Inferenza Convalida Formazione Esportazione
YOLOE-11S yoloe-11s-seg.pt Segmentazione delle istanze
YOLOE-11M yoloe-11m-seg.pt Segmentazione delle istanze
YOLOE-11L yoloe-11l-seg.pt Segmentazione delle istanze
YOLOE-v8S yoloe-v8s-seg.pt Segmentazione delle istanze
YOLOE-v8M yoloe-v8m-seg.pt Segmentazione delle istanze
YOLOE-v8L yoloe-v8l-seg.pt Segmentazione delle istanze

Modelli gratuiti Prompt

Tipo di modello Pesi pre-addestrati Attività supportate Inferenza Convalida Formazione Esportazione
YOLOE-11S-PF yoloe-11s-seg-pf.pt Segmentazione delle istanze
YOLOE-11M-PF yoloe-11m-seg-pf.pt Segmentazione delle istanze
YOLOE-11L-PF yoloe-11l-seg-pf.pt Segmentazione delle istanze
YOLOE-v8S-PF yoloe-v8s-seg-pf.pt Segmentazione delle istanze
YOLOE-v8M-PF yoloe-v8m-seg-pf.pt Segmentazione delle istanze
YOLOE-v8L-PF yoloe-v8l-seg-pf.pt Segmentazione delle istanze

Esempi di utilizzo

I modelli YOLOE sono facili da integrare nelle applicazioni Python . Ultralytics fornisce APIPython e comandiCLI di facile utilizzo per semplificare lo sviluppo.

Utilizzo del treno

Messa a punto su set di dati personalizzati

Esempio

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

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

model.train(
    data="coco128-seg.yaml",
    epochs=80,
    close_mosaic=10,
    batch=128,
    optimizer="AdamW",
    lr0=1e-3,
    warmup_bias_lr=0.0,
    weight_decay=0.025,
    momentum=0.9,
    workers=4,
    device="0",
    trainer=YOLOEPESegTrainer,
)
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer

model = YOLOE("yoloe-11s-seg.pt")
head_index = len(model.model.model) - 1
freeze = [str(f) for f in range(0, head_index)]
for name, child in model.model.model[-1].named_children():
    if "cv3" not in name:
        freeze.append(f"{head_index}.{name}")

freeze.extend(
    [
        f"{head_index}.cv3.0.0",
        f"{head_index}.cv3.0.1",
        f"{head_index}.cv3.1.0",
        f"{head_index}.cv3.1.1",
        f"{head_index}.cv3.2.0",
        f"{head_index}.cv3.2.1",
    ]
)

model.train(
    data="coco128-seg.yaml",
    epochs=2,
    close_mosaic=0,
    batch=16,
    optimizer="AdamW",
    lr0=1e-3,
    warmup_bias_lr=0.0,
    weight_decay=0.025,
    momentum=0.9,
    workers=4,
    device="0",
    trainer=YOLOEPESegTrainer,
    freeze=freeze,
)

Prevedere l'utilizzo

YOLOE supports both text-based and visual prompting. Using prompts is straightforward—just pass them through the predict come mostrato di seguito:

Esempio

Text prompts allow you to specify the classes that you wish to detect through textual descriptions. The following code shows how you can use YOLOE to detect people and buses in an image:

from ultralytics import YOLOE

# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")  # or select yoloe-11s/m-seg.pt for different sizes

# Set text prompt to detect person and bus. You only need to do this once after you load the model.
names = ["person", "bus"]
model.set_classes(names, model.get_text_pe(names))

# Run detection on the given image
results = model.predict("path/to/image.jpg")

# Show results
results[0].show()

Visual prompts allow you to guide the model by showing it visual examples of the target classes, rather than describing them in text.

Il visual_prompts argument takes a dictionary with two keys: bboxes e cls. Each bounding box in bboxes should tightly enclose an example of the object you want the model to detect, and the corresponding entry in cls specifies the class label for that box. This pairing tells the model, "This is what class X looks like—now find more like it."

Class IDs (cls) in visual_prompts are used to associate each bounding box with a specific category within your prompt. They aren't fixed labels, but temporary identifiers you assign to each example. The only requirement is that class IDs must be sequential, starting from 0. This helps the model correctly associate each box with its respective class.

You can provide visual prompts directly within the same image you want to run inference on. For example:

import numpy as np

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

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

# Define visual prompts using bounding boxes and their corresponding class IDs.
# Each box highlights an example of the object you want the model to detect.
visual_prompts = dict(
    bboxes=np.array(
        [
            [221.52, 405.8, 344.98, 857.54],  # Box enclosing person
            [120, 425, 160, 445],  # Box enclosing glasses
        ],
    ),
    cls=np.array(
        [
            0,  # ID to be assigned for person
            1,  # ID to be assigned for glassses
        ]
    ),
)

# Run inference on an image, using the provided visual prompts as guidance
results = model.predict(
    "ultralytics/assets/bus.jpg",
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)

# Show results
results[0].show()

Or you can provide examples from a separate reference image using the refer_image argument. In that case, the bboxes e cls in visual_prompts should describe objects in the reference image, not the target image you're making predictions on:

Nota

Se source is a video or stream, the model automatically uses the first frame as the refer_image. This means your visual_prompts are applied to that initial frame to help the model understand what to look for in the rest of the video. Alternatively, you can explicitly pass any specific frame as the refer_image to control which visual examples the model uses as reference.

import numpy as np

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

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

# Define visual prompts based on a separate reference image
visual_prompts = dict(
    bboxes=np.array([[221.52, 405.8, 344.98, 857.54]]),  # Box enclosing person
    cls=np.array([0]),  # ID to be assigned for person
)

# Run prediction on a different image, using reference image to guide what to look for
results = model.predict(
    "ultralytics/assets/zidane.jpg",  # Target image for detection
    refer_image="ultralytics/assets/bus.jpg",  # Reference image used to get visual prompts
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)

# Show results
results[0].show()

You can also pass multiple target images to run prediction on:

import numpy as np

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

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

# Define visual prompts using bounding boxes and their corresponding class IDs.
# Each box highlights an example of the object you want the model to detect.
visual_prompts = dict(
    bboxes=[
        np.array(
            [
                [221.52, 405.8, 344.98, 857.54],  # Box enclosing person
                [120, 425, 160, 445],  # Box enclosing glasses
            ],
        ),
        np.array([[150, 200, 1150, 700]]),
    ],
    cls=[
        np.array(
            [
                0,  # ID to be assigned for person
                1,  # ID to be assigned for glasses
            ]
        ),
        np.array([0]),
    ],
)

# Run inference on multiple image, using the provided visual prompts as guidance
results = model.predict(
    ["ultralytics/assets/bus.jpg", "ultralytics/assets/zidane.jpg"],
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)

# Show results
results[0].show()

YOLOE also includes prompt-free variants that come with a built-in vocabulary. These models don't require any prompts and work like traditional YOLO models. Instead of relying on user-provided labels or visual examples, they detect objects from a predefined list of 4,585 classes based on the tag set used by the Recognize Anything Model Plus (RAM++).

from ultralytics import YOLOE

# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg-pf.pt")

# Run prediction. No prompts required.
results = model.predict("path/to/image.jpg")

# Show results
results[0].show()

Utilizzo di Val

Esempio

from ultralytics import YOLOE

# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")  # or select yoloe-m/l-seg.pt for different sizes

# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml")

Per impostazione predefinita, utilizza il set di dati fornito per estrarre le incorporazioni visive per ogni categoria.

from ultralytics import YOLOE

# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")  # or select yoloe-m/l-seg.pt for different sizes

# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml", load_vp=True)

In alternativa, si può usare un altro set di dati come set di riferimento per estrarre le incorporazioni visive per ogni categoria. Si noti che questo set di dati di riferimento deve avere esattamente le stesse categorie del set di dati fornito.

from ultralytics import YOLOE

# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")  # or select yoloe-m/l-seg.pt for different sizes

# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml", load_vp=True, refer_data="coco.yaml")
from ultralytics import YOLOE

# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")  # or select yoloe-m/l-seg.pt for different sizes

# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml")

La validazione del modello su un set di dati viene semplificata come segue:

Modelli ufficiali di treni

Preparare i set di dati

Nota

L'addestramento dei modelli YOLOE ufficiali necessita di annotazioni di segmento per i dati di addestramento, ecco lo script fornito dal team ufficiale che converte gli insiemi di dati in annotazioni di segmenti, grazie a Modelli SAM2.1. Oppure è possibile scaricare direttamente il file Processed Segment Annotations nella seguente tabella fornita dal team ufficiale.

  • Dati del treno
Set di dati Tipo Campioni Scatole Annotazioni di rilevamento grezze Annotazioni di segmento elaborate
Oggetti365v1 Rilevamento 609k 9621k oggetti365_addestramento.json objects365_train_segm.json
GQA Messa a terra 621k 3681k final_mixed_train_no_coco.json final_mixed_train_no_coco_segm.json
Flickr30k Messa a terra 149k 641k final_flickr_separateGT_train.json final_flickr_separateGT_train_segm.json
  • Dati di valore
Set di dati Tipo File di annotazione
LVIS minival Rilevamento minival.txt

Avviare la formazione da zero

Nota

Visual Prompt I modelli sono messi a punto sulla base di modelli ben Text Prompt modelli.

Esempio

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

data = dict(
    train=dict(
        yolo_data=["Objects365.yaml"],
        grounding_data=[
            dict(
                img_path="../datasets/flickr/full_images/",
                json_file="../datasets/flickr/annotations/final_flickr_separateGT_train_segm.json",
            ),
            dict(
                img_path="../datasets/mixed_grounding/gqa/images",
                json_file="../datasets/mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
            ),
        ],
    ),
    val=dict(yolo_data=["lvis.yaml"]),
)

model = YOLOE("yoloe-11l-seg.yaml")
model.train(
    data=data,
    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",
)

Poiché solo il SAVPE deve essere aggiornato durante l'addestramento. Convertire il modello di prompt testuale ben addestrato in modello di rilevamento e adottare la pipeline di rilevamento con costi di addestramento inferiori. Si noti che questo passaggio è facoltativo, si può anche iniziare direttamente dalla segmentazione.

import torch

from ultralytics import YOLOE

det_model = YOLOE("yoloe-11l.yaml")
state = torch.load("yoloe-11l-seg.pt")
det_model.load(state["model"])
det_model.save("yoloe-11l-seg-det.pt")

Iniziare la formazione:

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

data = dict(
    train=dict(
        yolo_data=["Objects365.yaml"],
        grounding_data=[
            dict(
                img_path="../datasets/flickr/full_images/",
                json_file="../datasets/flickr/annotations/final_flickr_separateGT_train_segm.json",
            ),
            dict(
                img_path="../datasets/mixed_grounding/gqa/images",
                json_file="../datasets/mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
            ),
        ],
    ),
    val=dict(yolo_data=["lvis.yaml"]),
)

model = YOLOE("yoloe-11l-seg.pt")
# replace to yoloe-11l-seg-det.pt if converted to detection model
# model = YOLOE("yoloe-11l-seg-det.pt")

# freeze every layer except of the savpe module.
head_index = len(model.model.model) - 1
freeze = list(range(0, head_index))
for name, child in model.model.model[-1].named_children():
    if "savpe" not in name:
        freeze.append(f"{head_index}.{name}")

model.train(
    data=data,
    batch=128,
    epochs=2,
    close_mosaic=2,
    optimizer="AdamW",
    lr0=16e-3,
    warmup_bias_lr=0.0,
    weight_decay=0.025,
    momentum=0.9,
    workers=4,
    trainer=YOLOEVPTrainer,
    device="0,1,2,3,4,5,6,7",
    freeze=freeze,
)

Convertire nuovamente il modello di segmentazione dopo l'addestramento. È necessario solo se si è convertito il modello di segmentazione in modello di rilevamento prima dell'addestramento.

from copy import deepcopy

from ultralytics import YOLOE

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

vp_model = YOLOE("yoloe-11l-vp.pt")
model.model.model[-1].savpe = deepcopy(vp_model.model.model[-1].savpe)
model.eval()
model.save("yoloe-11l-seg.pt")

Come per l'addestramento dei prompt visivi, per il modello senza prompt è necessario aggiornare solo l'incorporazione dei prompt specializzati durante l'addestramento. Convertire il modello di prompt testuale ben addestrato in modello di rilevamento e adottare la pipeline di rilevamento con costi di addestramento inferiori. Si noti che questo passaggio è facoltativo, si può anche iniziare direttamente dalla segmentazione.

import torch

from ultralytics import YOLOE

det_model = YOLOE("yoloe-11l.yaml")
state = torch.load("yoloe-11l-seg.pt")
det_model.load(state["model"])
det_model.save("yoloe-11l-seg-det.pt")
Iniziare la formazione:
from ultralytics import YOLOE

data = dict(
    train=dict(
        yolo_data=["Objects365.yaml"],
        grounding_data=[
            dict(
                img_path="../datasets/flickr/full_images/",
                json_file="../datasets/flickr/annotations/final_flickr_separateGT_train_segm.json",
            ),
            dict(
                img_path="../datasets/mixed_grounding/gqa/images",
                json_file="../datasets/mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
            ),
        ],
    ),
    val=dict(yolo_data=["lvis.yaml"]),
)

model = YOLOE("yoloe-11l-seg.pt")
# replace to yoloe-11l-seg-det.pt if converted to detection model
# model = YOLOE("yoloe-11l-seg-det.pt")

# freeze layers.
head_index = len(model.model.model) - 1
freeze = [str(f) for f in range(0, head_index)]
for name, child in model.model.model[-1].named_children():
    if "cv3" not in name:
        freeze.append(f"{head_index}.{name}")

freeze.extend(
    [
        f"{head_index}.cv3.0.0",
        f"{head_index}.cv3.0.1",
        f"{head_index}.cv3.1.0",
        f"{head_index}.cv3.1.1",
        f"{head_index}.cv3.2.0",
        f"{head_index}.cv3.2.1",
    ]
)

model.train(
    data=data,
    batch=128,
    epochs=1,
    close_mosaic=1,
    optimizer="AdamW",
    lr0=2e-3,
    warmup_bias_lr=0.0,
    weight_decay=0.025,
    momentum=0.9,
    workers=4,
    trainer=YOLOEPEFreeTrainer,
    device="0,1,2,3,4,5,6,7",
    freeze=freeze,
    single_cls=True,  # this is needed
)

Convertire nuovamente il modello di segmentazione dopo l'addestramento. È necessario solo se si è convertito il modello di segmentazione in modello di rilevamento prima dell'addestramento.

from copy import deepcopy

from ultralytics import YOLOE

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

pf_model = YOLOE("yoloe-11l-seg-pf.pt")
names = ["object"]
tpe = model.get_text_pe(names)
model.set_classes(names, tpe)
model.model.model[-1].fuse(model.model.pe)

model.model.model[-1].cv3[0][2] = deepcopy(pf_model.model.model[-1].cv3[0][2]).requires_grad_(True)
model.model.model[-1].cv3[1][2] = deepcopy(pf_model.model.model[-1].cv3[1][2]).requires_grad_(True)
model.model.model[-1].cv3[2][2] = deepcopy(pf_model.model.model[-1].cv3[2][2]).requires_grad_(True)
del model.model.pe
model.save("yoloe-11l-seg-pf.pt")

Confronto delle prestazioni di YOLOE

YOLOE eguaglia o supera l'accuratezza dei modelli YOLO a set chiuso su benchmark standard come COCO, senza compromettere la velocità o le dimensioni del modello. La tabella seguente confronta YOLOE-L (costruito su YOLO11) con i corrispondenti modelli YOLOv8. YOLOv8 e YOLO11 :

Modello COCO mAP50-95 Velocità di inferenza (T4) Parametri GFLOP (640px)
YOLOv8 (set chiuso) 52.9% 9,06 ms (110 FPS) 43.7 M 165.2 B
YOLO11 (set chiuso) 53.5% 6,2 ms (130 FPS) 26.2 M 86.9 B
YOLOE-L (cabina aperta) 52.6% 6,2 ms (130 FPS) 26.2 M 86.9 B†

YOLO11 e YOLOE-L hanno architetture identiche (moduli prompt disabilitati in YOLO11), con conseguente velocità di inferenza identica e stime GFLOP simili.

YOLOE-L raggiunge il 52,6% di mAP, superando YOLOv8(52,9%) con circa il 40% di parametri in meno (26M contro 43,7M). Elabora immagini 640×640 in 6,2 ms (161 FPS) rispetto ai 9,06 ms (110 FPS) di YOLOv8, evidenziando l'efficienza di YOLO11. Inoltre, i moduli a vocabolario aperto di YOLOE non comportano alcun costo di inferenza, a dimostrazione di un design "no free lunch trade-off".

Per le attività a scatto zero e di trasferimento, YOLOE eccelle: su LVIS, YOLOE-small migliora rispetto a YOLO di +3,5 AP utilizzando 3 volte meno risorse di addestramento. Anche la messa a punto di YOLOE-L da LVIS a COCO ha richiesto un tempo di addestramento 4 volte inferiore rispetto a YOLOv8, sottolineando la sua efficienza e adattabilità. YOLOE mantiene inoltre la velocità tipica di YOLO, raggiungendo oltre 300 FPS su una GPU T4 e ~64 FPS su iPhone 12 tramite CoreML, ideale per le implementazioni edge e mobile.

Nota

Condizioni di benchmark: I risultati di YOLOE provengono da modelli pre-addestrati su Objects365, GoldG e LVIS, poi messi a punto o valutati su COCO. Il leggero vantaggio di YOLOE in termini di mAP rispetto a YOLOv8 deriva da un ampio pre-addestramento. Senza questo addestramento in open-vocab, YOLOE è all'altezza di modelli YOLO di dimensioni simili, affermando la sua precisione SOTA e la sua flessibilità open-world senza penalizzazioni delle prestazioni.

Confronto con i modelli precedenti

YOLOE introduce notevoli progressi rispetto ai precedenti modelli YOLO e ai rilevatori di vocaboli aperti:

  • YOLOE vs YOLOv5:
    YOLOv5 ha offerto un buon rapporto velocità-accuratezza, ma richiedeva una riqualificazione per le nuove classi e utilizzava teste basate su ancore. Al contrario, YOLOE è privo di ancore e rileva dinamicamente le nuove classi. YOLOE, basandosi sui miglioramenti di YOLOv8, raggiunge un'accuratezza maggiore (52,6% contro il ~50% di YOLOv5 su COCO) e integra la segmentazione delle istanze, a differenza di YOLOv5.

  • YOLOE vs YOLOv8:
    YOLOE estende YOLOv8e raggiunge un'accuratezza simile o superiore(52,6% di mAP con ~26M parametri contro il 52,9% di YOLOv8 con ~44M parametri). Riduce significativamente il tempo di addestramento grazie a un pre-addestramento più intenso. Il progresso principale è rappresentato dalla capacità di YOLOE di rilevare oggetti non visti (ad esempio,"scooter con uccello" o"simbolo della pace") tramite prompt, a differenza del design a set chiuso di YOLOv8.

  • YOLOE vs YOLO11:
    YOLO11 migliora YOLOv8 con una maggiore efficienza e un minor numero di parametri (~22% di riduzione). YOLOE eredita direttamente questi vantaggi, eguagliando la velocità di inferenza e il numero di parametri di YOLO11(~26M parametri), aggiungendo al contempo il rilevamento e la segmentazione del vocabolario aperto. In scenari chiusi, YOLOE è equivalente a YOLO11, ma aggiunge l'adattabilità per rilevare classi non viste, ottenendo la capacità diYOLO11 + open-world senza compromettere la velocità.

  • YOLOE rispetto ai precedenti rilevatori di vocaboli aperti:
    I precedenti modelli di vocabolario aperto (GLIP, OWL-ViT, YOLO) si basavano pesantemente sui trasformatori del linguaggio della visione, con conseguente lentezza dell'inferenza. YOLOE li supera in termini di accuratezza a zero scatti (ad esempio, +3,5 AP rispetto a YOLO), mentre funziona 1,4 volte più velocemente con risorse di addestramento significativamente inferiori. Rispetto agli approcci basati su trasformatori (ad esempio, GLIP), YOLOE offre un'inferenza più veloce di ordini di grandezza, colmando efficacemente il divario di accuratezza ed efficienza nel rilevamento degli insiemi aperti.

In sintesi, YOLOE mantiene la rinomata velocità ed efficienza di YOLO, supera i predecessori in termini di accuratezza, integra la segmentazione e introduce un potente rilevamento open-world, rendendolo unico per versatilità e praticità.

Casi d'uso e applicazioni

Il rilevamento e la segmentazione del vocabolario aperto di YOLOE consentono diverse applicazioni al di là dei tradizionali modelli a classe fissa:

  • Rilevamento di oggetti in un mondo aperto:
    Ideale per scenari dinamici come la robotica, in cui i robot riconoscono oggetti mai visti prima grazie a suggerimenti, o i sistemi di sicurezza che si adattano rapidamente a nuove minacce (ad esempio, oggetti pericolosi) senza bisogno di riqualificarsi.

  • Rilevamento con pochi scatti e con un solo scatto:
    Utilizzando suggerimenti visivi (SAVPE), YOLOE apprende rapidamente nuovi oggetti da singole immagini di riferimento, perfette per l'ispezione industriale (identificazione immediata di parti o difetti) o per la sorveglianza personalizzata, consentendo ricerche visive con una configurazione minima.

  • Riconoscimento di un ampio vocabolario e di una lunga coda:
    Dotato di un vocabolario di oltre 1000 classi, YOLOE eccelle in compiti come il monitoraggio della biodiversità (rilevamento di specie rare), le collezioni museali, l'inventario di vendita al dettaglio o il commercio elettronico, identificando in modo affidabile molte classi senza una formazione estesa per classe.

  • Rilevamento e segmentazione interattivi:
    YOLOE supporta applicazioni interattive in tempo reale, come il recupero di video/immagini, la realtà aumentata (AR) e l'editing intuitivo delle immagini, guidato da input naturali (testo o messaggi visivi). Gli utenti possono isolare, identificare o modificare dinamicamente gli oggetti con precisione utilizzando maschere di segmentazione.

  • Etichettatura automatica dei dati e bootstrapping:
    YOLOE facilita la creazione rapida di set di dati fornendo annotazioni iniziali di bounding box e segmentazione, riducendo in modo significativo gli sforzi di etichettatura umana. Particolarmente utile nell'analisi di grandi raccolte multimediali, dove può identificare automaticamente gli oggetti presenti, aiutando a costruire più rapidamente modelli specializzati.

  • Segmentazione per qualsiasi oggetto:
    Estende le capacità di segmentazione a oggetti arbitrari attraverso suggerimenti - particolarmente utili per l'imaging medico, la microscopia o l'analisi di immagini satellitari- identificando automaticamente e segmentando con precisione le strutture senza modelli specializzati pre-addestrati. A differenza di modelli come SAMYOLOE riconosce e segmenta simultaneamente gli oggetti in modo automatico, aiutando in attività come la creazione di contenuti o la comprensione della scena.

In tutti questi casi d'uso, il vantaggio principale di YOLOE è la versatilità, in quanto fornisce un modello unificato per il rilevamento, il riconoscimento e la segmentazione in scenari dinamici. La sua efficienza garantisce prestazioni in tempo reale su dispositivi con risorse limitate, ideali per la robotica, la guida autonoma, la difesa e altro ancora.

Suggerimento

Scegliete la modalità di YOLOE in base alle vostre esigenze:

  • Modalità a set chiuso: Per compiti a classe fissa (massima velocità e precisione).
  • Modalità con prompt: Aggiungete rapidamente nuovi oggetti tramite suggerimenti testuali o visivi.
  • Modalità open-set senza prompt: Rilevamento generale di molte categorie (ideale per la catalogazione e la scoperta).

Spesso la combinazione di modalità, come la scoperta senza suggerimenti seguita da suggerimenti mirati, consente di sfruttare appieno il potenziale di YOLOE.

Formazione e inferenza

YOLOE si integra perfettamente con l'APIPython di Ultralytics e con la CLIsimile agli altri modelli YOLO YOLOv8, YOLO). Ecco come iniziare rapidamente:

Formazione e inferenza con YOLOE

from ultralytics import YOLO

# Load pre-trained YOLOE model and train on custom data
model = YOLO("yoloe-11s.pt")
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)

# Run inference using text prompts ("person", "bus")
model.set_classes(["person", "bus"])
results = model.predict(source="test_images/street.jpg")
results[0].save()  # save annotated output

In questo caso, YOLOE si comporta come un rilevatore standard per impostazione predefinita, ma passa facilmente a un rilevamento guidato specificando le classi (set_classes). I risultati contengono caselle di delimitazione, maschere ed etichette.

# Training YOLOE on custom dataset
yolo train model=yoloe-11s.pt data=path/to/data.yaml epochs=50 imgsz=640

# Inference with text prompts
yolo predict model=yoloe-11s.pt source="test_images/street.jpg" classes="person,bus"

prompt della CLI (classes) guidano YOLOE in modo simile a quello di Python set_classes. La richiesta visiva (query basate su immagini) richiede attualmente l'API Python .

Altre attività supportate

  • Convalida: Valutare facilmente l'accuratezza con model.val() o yolo val.
  • Esportazione: Esportazione dei modelli YOLOE (model.export()) a ONNX, TensorRT e così via, facilitando la distribuzione.
  • Tracciamento: YOLOE supporta il tracciamento degli oggetti (yolo track) se integrato, utile per tracciare le classi richieste nei video.

Nota

YOLOE include automaticamente maschere di segmentazione nei risultati dell'inferenza (results[0].masks), semplificando le operazioni di precisione al pixel, come l'estrazione o la misurazione di oggetti, senza bisogno di modelli separati.

Per iniziare

Per configurare rapidamente YOLOE con Ultralytics , procedere come segue:

  1. Installazione: Installare o aggiornare il pacchetto Ultralytics :

    pip install -U ultralytics
    
  2. Scarica i pesi YOLOE: I modelli YOLOE pre-addestrati (ad esempio, le varianti YOLOE-v8-S/L e YOLOE-11) sono disponibili nelle release di YOLOE GitHub. È sufficiente scaricare il modello desiderato .pt da caricare nella classe Ultralytics YOLO .

  3. Requisiti hardware:

    • Inferenza: GPU consigliataNVIDIA con ≥4-8 GB di VRAM). I modelli di piccole dimensioni vengono eseguiti in modo efficiente su GPU di fascia bassa (ad esempio, Jetson) o CPU a risoluzioni inferiori.
    • Formazione: La messa a punto di YOLOE su dati personalizzati richiede in genere una sola GPU. Il pre-training estensivo del vocabolario aperto (LVIS/Objects365) utilizzato dagli autori ha richiesto una notevole quantità di calcoli (8× GPU RTX 4090).
  4. Configurazione: Le configurazioni di YOLOE utilizzano i file YAML standard di Ultralytics . Le configurazioni predefinite (ad esempio, yoloe-s.yaml) sono in genere sufficienti, ma è possibile modificare la spina dorsale, le classi o le dimensioni dell'immagine secondo le necessità.

  5. Esecuzione di YOLOE:

    • Inferenza rapida (senza fretta):
      yolo predict model=yoloe-s.pt source="image.jpg"
      
    • Rilevamento su richiesta (esempio di richiesta di testo):

      yolo predict model=yoloe-s.pt source="kitchen.jpg" classes="bowl,apple"
      

      In Python:

      from ultralytics import YOLO
      
      model = YOLO("yoloe-s.pt")
      model.set_classes(["bowl", "apple"])
      results = model.predict("kitchen.jpg")
      results[0].save()
      
  6. Suggerimenti per l'integrazione:

    • Nomi delle classi: Le uscite predefinite di YOLOE utilizzano le categorie LVIS; utilizzare set_classes() per specificare le proprie etichette.
    • Velocità: YOLOE non ha spese generali, a meno che non si utilizzino i prompt. I suggerimenti testuali hanno un impatto minimo, quelli visivi un po' di più.
    • Inferenza in batch: Supportato direttamente (model.predict([img1, img2])). Per le richieste specifiche delle immagini, eseguire le immagini singolarmente.

La documentazione diUltralytics fornisce ulteriori risorse. YOLOE consente di esplorare facilmente le potenti funzionalità open-world all'interno del familiare ecosistema YOLO .

Suggerimento

Suggerimento professionale: Per massimizzare l'accuratezza di YOLOE a colpo zero, è consigliabile effettuare una messa a punto a partire dai punti di controllo forniti, piuttosto che addestrarsi da zero. Per migliorare l'accuratezza del rilevamento, utilizzare parole di suggerimento che corrispondono alle etichette di addestramento comuni (vedere le categorie LVIS).

Citazioni e ringraziamenti

Se YOLOE ha contribuito alla vostra ricerca o al vostro progetto, vi preghiamo di citare l'articolo originale di Ao Wang, Lihao Liu, Hui Chen, Zijia Lin, Jungong Han e Guiguang Ding della Tsinghua University:

@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},
}

Per ulteriori letture, il documento originale di YOLOE è disponibile su arXiv. Il codice sorgente del progetto e le risorse aggiuntive sono accessibili tramite il loro repository GitHub.

FAQ

In cosa si differenzia YOLOE da YOLO?

Sebbene sia YOLOE che YOLO consentano il rilevamento del vocabolario aperto, YOLOE offre diversi vantaggi. YOLOE raggiunge un'accuratezza superiore di +3,5 AP su LVIS, utilizzando 3 volte meno risorse di addestramento e funzionando 1,4 volte più velocemente di YOLO. YOLOE supporta anche tre modalità di prompt (testuale, visivo e vocabolario interno), mentre YOLO si concentra principalmente sui prompt testuali. Inoltre, YOLOE include funzionalità integrate di segmentazione delle istanze, fornendo maschere precise al pixel per gli oggetti rilevati senza costi aggiuntivi.

Posso utilizzare YOLOE come un normale modello YOLO ?

Sì, YOLOE può funzionare esattamente come un modello YOLO standard senza alcuna penalizzazione delle prestazioni. Quando viene utilizzato in modalità closed-set (senza prompt), i moduli a vocabolario aperto di YOLOE vengono ri-parametrizzati nella testina di rilevamento standard, ottenendo velocità e precisione identiche a quelle dei modelli YOLO11 equivalenti. Ciò rende YOLOE estremamente versatile: è possibile utilizzarlo come rilevatore tradizionale per ottenere la massima velocità e passare alla modalità a vocabolario aperto solo quando necessario.

Quali tipi di suggerimenti si possono utilizzare con YOLOE?

YOLOE supporta tre tipi di richieste:

  1. Richiami di testo: Specificare le classi di oggetti utilizzando il linguaggio naturale (ad esempio, "persona", "semaforo", "scooter per uccelli").
  2. Suggerimenti visivi: Fornire immagini di riferimento degli oggetti che si desidera rilevare.
  3. Vocabolario interno: Utilizzate il vocabolario integrato di YOLOE, composto da oltre 1200 categorie, senza bisogno di suggerimenti esterni.

Questa flessibilità consente di adattare YOLOE a vari scenari senza dover riqualificare il modello, rendendolo particolarmente utile per gli ambienti dinamici in cui i requisiti di rilevamento cambiano frequentemente.

Come gestisce YOLOE la segmentazione delle istanze?

YOLOE integra la segmentazione delle istanze direttamente nella sua architettura, estendendo la testa di rilevamento con un ramo di predizione della maschera. Questo approccio è simile a YOLOv8, ma funziona per qualsiasi classe di oggetti richiesta. Le maschere di segmentazione sono automaticamente incluse nei risultati dell'inferenza e sono accessibili tramite results[0].masks. Questo approccio unificato elimina la necessità di modelli di rilevamento e segmentazione separati, semplificando i flussi di lavoro per le applicazioni che richiedono confini di oggetti precisi al pixel.

Come gestisce YOLOE l'inferenza con i prompt personalizzati?

Come YOLO, YOLOE supporta una strategia di "prompt-then-detect" che utilizza un vocabolario offline per migliorare l'efficienza. I suggerimenti personalizzati, come le didascalie o le categorie specifiche di oggetti, sono pre-codificati e memorizzati come embedding di vocabolario offline. Questo approccio semplifica il processo di rilevamento senza richiedere una nuova formazione. È possibile impostare dinamicamente questi suggerimenti all'interno del modello per adattarlo a compiti di rilevamento specifici:

from ultralytics import YOLO

# Initialize a YOLOE model
model = YOLO("yoloe-s.pt")

# Define custom classes
model.set_classes(["person", "bus"])

# Execute prediction on an image
results = model.predict("path/to/image.jpg")

# Show results
results[0].show()
📅C reato 1 mese fa ✏️ Aggiornato 2 giorni fa

Commenti