Ultralytics YOLO27: Iscriviti alla lista d'attesa.
Get Started
Addestra il tuo primo modello YOLO·Predici·Lezione 2/10
Lezioneprincipiante

Predici su un'immagine

Esegui da Python un modello YOLO26 preaddestrato, leggi classi, confidenze e riquadri in pixel dai risultati e regola gli argomenti che risolvono la maggior parte dei mancati rilevamenti.

Ogni utilizzo concreto di un rilevatore — contare le scorte su uno scaffale, ritagliare volti da sfocare, inviare riquadri a un'API JSON — inizia con la corretta lettura dell'oggetto dei risultati. Basta sbagliare un dettaglio, come indicizzare i nomi delle classi con un tensore, perché l'app vada in crash alla prima immagine.

Un modello YOLO26 di rilevamento preaddestrato conosce già le 80 classi COCO. In questa lezione eseguirai la modalità Predict da Python, estrarrai dai risultati tutti i campi utili e imparerai quale argomento modificare in caso di mancati rilevamenti, duplicati e oggetti piccoli. In seguito, anche il tuo modello addestrato restituirà lo stesso oggetto dei risultati.

Esito

Puoi scrivere uno script Python che esegue YOLO26 sulle immagini e stampa il nome della classe, la confidenza e il riquadro in pixel di ogni rilevamento, e sai quale argomento risolve ciascun tipo di mancato rilevamento.

Percorso rapido
Se sai già come muoverti, ecco la versione breve.
  1. Carica una volta: model = YOLO('yolo26n.pt'); poi result = model(source)[0].

  2. Itera su result.boxes; converti con int(box.cls), float(box.conf), box.xyxy[0].tolist().

  3. Associa gli indici delle classi ai nomi con result.names[int(box.cls)].

  4. Regola conf, iou, imgsz e classes per ogni chiamata.

Pratico

Predici e stampa ogni rilevamento#

Rilevamenti Ultralytics YOLO su una passeggiata sul lungomare: riquadri con etichette e punteggi di confidenza intorno a persone, biciclette, un cane e automobili

Chiamare il modello su una sorgente esegue la modalità Predict e restituisce un elenco con un oggetto Results per ogni immagine. Con una sola immagine, leggi results[0].

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")

result = results[0]
for box in result.boxes:
    name = result.names[int(box.cls)]
    conf = float(box.conf)
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    print(f"{name:>8} {conf:.2f}  ({x1:.0f}, {y1:.0f}) -> ({x2:.0f}, {y2:.0f})")

result.save("bus_annotated.jpg")

Output reale di predict.py, dopo la consueta riga di log:

     bus 0.88  (0, 230) -> (803, 751)
  person 0.87  (49, 398) -> (240, 902)
  person 0.86  (223, 405) -> (345, 861)
  person 0.85  (670, 395) -> (810, 880)
  person 0.65  (0, 553) -> (60, 871)

Come leggerlo:

  • bus 0.88: nome della classe e confidenza. I riquadri sono ordinati per confidenza, dal valore più alto al più basso.
  • (0, 230) -> (803, 751): angoli superiore sinistro e inferiore destro in pixel dell'immagine originale di 810×1080, con origine in alto a sinistra. Puoi usare direttamente queste coordinate per ritagliare o disegnare.
  • person 0.65 a (0, 553): una quinta persona, tagliata dal bordo sinistro, ottiene un punteggio più basso. Di solito succede con gli oggetti parziali.

result.save() salva l'immagine annotata; result.show() la apre in una finestra.

Scopri cosa contiene un risultato#

Ogni attività restituisce lo stesso tipo Results; cambiano solo i campi valorizzati. Trovi l'interfaccia completa nella guida all'uso di Python.

AttributoContiene
boxesRilevamenti: pixel xyxy, formato centro normalizzato xywhn, conf, cls e id quando si usa il tracking
masks, keypoints, obb, probsOutput dei modelli di segmentazione, posa, OBB e classificazione (None per un modello di rilevamento)
namesDizionario da indice della classe → nome della classe
orig_img, orig_shapeL'immagine di input come array NumPy e le sue dimensioni altezza × larghezza
speedTempi di preelaborazione, inferenza e postelaborazione in ms
path, save_dirOrigine dell'input e destinazione in cui sono stati scritti gli output

Per il rilevamento di oggetti ti serve soprattutto boxes, ovvero i riquadri di delimitazione. result.summary() restituisce gli stessi rilevamenti come elenco di semplici dizionari, pronti per un'API JSON.

Regola la predizione#

Le impostazioni predefinite sono adatte alla maggior parte delle immagini. Se non lo sono, modifica un argomento alla volta:

