Ultralytics YOLO27: Únete a la lista de espera.
Get Started
Lecciónprincipiante

Averigua cuándo está listo el conjunto de datos

Condiciona la primera ejecución de entrenamiento a ocho comprobaciones de aprobado o suspenso, automatiza las tres que puede verificar un script y averigua qué solución requiere cada fallo.

Todos los proyectos llegan al momento en que el equipo quiere entrenar. A veces el conjunto de datos está listo; otras, todavía tiene una fuga entre particiones o una clase con pocas anotaciones que desperdiciará una semana de tiempo de GPU y producirá una cifra en la que nadie debería confiar. Ocho comprobaciones, cada una marcada como sí, no o excepción documentada, permiten tomar esa decisión de forma objetiva y no según el estado de ánimo.

Resultado

Evalúa tu conjunto de datos con la comprobación de preparación de ocho puntos, haz que un script verifique los tres puntos cuantificables y decide si seguir adelante o genera una lista priorizada de correcciones.

Vía rápida
Si ya tienes experiencia, aquí tienes un resumen.
  1. Evalúa las ocho comprobaciones: sí, no o excepción documentada.

  2. Deja que readiness.py evalúe el volumen, las fugas, la cobertura de las particiones y la proporción de imágenes de fondo.

  3. Corrige cada respuesta negativa en los datos, no con hiperparámetros.

  4. Sigue adelante con una carencia conocida solo si has documentado su impacto previsto.

Práctico

Las ocho comprobaciones#

#ComprobaciónCriterios de aprobadoSi no se supera, vuelve a
1Objetivo claroEl objetivo, la tarea, las clases y una prueba de aceptación están documentados y acordadosEmpieza por el objetivo de negocio
2Clases definidasCada clase tiene una definición y un ejemplo parecido que queda excluidoObjetivo y guía de anotación
3Imágenes representativasCada escenario de la especificación alcanza su cuota, principalmente con fuentes de producciónRecopila datos representativos de alta calidad
4Volumen suficiente≥ 1.500 imágenes y ≥ 10.000 instancias por clase, o una excepción documentadaEspecificación y recopilación
5Etiquetas coherentesGuía redactada, ronda de calibración completada y concordancia ≥ 90 %Buenas prácticas de anotación
6Control de calidad completadoScript de auditoría sin errores, casos sospechosos revisados y notas de control de calidad redactadasControl de calidad del conjunto de datos
7Particiones limpiasPartición por grupos, ningún grupo en dos particiones y todas las clases en cada particiónDivide correctamente el conjunto de datos
8Imágenes de fondoEntre el 0 y el 10 % de las imágenes son fotogramas sin etiquetasEspecificación y recopilación

La lista de comprobación evalúa una por una las mismas decisiones que cubre la guía de recopilación y anotación de datos; aquí se convierten en una única decisión de seguir o no seguir.

Automatiza las comprobaciones cuantificables#

Las comprobaciones 4, 7 y 8 son cálculos, así que un script las evalúa siempre del mismo modo. Este lee el conjunto de práctica y las listas de particiones que escribió group_split.py en la lección anterior:

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 partición por grupos corrigió la fuga, pero el conjunto de práctica está muy lejos de estar listo: la clase más débil (30, skis) solo tiene una instancia etiquetada y la validación no puede evaluar la mitad de las clases. Ese es el veredicto esperado para 128 imágenes de demostración, y justo el que esta comprobación debe ofrecer antes de dedicar una semana al entrenamiento.

Un script limpio no equivale a una lista de comprobación completa

El script cubre lo que se puede contar. Las comprobaciones 1, 2, 3, 5 y 6 necesitan a una persona: un objetivo acordado, definiciones por escrito, cobertura de la especificación, una puntuación de concordancia medida y notas de control de calidad. Evalúalas manualmente, con una línea de pruebas para cada una.

Decide: entrenar, seguir adelante con una carencia o corregirla#

Cuando una comprobación falla, el siguiente paso tentador casi siempre es hacer algo distinto de corregir los datos:

Atajo tentadorPor qué no funciona
«Prueba con un modelo más grande».Un modelo más grande aprende el ruido de las etiquetas con la misma fidelidad.
«Ajusta la tasa de aprendizaje».Ningún ajuste del optimizador añade una clase o un escenario que falta.
«Entrena durante más épocas».Más épocas con datos poco variados provocan un sobreajuste más rápido.
«Añade más aumento de datos».El aumento de datos no puede crear escenarios que nunca estuvieron presentes en los datos.

Tres situaciones en las que casi todo está listo#

