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.
Pratico
Crea il 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à:

| Fonte | Usalo quando | Piano |
|---|---|---|
| Upload | I file sono sul tuo computer: immagini, video, archivi o esportazioni NDJSON | Tutte |
| URL | È disponibile un link pubblico .zip, .tar, .tar.gz, .tgz o .ndjson; Platform lo scarica lato server | Tutte |
| Cloud | I dati si trovano già in Google Cloud Storage, Amazon S3 o Azure Blob Storage e devono rimanere lì | Pro, Enterprise |
| On Premise | I pixel non devono mai lasciare le tue macchine | Enterprise |
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:
| Task | Come etichettare |
|---|---|
| Rilevamento | Rettangolo oppure annotazione intelligente con SAM e YOLO |
| Segmentazione | Poligono oppure annotazione intelligente con SAM e YOLO |
| Semantica | Poligono oppure annotazione intelligente con SAM e YOLO; le maschere PNG si importano direttamente |
| Stima della posa | Punti chiave su scheletri predefiniti o personalizzati; modelli YOLO pose per l'annotazione intelligente |
| OBB | Riquadro orientato oppure annotazione intelligente con SAM e YOLO |
| Classificazione | Selettore 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: noneCosa indica l'output:
- Conteggi per split. Le immagini nelle cartelle
train/,val/etest/mantengono quello split dopo il caricamento, quindi questi sono i numeri che mostrerà la piattaforma. Se manca la rigaval, 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: nonesignifica che ogni immagine verrà elaborata. Qualsiasi conteggio qui indica un file che finirà nella schedaErrorsoppure 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 clip | Fotogrammi mantenuti | Intervallo |
|---|---|---|
| 60 secondi | 60 | 1 secondo |
| 100 secondi | 100 | 1 secondo |
| 30 minuti (54.000 fotogrammi a 30 fps) | 100 | 18 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.jpgPer 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 framesvid_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:

- La scheda
Errorsappare 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
Chartsmostra 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
Readyal termine dell'elaborazione, se il dataset contiene almeno un'immaginetrain, un'immaginevaloteste un'immagine etichettata. Fai clic suNot Readyper vedere quale condizione manca.

Inizia da un dataset pubblico#

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#
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.
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).
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.
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.