Ultralytics YOLO27: Iscriviti alla lista d'attesa.
Get Started
Creare dataset YOLO ad alte prestazioni·Addestrare e iterare·Lezione 8/10
Lezioneprincipiante

Sapere quando il set di dati è pronto

Subordina la prima esecuzione di addestramento a otto controlli superato/non superato, automatizza i tre verificabili da uno script e individua la correzione necessaria per ogni controllo non superato.

Ogni progetto arriva al momento in cui il team vuole avviare l'addestramento. A volte il set di dati è pronto; altre volte presenta ancora una fuga tra le suddivisioni o una classe con etichette insufficienti, che farà sprecare una settimana di tempo GPU e produrrà un numero di cui nessuno dovrebbe fidarsi. Otto controlli, ciascuno valutato come sì, no o eccezione documentata, rendono la decisione oggettiva anziché dettata dall'umore.

Esito

Valuta il tuo set di dati con gli otto controlli di preparazione, usa uno script per verificare i tre controlli quantificabili e produci una decisione di via libera oppure un elenco ordinato per priorità delle correzioni.

Percorso rapido
Se sai già come muoverti, ecco la versione breve.
  1. Valuta tutti e otto i controlli: sì, no o eccezione documentata.

  2. Lascia che readiness.py valuti il volume, le fughe tra le suddivisioni, la copertura delle suddivisioni e la quota di sfondi.

  3. Correggi ogni esito negativo intervenendo sui dati, non sugli iperparametri.

  4. Procedi pur con una lacuna nota solo quando il suo impatto previsto è stato messo per iscritto.

Pratico

Gli otto controlli#

#ControlloCriteri per superare il controlloSe non lo supera, torna a
1Obiettivo chiaroObiettivo, attività, classi e test di accettazione sono documentati e approvatiParti dall'obiettivo aziendale
2Classi definiteOgni classe ha una definizione e un elemento simile, indicato per nome, che ne è esclusoObiettivo e guida all'etichettatura
3Immagini rappresentativeOgni scenario delle specifiche raggiunge la propria quota, prevalentemente con fonti di produzioneRaccogliere dati rappresentativi e di alta qualità
4Volume sufficiente≥ 1.500 immagini e ≥ 10.000 istanze per classe, oppure un'eccezione documentataSpecifiche e raccolta
5Etichette coerentiGuida redatta, sessione di calibrazione completata, accordo ≥ 90%Best practice per l'annotazione
6Controllo qualità completatoScript di audit senza errori, casi sospetti esaminati, note sul controllo qualità redatteControllo qualità del set di dati
7Suddivisioni puliteSuddivisione per gruppi, nessun gruppo presente in due suddivisioni, ogni classe presente in ciascuna suddivisioneSuddividere correttamente il set di dati
8Immagini di sfondoTra lo 0 e il 10% delle immagini sono fotogrammi senza etichetteSpecifiche e raccolta

La checklist verifica una per una le stesse decisioni trattate dalla guida alla raccolta e all'annotazione dei dati; qui diventano un'unica decisione di via libera o di stop.

Automatizza i controlli quantificabili#

I controlli 4, 7 e 8 si basano su calcoli, quindi uno script li valuta sempre allo stesso modo. Questo script legge il set di esercitazione e gli elenchi delle suddivisioni creati da group_split.py nella lezione precedente:

from collections import Counter
from pathlib import Path

root = Path("datasets/practice")  # images/, labels/, and the train/val/test.txt lists from group_split.py
splits = {s: [Path(p).stem for p in (root / f"{s}.txt").read_text().split()] for s in ("train", "val", "test")}

def classes(stem):
    label = root / "labels" / f"{stem}.txt"
    return [int(r.split()[0]) for r in label.read_text().splitlines() if r.strip()] if label.exists() else []

stems = [s for split in splits.values() for s in split]
instances = Counter(c for s in stems for c in classes(s))
images = Counter(c for s in stems for c in set(classes(s)))
background = sum(not classes(s) for s in stems) / len(stems)
groups = {split: {s.rsplit("_", 1)[0] for s in names} for split, names in splits.items()}
per_split = {split: {c for s in names for c in classes(s)} for split, names in splits.items()}
shared = (groups["train"] & groups["val"]) | (groups["train"] & groups["test"]) | (groups["val"] & groups["test"])
weakest = min(instances, key=lambda c: (images[c], instances[c]))

checks = {
    "4 volume": (images[weakest] >= 1500 and instances[weakest] >= 10_000,
                 f"weakest class {weakest}: {images[weakest]} images, {instances[weakest]} instances"),
    "7 no shared groups": (not shared, f"{len(shared)} groups appear in more than one split"),
    "7 every class in every split": (all(per_split[s] == set(instances) for s in splits),
                                     ", ".join(f"{s} misses {len(set(instances) - per_split[s])}" for s in splits)),
    "8 background 0-10%": (background <= 0.10, f"{background:.1%} background images"),
}
for name, (ok, detail) in checks.items():
    print(f"{'PASS' if ok else 'FAIL'}  {name:<29} {detail}")
FAIL  4 volume                      weakest class 30: 1 images, 1 instances
PASS  7 no shared groups            0 groups appear in more than one split
FAIL  7 every class in every split  train misses 5, val misses 36, test misses 41
PASS  8 background 0-10%            1.6% background images

La suddivisione per gruppi ha risolto la fuga, ma il set di esercitazione è ben lontano dall'essere pronto: la classe più debole (30, skis) ha una sola istanza etichettata e val non può valutare metà delle classi. È il verdetto atteso per 128 immagini dimostrative, ed è proprio il verdetto che questo controllo deve fornire prima di una settimana di addestramento.

Uno script pulito non equivale a una checklist completa

