Ultralytics YOLO27:
Get Started

Modello YOLO-World#

Il modello YOLO-World introduce un approccio avanzato in tempo reale basato su Ultralytics YOLOv8 per le attività di rilevamento a vocabolario aperto. Questa innovazione consente di rilevare qualsiasi oggetto in un'immagine sulla base di testi descrittivi. Riducendo notevolmente i requisiti computazionali e mantenendo prestazioni competitive, YOLO-World si afferma come uno strumento versatile per numerose applicazioni basate sulla visione.



Guarda: Workflow di addestramento di YOLO World su un dataset personalizzato

Panoramica dell'architettura del modello YOLO-World

Panoramica#

YOLO-World affronta le sfide dei tradizionali modelli di rilevamento a vocabolario aperto, che spesso si basano su ingombranti modelli Transformer che richiedono ingenti risorse computazionali. La dipendenza di questi modelli da categorie di oggetti predefinite ne limita inoltre l'utilità negli scenari dinamici. YOLO-World rinnova il framework YOLOv8 con funzionalità di rilevamento a vocabolario aperto, utilizzando la modellazione visione-linguaggio e il preaddestramento su dataset estesi per eccellere nell'identificazione di un'ampia varietà di oggetti in scenari zero-shot, con un'efficienza senza pari.

Per le attività a vocabolario aperto che richiedono anche maschere di istanza, prompt visivi o una modalità senza prompt, consulta YOLOE, che mantiene la stessa API set_classes().

Funzionalità principali#

  1. Soluzione in tempo reale: sfruttando la velocità computazionale delle CNN, YOLO-World offre una soluzione rapida di rilevamento a vocabolario aperto, adatta ai settori che hanno bisogno di risultati immediati.

  2. Efficienza e prestazioni: YOLO-World riduce drasticamente i requisiti computazionali e di risorse senza sacrificare le prestazioni, offrendo un'alternativa solida a modelli come SAM a una frazione del costo computazionale e consentendo applicazioni in tempo reale.

  3. Inferenza con vocabolario offline: YOLO-World introduce una strategia "prompt-then-detect", che utilizza un vocabolario offline per migliorare ulteriormente l'efficienza. Questo approccio consente di usare prompt personalizzati calcolati in anticipo, comprese descrizioni o categorie, codificandoli e memorizzandoli come embedding del vocabolario offline, così da snellire il processo di rilevamento.

  4. Basato su YOLOv8: sviluppato sulla base di Ultralytics YOLOv8, YOLO-World sfrutta i più recenti progressi nel rilevamento degli oggetti in tempo reale per consentire il rilevamento a vocabolario aperto con accuratezza e velocità senza pari.

  5. Eccellenza nei benchmark: YOLO-World supera i rilevatori a vocabolario aperto esistenti, tra cui le serie MDETR e GLIP, in termini di velocità ed efficienza nei benchmark standard, dimostrando le capacità superiori di YOLOv8 su una singola GPU NVIDIA V100.

  6. Applicazioni versatili: l'approccio innovativo di YOLO-World apre nuove possibilità per numerose attività di visione, offrendo miglioramenti di velocità di ordini di grandezza rispetto ai metodi esistenti.

Modelli disponibili, attività supportate e modalità operative#

Questa sezione descrive i modelli disponibili con i relativi pesi preaddestrati specifici, le attività supportate e la compatibilità con varie modalità operative, come Inferenza, Validazione, Addestramento ed Esportazione, indicate con ✅ per le modalità supportate e ❌ per quelle non supportate.

Nota

Tutti i pesi YOLOv8-World sono stati trasferiti direttamente dal repository ufficiale YOLO-World, a testimonianza degli eccellenti contributi del progetto.

