Ultralytics YOLO27: Iscriviti alla lista d'attesa.
Get Started
Crea con Ultralytics Platform·Crea il dataset·Lezione 2/10
Lezioneintermedio

Aggiungi e prepara i dati

Controlla un dataset in locale prima di caricarlo, campiona i video in modo mirato e porta un dataset Platform allo stato Ready al primo tentativo.

Il bug più economico nei dataset è quello che trovi prima del caricamento. Le etichette Pascal VOC vengono ignorate senza avvisi, le immagini sotto i 28 pixel vengono rifiutate e da un video di 30 minuti si ricavano solo 100 frame, la maggior parte dei quali mostra una scena vuota. In questa lezione eseguirai un controllo di due minuti prima del caricamento, campionerai i video intenzionalmente e leggerai gli indicatori di elaborazione di Platform, così i tuoi dati di addestramento arriveranno completi.

Esito

Sai eseguire un controllo prima del caricamento su un dataset locale, ridurre un video lungo ai frame che vale la pena etichettare e creare un dataset Platform che mostri un badge Ready.

Percorso rapido
Se sai già come muoverti, ecco la versione breve.
  1. Esegui il controllo prima del caricamento: numero di immagini ed etichette per suddivisione, immagini troppo piccole o troppo grandi, file non supportati, etichette VOC.

  2. In Annotate, fai clic su New Dataset; scegli la sorgente, il tipo di attività e la visibilità Private.

  3. Campiona in anticipo i video lunghi: Platform conserva al massimo 100 frame per video.

  4. Consulta le schede Errors e Charts, poi fai clic sul badge finché non mostra Ready.

Pratico

Crea il dataset#

Pagina del profilo Ultralytics Platform con la scheda Datasets, le schede dei dataset e il pulsante New Dataset

Apri Annotate nella barra laterale e fai clic su New Dataset. La finestra di dialogo chiede una sorgente, un nome, il tipo di attività, una licenza facoltativa, l'offuscamento dei volti e la visibilità:

Finestra di dialogo New Dataset di Ultralytics Platform con le schede delle sorgenti Upload, URL, Cloud e On Premise, un'area di caricamento con i formati accettati e i limiti di dimensione, e i controlli Task Type, License, Blur faces e Visibility

FonteUsalo quandoPiano
UploadI file sono sul tuo computer: immagini, video, archivi o esportazioni NDJSONTutte
URLÈ disponibile un link pubblico .zip, .tar, .tar.gz, .tgz o .ndjson; Platform lo scarica lato serverTutte
CloudI dati si trovano già in Google Cloud Storage, Amazon S3 o Azure Blob Storage e devono rimanere lìPro, Enterprise
On PremiseI pixel non devono mai lasciare le tue macchineEnterprise

Regola decisionale: per questo corso, carica una copia. I dataset Cloud e On Premise mantengono i pixel fuori da Platform, quindi per questi dataset non sono disponibili l'annotazione intelligente, il raggruppamento, la clonazione e le istantanee delle versioni.

Il tipo di attività determina gli strumenti e i modelli disponibili. Platform supporta tutte e sette le attività Ultralytics YOLO:

TaskCome etichettare
RilevamentoRettangolo oppure annotazione intelligente con SAM e YOLO
SegmentazionePoligono oppure annotazione intelligente con SAM e YOLO
SemanticaPoligono oppure annotazione intelligente con SAM e YOLO; le maschere PNG si importano direttamente
Stima della posaPunti chiave su scheletri predefiniti o personalizzati; modelli YOLO pose per l'annotazione intelligente
OBBRiquadro orientato oppure annotazione intelligente con SAM e YOLO
ClassificazioneSelettore di classe nella barra laterale
ProfonditàNessun disegno: carica immagini con mappe di profondità abbinate (solo caricamento o URL)

Esempio pratico: controlla il dataset prima di caricarlo#

La piattaforma accetta immagini JPEG, PNG, WebP, BMP, TIFF, HEIC, AVIF, JP2, DNG e MPO fino a 50 MB e con almeno 28 px sul lato corto, e legge etichette YOLO, COCO, LabelMe, NDJSON di Ultralytics o Labelbox e maschere PNG semantiche. I file XML Pascal VOC vengono rilevati ma non importati. Questo script controlla un dataset YOLO locale secondo queste regole, qui il dataset pubblico medical pills:

from collections import Counter
from pathlib import Path

from PIL import Image

from ultralytics.data.utils import check_det_dataset

ACCEPTED = {".jpg", ".jpeg", ".png", ".webp", ".bmp", ".tif", ".tiff", ".heic", ".avif", ".jp2", ".dng", ".mpo"}
data = check_det_dataset("medical-pills.yaml")  # your local dataset YAML
root = Path(data["path"])

