Ir al contenido

Cómo ajustar YOLO un conjunto de datos personalizado

El ajuste fino adapta un modelo preentrenado para que reconozca nuevas clases partiendo de los pesos aprendidos, en lugar de una inicialización aleatoria. En lugar de entrenar desde cero durante cientos de épocas, el ajuste fino aprovecha el modelo preentrenado COCO y converge en datos personalizados en una fracción del tiempo.

Esta guía explica cómo ajustar YOLO26 para conjuntos de datos personalizados, desde su uso básico hasta técnicas avanzadas como la congelación de capas y el entrenamiento en dos etapas.

Ajuste fino frente a entrenamiento desde cero

Un modelo preentrenado ya ha aprendido características visuales generales —detección de bordes, reconocimiento de texturas, comprensión de formas— a partir de millones de imágenes. El aprendizaje por transferencia mediante el ajuste fino reutiliza ese conocimiento y solo enseña al modelo cómo son las nuevas clases, por lo que converge más rápido y requiere menos datos. El entrenamiento desde cero descarta todo eso y obliga al modelo a aprenderlo todo partiendo de los patrones a nivel de píxel, lo que exige muchos más recursos.

Ajuste FinoFormación desde cero
Peso inicialEntrenado previamente en COCO 80 clases)Inicialización aleatoria
ComandoYOLO("yolo26n.pt")YOLO("yolo26n.yaml")
ConvergenciaMás rápido: la red principal ya está entrenadaMás lento: todas las capas se aprenden desde cero
Requisitos de datosMenos: las características preentrenadas compensan la escasez de datosNivel superior: el modelo debe aprender todas las características a partir únicamente del conjunto de datos
Cuándo utilizarloClases personalizadas con imágenes de la naturalezaÁmbitos fundamentalmente distintos de COCO médico, satélites, radares)

El ajuste fino no requiere código adicional

Cuando un .pt el archivo se carga con YOLO("yolo26n.pt"), los pesos preentrenados se almacenan en el modelo. Al llamar a .train(data="custom.yaml") A continuación, transfiere automáticamente todos los pesos compatibles a la nueva arquitectura del modelo, reinicializa las capas que no coinciden (como el núcleo de detección cuando el número de clases difiere) y comienza el entrenamiento. No es necesario cargar los pesos manualmente, manipular las capas ni utilizar código personalizado de aprendizaje por transferencia.

Cómo funciona la transferencia de pesos preentrenados

Cuando se realiza un ajuste fino de un modelo preentrenado sobre un conjunto de datos con un número diferente de clases (por ejemplo, las 80 clases COCO a 5 clases personalizadas), Ultralytics una transferencia de pesos que tiene en cuenta la forma:

  1. Transferencia completa de la columna vertebral y el cuello: estas capas extraen características visuales generales y sus formas son independientes del número de clases.
  2. El cabezal de detección se ha reiniciado parcialmente - las capas de salida de clasificación (cv3, one2one_cv3) tienen formas vinculadas al número de clases (80 frente a 5), por lo que no se pueden transferir y se inicializan aleatoriamente. Las capas de regresión de cajas (cv2, one2one_cv2) en el encabezado tienen formas fijas independientemente del número de clases, por lo que se transfieren con normalidad.
  3. La gran mayoría de los pesos se transfieren al cambiar el número de clases. Solo se reinicializan las capas específicas de la clasificación en el módulo de detección; las ramas de regresión de la columna vertebral, el cuello y la caja permanecen intactas.

En el caso de conjuntos de datos con el mismo número de clases que el modelo preentrenado (por ejemplo, al ajustar los pesos COCO en otro conjunto de datos de 80 clases), se transfiere el 100 % de los pesos, incluido el módulo de detección.

Ejemplo básico de ajuste fino

Ejemplo

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)
yolo detect train model=yolo26n.pt data=path/to/data.yaml epochs=50 imgsz=640

Elección del Tamaño del Modelo

Los modelos más grandes tienen mayor capacidad, pero también más parámetros que actualizar, lo que puede aumentar el riesgo de sobreajuste cuando los datos de entrenamiento son limitados. Un enfoque práctico consiste en comenzar con un modelo más pequeño (YOLO26n o YOLO26s) y ampliarlo solo si las métricas de validación se estabilizan. El tamaño óptimo del modelo depende de la complejidad de la tarea, el número de clases, la diversidad del conjunto de datos y el hardware disponible para la implementación. Consulte la página completa del modelo YOLO26 para conocer los tamaños disponibles y los benchmarks de rendimiento.

Selección del optimizador y de la tasa de aprendizaje

El valor predeterminado optimizer=auto Esta configuración selecciona el optimizador y la tasa de aprendizaje en función del número total de iteraciones de entrenamiento:

  • < 10,000 iterations (small datasets or few epochs): AdamW with a low, auto-calculated learning rate
  • > 10 000 iteraciones (conjuntos de datos de gran tamaño): MuSGD (unSGD híbridoSGD ) con lr=0,01

