Ultralytics YOLO27: Únete a la lista de espera.
Get Started
Desarrolla con Ultralytics Platform·Crea el conjunto de datos·Lección 2/10
Lecciónintermedio

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.

Resultado

Puedes ejecutar una comprobación previa a la subida en un conjunto de datos local, reducir un vídeo largo a los fotogramas que merezca la pena etiquetar y crear un conjunto de datos de Platform que muestre una insignia Ready.

Vía rápida
Si ya tienes experiencia, aquí tienes un resumen.
  1. Ejecuta la comprobación previa a la subida: recuento de imágenes y etiquetas por división, imágenes demasiado pequeñas o grandes, archivos no compatibles y etiquetas VOC.

  2. En Annotate, haz clic en New Dataset; elige el origen, el tipo de tarea y la visibilidad privada.

  3. Selecciona de antemano los fotogramas de los vídeos largos: Platform conserva como máximo 100 fotogramas por vídeo.

  4. Consulta las pestañas Errors y Charts; después, haz clic en la insignia hasta que indique Ready.

Práctico

Crea el conjunto de datos#

Página de perfil de Ultralytics Platform que muestra la pestaña Datasets, con tarjetas de conjuntos de datos y un botón New Dataset

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:

Cuadro de diálogo New Dataset de Ultralytics Platform, con pestañas de origen Upload, URL, Cloud y On Premise, una zona de carga que indica los formatos aceptados y los límites de tamaño, y controles para Task Type, License, Blur faces y Visibility

FuenteCuándo usarloPlan
UploadLos archivos están en tu ordenador: imágenes, vídeos, archivos comprimidos o exportaciones NDJSONTodas
URLExiste un enlace público a .zip, .tar, .tar.gz, .tgz o .ndjson; Platform lo descarga en el servidorTodas
CloudLos datos ya están en Google Cloud Storage, Amazon S3 o Azure Blob Storage y deben permanecer allíPro, Enterprise
On PremiseLos píxeles no deben salir nunca de tus máquinasEnterprise

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:

TareaCómo etiquetarlo
DetectarRectángulo o anotación inteligente con SAM y YOLO
SegmentarPolígono o anotación inteligente con SAM y YOLO
SemánticaPolígono o anotación inteligente con SAM y YOLO; las máscaras PNG se importan directamente
PosePuntos clave en esqueletos integrados o personalizados; modelos de pose YOLO para la anotación inteligente
OBBCaja orientada o anotación inteligente con SAM y YOLO
ClasificarSelector de clases en la barra lateral
ProfundidadSin 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: none

Qué te indica el resultado:

  • Recuentos por partición. Las imágenes de las carpetas train/, val/ y test/ mantienen esa partición al subirlas, así que estos son los números que mostrará Platform. Si no aparece la línea val, 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: none significa que se procesará cada imagen. Cualquier recuento que aparezca aquí corresponde a un archivo que acabará en la pestaña Errors o 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 clipFotogramas conservadosIntervalo
60 segundos601 segundo
100 segundos1001 segundo
30 minutos (54 000 fotogramas a 30 fps)10018 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.jpg

Para 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 frames

vid_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:

Página del conjunto de datos de Ultralytics Platform con la pestaña Errors abierta; se muestra un aviso de que no se ha podido procesar 1 imagen y una fila de la tabla que indica que no se ha podido leer el archivo de imagen, con una sugerencia para solucionarlo

  • La pestaña Errors solo 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 Charts muestra 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 Ready cuando termina el procesamiento y el conjunto de datos tiene al menos una imagen train, una imagen val o test, y una imagen etiquetada. Haz clic en Not Ready para ver qué condición falta.

Pestaña Charts de Ultralytics Platform para el conjunto de datos medical-pills, con gráficos de anillos para la distribución de particiones y las clases principales, e histogramas para las dimensiones y el tamaño de archivo de las imágenes

Empieza con un conjunto de datos público#

Cuadro de diálogo Clone Dataset de Ultralytics Platform para un conjunto de datos público de equipos de protección individual en obras, con campos para el nuevo nombre, el slug de URL, la descripción, el tipo de tarea, la licencia y un selector de visibilidad

¿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#

Las etiquetas Pascal VOC desaparecen sin avisar

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.

La división automática de validación mezcla fotogramas de vídeo

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

Faltan herramientas de anotación

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.

Pruébalo

Ejecuta preflight.py en tu propio conjunto de datos (o en el de pastillas médicas) y soluciona todos los problemas que indique. Después, crea un conjunto de datos privado en Platform, sube el conjunto de datos y un vídeo, y calcula cuántos fotogramas generará el vídeo según la tabla antes de comprobar la galería.

Cuándo se considera terminado
Has terminado la lección cuando se cumplen todas estas condiciones.
  • preflight.py informa de problems: none en el conjunto de datos que has subido.

  • El número de imágenes de la galería coincide con el de tus imágenes más los fotogramas de vídeo que has calculado.

  • La cabecera del conjunto de datos muestra Ready o has anotado exactamente qué condición falta.

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.

Qué viene después

A continuación, preetiquetarás imágenes con un modelo y medirás cuánto trabajo de revisión genera cada umbral de confianza.