problems = Counter()
for split in ("train", "val", "test"):
    if not data.get(split):
        continue
    files = [p for p in Path(data[split]).rglob("*") if p.is_file()]
    images = [p for p in files if p.suffix.lower() in ACCEPTED]
    labeled = 0
    for img in images:
        label = Path(str(img).replace("images", "labels")).with_suffix(".txt")
        labeled += label.exists() and label.stat().st_size > 0
        if min(Image.open(img).size) < 28:
            problems["under 28 px (rejected)"] += 1
        if img.stat().st_size > 50 * 1024**2:
            problems["over 50 MB (rejected)"] += 1
    problems["unsupported files (skipped)"] += len(files) - len(images)
    print(f"{split:<5} {len(images):>4} images, {labeled:>4} labeled, {len(images) - labeled:>3} background")
problems["Pascal VOC .xml labels (not imported)"] += len(list(root.rglob("*.xml")))
print("classes:", data["names"])
print("problems:", {k: v for k, v in problems.items() if v} or "none")
train   92 images,   92 labeled,   0 background
val     23 images,   23 labeled,   0 background
classes: {0: 'pill'}
problems: none

Cosa indica l'output:

  • Conteggi per split. Le immagini nelle cartelle train/, val/ e test/ mantengono quello split dopo il caricamento, quindi questi sono i numeri che mostrerà la piattaforma. Se manca la riga val, la piattaforma creerà automaticamente uno split di validazione casuale (vedi il problema descritto sotto).
  • Le immagini di sfondo (senza file di etichette) vanno bene se usate con moderazione: insegnano al modello che aspetto ha il "nulla". Se sono centinaia, di solito le etichette non sono state esportate correttamente.
  • problems: none significa che ogni immagine verrà elaborata. Qualsiasi conteggio qui indica un file che finirà nella scheda Errors oppure non arriverà affatto.

Comprimi la cartella del dataset insieme alla sua data.yaml e trascina l'archivio nella galleria. La piattaforma rileva automaticamente il formato, archivia una sola copia delle immagini identiche e chiede se vuoi Ignorare, Mantenere entrambe o Sostituire quando un caricamento entra in conflitto con immagini già presenti nel dataset.

Esempio pratico: campiona il video prima che lo faccia la piattaforma#

La piattaforma campiona ogni video a 1 fotogramma al secondo e ne conserva al massimo 100, aumentando l'intervallo per i clip più lunghi di 100 secondi:

Durata del clipFotogrammi mantenutiIntervallo
60 secondi601 secondo
100 secondi1001 secondo
30 minuti (54.000 fotogrammi a 30 fps)10018 secondi

È una soluzione adatta a dare un'occhiata veloce, ma inadeguata per la maggior parte dei progetti reali: una registrazione di un turno di 30 minuti diventa 100 fotogrammi, perlopiù di un corridoio vuoto. Campiona tu le riprese lunghe e carica i fotogrammi:

Per un campionamento uniforme, FFmpeg è sufficiente:

mkdir -p frames
ffmpeg -i source.mp4 -vf fps=1 frames/%06d.jpg

Per un campionamento basato sugli eventi, lascia che un modello Ultralytics YOLO preaddestrato conservi solo i fotogrammi che contengono il tuo oggetto:

from pathlib import Path

import cv2

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # or your latest fine-tune
out = Path("frames")
out.mkdir(exist_ok=True)

source = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"
seen = kept = 0
for i, result in enumerate(model.predict(source, stream=True, vid_stride=5, classes=[0], conf=0.5, verbose=False)):
    seen += 1
    if len(result.boxes):  # keep only frames where a person was detected
        cv2.imwrite(str(out / f"frame_{i:05d}.jpg"), result.orig_img)
        kept += 1
print(f"Kept {kept} of {seen} sampled frames")
Kept 12 of 12 sampled frames

vid_stride=5 esamina un fotogramma ogni cinque, classes=[0] limita il rilevamento alle persone e conf=0.5 ignora le rilevazioni poco affidabili. In questo clip dimostrativo molto movimentato ci sono persone in ogni fotogramma campionato; in una registrazione di una scena perlopiù vuota, la frazione conservata cala bruscamente, così come il costo dell'etichettatura. Aumenta vid_stride finché i fotogrammi consecutivi conservati non smettono di sembrare identici.

Leggi gli indicatori di elaborazione della piattaforma#

Dopo il caricamento, la piattaforma convalida e normalizza i dati (ridimensiona le immagini oltre 4.096 px), crea miniature, analizza le etichette e calcola le statistiche. Controlla tre punti:

