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

Definisci la specifica del dataset

Pianifica scenari, quote, variabilità, casi limite e immagini di sfondo prima della raccolta, e dimensiona il piano in base agli obiettivi di volume di Ultralytics.

I team senza una specifica finiscono per avere 5.000 foto diurne ben illuminate scattate da una sola fotocamera e un modello che fallisce al crepuscolo il primo giorno in produzione. Una specifica del dataset è una lista della spesa di immagini: ogni scenario che il modello deve gestire, quante immagini servono per ciascuno e quali casi rari sovracampionare. Ci vuole un'ora per scriverla e determina dove concentrare gli sforzi di raccolta.

Esito

Prepara una tabella di scenari con quote che copra le dimensioni della variabilità e i casi limite, e misura quanto un dataset etichettato si discosta dagli obiettivi di volume per la produzione.

Percorso rapido
Se sai già come muoverti, ecco la versione breve.
  1. Inserisci gli scenari in righe: fotocamera, luogo, orario e condizione, ciascuno con la propria quota.

  2. Dimensiona le quote puntando a ≥1.500 immagini e ≥10.000 istanze etichettate per classe in produzione.

  3. Dedica una riga a ogni caso limite noto e sovracampionalo.

  4. Riserva lo 0–10% delle immagini allo sfondo, senza oggetti.

Pratico

Dove si colloca la specifica#

La specifica è il ponte tra l'obiettivo e la fotocamera. Guida la raccolta ed è la pagina a cui tornerai quando il primo modello non raggiungerà l'obiettivo:

Il ciclo torna alla specifica, non alle impostazioni di addestramento: un obiettivo mancato di solito indica uno scenario non coperto dalla specifica. La guida ai passaggi di un progetto di CV descrive lo stesso ciclo di vita.

Inserisci gli scenari in righe#

Uno scenario è una combinazione di condizioni di acquisizione che il modello deve gestire. Le righe con le quote rendono visibili le lacune prima che qualcuno prenda in mano una fotocamera:

ScenarioFotocamereLuoghiOra del giornoCondizioneQuotaNote
banchina-diurnacam-1 a cam-4baie A–C08:00–17:00qualsiasi1,200ore di maggiore attività
banchina-notturnacam-1 a cam-4baie A–C22:00–04:00qualsiasi400illuminazione al sodio, meno persone
carico-pioggiacam-2, cam-3baia Bqualsiasisolo pioggia200raro ma critico
impilatiqualsiasiqualsiasiqualsiasipallet > 2 di altezza150nasconde le persone dietro di essi
sfondoqualsiasiqualsiasiqualsiasibanchina vuota150nessun oggetto, nessuna etichetta

Uno scenario che non riesci a descrivere per iscritto è uno scenario che il modello non vedrà durante l'addestramento, e sarà proprio quello a causare un problema in produzione.

Dimensiona la specifica in base agli obiettivi di volume#

I consigli di Ultralytics per ottenere i migliori risultati di addestramento indicano alcune regole pratiche per la produzione:

ObiettivoConsiglio
Immagini per classe≥ 1,500
Istanze etichettate per classe≥ 10,000
Immagini di sfondo (senza etichette)0–10% del dataset; COCO è circa all'1%
VarietàOrari, stagioni, condizioni meteorologiche, illuminazione, angolazioni, fonti e fotocamere diversi

Questi sono i parametri di riferimento per un modello destinato alla produzione. Qualche centinaio di oggetti etichettati per classe basta per iniziare a sperimentare, e il primo modello è il modo più rapido per capire quali scenari richiedono più dati. Per vedere quanto un dataset si discosta dai parametri, contalo. Questo script funziona su COCO128, un sottoinsieme di COCO da 128 immagini che viene scaricato automaticamente:

from collections import Counter
from pathlib import Path

from ultralytics.data.utils import IMG_FORMATS, check_det_dataset, img2label_paths

IMAGES_PER_CLASS, INSTANCES_PER_CLASS = 1500, 10_000  # Ultralytics production targets

data = check_det_dataset("coco128.yaml")  # downloads COCO128 (~7 MB) on first run; swap in your data YAML
images = [p for p in Path(data["train"]).rglob("*.*") if p.suffix[1:].lower() in IMG_FORMATS]
image_count, instance_count, background = Counter(), Counter(), 0
for label in map(Path, img2label_paths([str(p) for p in images])):
    classes = [int(r.split()[0]) for r in label.read_text().splitlines() if r.strip()] if label.exists() else []
    instance_count.update(classes)
    image_count.update(set(classes))
    background += not classes

print(f"{len(images)} images, {background} background ({background / len(images):.0%}, target 0-10%)")
print(f"{'class':>12} {'images':>7} {'instances':>10} {'of target':>10}")
ranked = instance_count.most_common()
for cls, n in ranked[:3] + ranked[-3:]:  # best and worst covered classes
    coverage = min(image_count[cls] / IMAGES_PER_CLASS, n / INSTANCES_PER_CLASS)
    print(f"{data['names'][cls]:>12} {image_count[cls]:>7} {n:>10} {coverage:>10.1%}")

never_labeled = [name for i, name in data["names"].items() if i not in instance_count]
print(f"{len(never_labeled)} classes in names with zero labels: {never_labeled[:4]} ...")
128 images, 2 background (2%, target 0-10%)
       class  images  instances  of target
      person      61        254       2.5%
         car      12         46       0.5%
         cup      10         36       0.4%
        bear       1          1       0.0%
      banana       1          1       0.0%
        skis       1          1       0.0%
9 classes in names with zero labels: ['fire hydrant', 'parking meter', 'sheep', 'cow'] ...

