Ultralytics YOLO27: Iscriviti alla lista d'attesa.
Get Started
Fondamenti della visione artificiale·Scegli un task·Lezione 3/10
Lezioneprincipiante

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.

Esito

Leggi nel codice i rilevamenti YOLO26 e scegli conf e iou in base al costo di un mancato rilevamento rispetto a un falso allarme.

Percorso rapido
Se sai già come muoverti, ecco la versione breve.
  1. Ogni rilevamento è composto da una classe, un riquadro e un punteggio di confidenza.

  2. conf elimina i riquadri con punteggi bassi (valore predefinito 0.25); iou determina quando NMS considera duplicati due riquadri (valore predefinito 0.7).

  3. I mancati rilevamenti sono costosi? Abbassa conf. I falsi allarmi sono evidenti? Alzala.

  4. Gli oggetti vicini scompaiono? Alza iou.

  5. La confidenza ordina i riquadri, ma non è una probabilità calibrata.

Pratico

Cosa restituisce un rilevatore#

Passeggiata sul lungomare con rilevamenti Ultralytics YOLO: persone, due ciclisti, un cane e due auto, ognuno con un riquadro contrassegnato dalla classe e dalla confidenza

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; xyxy fornisce 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:

AttributoFormatoUso tipico
boxes.xyxyCoordinate degli angoli in pixel (x1, y1, x2, y2)Ritaglio, disegno, regole di sovrapposizione
boxes.xywhCentro in pixel, larghezza e altezzaFiltri dimensionali, movimento
boxes.xyxynCoordinate degli angoli normalizzate tra 0 e 1Regole che restano valide al variare della risoluzione
boxes.xywhnCentro e dimensioni normalizzati tra 0 e 1File 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:

confRiquadri su bus.jpg
0.107
0.255
0.505
0.754

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.

Intersezione su unione su un uccello: riquadri predetti e di riferimento sovrapposti, con maschere corrispondenti; IoU è la loro sovrapposizione divisa per la loro unione

iouRiquadri su bus.jpgEffetto
0.35Rigida: le box sovrapposte vengono unite
0.75Predefinita
0.958Permissiva: 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 conteggiProva conf sulle immagini di validazione e scegli il valore con l'errore di conteggio più basso
Gli oggetti vicini reali scompaiono tra la follaAlza iou, ad es. da 0.7 a 0.8
Lo stesso oggetto riceve due boxAbbassa iou
Le classi hanno livelli di difficoltà diversiUsa 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#

Interpretare la confidenza come una probabilità

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.

Manca uno dei due elementi vicini? Controlla NMS

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.

Regolare i parametri su una sola immagine

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#

ErroreCosa non funzionaCorrezione tipica
Classe corretta, box imprecisaLocalizzazioneCriteri più rigorosi e coerenti per le box; imgsz più alto per gli oggetti piccoli
Box corretta, classe sbagliataClassificazionePiù esempi della coppia confusa oppure unisci le classi
Nessuna boxRecallPiù esempi di quella condizione: illuminazione, dimensioni, occlusione
Box sullo sfondoPrecisionImmagini 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.

Provalo

Esegui la soluzione con conf=0.05 e apri l'immagine salvata. Segna ogni box sotto 0.5 come vero o falso positivo e annota il motivo di ogni falso positivo. Poi scrivi il valore di conf che useresti per un contapersone su questa videocamera, con una frase di motivazione.

Criteri di completamento
La lezione è completata quando tutte le seguenti condizioni sono soddisfatte.
  • Hai un elenco di tutte le box sotto 0.5 in bus.jpg, ciascuna contrassegnata come vero o falso positivo con una motivazione.

  • Hai annotato un valore di conf per un contapersone e l'errore da cui protegge.

  • Sai spiegare, con la tabella iou, perché alzare iou fa ricomparire un oggetto vicino soppresso.

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.

Prossimi passi

Prossimo argomento: quando un rettangolo non basta e ti serve la forma esatta dell'oggetto.

Accedi per salvare i progressi