Meet YOLO26: next-gen vision AI.

Link to this sectionCómo realizar un ajuste fino de YOLO en un conjunto de datos personalizado#

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

Esta guía cubre el ajuste fino de YOLO26 en conjuntos de datos personalizados, desde el uso básico hasta técnicas avanzadas como el congelado de capas y el entrenamiento en dos etapas.

Link to this sectionAjuste fino frente al 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 le enseña al modelo cómo son las nuevas clases, por lo que converge más rápido y requiere menos datos. Entrenar desde cero descarta todo eso y obliga al modelo a aprenderlo todo desde los patrones de nivel de píxel, lo que demanda significativamente más recursos.

Ajuste finoEntrenamiento desde cero
Pesos inicialesPreentrenado en COCO (80 clases)Inicialización aleatoria
ComandoYOLO("yolo26n.pt")YOLO("yolo26n.yaml")
ConvergenciaMás rápida: el backbone ya está entrenadoMás lenta: todas las capas aprenden desde cero
Requisitos de datosMenores: las características preentrenadas compensan la falta de datosMayores: el modelo debe aprender todas las características solo del conjunto de datos
Cuándo usarloClases personalizadas con imágenes naturalesDominios fundamentalmente diferentes de COCO (médico, satelital, radar)
El ajuste fino no requiere código adicional

Cuando se carga un archivo .pt con YOLO("yolo26n.pt"), los pesos preentrenados se almacenan en el modelo. Al llamar a .train(data="custom.yaml") después de eso, se transfieren automáticamente todos los pesos compatibles a la nueva arquitectura del modelo, se reinicializan las capas que no coinciden (como la cabeza de detección cuando el número de clases difiere) y comienza el entrenamiento. No se requiere carga manual de pesos, manipulación de capas ni código personalizado de aprendizaje por transferencia.

Link to this sectionCómo funciona la transferencia de pesos preentrenados#

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

  1. El backbone y el cuello se transfieren completamente: estas capas extraen características visuales generales y sus formas son independientes del número de clases.
  2. La cabeza de detección se reinicializa parcialmente: las capas de salida de clasificación (cv3, one2one_cv3) tienen formas vinculadas al recuento 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 la cabeza tienen formas fijas independientemente del recuento de clases, por lo que se transfieren normalmente.
  3. La gran mayoría de los pesos se transfieren al cambiar el recuento de clases. Por ejemplo, al realizar un ajuste fino de YOLO26n de COCO (80 clases) a un conjunto de datos de 5 clases, se transfieren 606 de 708 tensores de pesos: solo se reinicializan las capas de clasificación dependientes del número de clases, mientras que el backbone, el cuello y las ramas de regresión de cajas permanecen intactos.

Para conjuntos de datos con el mismo número de clases que el modelo preentrenado (por ejemplo, al realizar un ajuste fino de pesos preentrenados en COCO en otro conjunto de datos de 80 clases), el 100% de los pesos se transfieren, incluida la cabeza de detección.

Link to this sectionEjemplo básico de ajuste fino#

Ejemplo
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)

Link to this sectionElección del tamaño del modelo#

Los modelos más grandes tienen más capacidad, pero también más parámetros para actualizar, lo que puede aumentar el riesgo de sobreajuste cuando los datos de entrenamiento son limitados. Empezar con un modelo más pequeño (YOLO26n o YOLO26s) y escalar hacia arriba solo si las métricas de validación se estancan es un enfoque práctico. 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. Consulta la página del modelo YOLO26 completa para ver los tamaños disponibles y los puntos de referencia de rendimiento.

Link to this sectionSelección del optimizador y la tasa de aprendizaje#

La configuración predeterminada optimizer=auto selecciona el optimizador y la tasa de aprendizaje en función del número total de iteraciones de entrenamiento:

  • < 10,000 iteraciones (conjuntos de datos pequeños o pocas épocas): AdamW con una tasa de aprendizaje baja calculada automáticamente
  • > 10,000 iteraciones (conjuntos de datos grandes): MuSGD (un optimizador híbrido Muon+SGD) con lr=0.01

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

  • El entrenamiento es inestable (la pérdida aumenta o diverge): prueba con optimizer=AdamW, lr0=0.001 para una convergencia más estable
  • Ajuste fino de un modelo grande en un conjunto de datos pequeño: una tasa de aprendizaje más baja como lr0=0.001 ayuda a preservar las características preentrenadas