Tipo di modelloPesi preaddestratiAttività supportateAddestramentoValidazioneInferenzaEsporta
YOLOv8s-worldyolov8s-world.ptRilevamento di oggetti✅✅✅❌
YOLOv8s-worldv2yolov8s-worldv2.ptRilevamento di oggetti✅✅✅✅
YOLOv8m-worldyolov8m-world.ptRilevamento di oggetti✅✅✅❌
YOLOv8m-worldv2yolov8m-worldv2.ptRilevamento di oggetti✅✅✅✅
YOLOv8l-worldyolov8l-world.ptRilevamento di oggetti✅✅✅❌
YOLOv8l-worldv2yolov8l-worldv2.ptRilevamento di oggetti✅✅✅✅
YOLOv8x-worldyolov8x-world.ptRilevamento di oggetti✅✅✅❌
YOLOv8x-worldv2yolov8x-worldv2.ptRilevamento di oggetti✅✅✅✅

Trasferimento zero-shot sul dataset COCO#

Prestazioni
Tipo di modellomAPmAP50mAP75
yolov8s-world37.452.040.6
yolov8s-worldv237.752.241.0
yolov8m-world42.057.045.6
yolov8m-worldv243.058.446.8
yolov8l-world45.761.349.8
yolov8l-worldv245.861.349.8
yolov8x-world47.063.051.2
yolov8x-worldv247.162.851.4

Esempi d'uso#

I modelli YOLO-World si integrano facilmente nelle tue applicazioni Python. Ultralytics fornisce una API Python e comandi CLI intuitivi per semplificare lo sviluppo.



Guarda: Esempi di utilizzo del modello YOLO-World con Ultralytics | Vocabolario aperto, senza prompt e altro 🚀

Utilizzo dell'addestramento#

Suggerimento

Consigliamo vivamente di usare yolov8-worldv2 per l'addestramento personalizzato, perché supporta l'addestramento deterministico e semplifica l'esportazione in formati come ONNX e TensorRT.

Il rilevamento degli oggetti è semplice con il metodo train, come illustrato di seguito:

Esempio

I modelli *.pt preaddestrati con PyTorch e i file di configurazione *.yaml possono essere passati alla classe YOLOWorld() per creare un'istanza del modello in Python:

from ultralytics import YOLOWorld

# Carica un modello YOLOv8s-worldv2 pretrained
model = YOLOWorld("yolov8s-worldv2.pt")

# Addestra il modello sul dataset di esempio COCO8 per 100 epoche
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)

# Esegui l'inferenza con il modello YOLO-World sull'immagine 'bus.jpg'
results = model("path/to/bus.jpg")

Uso di predict#

Il rilevamento degli oggetti è semplice con il metodo predict, come illustrato di seguito:

Esempio
from ultralytics import YOLOWorld

# Inizializza un modello YOLO-World
model = YOLOWorld("yolov8s-world.pt")  # oppure scegli yolov8m/l-world.pt per dimensioni diverse

# Esegui l'inferenza con il modello YOLOv8s-world sull'immagine specificata
results = model.predict("path/to/image.jpg")

# Mostra i risultati
results[0].show()

Questo frammento di codice mostra quanto sia semplice caricare un modello preaddestrato ed eseguire una previsione su un'immagine.

Uso di val#

La convalida del modello su un dataset si esegue facilmente come segue:

Esempio
from ultralytics import YOLO

# Crea un modello YOLO-World
model = YOLO("yolov8s-world.pt")  # oppure scegli yolov8m/l-world.pt per dimensioni diverse

# Esegui la convalida del modello sul dataset di esempio COCO8
metrics = model.val(data="coco8.yaml")

Tracciamento#

Il tracciamento degli oggetti con il modello YOLO-World su un video o su immagini si esegue facilmente come segue:

Esempio
from ultralytics import YOLO

# Crea un modello YOLO-World
model = YOLO("yolov8s-world.pt")  # oppure scegli yolov8m/l-world.pt per dimensioni diverse

# Esegui il tracking con un modello YOLO-World su un video
results = model.track(source="path/to/video.mp4")
Nota