Come interpretarlo:

  • La copertura è il valore minore tra la proporzione di immagini e quella di istanze, perché una classe ha bisogno di entrambe. Anche person, la classe con la copertura migliore, raggiunge solo il 2,5% del parametro di riferimento per la produzione.
  • Le classi con una sola istanza (bear, banana, skis) non possono essere apprese né valutate. Nel tuo dataset, raccogli altre istanze oppure escludi le classi dalla v1.
  • Le classi senza etichette sono elencate nel file YAML, ma non vengono mai disegnate. Il modello continua comunque a dedicare loro capacità predittiva. Rimuovile da names oppure raccoglile prima dell'addestramento.

Copri le dimensioni della variabilità#

Rilevamento YOLO di Ultralytics su una passeggiata sul lungomare: persone e ciclisti vicino alla fotocamera, un cane e auto a distanze diverse, ciascuno con un riquadro etichettato e un punteggio di confidenza

Un singolo fotogramma include già persone vicine e lontane, biciclette, un cane e auto. Una specifica reale deve pianificare intenzionalmente questa varietà. Per ogni dimensione, indica se la specifica la copre oppure perché non è pertinente; le righe vuote rappresentano scenari che scoprirai solo in produzione:

DimensioneEsempi
OraGiorno, notte, alba, tramonto
MeteoSole, cielo coperto, pioggia, nebbia, neve
IlluminazioneLuminosa, fioca, abbagliante, ombre nette, fonti miste
TelecameraModello, obiettivo, altezza di montaggio, campo visivo
GeografiaSiti, città, paesi
Persone e operatoriTurni, team, uniformi, dispositivi di protezione
Varianti del prodottoSKU, revisioni del packaging, colori
Dimensione degli oggettiVicini e grandi, a media distanza, lontani e piccoli
OcclusioneAssente, parziale, marcata, dietro un vetro
Condizioni delle attrezzatureObiettivi sporchi o appannati, pallet danneggiati, segnaletica a pavimento consumata

La variabilità conta più del volume: 1.500 immagini distribuite tra queste righe valgono più di 5.000 immagini riprese da una sola telecamera a mezzogiorno.

Pianifica le immagini di sfondo e i casi limite#

Le immagini di sfondo sono fotogrammi senza oggetti etichettati, come una banchina vuota. Insegnano al modello che non c'è nulla e riducono i falsi positivi.

Come viene memorizzata un'immagine di sfondo

Nel formato Ultralytics YOLO, un'immagine di sfondo è semplicemente un'immagine con un file di etichette vuoto o senza file di etichette. L'addestramento le conta entrambe nella riga di scansione (… 1200 images, 90 backgrounds, 0 corrupt). Verifica che il numero corrisponda all'obiettivo dello 0–10% prima della prima epoca.

I casi limite includono occlusioni marcate, oggetti tagliati dal bordo del fotogramma, orientamenti insoliti, oggetti impilati e oggetti simili, come il montante di un carrello elevatore accanto a una colonna d'acciaio. Assegna a ciascuno una riga di quota dedicata.

La frequenza naturale penalizza i casi limite

Se un fotogramma ogni 200 mostra una persona dietro pallet impilati, un dataset raccolto con frequenza naturale ne contiene circa 7 su 1.500: troppo poche per imparare. Sovracampiona intenzionalmente i casi limite: la loro quota dovrebbe essere molto superiore alla loro percentuale nelle riprese reali.

La specifica non deve essere completa

Non riuscirai a pensare a ogni scenario sulla carta. Definisci una specifica abbastanza accurata, addestra rapidamente un primo modello e lascia che i suoi errori rivelino gli scenari che ti sono sfuggiti.

Provalo

Prepara una tabella degli scenari per il tuo progetto con 5–10 righe, ciascuna con una quota numerica, oltre a una riga per lo sfondo e una per ogni caso limite noto. Esaminala con qualcuno che lavora nel sito di deployment e aggiungi ogni scenario che ti indica. Poi esegui volume_gap.py su tutti i dati etichettati che hai già (o su COCO128) e annota le classi con la copertura migliore e peggiore. Risultato: spec.md con la tabella e i valori di copertura.

Criteri di completamento
La lezione è completata quando tutte le seguenti condizioni sono soddisfatte.
  • La tabella degli scenari ha almeno 5 righe, ciascuna con una quota numerica, oltre alle righe per lo sfondo e i casi limite.

  • Sono coperte almeno 5 delle 10 dimensioni di variabilità, oppure sono esplicitamente escluse.

  • Le quote raggiungono almeno gli obiettivi di immagini e istanze per classe, oppure la differenza è documentata come eccezione della versione v1.

Mostra la soluzione

Le quote si basano sull'obiettivo di istanze, non solo su quello di immagini. Supponiamo che un sistema di conteggio in un parcheggio abbia due classi e che i video pilota mostrino in media 3 auto e 0,5 camion per immagine:

ClasseIstanze per immagineImmagini necessarie per 10.000 istanzeImmagini necessarie per raggiungere il minimo di 1.500Piano
car3.0≈ 3,3001,5003.300 immagini
truck0.5≈ 20,0001,500Acquisizione mirata all'ingresso di carico, dove i camion sono 10× più frequenti

Le auto sono coperte dai video ordinari. Per i camion servirebbero 20.000 immagini casuali, quindi la specifica aggiunge una riga dedicata a uno scenario (ingresso di carico, giorni feriali dalle 06:00 alle 10:00) invece di raccogliere sei volte più immagini di tutto. Aggiungi una riga per lo sfondo pari a circa il 5% (parcheggio vuoto di notte) e righe per i casi limite relativi alla copertura nevosa e ai camion parzialmente fuori dall'inquadratura.

Prossimi passi

Una volta scritta la specifica, la lezione successiva raccoglie immagini che la soddisfano davvero.

Accedi per salvare i progressi