Pagina del dataset di Ultralytics Platform con la scheda Errors aperta, un banner che indica che l'elaborazione di 1 immagine non è riuscita e una riga della tabella con la dicitura Impossibile leggere il file immagine e un suggerimento per la correzione

  • La scheda Errors appare solo quando alcuni file non vengono elaborati: file danneggiati, formati non supportati, immagini sotto i 28 px o modalità colore CMYK e indicizzata, ciascuno con un suggerimento per la correzione. Esportali di nuovo o caricali nuovamente.
  • La scheda Charts mostra la distribuzione degli split, le classi principali, le dimensioni delle immagini, le dimensioni dei file, la posizione delle annotazioni, le dimensioni dei riquadri e gli oggetti per immagine. Cerca una classe che compare raramente, immagini minuscole o riquadri concentrati in un angolo.
  • L'etichetta nell'intestazione del dataset mostra Ready al termine dell'elaborazione, se il dataset contiene almeno un'immagine train, un'immagine val o test e un'immagine etichettata. Fai clic su Not Ready per vedere quale condizione manca.

Scheda Charts di Ultralytics Platform per il dataset medical-pills, con i grafici ad anello Split Distribution e Top Classes e gli istogrammi Image Dimensions e Image File Size

Inizia da un dataset pubblico#

Finestra Clone Dataset di Ultralytics Platform per un dataset pubblico di DPI per l'edilizia, con campi per il nuovo nome, lo slug URL, la descrizione, il tipo di attività, la licenza e un interruttore di visibilità

Non hai ancora dati? La pagina Explore elenca dataset ufficiali e della community. Clone Dataset copia immagini, annotazioni e classi nel tuo spazio di lavoro, le conteggia nel tuo spazio di archiviazione e mantiene per impostazione predefinita la visibilità pubblica della fonte; se aggiungerai contenuti sensibili, disattiva l'interruttore nella finestra di dialogo.

Insidie#

Le etichette Pascal VOC scompaiono senza avviso

Sintomo: il caricamento riesce, ma tutte le immagini arrivano senza etichette. Soluzione: Platform rileva i file XML Pascal VOC e non li importa. Converti prima le etichette YOLO .txt o il JSON COCO; il controllo prima del caricamento conta i file .xml, così puoi accorgerti del problema prima di caricare.

La suddivisione automatica di validazione mescola fotogrammi dello stesso video

Sintomo: la mAP di validazione è eccellente, ma il modello distribuito non lo è. Soluzione: se un caricamento senza suddivisione selezionata lascia vuota val, Platform sposta casualmente circa il 20% delle immagini di addestramento in val. Per i fotogrammi video, così si ritrovano nei due insiemi fotogrammi consecutivi quasi identici. Carica invece i dati con cartelle train/ e val/ suddivise per video o telecamera (lezione 4).

Mancano gli strumenti di annotazione

Sintomo: non trovi lo strumento poligono o i punti chiave. Soluzione: gli strumenti disponibili dipendono dal tipo di task. Modificalo nell'intestazione del dataset; ogni immagine conserva le etichette di tutti i task, quindi quando cambi task le etichette degli altri vengono nascoste, non eliminate.

Provalo

Esegui preflight.py sul tuo dataset (o su medical pills) e correggi ogni problema segnalato. Poi crea un dataset privato sulla piattaforma, carica il dataset e un video, quindi prevedi dalla tabella quanti fotogrammi produrrà il video prima di controllare la galleria.

Criteri di completamento
La lezione è completata quando tutte le seguenti condizioni sono soddisfatte.
  • preflight.py segnala problems: none nel dataset che hai caricato.

  • Il numero di immagini nella galleria corrisponde alle tue immagini più i fotogrammi previsti del video.

  • L'intestazione del dataset mostra Ready, oppure hai annotato esattamente quale condizione manca.

Mostra la soluzione

Soluzione dell'esempio per medical pills e un video di 4 minuti registrato con una telecamera sulla linea. Controllo prima del caricamento: 92 immagini di train e 23 di val, tutte etichettate e senza problemi. Video: 240 secondi superano 100, quindi l'intervallo aumenta a ceil(240 / 100) = 3 secondi e la piattaforma conserva 80 fotogrammi (uno a 0 s, 3 s, …, 237 s). Numero previsto di immagini nella galleria: 92 + 23 + 80 = 195 immagini. I fotogrammi del video arrivano senza etichette nello split selezionato nel filtro della galleria, quindi seleziona Train prima di trascinare il video per non inserirli in val. L'etichetta mostra Ready perché sono presenti immagini di train, val e immagini etichettate. Se avessi caricato solo il video, l'etichetta mostrerebbe Not Ready: non ci sarebbero ancora immagini etichettate.

Prossimi passi

Ora pre-etichetta le immagini con un modello e misura quanto lavoro di revisione richiede ciascuna soglia di confidenza.

Accedi per salvare i progressi