I modelli YOLO-World forniti da Ultralytics sono preconfigurati con le categorie del dataset COCO nel vocabolario offline, così da essere più efficienti e pronti all'uso. Questa integrazione consente ai modelli YOLOv8-World di riconoscere e prevedere direttamente le 80 categorie standard definite nel dataset COCO, senza richiedere ulteriori configurazioni o personalizzazioni.

Imposta i prompt#

Panoramica dei nomi delle classi dei prompt YOLO-World

Il framework YOLO-World consente di specificare dinamicamente le classi tramite prompt personalizzati, permettendoti di adattare il modello alle tue esigenze specifiche senza riaddestrarlo. Questa funzionalità è particolarmente utile per adattare il modello a nuovi domini o ad attività specifiche che inizialmente non facevano parte dei dati di addestramento. Impostando prompt personalizzati, puoi indirizzare l'attenzione del modello verso gli oggetti di interesse, migliorando la pertinenza e la precisione dei risultati del rilevamento.

Ad esempio, se la tua applicazione deve rilevare solo oggetti 'person' e 'bus', puoi specificare direttamente queste classi:

Esempio
from ultralytics import YOLO

# Inizializza un modello YOLO-World
model = YOLO("yolov8s-world.pt")  # oppure scegli yolov8m/l-world.pt

# Definisci classi personalizzate
model.set_classes(["person", "bus"])

# Esegui la previsione delle categorie specificate in un'immagine
results = model.predict("path/to/image.jpg")

# Mostra i risultati
results[0].show()
Classe di sfondo

Alcuni utenti hanno riscontrato che aggiungere una stringa vuota "" come classe di sfondo può migliorare le prestazioni di rilevamento in determinati scenari. Questo comportamento sembra dipendere dallo scenario e il meccanismo esatto non è del tutto chiaro:

model.set_classes(["person", "bus", ""])

La stringa vuota rimane in model.names come classe a sé stante, anche nei modelli che salvi, quindi le relative rilevazioni restituiscono un'etichetta vuota. Passa classes=[0, 1] al momento della previsione per mantenere solo le tue classi effettive.

Puoi anche salvare un modello dopo aver impostato classi personalizzate. In questo modo crei una versione del modello YOLO-World specializzata per il tuo caso d'uso specifico. Questa procedura incorpora le definizioni delle classi personalizzate direttamente nel file del modello, rendendolo pronto all'uso con le classi specificate senza ulteriori modifiche. Segui questi passaggi per salvare e caricare il tuo modello YOLO-World personalizzato:

Esempio

Per prima cosa, carica un modello YOLO-World, impostane le classi personalizzate e salvalo:

from ultralytics import YOLO

# Inizializza un modello YOLO-World
model = YOLO("yolov8s-world.pt")  # oppure scegli yolov8m/l-world.pt

# Definisci classi personalizzate
model.set_classes(["person", "bus"])

# Salva il modello con il vocabolario offline definito
model.save("custom_yolov8s.pt")

Dopo il salvataggio, il modello custom_yolov8s.pt si comporta come qualsiasi altro modello YOLOv8 pretrained, con una differenza fondamentale: ora è ottimizzato per rilevare solo le classi che hai definito. Questa personalizzazione può migliorare notevolmente le prestazioni e l'efficienza del rilevamento nei tuoi specifici scenari applicativi.

from ultralytics import YOLO

# Carica il tuo modello personalizzato
model = YOLO("custom_yolov8s.pt")

# Esegui l'inferenza per rilevare le tue classi personalizzate
results = model.predict("path/to/image.jpg")

# Mostra i risultati
results[0].show()

Vantaggi del salvataggio con un vocabolario personalizzato#

  • Efficienza: semplifica il processo di rilevamento concentrandosi sugli oggetti pertinenti, riduce il carico computazionale e velocizza l'inferenza.
  • Flessibilità: consente di adattare facilmente il modello a nuove attività di rilevamento o ad attività di nicchia, senza dover ricorrere a un riaddestramento esteso o raccogliere altri dati.
  • Semplicità: semplifica la distribuzione eliminando la necessità di specificare ripetutamente le classi personalizzate in fase di esecuzione, così il modello può essere usato direttamente con il vocabolario incorporato.
  • Prestazioni: migliora la precisione del rilevamento per le classi specificate, concentrando l'attenzione e le risorse del modello sul riconoscimento degli oggetti definiti.