Para la mayoría de las tareas de ajuste, la configuración predeterminada funciona bien sin necesidad de realizar ajustes manuales. Considera la posibilidad de configurar el optimizador de forma explícita cuando:

  • El entrenamiento es inestable (picos o divergencias en las pérdidas): prueba optimizer=AdamW, lr0=0.001 para una convergencia más estable
  • Ajustar un modelo grande con un conjunto de datos pequeño: una tasa de aprendizaje más baja, como lr0=0.001 ayuda a conservar las características preentrenadas

El optimizador automático anula el ajuste manual de lr0

Cuándo optimizer=auto, la lr0 y momentum Los valores se ignoran. Para controlar la tasa de aprendizaje manualmente, configura el optimizador de forma explícita: optimizer=SGD, lr0=0.005.

Capas de congelación

La congelación impide que determinadas capas se actualicen durante el entrenamiento. Esto acelera el entrenamiento y reduce el sobreajuste cuando el conjunto de datos es pequeño en comparación con la capacidad del modelo.

El freeze El parámetro admite tanto un número entero como una lista. Un número entero freeze=10 congela las primeras 10 capas (del 0 al 9, lo que corresponde a la estructura principal de YOLO26). Una lista puede contener índices de capas como freeze=[0, 3, 5] para la congelación parcial de la estructura, o cadenas de nombres de módulos como freeze=["23.cv2"] para un control preciso de ramas específicas dentro de una capa.

Ejemplo

model.train(data="custom.yaml", epochs=50, freeze=10)
model.train(data="custom.yaml", epochs=50, freeze=[0, 1, 2, 3, 4])
# Freeze the box regression branch of the detection head
model.train(data="custom.yaml", epochs=50, freeze=["23.cv2"])

La profundidad de congelación adecuada depende del grado de similitud entre el dominio objetivo y los datos preentrenados, así como de la cantidad de datos de entrenamiento disponibles:

EscenarioRecomendaciónJustificación
Conjunto de datos extenso, ámbito similarfreeze=None (predeterminado)Datos suficientes para adaptar todas las capas sin sobreajuste
Conjunto de datos pequeño, ámbito similarfreeze=10Conserva las características fundamentales y reduce los parámetros entrenables
Conjunto de datos muy pequeñofreeze=23Solo se entrena el módulo de detección, lo que minimiza el riesgo de sobreajuste
Dominio alejado de COCOfreeze=NoneEs posible que las habilidades básicas no se transfieran fácilmente y sea necesario volver a formarse

La profundidad de congelación también puede considerarse un hiperparámetro: probar varios valores (0, 5, 10) y comparar mAP de validación mAP una forma práctica de encontrar la mejor configuración para un conjunto de datos concreto.

Hiperparámetros clave para el ajuste fino

El ajuste fino suele requerir menos modificaciones de los hiperparámetros que el entrenamiento desde cero. Los parámetros más importantes son:

  • epochs: El ajuste fino converge más rápido que el entrenamiento desde cero. Empieza con un valor moderado y utiliza patience detener el proceso antes de tiempo cuando las métricas de validación se estabilicen.
  • patience: El valor predeterminado de 100 está pensado para ejecuciones de entrenamiento largas. Si se reduce a 10-20, se evita perder tiempo en ejecuciones que ya han convergido.
  • warmup_epochs: El calentamiento predeterminado (3 épocas) aumenta gradualmente la tasa de aprendizaje desde cero, lo que evita que las actualizaciones de gradientes de gran magnitud dañen las características preentrenadas en las primeras iteraciones. Se recomienda mantener la configuración predeterminada incluso para el ajuste fino.

Para consultar la lista completa de parámetros de entrenamiento, véase la guía de configuración del entrenamiento.

Ajuste en dos fases

El ajuste fino en dos etapas divide el entrenamiento en dos fases. En la primera etapa se congela la estructura principal y solo se entrenan el cuello y la cabeza, lo que permite que las capas de detección se adapten a las nuevas clases sin alterar las características preentrenadas. En la segunda etapa se descongelan todas las capas y se entrena el modelo completo con una tasa de aprendizaje más baja para perfeccionar la estructura principal para el dominio de destino.

Este enfoque resulta especialmente útil cuando el dominio de destino difiere significativamente de COCO imágenes médicas, imágenes aéreas, microscopía), en cuyo caso puede ser necesario adaptar la red base, pero entrenar todo a la vez provoca inestabilidad. Para obtener información sobre el desbloqueo automático mediante un enfoque basado en callbacks, consulta «Congelación y desbloqueo de la red base».

Ajuste fino en dos etapas

from ultralytics import YOLO

# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)

# Stage 2: unfreeze all, fine-tune with lower lr
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, lr0=0.001, name="stage2", exist_ok=True)

Errores habituales