El optimizador automático anula el lr0 manual

Cuando se usa optimizer=auto, los valores de lr0 y momentum se ignoran. Para controlar la tasa de aprendizaje manualmente, configura el optimizador explícitamente: optimizer=SGD, lr0=0.005.

Link to this sectionCongelado de capas#

El congelado evita que capas específicas se actualicen durante el entrenamiento. Esto acelera el entrenamiento y reduce el sobreajuste cuando el conjunto de datos es pequeño en relación con la capacidad del modelo.

El parámetro freeze acepta un entero o una lista. Un entero freeze=10 congela las primeras 10 capas (índices 0-9), lo que cubre la mayor parte del backbone de YOLO26. El backbone abarca las capas 0-10, por lo que freeze=10 deja el bloque C2PSA final (capa 10) entrenable; usa freeze=11 para congelar todo el backbone. Una lista puede contener índices de capa como freeze=[0, 3, 5] para un congelado parcial del backbone, o cadenas de nombres de módulos como freeze=["23.cv2", "23.one2one_cv2"] para un control preciso sobre ramas específicas dentro de una capa (aquí, ambas ramas de regresión de cajas de la cabeza de detección).

Ejemplo
model.train(data="custom.yaml", epochs=50, freeze=10)

La profundidad de congelado adecuada depende de qué tan similar sea el dominio objetivo a los datos preentrenados y de cuántos datos de entrenamiento haya disponibles:

EscenarioRecomendaciónJustificación
Conjunto de datos grande, dominio similarfreeze=None (predeterminado)Suficientes datos para adaptar todas las capas sin sobreajuste
Conjunto de datos pequeño, dominio similarfreeze=10Preserva las características del backbone, reduce los parámetros entrenables
Conjunto de datos muy pequeñofreeze=23Solo se entrena la cabeza de detección, minimizando el riesgo de sobreajuste
Dominio lejano a COCOfreeze=NoneEs posible que las características del backbone no se transfieran bien y necesiten un reentrenamiento

La profundidad de congelado también puede tratarse como un hiperparámetro: probar algunos valores (0, 5, 10) y comparar el mAP de validación es una forma práctica de encontrar la mejor configuración para un conjunto de datos específico.

Link to this sectionHiperparámetros clave para el ajuste fino#

El ajuste fino generalmente requiere menos ajustes de hiperparámetros que el entrenamiento desde cero. Los parámetros que más importan son:

  • epochs: El ajuste fino converge más rápido que el entrenamiento desde cero. Comienza con un valor moderado y usa patience para detenerlo pronto cuando las métricas de validación se estanquen.
  • patience: El valor predeterminado de 100 está diseñado para ejecuciones de entrenamiento largas. Reducirlo a 10-20 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 grandes actualizaciones de gradiente dañen las características preentrenadas en las primeras iteraciones. Se recomienda mantener el valor predeterminado incluso para el ajuste fino.

Para obtener la lista completa de parámetros de entrenamiento, consulta la referencia de configuración de entrenamiento.

Link to this sectionAjuste fino en dos etapas#

El ajuste fino en dos etapas divide el entrenamiento en dos fases. La primera etapa congela el backbone y entrena solo 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. La segunda etapa descongela todas las capas y entrena el modelo completo con una tasa de aprendizaje más baja para refinar el backbone para el dominio objetivo.

Este enfoque es especialmente útil cuando el dominio objetivo difiere significativamente de COCO (imágenes médicas, imágenes aéreas, microscopía), donde es posible que el backbone necesite adaptación pero entrenar todo a la vez cause inestabilidad. Para un descongelado automático con un enfoque basado en callbacks, consulta Congelado y descongelado del backbone.

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)

Link to this sectionErrores comunes#

Link to this sectionEl modelo no produce predicciones#

  • Datos de entrenamiento insuficientes: entrenar con muy pocas muestras es la causa más común: el modelo no puede aprender ni generalizar a partir de muy pocos datos. Asegúrate de tener suficientes ejemplos diversos por clase antes de investigar otras causas.
  • Comprobar rutas del conjunto de datos: las rutas incorrectas en data.yaml producen cero etiquetas de forma silenciosa. Ejecuta yolo detect val model=yolo26n.pt data=custom.yaml antes de entrenar para confirmar que las etiquetas se cargan correctamente.
  • Umbral de confianza más bajo: si existen predicciones pero se filtran, prueba con conf=0.1 durante la inferencia.
  • Verificar el recuento de clases: asegúrate de que nc en data.yaml coincida con el número real de clases en los archivos de etiquetas.

