Parti dall'obiettivo aziendale
Trasforma un obiettivo aziendale in un task di visione, definisci le classi e crea un test di accettazione eseguibile come codice, prima di raccogliere anche una sola immagine.

Un team di magazzino fotografa tutto per un mese, poi scopre che il responsabile della sicurezza si interessa solo alle persone vicino ai carrelli elevatori in movimento e che metà delle etichette va rifatta. Una descrizione dell'obiettivo di una pagina, concordata prima della prima foto, evita questo problema. Richiede un pomeriggio e determina ogni scelta successiva di questo corso: cosa raccogliere, cosa etichettare e quando il modello è abbastanza valido da essere rilasciato.
Pratico
La descrizione dell'obiettivo di una pagina#

Cinque righe rispondono alle domande da cui dipende ogni passaggio successivo. La guida Definire gli obiettivi del progetto approfondisce gli stessi argomenti. Ecco un esempio compilato per un magazzino, su cui si basa questo corso:
| Voce | Domanda a cui risponde | Esempio di magazzino |
|---|---|---|
| Obiettivo aziendale | Cosa cambia per l'azienda e in quale data? | Ridurre del 30% gli incidenti sfiorati alle porte di carico entro sei mesi. |
| Task di visione | Qual è l'output del modello? | Rilevamento di oggetti: riquadri intorno a carrelli elevatori e persone. |
| Classi | Cosa deve ricevere esattamente un'etichetta? | forklift, person, pallet; tutto il resto è background. |
| Test di accettazione | Quale valore significa «si può rilasciare»? | Recall su person ≥ 0,95 con precision ≥ 0,85 su 500 frame acquisiti da telecamere non usate nell'addestramento. |
| Fuori ambito | Cosa non prometterà la v1? | Banchine completamente buie, persone interamente nascoste dietro gli scaffali, transpallet manuali. |
Fissa la pagina in un posto visibile a tutto il team. Se in seguito qualcuno contesta una voce, modifica prima la pagina e poi il dataset.
Scegli il task più semplice che risponde alla domanda#

Il task determina cosa disegnano gli annotatori, e questo determina gran parte del budget per l'annotazione. Segui questo albero decisionale e fermati al primo task che risponde alla domanda aziendale:
Ultralytics YOLO supporta sette task. Per pianificare il dataset, conta il costo di annotazione di ciascuno; Fondamenti di visione artificiale li confronta in dettaglio nella lezione sui task di visione.
| Task | Cosa producono gli annotatori | Impegno richiesto per l'annotazione | Sceglilo quando |
|---|---|---|---|
| Classificazione | Un'etichetta per immagine | Minimo | È sufficiente una risposta per immagine |
| Rilevamento | Classe + riquadro allineato agli assi per oggetto | Basso | Devi contare o localizzare gli oggetti |
| OBB | Classe + riquadro ruotato per oggetto | Medio | Gli oggetti sono lunghi e sottili o vengono ripresi dall'alto |
| Posa | Classe + keypoint con nome per oggetto | Alto | La posizione delle articolazioni o delle parti è importante |
| Segmentazione di istanze | Classe + poligono per oggetto | Alto | Il contorno di ogni oggetto è importante |
| Segmentazione semantica | Una classe per ogni pixel | Massimo | Ti servono regioni, non oggetti da contare |
| Stima della profondità | Nessun elemento disegnato: una mappa di profondità per immagine, solitamente ottenuta da un sensore di profondità | Dipende dall'hardware di acquisizione | Ti serve la distanza di ogni pixel |