Questo approccio offre un potente metodo per personalizzare i modelli all'avanguardia di rilevamento degli oggetti per attività specifiche, rendendo l'AI avanzata più accessibile e applicabile a una gamma più ampia di applicazioni pratiche.

Riproduci da zero i risultati ufficiali (sperimentale)#

Prepara i dataset#

  • Dati di addestramento
DatasetTipoCampioniRiquadriFile di annotazione
Objects365v1Rilevamento609k9621kobjects365_train.json
GQAGrounding621k3681kfinal_mixed_train_no_coco.json
Flickr30kGrounding149k641kfinal_flickr_separateGT_train.json
  • Dati di convalida
DatasetTipoFile di annotazione
LVIS minivalRilevamentominival.txt

Avvia l'addestramento da zero#

Nota

WorldTrainerFromScratch è altamente personalizzato per consentire l'addestramento simultaneo dei modelli YOLO-World su dataset di rilevamento e dataset di grounding. Per maggiori dettagli, consulta ultralytics.models.yolo.world.train_world.py.

Esempio
from ultralytics import YOLOWorld
from ultralytics.models.yolo.world.train_world import WorldTrainerFromScratch

# Opzione 1: usa un dizionario Python
data = {
    "train": {
        "yolo_data": ["Objects365.yaml"],
        "grounding_data": [
            {
                "img_path": "flickr30k/images",
                "json_file": "flickr30k/final_flickr_separateGT_train.json",
            },
            {
                "img_path": "GQA/images",
                "json_file": "GQA/final_mixed_train_no_coco.json",
            },
        ],
    },
    "val": {"yolo_data": ["lvis.yaml"]},
}

# Opzione 2: usa un file YAML (yolo_world_data.yaml)
# 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 = YOLOWorld("yolov8s-worldv2.yaml")
model.train(
    data=data,  # oppure data="yolo_world_data.yaml" se usi un file YAML
    batch=128,
    epochs=100,
    trainer=WorldTrainerFromScratch,
)

Citazioni e ringraziamenti#

Ringraziamo il Tencent AILab Computer Vision Center per il suo lavoro pionieristico nel rilevamento di oggetti in tempo reale con vocabolario aperto con YOLO-World:

Citazione
@article{cheng2024yolow,
title={YOLO-World: Real-Time Open-Vocabulary Object Detection},
author={Cheng, Tianheng and Song, Lin and Ge, Yixiao and Liu, Wenyu and Wang, Xinggang and Shan, Ying},
journal={arXiv preprint arXiv:2401.17270},
year={2024}
}

Per approfondire, il paper originale su YOLO-World è disponibile su arXiv. Il codice sorgente del progetto e altre risorse sono disponibili nel loro repository GitHub. Apprezziamo il loro impegno nel far progredire il settore e nel condividere preziose conoscenze con la community.