Link to this sectionEl mAP de validación se estanca pronto#

  • Añadir más datos: el ajuste fino se beneficia significativamente de datos de entrenamiento adicionales, especialmente ejemplos diversos con ángulos, iluminación y fondos variados.
  • Comprobar el equilibrio de clases: las clases subrepresentadas tendrán un AP bajo. Usa cls_pw para aplicar una ponderación de clases por frecuencia inversa (comienza con cls_pw=0.25 para un desequilibrio moderado, aumenta a 1.0 para un desequilibrio severo).
  • Reducir la aumentación: para conjuntos de datos muy pequeños, una aumentación fuerte puede hacer más daño que bien. Prueba con mosaic=0.5 o mosaic=0.0.
  • Aumentar la resolución: para conjuntos de datos con objetos pequeños, prueba con imgsz=1280 para preservar los detalles.

Link to this sectionEl rendimiento se degrada en las clases originales después del ajuste fino#

Esto se conoce como olvido catastrófico: el modelo pierde conocimientos aprendidos previamente cuando se ajusta exclusivamente con nuevos datos. El olvido es prácticamente inevitable sin incluir imágenes del conjunto de datos original junto con los nuevos datos. Para mitigar esto:

  • Fusionar conjuntos de datos: incluye ejemplos de las clases originales junto con las nuevas clases durante el ajuste fino. Esta es la única forma fiable de evitar el olvido.
  • Congelar el backbone y el cuello: congelar tanto el backbone como el cuello para que solo se entrene la cabeza de detección ayuda en ejecuciones cortas de ajuste fino con una tasa de aprendizaje muy baja.
  • Entrenar durante menos épocas: cuanto más tiempo entrene el modelo exclusivamente con nuevos datos, más aumentará el olvido.

Link to this sectionFAQ#

Link to this section¿Cuántas imágenes necesito para ajustar YOLO?#

No existe un mínimo fijo: los resultados dependen de la complejidad de la tarea, el número de clases y qué tan similar sea el dominio a COCO. Imágenes más diversas (iluminación, ángulos, fondos variados) importan más que la cantidad bruta. Comienza con lo que tienes y escala si las métricas de validación no son suficientes.

Link to this section¿Cómo realizo un ajuste fino de YOLO26 en un conjunto de datos personalizado?#

Carga un archivo .pt preentrenado y llama a .train() con la ruta a un data.yaml personalizado. Ultralytics gestiona automáticamente la transferencia de pesos, la reinicialización de la cabeza de detección y la selección del optimizador. Consulta la sección Ejemplo básico de ajuste fino para ver el ejemplo de código completo.

Link to this section¿Por qué mi modelo YOLO ajustado no detecta nada?#

Las causas más comunes son rutas incorrectas en data.yaml (que produce cero etiquetas de forma silenciosa), una falta de coincidencia entre nc en el YAML y los archivos de etiquetas reales, o un umbral de confianza demasiado alto. Consulta Errores comunes para obtener una lista de verificación de solución de problemas completa.

Link to this section¿Qué capas de YOLO debería congelar para el ajuste fino?#

Depende del tamaño del conjunto de datos y la similitud del dominio. Para conjuntos de datos pequeños con un dominio similar a COCO, congelar el backbone (freeze=10) evita el sobreajuste. Para dominios muy diferentes de COCO, dejar todas las capas sin congelar (freeze=None) permite que el backbone se adapte. Consulta Congelado de capas para ver recomendaciones detalladas.

Link to this section¿Cómo evito el olvido catastrófico al ajustar YOLO en nuevas clases?#

Incluye ejemplos de las clases originales en los datos de entrenamiento junto con las nuevas clases. Si eso no es posible, congelar más capas (freeze=10 o superior) y usar una tasa de aprendizaje más baja ayuda a preservar el conocimiento preentrenado. Consulta El rendimiento se degrada en las clases originales para obtener más detalles.

Colaboradores

Comentarios