Lo script copre ciò che si può contare. Per i controlli 1, 2, 3, 5 e 6 serve una persona: un obiettivo concordato, definizioni scritte, copertura della specifica, un punteggio di accordo misurato e note di controllo qualità. Assegnagli un punteggio manualmente, con una riga di evidenza per ciascuno.

Decidi: addestrare, procedere con una lacuna o correggere#

Quando un controllo non viene superato, il passo successivo più allettante è quasi sempre qualcosa di diverso dal correggere i dati:

Scorciatoia allettantePerché non funziona
"Prova un modello più grande."Un modello più grande impara il rumore nelle etichette con altrettanta fedeltà.
"Regola il tasso di apprendimento."Nessuna impostazione dell'ottimizzatore aggiunge una classe o uno scenario mancante.
"Addestra per più epoche."Più epoche su dati poco vari tendono a causare prima l'overfitting.
"Aggiungi altro aumento dei dati."L'aumento dei dati non può creare scenari assenti dai dati originali.

Tre situazioni quasi pronte#

SituazioneControllo non superatoCome si presentaSoluzione
Volume senza variabilità35.000 immagini, una telecamera, nessun caso limiteRaccogli dati da più telecamere, siti e orari prima dell'addestramento
Variabilità senza coerenza5Gli annotatori non concordano sull'estensione dei riquadri e sull'occlusioneCompleta la guida, calibra e rietichetta il campione interessato
Fuga non evidente7Suddivisione casuale per immagine dei fotogrammi videoSuddividi di nuovo per clip, telecamera o giorno; aspettati che il mAP di validazione diminuisca, perché questo calo riflette la realtà

Rilascia con una lacuna nota#

Spesso la scelta giusta è un primo modello mirato prima che tutti i controlli siano superati: un progetto pilota, un prototipo o una v1 su un sottoinsieme di telecamere. Un modello in produzione mostra cosa non va davvero più in fretta che perfezionare il dataset senza vedere i risultati. Quando rilasci con una lacuna, annota tre cose:

  • Quale controllo non è stato superato.
  • L'impatto previsto, per esempio "nessun dato notturno; aspettati un richiamo inferiore dopo il tramonto".
  • Il piano di raccolta dati per colmare la lacuna mentre la v1 è in esecuzione.
Un'eccezione senza indicarne l'impatto equivale a saltare un controllo

"Volume: eccezione" non dice nulla alla persona successiva. "Volume: pallet a 700 istanze; aspettati un richiamo inferiore dei pallet nelle aree di carico affollate; altre 2.000 etichette entro giugno" è un rischio gestito. Per ogni eccezione, indica l'impatto previsto sul test di accettazione.

Ripeti i controlli prima di ogni nuovo addestramento#

Qualità del modello nel tempo: la qualità si mantiene mentre arrivano nuovi dati etichettati, poi cala dopo il punto di declino previsto, facendo sorgere la domanda se riaddestrare subito o aspettare

Un dataset pronto per la v1 non è automaticamente pronto per la v3. Nuove classi, nuove fonti e nuovi annotatori possono ciascuno compromettere un controllo che prima veniva superato, mentre i dati di produzione cambiano man mano che si accumulano nuove etichette. Esegui di nuovo readiness.py e valuta nuovamente i controlli manuali prima di ogni nuovo addestramento; bastano pochi minuti, mentre saltarli può costarti una settimana di addestramento su un dataset compromesso.

Provalo

Esegui readiness.py sul dataset suddiviso (o sul set di esercitazione), poi valuta manualmente i cinque controlli manuali, annotando una riga di evidenza per ciascuno. Ordina ogni controllo non superato in base a quanto mette a rischio il test di accettazione. Risultato: una checklist di otto righe con punteggi, una decisione di via libera o un elenco di correzioni ordinate per priorità, salvata accanto alle note di controllo qualità.

Criteri di completamento
La lezione è completata quando tutte le seguenti condizioni sono soddisfatte.
  • Tutti e otto i controlli hanno un punteggio e una riga di evidenza; i tre quantificabili provengono dallo script.

  • Ogni eccezione specifica l'impatto previsto sul test di accettazione e un piano per colmare la lacuna.

  • La decisione (addestrare, rilasciare con una lacuna documentata o correggere prima) è annotata insieme alla checklist.

Mostra la soluzione

Una checklist con punteggi per il set di esercitazione:

#ControlloPunteggioEvidenza
1Obiettivo chiarosìobjective.md e acceptance_test.py della lezione 1
2Classi definitenoGli 80 nomi di COCO non hanno definizioni scritte né esempi simili da escludere
3Immagini rappresentativenocoverage.py: cam2–cam4 sotto la quota
4Volume sufficientenoreadiness.py: la classe più debole ha 1 immagine
5Etichette coerentinoAccordo del 47% nel turno di calibrazione
6Controllo qualità completatoparzialeVerifica eseguita; i casi sospetti in 000000000438.jpg sono ancora da risolvere
7Suddivisioni senza contaminazioninoNessun gruppo condiviso, ma val non include 36 delle 71 classi
8Immagini di sfondosì1.6%

Decisione: correggere prima. In ordine di rischio per il test di accettazione: (1) riduci l'elenco delle classi a quelle necessarie per l'obiettivo, così da semplificare contemporaneamente i controlli 2, 4 e 7; (2) raccogli altri gruppi per quelle classi; (3) completa la regola della guida sulle persone distanti e rietichetta. Un set dimostrativo non supera questo controllo, e dovrebbe essere così.

Prossimi passi

Dopo aver superato la checklist, nella lezione successiva eseguirai un fine-tuning di base e trasformerai i risultati nella prossima correzione del dataset.

Accedi per salvare i progressi