El modelo no genera predicciones

  • Datos de entrenamiento insuficientes: el entrenamiento con muy pocas muestras es la causa más habitual; el modelo no puede aprender ni generalizar a partir de una cantidad de datos demasiado escasa. Asegúrate de que hay suficientes ejemplos diversos por clase antes de investigar otras causas.
  • Comprueba las rutas de los conjuntos de datos: rutas incorrectas en data.yaml genera silenciosamente cero etiquetas. Ejecutar yolo detect val model=yolo26n.pt data=your_data.yaml antes del entrenamiento, para comprobar que las etiquetas se cargan correctamente.
  • Umbral de confianza más bajo: si hay predicciones pero se han filtrado, prueba conf=0.1 durante la inferencia.
  • Comprobar el número de alumnos: garantizar nc en data.yaml coincide con el número real de clases que hay en los archivos de etiquetas.

En la validación, mAP prematuramente

  • Añadir más datos: el ajuste fino mejora considerablemente con datos de entrenamiento adicionales, especialmente con ejemplos variados que incluyan distintos ángulos, condiciones de iluminación y fondos.
  • Comprobar el saldo de la clase: los grupos infrarrepresentados tendrán AP bajo. Utiliza cls_pw para aplicar una ponderación inversa de la clase de frecuencia (empezar con cls_pw=0.25 en caso de desequilibrio moderado, aumentar a 1.0 (en caso de desequilibrio grave).
  • Reducir el aumento: en el caso de conjuntos de datos muy pequeños, un aumento excesivo puede ser más perjudicial que beneficioso. Prueba mosaic=0.5 o mosaic=0.0.
  • Aumentar la resolución: para conjuntos de datos con objetos pequeños, prueba imgsz=1280 para conservar los detalles.

El rendimiento de las clases originales se ve afectado tras el ajuste fino

Esto se conoce como «olvido catastrófico»: el modelo pierde los conocimientos adquiridos previamente cuando se ajusta exclusivamente con datos nuevos. Este olvido es prácticamente inevitable si no se incluyen imágenes del conjunto de datos original junto con los datos nuevos. Para mitigarlo:

  • Combinar conjuntos de datos: incluye ejemplos de las clases originales junto con las nuevas durante el ajuste fino. Esta es la única forma fiable de evitar el olvido.
  • Congelar la columna vertebral y el cuello: al congelar tanto la columna vertebral como el cuello, de modo que solo se entrenen las redes de detección, se facilita la realización de series cortas de ajuste fino con una tasa de aprendizaje muy baja.
  • Entrenar durante menos épocas: cuanto más tiempo se entrene el modelo exclusivamente con datos nuevos, mayor será el olvido.

Preguntas frecuentes

¿Cuántas imágenes necesito para ajustar YOLO?

No hay un mínimo establecido: los resultados dependen de la complejidad de la tarea, del número de clases y del grado de similitud del dominio con COCO. Las imágenes más variadas (con diferentes condiciones de iluminación, ángulos y fondos) son más importantes que la mera cantidad. Empieza con lo que tengas y amplía el volumen si los indicadores de validación no son suficientes.

¿Cómo puedo ajustar YOLO26 para un conjunto de datos personalizado?

Cargar un modelo preentrenado .pt archivo y llamada .train() con la ruta a un archivo personalizado data.yaml. Ultralytics se encarga Ultralytics de transferencia de peso, la reinicialización del cabezal de detección y la selección del optimizador. Consulte el Ajustes básicos Consulte la sección correspondiente para ver el ejemplo de código completo.

¿Por qué mi YOLO ajustado no detecta nada?

Las causas más comunes son rutas incorrectas en data.yaml (que genera silenciosamente cero etiquetas), una discrepancia entre nc en el archivo YAML y en los archivos de etiquetas reales, o un umbral de confianza demasiado alto. Véase Errores habituales para consultar una lista completa de comprobación para la resolución de problemas.

¿Qué YOLO debo congelar para el ajuste fino?

Depende del tamaño del conjunto de datos y de la similitud del dominio. En el caso de conjuntos de datos pequeños con un dominio similar al de COCO, al fijar la estructura básica (freeze=10) evita el sobreajuste. En el caso de dominios muy diferentes de COCO, si se dejan todas las capas sin congelar (freeze=None) permite que la red troncal se adapte. Véase Capas de congelación para obtener recomendaciones detalladas.

¿Cómo puedo evitar el olvido catastrófico al ajustar YOLO nuevas clases?

Incluye ejemplos de las clases originales en los datos de entrenamiento junto con las nuevas clases. Si eso no es posible, congela más capas (freeze=10 (o superior) y el uso de una tasa de aprendizaje más baja ayuda a conservar los conocimientos preentrenados. Véase El rendimiento se ve afectado en las clases originales para obtener más detalles.



📅 Creado hace 0 días ✏️ Actualizado hace 0 días
raimbekovm

Comentarios