Problema riscontratoArgomentoPredefinitaModifica
Mancati rilevamenti: un oggetto visibile non viene racchiuso in un riquadroconf0.25Abbassa, ad esempio 0.1
Falsi positivi: riquadri intorno a elementi inesistenticonf0.25Alza, ad esempio 0.5
Due riquadri sullo stesso oggettoiou0.7Abbassa: la soglia di sovrapposizione (IoU) della NMS per unire i duplicati
Oggetti piccoli e distanti non rilevatiimgsz640Alza, ad esempio 1280 (arrotondato a un multiplo di 32)
Sono rilevanti solo alcune classiclassestuttead esempio classes=[0] per le persone
Hardware erratodeviceautocpu, mps o un indice GPU come 0

La confidenza cambia il risultato, non solo il conteggio. Sulla stessa immagine dell'autobus:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model("https://ultralytics.com/images/bus.jpg", conf=0.5, classes=[0])  # 4 persons
model("https://ultralytics.com/images/bus.jpg", conf=0.1)  # 5 persone, 1 autobus, 1 segnale di stop

Con conf=0.1 il modello segnala anche un segnale di stop di cui non era sicuro. Abbassare conf è il modo più rapido per vedere cosa un modello ha quasi rilevato. Tutti gli altri argomenti sono nella documentazione di riferimento della configurazione.

Quando una predizione non restituisce risultati, segui questi passaggi:

Esegui su più immagini#

Passa un elenco, una cartella o un pattern glob come "photos/*.jpg". Predict usa batch=1 per impostazione predefinita; imposta batch per elaborare più immagini alla volta con il modello: su una GPU è molto più veloce.

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, batch=2):
    print(result.path, len(result.boxes), result.verbose())
image0.jpg 5 4 persons, 1 bus,
image1.jpg 3 2 persons, 1 tie,

Evita questi errori#

Usare un tensore per indicizzare i nomi

Sintomo: KeyError: tensor([5.]). Causa: box.cls e box.conf sono tensori PyTorch e result.names è un dizionario indicizzato da int. Soluzione: converti prima: result.names[int(box.cls)], float(box.conf), box.xyxy[0].tolist().

Caricare il modello a ogni chiamata

Sintomo: una funzione di supporto che chiama YOLO("yolo26n.pt") al suo interno è lenta. Su una CPU di un portatile, ricaricare il modello per ogni immagine ha richiesto 71 ms, contro 25 ms con il modello caricato una sola volta. Soluzione: crea il modello una volta all'avvio e riutilizzalo per ogni immagine.

Centinaia di immagini o un video? Elaborali in streaming

model(list_or_folder) raccoglie in memoria tutti gli oggetti Results prima di restituirli. Per cartelle di grandi dimensioni e per tutti i video, passa stream=True e usa un ciclo: i risultati arrivano uno alla volta. La lezione sui video approfondisce l'argomento.

Provalo

Scrivi top3.py: carica yolo26n.pt una sola volta, eseguilo su bus.jpg, zidane.jpg e una tua foto, quindi stampa il conteggio dei rilevamenti di ogni immagine e le tre classi con la confidenza più alta. Poi esegui di nuovo l'immagine con meno rilevamenti a conf=0.1 e scrivi una frase su ciò che è apparso.

Criteri di completamento
La lezione è completata quando tutte le seguenti condizioni sono soddisfatte.
  • Lo script stampa per ogni immagine il conteggio e le prime 3 classi con le rispettive confidenze, senza un KeyError.

  • Hai confrontato un'immagine a conf=0.25 e conf=0.1 e hai annotato cosa è cambiato.

  • Sai indicare quale argomento modificheresti per i mancati rilevamenti, i riquadri duplicati e gli oggetti piccoli.

Mostra la soluzione
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load once
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]

for result in model(images, verbose=False):
    top3 = sorted(result.summary(), key=lambda d: d["confidence"], reverse=True)[:3]
    print(f"{result.path}: {len(result.boxes)} detections")
    for d in top3:
        print(f"  {d['name']:>8} {d['confidence']:.2f}")
image0.jpg: 5 detections
       bus 0.90
    person 0.85
    person 0.85
image1.jpg: 3 detections
    person 0.89
    person 0.79
       tie 0.59

summary() restituisce già nomi semplici e numeri in virgola mobile, quindi non ci sono tensori da convertire. Le confidenze differiscono leggermente da predict.py perché l'elenco di immagini viene riempito fino a raggiungere una forma condivisa. Con conf=0.1, bus.jpg aggiunge un segnale di stop.

Prossimi passi

Hai usato il modello più piccolo. Ora decidi quale dimensione di YOLO26 il tuo progetto dovrebbe effettivamente addestrare e distribuire.

Accedi per salvare i progressi