Ultralytics YOLO27: Iscriviti alla lista d'attesa.
Get Started
Lezioneprincipiante

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.

Una scrivania con un laptop che mostra un dataset di immagini etichettate, stampe fotografiche ordinate, post-it con le classi e una checklist del dataset

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.

Esito

Scrivi una descrizione dell'obiettivo di una pagina e trasforma la relativa metrica di successo in uno script di test di accettazione che stampa PASS o FAIL per qualsiasi modello.

Percorso rapido
Se sai già come muoverti, ecco la versione breve.
  1. Esprimi l'obiettivo aziendale in una frase misurabile con una scadenza.

  2. Scegli il più semplice dei sette task di visione che risponde all'obiettivo.

  3. Definisci da 3 a 10 classi con una frase ciascuna, indicando per ognuna un elemento simile che escludi.

  4. Scrivi il test di accettazione: metrica, soglia e un holdout mai visto. Poi eseguilo come codice.

  5. Elenca ciò che la v1 non gestirà.

Pratico

La descrizione dell'obiettivo di una pagina#

Output dei task di Ultralytics YOLO affiancati: rilevamento, posa, segmentazione, classificazione, OBB, segmentazione semantica e profondità

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:

VoceDomanda a cui rispondeEsempio di magazzino
Obiettivo aziendaleCosa cambia per l'azienda e in quale data?Ridurre del 30% gli incidenti sfiorati alle porte di carico entro sei mesi.
Task di visioneQual è l'output del modello?Rilevamento di oggetti: riquadri intorno a carrelli elevatori e persone.
ClassiCosa deve ricevere esattamente un'etichetta?forklift, person, pallet; tutto il resto è background.
Test di accettazioneQuale 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 ambitoCosa 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#

La stessa scena con un gatto e un cane interpretata in tre modi: la classificazione delle immagini chiede se si tratta di un gatto, il rilevamento di oggetti chiede cosa c'è e dove, e la segmentazione delle immagini chiede quali pixel appartengono a ciascun oggetto

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.

TaskCosa producono gli annotatoriImpegno richiesto per l'annotazioneSceglilo quando
ClassificazioneUn'etichetta per immagineMinimoÈ sufficiente una risposta per immagine
RilevamentoClasse + riquadro allineato agli assi per oggettoBassoDevi contare o localizzare gli oggetti
OBBClasse + riquadro ruotato per oggettoMedioGli oggetti sono lunghi e sottili o vengono ripresi dall'alto
PosaClasse + keypoint con nome per oggettoAltoLa posizione delle articolazioni o delle parti è importante
Segmentazione di istanzeClasse + poligono per oggettoAltoIl contorno di ogni oggetto è importante
Segmentazione semanticaUna classe per ogni pixelMassimoTi 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 acquisizioneTi serve la distanza di ogni pixel

Tipi di annotazione delle immagini su un casco di banane: la classificazione rivela la presenza, il rilevamento aggiunge posizione e conteggio, la segmentazione semantica mostra quali pixel appartengono alle banane e la segmentazione per istanze aggiunge dimensioni e forma di ogni banana

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.

La segmentazione per impostazione predefinita prosciuga il budget

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.

Se non sai descriverlo, chi annota non può etichettarlo

"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 test

Cosa indica ogni riga:

  • classes=[0] valuta solo person, 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. mp e mr sono 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.
La clausola di esclusione dal set di addestramento conta quanto il numero

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.

Provalo

Compila la tabella degli obiettivi in cinque righe per il tuo progetto e inviala alla persona responsabile del risultato aziendale. Rivedi ogni riga che mette in discussione. Poi copia acceptance_test.py, imposta l'ID della classe e le soglie e testalo sul modello preaddestrato, così il test esiste prima ancora del dataset. Risultato da consegnare: objective.md e un acceptance_test.py funzionante.

Criteri di completamento
La lezione è completata quando tutte le seguenti condizioni sono soddisfatte.
  • L'obiettivo aziendale è espresso in una frase misurabile con una scadenza e il responsabile lo ha approvato.

  • Ogni classe ha una definizione di una frase e almeno un elemento simile escluso, indicato esplicitamente.

  • acceptance_test.py viene eseguito e stampa PASS o FAIL per una metrica, una soglia e un set di holdout specificato.

Mostra la soluzione

Un esempio pratico di obiettivo per un altro progetto: una catena di supermercati che rileva gli spazi vuoti sugli scaffali.

VoceRisposta
Obiettivo aziendaleRidurre del 25% i minuti di esaurimento scorte per i 200 prodotti principali nell'arco di un trimestre.
Task di visioneRilevamento. Il negozio ha bisogno della posizione di ogni spazio vuoto, non del suo contorno, quindi i riquadri sono preferibili ai poligoni.
Classigap: 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 accettazioneRichiamo su gap ≥ 0.90 con precisione ≥ 0.80 su 400 immagini di 5 negozi non usati per l'addestramento.
Fuori ambitoPorte 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.

Prossimi passi

Poi trasforma l'obiettivo in una specifica del dataset che indichi quali immagini ti servono e quante per ciascun caso.

Accedi per salvare i progressi