Añade y prepara los datos
Comprueba localmente un conjunto de datos antes de subirlo, selecciona los fotogramas de vídeo de forma deliberada y consigue que un conjunto de datos de Platform llegue al estado Ready al primer intento.
El error más barato en un conjunto de datos es el que detectas antes de subirlo. Las etiquetas Pascal VOC se omiten silenciosamente, las imágenes de menos de 28 píxeles se rechazan y un vídeo de 30 minutos se convierte en solo 100 fotogramas, la mayoría de los cuales muestran una escena vacía. En esta lección harás una comprobación previa a la subida de dos minutos, seleccionarás los fotogramas de vídeo a propósito y consultarás las señales de procesamiento de Platform para que tus datos de entrenamiento lleguen completos.
Práctico
Crea el conjunto de datos#

Abre Annotate en la barra lateral y haz clic en New Dataset. El cuadro de diálogo solicita un origen, un nombre, el tipo de tarea, una licencia opcional, el difuminado de caras y la visibilidad:

| Fuente | Cuándo usarlo | Plan |
|---|---|---|
| Upload | Los archivos están en tu ordenador: imágenes, vídeos, archivos comprimidos o exportaciones NDJSON | Todas |
| URL | Existe un enlace público a .zip, .tar, .tar.gz, .tgz o .ndjson; Platform lo descarga en el servidor | Todas |
| Cloud | Los datos ya están en Google Cloud Storage, Amazon S3 o Azure Blob Storage y deben permanecer allí | Pro, Enterprise |
| On Premise | Los píxeles no deben salir nunca de tus máquinas | Enterprise |
Regla para decidir: sube una copia para este curso. Los conjuntos de datos Cloud y On Premise mantienen los píxeles fuera de Platform, por lo que no permiten la anotación inteligente, la agrupación, la clonación ni las instantáneas de versiones.
El tipo de tarea determina qué herramientas y modelos aparecen. Platform admite las siete tareas de Ultralytics YOLO:
| Tarea | Cómo etiquetarlo |
|---|---|
| Detectar | Rectángulo o anotación inteligente con SAM y YOLO |
| Segmentar | Polígono o anotación inteligente con SAM y YOLO |
| Semántica | Polígono o anotación inteligente con SAM y YOLO; las máscaras PNG se importan directamente |
| Pose | Puntos clave en esqueletos integrados o personalizados; modelos de pose YOLO para la anotación inteligente |
| OBB | Caja orientada o anotación inteligente con SAM y YOLO |
| Clasificar | Selector de clases en la barra lateral |
| Profundidad | Sin dibujo: sube imágenes con mapas de profundidad emparejados (solo mediante carga o URL) |
Ejemplo práctico: comprueba el conjunto de datos antes de subirlo#
Platform acepta imágenes JPEG, PNG, WebP, BMP, TIFF, HEIC, AVIF, JP2, DNG y MPO de hasta 50 MB y con un mínimo de 28 px en el lado corto, y lee etiquetas YOLO, COCO, LabelMe, NDJSON de Ultralytics o Labelbox, y máscaras PNG semánticas. Detecta los archivos XML de Pascal VOC, pero no los importa. Este script comprueba un conjunto de datos YOLO local según esas reglas; aquí se usa el conjunto de datos público de pastillas médicas:
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: noneQué te indica el resultado:
- Recuentos por partición. Las imágenes de las carpetas
train/,val/ytest/mantienen esa partición al subirlas, así que estos son los números que mostrará Platform. Si no aparece la líneaval, Platform creará una partición de validación aleatoria (consulta el problema que se describe más abajo). - Las imágenes de fondo (sin archivo de etiquetas) son aceptables en cantidades moderadas; enseñan al modelo cómo es «no hay nada aquí». Si hay cientos, normalmente significa que las etiquetas no se exportaron correctamente.
problems: nonesignifica que se procesará cada imagen. Cualquier recuento que aparezca aquí corresponde a un archivo que acabará en la pestañaErrorso que no llegará a subirse.
Comprime la carpeta del conjunto de datos con su data.yaml y arrastra el archivo comprimido a la galería. Platform detecta el formato automáticamente, almacena una sola copia de las imágenes idénticas y te pregunta si quieres Omitir, Conservar ambas o Reemplazar cuando una imagen que subes coincide con otra que ya está en el conjunto de datos.
Ejemplo práctico: muestrea el vídeo antes de que lo haga Platform#
Platform muestrea cada vídeo a 1 fotograma por segundo y conserva como máximo 100 fotogramas; para los clips de más de 100 segundos, amplía el intervalo:
| Duración del clip | Fotogramas conservados | Intervalo |
|---|---|---|
| 60 segundos | 60 | 1 segundo |
| 100 segundos | 100 | 1 segundo |
| 30 minutos (54 000 fotogramas a 30 fps) | 100 | 18 segundos |
Esto sirve para echar un vistazo rápido, pero no para la mayoría de los proyectos reales: una grabación de un turno de 30 minutos se convierte en 100 fotogramas, casi todos de un pasillo vacío. Muestrea tú mismo las grabaciones largas y sube los fotogramas:
Para un muestreo uniforme, basta con FFmpeg:
mkdir -p frames
ffmpeg -i source.mp4 -vf fps=1 frames/%06d.jpgPara un muestreo basado en eventos, deja que un modelo YOLO de Ultralytics preentrenado conserve solo los fotogramas que contengan tu objeto:
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 examina uno de cada cinco fotogramas, classes=[0] limita la detección a personas y conf=0.5 ignora las predicciones poco fiables. En este clip de demostración con mucha actividad hay personas en cada fotograma muestreado; en una grabación de una escena casi vacía, la proporción de fotogramas conservados disminuye drásticamente, y también el coste del etiquetado. Aumenta vid_stride hasta que los fotogramas conservados contiguos dejen de parecer idénticos.
Consulta las señales de procesamiento de Platform#
Después de subir los archivos, Platform los valida, normaliza (las imágenes de más de 4096 px se redimensionan), genera miniaturas, analiza las etiquetas y calcula estadísticas. Comprueba estos tres sitios:

- La pestaña
Errorssolo aparece cuando hay archivos que no se pueden procesar: archivos dañados, formatos no compatibles, imágenes de menos de 28 px o modos de color CMYK e indexado, cada uno con una sugerencia para solucionarlo. Vuelve a exportarlos o a subirlos. - La pestaña
Chartsmuestra la distribución de particiones, las clases principales, las dimensiones de las imágenes, el tamaño de los archivos, la ubicación de las anotaciones, el tamaño de las cajas y los objetos por imagen. Fíjate si alguna clase aparece muy poco, si hay imágenes diminutas o si las cajas se agrupan en una esquina. - La insignia de la cabecera del conjunto de datos muestra
Readycuando termina el procesamiento y el conjunto de datos tiene al menos una imagentrain, una imagenvalotest, y una imagen etiquetada. Haz clic enNot Readypara ver qué condición falta.

Empieza con un conjunto de datos público#

¿Aún no tienes datos? La página Explorar incluye conjuntos de datos oficiales y de la comunidad. Clonar conjunto de datos copia las imágenes, las anotaciones y las clases en tu espacio de trabajo, cuenta para el almacenamiento y conserva de forma predeterminada la visibilidad pública del conjunto de datos de origen; por tanto, cambia el selector del cuadro de diálogo si vas a añadir algo sensible.
Errores habituales#
Síntoma: la subida se completa, pero todas las imágenes aparecen sin etiquetas. Solución: Platform detecta el formato XML de Pascal VOC y no lo importa. Convierte primero las etiquetas a .txt de YOLO o a JSON de COCO; la comprobación previa a la subida cuenta los archivos .xml para que detectes el problema antes de subirlos.
Síntoma: el mAP de validación es excelente, pero el modelo desplegado no lo es. Solución: si una subida sin división seleccionada deja vacío val, Platform mueve aleatoriamente aproximadamente el 20 % de las imágenes de entrenamiento a val. En el caso de los fotogramas de vídeo, esto coloca fotogramas casi idénticos en ambas divisiones. Sube los datos con las carpetas train/ y val/ divididas por vídeo o cámara (lección 4).
Síntoma: no encuentras la herramienta de polígonos o los puntos clave. Solución: el tipo de tarea determina las herramientas. Cámbialo en la cabecera del conjunto de datos; cada imagen almacena etiquetas para todas las tareas, así que al cambiar de tarea se ocultan las etiquetas de las demás, pero no se eliminan.
Mostrar solución
Solución del ejemplo: pastillas médicas y un vídeo de 4 minutos de una cámara en línea de producción. Comprobación antes de subir: 92 imágenes de entrenamiento y 23 de validación, todas etiquetadas y sin problemas. Vídeo: dura 240 segundos, más de 100, así que el intervalo se amplía a ceil(240 / 100) = 3 segundos y Platform conserva 80 fotogramas (uno en 0 s, 3 s, …, 237 s). Número esperado de imágenes en la galería: 92 + 23 + 80 = 195. Los fotogramas del vídeo llegan sin etiquetar a la partición seleccionada en el filtro de la galería; selecciona Train antes de soltar el vídeo para que no acaben en val. La insignia muestra Ready porque existen imágenes de entrenamiento, de validación y etiquetadas. Si solo hubieras subido el vídeo, la insignia mostraría Not Ready: todavía no habría ninguna imagen etiquetada.