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.
Pratico
Predici e stampa ogni rilevamento#

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.65a(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.
| Attributo | Contiene |
|---|---|
boxes | Rilevamenti: pixel xyxy, formato centro normalizzato xywhn, conf, cls e id quando si usa il tracking |
masks, keypoints, obb, probs | Output dei modelli di segmentazione, posa, OBB e classificazione (None per un modello di rilevamento) |
names | Dizionario da indice della classe → nome della classe |
orig_img, orig_shape | L'immagine di input come array NumPy e le sue dimensioni altezza × larghezza |
speed | Tempi di preelaborazione, inferenza e postelaborazione in ms |
path, save_dir | Origine 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 riscontrato | Argomento | Predefinita | Modifica |
|---|---|---|---|
| Mancati rilevamenti: un oggetto visibile non viene racchiuso in un riquadro | conf | 0.25 | Abbassa, ad esempio 0.1 |
| Falsi positivi: riquadri intorno a elementi inesistenti | conf | 0.25 | Alza, ad esempio 0.5 |
| Due riquadri sullo stesso oggetto | iou | 0.7 | Abbassa: la soglia di sovrapposizione (IoU) della NMS per unire i duplicati |
| Oggetti piccoli e distanti non rilevati | imgsz | 640 | Alza, ad esempio 1280 (arrotondato a un multiplo di 32) |
| Sono rilevanti solo alcune classi | classes | tutte | ad esempio classes=[0] per le persone |
| Hardware errato | device | auto | cpu, 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 stopCon 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#
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().
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.
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.
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.59summary() 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.