Leggi il pannello delle banane come un listino prezzi: il rilevamento fornisce già presenza, posizione e conteggio, mentre solo i due pannelli di segmentazione aggiungono dimensioni e forma, a un costo di etichettatura molto più alto. Se all'azienda serve solo sapere "quante banane", la risposta è il rilevamento e i poligoni sono budget sprecato.
Spesso i team scelgono la segmentazione perché sembra più precisa, per poi esaurire il budget per l'etichettatura prima che il dataset includa turni notturni, pioggia o il secondo sito. I poligoni costano diverse volte più dei riquadri per ogni oggetto. Scegli la segmentazione solo quando una riga dell'obiettivo richiede proprio il contorno, ad esempio per misurare un'area o ritagliare una maschera.
Definisci classi applicabili dagli annotatori#
Una classe è utile solo se due annotatori etichettano allo stesso modo lo stesso oggetto. Definisci ciascuna classe con una frase che indichi un elemento simile che esclude:
forklift: un carrello elevatore a motore, comprese le forche e il montante. Esclude i transpallet manuali.person: qualsiasi persona, anche parzialmente visibile, seduta o all'interno della cabina di un veicolo. Esclude riflessi e poster.pallet: un pallet di legno o plastica, carico o vuoto. Esclude le pile di casse senza una base di pallet.
Poi scegli deliberatamente il livello di dettaglio. Le classi generiche ("veicolo") costano meno e convergono più rapidamente; quelle specifiche ("berlina", "pick-up") sono più utili nelle fasi successive, ma più difficili da mantenere coerenti. Parti dalle esigenze aziendali. In seguito puoi accorpare le etichette specifiche in classi generiche con una riga di codice, ma non puoi mai suddividere le classi generiche senza rietichettare.
"Qualsiasi cosa sembri pericolosa" o "roba che blocca il corridoio" non sono classi. Richiedono una valutazione personale da parte di ogni annotatore e un modello addestrato su valutazioni incoerenti impara l'incoerenza. Riformula una classe vaga finché un nuovo annotatore non riesce ad applicarla basandosi solo sulla definizione, oppure trasformala in una regola da applicare dopo il rilevamento (per esempio, "qualsiasi pallet all'interno del poligono del corridoio").
Trasforma la metrica in un test di accettazione eseguibile#
Scegli la metrica che corrisponde al costo di un errore:
- Un mancato rilevamento costa caro (sicurezza, difetti): stabilisci una soglia di richiamo per quella classe.
- Un falso allarme costa caro (rifiuto automatico di parti, avvisi al personale): stabilisci una soglia di precisione.
- Tutte le classi hanno la stessa importanza (conteggio, inventario): stabilisci una soglia per l'AP di ogni classe, così nessuna classe può nascondersi dietro la media.
La guida alle metriche di prestazione di YOLO spiega ciascuna metrica. Poi scrivi il test sotto forma di codice, così la domanda "è abbastanza valido?" non è più oggetto di discussione. Questo script funziona oggi con un modello preaddestrato sul set dimostrativo COCO8 e, in seguito, con il tuo checkpoint e il tuo set di holdout:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # later: your fine-tuned runs/detect/train/weights/best.pt
metrics = model.val(data="coco8.yaml", classes=[0], verbose=False) # 0 = person; later: your holdout YAML
precision, recall = metrics.box.mp, metrics.box.mr
print(f"person: precision={precision:.2f} recall={recall:.2f}")
print("PASS" if recall >= 0.95 and precision >= 0.85 else "FAIL: below the acceptance test") all 4 10 0.939 0.8 0.848 0.387
person: precision=0.94 recall=0.80
FAIL: below the acceptance testCosa indica ogni riga:
classes=[0]valuta soloperson, così le altre classi non possono gonfiare il risultato. Usa l'ID della tua classe di sicurezza.- La riga del validatore mostra 4 immagini con 10 persone etichettate.
mpemrsono precisione e richiamo alla soglia di confidenza che le bilancia al meglio (F1 massimo). - Un modello COCO preaddestrato rileva 8 delle 10 persone, quindi il richiamo è 0.80: preciso, ma non abbastanza sicuro. Questo FAIL dimostra che il test funziona. In questo corso, un FAIL rimanda ai dati, non agli iperparametri.
Un test ricavato dalle stesse videocamere e dagli stessi giorni del set di addestramento misura la memoria, non la prontezza. Specifica nell'obiettivo i dati esclusi dall'addestramento ("videocamere non usate nell'addestramento", "le ultime due settimane di riprese") e crea il set seguendo Suddividere correttamente il dataset.
Specifica cosa non farà la v1#
Nessun modello è perfetto, quindi definisci in anticipo quali mancate rilevazioni sono accettabili: condizioni per cui non farai promesse (nebbia fitta, buio totale), elementi simili che accetterai vengano confusi e classi rare rimandate alla v2. Questa riga evita che un modello conforme all'obiettivo venga valutato rispetto a un'asticella del 100% mai dichiarata e indica al team di raccolta dove non investire ancora tempo.
Mostra la soluzione
Un esempio pratico di obiettivo per un altro progetto: una catena di supermercati che rileva gli spazi vuoti sugli scaffali.
| Voce | Risposta |
|---|---|
| Obiettivo aziendale | Ridurre del 25% i minuti di esaurimento scorte per i 200 prodotti principali nell'arco di un trimestre. |
| Task di visione | Rilevamento. Il negozio ha bisogno della posizione di ogni spazio vuoto, non del suo contorno, quindi i riquadri sono preferibili ai poligoni. |
| Classi | gap: uno spazio vuoto sullo scaffale largo almeno quanto un prodotto; esclude gli spazi coperti da un cliente o da un carrello. price_tag: un'etichetta sul bordo dello scaffale; esclude gli adesivi promozionali. |
| Test di accettazione | Richiamo su gap ≥ 0.90 con precisione ≥ 0.80 su 400 immagini di 5 negozi non usati per l'addestramento. |
| Fuori ambito | Porte dei congelatori con riflessi, espositori di testata, reparto ortofrutta. |
Il richiamo viene prima perché uno spazio vuoto non rilevato costa una vendita, mentre un falso allarme costa a un dipendente una breve camminata. acceptance_test.py cambia in soli tre punti: data="holdout_stores.yaml" (i cinque negozi mai visti), classes=[0] (0 diventa gap) e le soglie recall >= 0.90 and precision >= 0.80.