Scopri il rilevamento degli oggetti
Leggi l'output di un rilevatore — classe, riquadro, confidenza — e imposta le soglie di confidenza e IoU in base al costo di ogni errore.
La maggior parte dei sistemi di visione in produzione si basa sul rilevamento con logica aggiuntiva: contatori, tracciatori, avvisi nelle zone, sfocatura per la privacy. Quando uno di questi sistemi si comporta in modo anomalo, di solito la causa non è il modello, ma una soglia scelta senza pensarci. Se sai esattamente cosa restituisce un rilevatore e quali due parametri determinano l'elenco, puoi eseguire il debug di quasi tutto ciò che si basa su di esso.
Pratico
Cosa restituisce un rilevatore#

Ogni etichetta nell'immagine corrisponde a una riga dell'output: un nome di classe, un punteggio di confidenza e il riquadro che circonda l'oggetto. Un modello di rilevamento restituisce esattamente questo elenco:
- Classe — un indice intero associato a un nome tramite
result.names(0èperson,5èbus). - Riquadro — quattro numeri che localizzano l'oggetto;
xyxyfornisce le coordinate degli angoli superiore sinistro e inferiore destro in pixel. - Confidenza — un punteggio da 0 a 1 usato per ordinare e filtrare i rilevamenti.
Conteggio, avvisi, tracciamento e sfocatura sono operazioni che implementi nel codice usando queste righe.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]
for box in result.boxes:
name = result.names[int(box.cls)]
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{name:8} conf={float(box.conf):.2f} box=({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")bus conf=0.88 box=(0, 230, 803, 751)
person conf=0.87 box=(49, 398, 240, 902)
person conf=0.86 box=(223, 405, 345, 861)
person conf=0.85 box=(670, 395, 810, 880)
person conf=0.65 box=(0, 553, 60, 871)Riga per riga: il riquadro dell'autobus inizia da x=0 perché l'autobus esce dal bordo sinistro; tre persone hanno un punteggio compreso tra 0.85 e 0.87; la quarta persona, tagliata dal bordo sinistro, ottiene solo 0.65: il modello vede metà del corpo. Una bassa confidenza per gli oggetti tagliati è normale e la soglia ha effetto soprattutto in questi casi.
Ogni riquadro è disponibile in quattro formati: usa quello previsto dal tuo codice a valle:
| Attributo | Formato | Uso tipico |
|---|---|---|
boxes.xyxy | Coordinate degli angoli in pixel (x1, y1, x2, y2) | Ritaglio, disegno, regole di sovrapposizione |
boxes.xywh | Centro in pixel, larghezza e altezza | Filtri dimensionali, movimento |
boxes.xyxyn | Coordinate degli angoli normalizzate tra 0 e 1 | Regole che restano valide al variare della risoluzione |
boxes.xywhn | Centro e dimensioni normalizzati tra 0 e 1 | File di etichette YOLO |
Dai candidati all'elenco finale#
Internamente, il modello assegna un punteggio a molti riquadri candidati per ogni oggetto. Due filtri li trasformano nell'elenco che visualizzi:
Filtro di confidenza. conf elimina i riquadri al di sotto di una soglia; il valore predefinito in fase di predizione è 0.25. Nell'immagine dell'autobus, il conteggio cambia rapidamente:
conf | Riquadri su bus.jpg |
|---|---|
| 0.10 | 7 |
| 0.25 | 5 |
| 0.50 | 5 |
| 0.75 | 4 |
Filtro dei duplicati. La soppressione non massima (NMS) mantiene il riquadro con la confidenza più alta ed elimina gli altri riquadri della stessa classe che si sovrappongono a esso per più di iou (valore predefinito 0.7). La sovrapposizione si misura come intersezione su unione: l'area condivisa divisa per l'area complessiva.

iou | Riquadri su bus.jpg | Effetto |
|---|---|---|
| 0.3 | 5 | Rigida: le box sovrapposte vengono unite |
| 0.7 | 5 | Predefinita |
| 0.95 | 8 | Permissiva: i quasi duplicati restano |
Scegli le soglie in base al costo degli errori#
| Se… | Allora… |
|---|---|
| Un mancato rilevamento costa caro (avvisi di sicurezza, difetti) | Abbassa conf e accetta qualche falso allarme |
| Un falso allarme è visibile agli utenti (ricerca, tagging) | Alza conf |
| Devi riportare i conteggi | Prova conf sulle immagini di validazione e scegli il valore con l'errore di conteggio più basso |
| Gli oggetti vicini reali scompaiono tra la folla | Alza iou, ad es. da 0.7 a 0.8 |
| Lo stesso oggetto riceve due box | Abbassa iou |
| Le classi hanno livelli di difficoltà diversi | Usa il valore più basso di conf che ti serve, poi filtra per classe nel codice |
Il monitoraggio della sicurezza in magazzino è il classico caso in cui serve una soglia bassa; la modalità Predict elenca tutti gli argomenti di inferenza.
Insidie#
Sintomo: "il modello è sicuro all'88% che si tratti di un autobus" e soglie scelte a intuito. Soluzione: considera la confidenza un punteggio di ordinamento. In YOLO26 un unico punteggio copre sia "c'è un oggetto" sia "è questa classe" e non è calibrato: scegli la soglia in base ai dati di validazione, non al significato del numero.
Quando due persone sono spalla a spalla, i loro riquadri si sovrappongono molto e NMS può eliminare una persona reale come "duplicato". Aumenta iou e il secondo riquadro ricompare. YOLO26 include anche una testa end-to-end che non ha bisogno di NMS; passa nms=False per usarla.
Sintomo: una soglia che sembra perfetta sull'immagine dimostrativa non funziona con la videocamera reale. Soluzione: prova diverse soglie su un set di validazione acquisito dalla videocamera di produzione; una sola immagine mostra soltanto l'effetto dei parametri.
Quattro modi di sbagliare#
| Errore | Cosa non funziona | Correzione tipica |
|---|---|---|
| Classe corretta, box imprecisa | Localizzazione | Criteri più rigorosi e coerenti per le box; imgsz più alto per gli oggetti piccoli |
| Box corretta, classe sbagliata | Classificazione | Più esempi della coppia confusa oppure unisci le classi |
| Nessuna box | Recall | Più esempi di quella condizione: illuminazione, dimensioni, occlusione |
| Box sullo sfondo | Precision | Immagini con hard negative di ciò che ha ingannato il modello |
Due elenchi velocizzano la diagnosi: veri positivi con bassa confidenza (il modello è incerto sugli oggetti reali) e falsi positivi con alta confidenza (è convinto di ciò che non è corretto). Indicano correzioni diverse.
Mostra la soluzione
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", conf=0.05, save=True, verbose=False)[0]
for box in sorted(result.boxes, key=lambda b: -float(b.conf)):
name, conf = result.names[int(box.cls)], float(box.conf)
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{conf:.2f} {name:10} ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")0.88 bus (0, 230, 803, 751)
0.87 person (49, 398, 240, 902)
0.86 person (223, 405, 345, 861)
0.85 person (670, 395, 810, 880)
0.65 person (0, 553, 60, 871)
0.18 person (0, 600, 40, 871)
0.12 stop sign (0, 252, 35, 326)
0.08 handbag (43, 732, 78, 812)
0.07 skateboard (669, 822, 808, 881)
0.06 handbag (225, 634, 291, 705)Tutte le box sotto 0.5 sono falsi positivi. La box a 0.18 di person duplica la persona a 0.65 tagliata dal bordo sinistro. Il valore a 0.12 di stop sign corrisponde a un vero cartello stradale con la classe sbagliata. Le borse e lo skateboard si trovano su mani e scarpe. Tutti gli oggetti reali hanno un punteggio superiore a 0.6, quindi conf=0.5 mantiene tutte e quattro le persone ed elimina tutto il rumore per un contapersone: protegge dal doppio conteggio. Prima di metterlo in produzione, verificalo su un set di validazione acquisito con la videocamera reale: la persona tagliata con punteggio 0.65 dimostra quanto gli oggetti reali possano essere vicini alla soglia.