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.
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:
| Scenario | Fotocamere | Luoghi | Ora del giorno | Condizione | Quota | Note |
|---|---|---|---|---|---|---|
| banchina-diurna | cam-1 a cam-4 | baie A–C | 08:00–17:00 | qualsiasi | 1,200 | ore di maggiore attività |
| banchina-notturna | cam-1 a cam-4 | baie A–C | 22:00–04:00 | qualsiasi | 400 | illuminazione al sodio, meno persone |
| carico-pioggia | cam-2, cam-3 | baia B | qualsiasi | solo pioggia | 200 | raro ma critico |
| impilati | qualsiasi | qualsiasi | qualsiasi | pallet > 2 di altezza | 150 | nasconde le persone dietro di essi |
| sfondo | qualsiasi | qualsiasi | qualsiasi | banchina vuota | 150 | nessun 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:
| Obiettivo | Consiglio |
|---|---|
| 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
namesoppure raccoglile prima dell'addestramento.
Copri le dimensioni della variabilità#

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:
| Dimensione | Esempi |
|---|---|
| Ora | Giorno, notte, alba, tramonto |
| Meteo | Sole, cielo coperto, pioggia, nebbia, neve |
| Illuminazione | Luminosa, fioca, abbagliante, ombre nette, fonti miste |
| Telecamera | Modello, obiettivo, altezza di montaggio, campo visivo |
| Geografia | Siti, città, paesi |
| Persone e operatori | Turni, team, uniformi, dispositivi di protezione |
| Varianti del prodotto | SKU, revisioni del packaging, colori |
| Dimensione degli oggetti | Vicini e grandi, a media distanza, lontani e piccoli |
| Occlusione | Assente, parziale, marcata, dietro un vetro |
| Condizioni delle attrezzature | Obiettivi 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.
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.
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.
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.
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:
| Classe | Istanze per immagine | Immagini necessarie per 10.000 istanze | Immagini necessarie per raggiungere il minimo di 1.500 | Piano |
|---|---|---|---|---|
car | 3.0 | ≈ 3,300 | 1,500 | 3.300 immagini |
truck | 0.5 | ≈ 20,000 | 1,500 | Acquisizione 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.