SituaciónComprobación fallidaCómo se manifiestaSolución
Mucho volumen, poca variación35.000 imágenes, una cámara y ningún caso límiteRecopila datos de más cámaras, ubicaciones y momentos antes de entrenar
Mucha variación, poca coherencia5Los anotadores discrepan sobre el tamaño de los cuadros y la oclusiónCompleta la guía, calibra y vuelve a etiquetar la muestra afectada
Fuga inadvertida7Partición aleatoria por imagen de fotogramas de vídeoVuelve a dividir por clip, cámara o día; espera que el mAP de val baje, porque esa bajada refleja la realidad.

Publica con una carencia conocida.#

A menudo, lo más adecuado es crear un primer modelo centrado antes de que todas las comprobaciones estén en verde: un piloto, un prototipo o una v1 para un subconjunto de cámaras. Un modelo en producción muestra qué falla de verdad más rápido que pulir el conjunto de datos a ciegas. Si publicas con una carencia, anota tres cosas:

  • Qué comprobación ha fallado.
  • El impacto previsto, por ejemplo: "no hay datos nocturnos; espera una menor exhaustividad cuando oscurezca".
  • El plan de recopilación para subsanarla mientras la v1 está en marcha.
Una excepción sin impacto es simplemente una comprobación omitida

«Volumen: excepción» no aporta información a la siguiente persona. «Volumen: pallet con 700 instancias; se prevé una menor detección de palés en zonas abarrotadas; 2.000 más etiquetadas para junio» es un riesgo gestionado. Cada excepción necesita indicar el impacto esperado en la prueba de aceptación.

Vuelve a ejecutar las comprobaciones antes de cada nuevo entrenamiento.#

Calidad del modelo a lo largo del tiempo: la calidad se mantiene mientras llegan nuevos datos etiquetados y luego decae tras el punto previsto de caída, lo que plantea si conviene volver a entrenar ahora o esperar

Un conjunto de datos que estaba listo para la v1 no está automáticamente listo para la v3. Las clases, las fuentes y los anotadores nuevos pueden hacer que falle una comprobación que antes superaba, y los datos de producción cambian mientras se acumulan nuevas etiquetas. Vuelve a ejecutar readiness.py y vuelve a puntuar las comprobaciones manuales antes de cada nuevo entrenamiento; solo lleva unos minutos, y saltártelo puede costarte una semana de entrenamiento con un conjunto de datos defectuoso.

Pruébalo

Ejecuta readiness.py en el conjunto de datos dividido (o en el conjunto de práctica) y luego puntúa a mano las cinco comprobaciones manuales, con una línea de evidencia para cada una. Ordena todas las comprobaciones que fallen según el riesgo que supongan para la prueba de aceptación. Entregable: una lista de comprobación de ocho filas con puntuaciones y una decisión de continuar o una lista priorizada de correcciones, guardada junto a las notas de control de calidad.

Cuándo se considera terminado
Has terminado la lección cuando se cumplen todas estas condiciones.
  • Las ocho comprobaciones tienen una puntuación y una línea de evidencia; las tres cuantificables proceden del script.

  • Cada excepción indica su impacto previsto en la prueba de aceptación y un plan para subsanarla.

  • La decisión (entrenar, publicar con una carencia documentada o corregir primero) queda anotada junto a la lista de comprobación.

Mostrar solución

Una lista de comprobación puntuada para el conjunto de práctica:

#ComprobaciónPuntuaciónEvidencia
1Objetivo clarosíobjective.md y acceptance_test.py de la lección 1
2Clases definidasnoLos 80 nombres de COCO no tienen definiciones por escrito ni ejemplos parecidos excluidos
3Imágenes representativasnocoverage.py: cam2–cam4 por debajo de la cuota
4Volumen suficientenoreadiness.py: la clase más débil tiene 1 imagen
5Etiquetas coherentesnoConcordancia del 47 % en la ronda de calibración
6Control de calidad completoparcialAuditoría realizada; aún quedan casos dudosos en 000000000438.jpg
7Divisiones limpiasnoNo hay grupos compartidos, pero a val le faltan 36 de 71 clases
8Imágenes de fondosí1.6%

Decisión: corregir primero. Ordenadas según el riesgo para la prueba de aceptación: (1) reducir la lista de clases a las que necesita el objetivo, lo que simplifica de una vez las comprobaciones 2, 4 y 7; (2) recopilar más grupos para esas clases; (3) terminar la regla de la guía sobre personas lejanas y volver a etiquetar. Un conjunto de demostración no supera esta comprobación, y así debe ser.

Qué viene después

Cuando la lista de comprobación se supere, la siguiente lección ejecutará un ajuste fino de referencia y convertirá sus resultados en la siguiente corrección del conjunto de datos.