Domande frequenti#

  • Il modello YOLO-World è un approccio avanzato al rilevamento di oggetti in tempo reale basato sul framework Ultralytics YOLOv8. Si distingue nelle attività di rilevamento a vocabolario aperto, identificando gli oggetti in un'immagine sulla base di testi descrittivi. Grazie alla modellazione visione-linguaggio e al pretraining su grandi dataset, YOLO-World raggiunge elevata efficienza e prestazioni con un fabbisogno computazionale notevolmente ridotto, risultando ideale per applicazioni in tempo reale in diversi settori.

  • YOLO-World supporta una strategia «prompt-then-detect», che utilizza un vocabolario offline per migliorare l'efficienza. I prompt personalizzati, come didascalie o categorie specifiche di oggetti, vengono codificati in anticipo e archiviati come embedding del vocabolario offline. Questo approccio semplifica il processo di rilevamento senza bisogno di riaddestrare il modello. Puoi impostare dinamicamente questi prompt nel modello per adattarlo ad attività di rilevamento specifiche, come illustrato di seguito:

    from ultralytics import YOLOWorld
    
    # Inizializza un modello YOLO-World
    model = YOLOWorld("yolov8s-world.pt")
    
    # Definisci classi personalizzate
    model.set_classes(["person", "bus"])
    
    # Esegui una previsione su un'immagine
    results = model.predict("path/to/image.jpg")
    
    # Mostra i risultati
    results[0].show()
  • YOLO-World offre diversi vantaggi rispetto ai modelli tradizionali di rilevamento a vocabolario aperto:

    • Prestazioni in tempo reale: sfrutta la velocità di calcolo delle CNN per offrire un rilevamento rapido ed efficiente.
    • Efficienza e basso fabbisogno di risorse: YOLO-World mantiene prestazioni elevate riducendo notevolmente il fabbisogno computazionale e di risorse.
    • Prompt personalizzabili: il modello supporta l'impostazione dinamica dei prompt, consentendo agli utenti di specificare classi di rilevamento personalizzate senza riaddestrare il modello.
    • Eccellenza nei benchmark: supera altri rilevatori a vocabolario aperto come MDETR e GLIP in termini di velocità ed efficienza sui benchmark standard.
  • Addestrare un modello YOLO-World sul tuo dataset è semplice grazie all'API Python o ai comandi CLI forniti. Ecco come avviare l'addestramento usando Python:

    from ultralytics import YOLOWorld
    
    # Carica un modello YOLOv8s-worldv2 pretrained
    model = YOLOWorld("yolov8s-worldv2.pt")
    
    # Addestra il modello sul dataset COCO8 per 100 epoche
    results = model.train(data="coco8.yaml", epochs=100, imgsz=640)

    Oppure usando la CLI:

    yolo train model=yolov8s-worldv2.pt data=coco8.yaml epochs=100 imgsz=640
  • Ultralytics offre diversi modelli YOLO-World pretrained che supportano varie attività e modalità operative:

    Tipo di modelloPesi preaddestratiAttività supportateAddestramentoValidazioneInferenzaEsporta
    YOLOv8s-worldyolov8s-world.ptRilevamento di oggetti✅✅✅❌
    YOLOv8s-worldv2yolov8s-worldv2.ptRilevamento di oggetti✅✅✅✅
    YOLOv8m-worldyolov8m-world.ptRilevamento di oggetti✅✅✅❌
    YOLOv8m-worldv2yolov8m-worldv2.ptRilevamento di oggetti✅✅✅✅
    YOLOv8l-worldyolov8l-world.ptRilevamento di oggetti✅✅✅❌
    YOLOv8l-worldv2yolov8l-worldv2.ptRilevamento di oggetti✅✅✅✅
    YOLOv8x-worldyolov8x-world.ptRilevamento di oggetti✅✅✅❌
    YOLOv8x-worldv2yolov8x-worldv2.ptRilevamento di oggetti✅✅✅✅
  • Per riprodurre da zero i risultati ufficiali, devi preparare i dataset e avviare l'addestramento usando il codice fornito. La procedura di addestramento prevede la creazione di un dizionario dei dati e l'esecuzione del metodo train con un trainer personalizzato:

    from ultralytics import YOLOWorld
    from ultralytics.models.yolo.world.train_world import WorldTrainerFromScratch
    
    data = {
        "train": {
            "yolo_data": ["Objects365.yaml"],
            "grounding_data": [
                {
                    "img_path": "flickr30k/images",
                    "json_file": "flickr30k/final_flickr_separateGT_train.json",
                },
                {
                    "img_path": "GQA/images",
                    "json_file": "GQA/final_mixed_train_no_coco.json",
                },
            ],
        },
        "val": {"yolo_data": ["lvis.yaml"]},
    }
    
    model = YOLOWorld("yolov8s-worldv2.yaml")
    model.train(data=data, batch=128, epochs=100, trainer=WorldTrainerFromScratch)

Commenti