Consejos para obtener los mejores resultados de entrenamiento con YOLOv5

📚 Esta guía explica cómo conseguir los mejores resultados de mAP y entrenamiento con YOLOv5 🚀.

La mayoría de las veces se pueden obtener buenos resultados sin realizar cambios en los modelos o en los ajustes de entrenamiento, siempre que tu conjunto de datos sea lo suficientemente grande y esté bien etiquetado. Si al principio no obtienes buenos resultados, existen pasos que podrías seguir para mejorar, pero siempre recomendamos a los usuarios que primero entrenen con todos los ajustes predeterminados antes de considerar cualquier cambio. Esto ayuda a establecer una línea base de rendimiento y a identificar áreas de mejora.

Si tienes preguntas sobre tus resultados de entrenamiento, te recomendamos que proporciones la mayor cantidad de información posible si esperas una respuesta útil, incluyendo gráficos de resultados (pérdidas de entrenamiento, pérdidas de validación, P, R, mAP), curva PR, matriz de confusión, mosaicos de entrenamiento, resultados de pruebas e imágenes de estadísticas del conjunto de datos como labels.png. Todos estos se encuentran en tu directorio project/name, normalmente yolov5/runs/train/exp.

Hemos elaborado una guía completa para los usuarios que buscan obtener los mejores resultados en sus entrenamientos con YOLOv5 a continuación.

Dataset

  • Imágenes por clase. Se recomiendan ≥ 1500 imágenes por clase.
  • Instancias por clase. Se recomiendan ≥ 10000 instancias (objetos etiquetados) por clase.
  • Variedad de imágenes. Debe ser representativa del entorno de despliegue. Para casos de uso en el mundo real, recomendamos imágenes de diferentes momentos del día, diferentes estaciones, diferentes climas, diferentes iluminaciones, diferentes ángulos, diferentes fuentes (obtenidas en línea, recopiladas localmente, diferentes cámaras), etc.
  • Consistencia de las etiquetas. Todas las instancias de todas las clases en todas las imágenes deben estar etiquetadas. El etiquetado parcial no funcionará.
  • Precisión de las etiquetas. Las etiquetas deben encerrar estrechamente cada objeto. No debe haber espacio entre un objeto y su caja delimitadora. No debería faltar la etiqueta de ningún objeto.
  • Disciplina en la división entrenamiento/validación. Asegúrate de que las imágenes de validación y prueba nunca aparezcan en el conjunto de entrenamiento para evitar métricas excesivamente optimistas. Mantén las distribuciones de clases similares entre las divisiones.
  • Verificación de etiquetas. Visualiza train_batch*.jpg al iniciar el entrenamiento para comprobar que tus etiquetas parecen correctas, por ejemplo, mira el mosaico de ejemplo.
  • Imágenes de fondo. Las imágenes de fondo son imágenes sin objetos que se añaden a un conjunto de datos para reducir los Falsos Positivos (FP). Recomendamos alrededor de un 0-10% de imágenes de fondo para ayudar a reducir los FP (COCO tiene 1000 imágenes de fondo como referencia, el 1% del total). No se requieren etiquetas para las imágenes de fondo.

Análisis de distribución de clases del conjunto de datos COCO

Selección del modelo

Los modelos más grandes como YOLOv5x y YOLOv5x6 producirán mejores resultados en casi todos los casos, pero tienen más parámetros, requieren más memoria CUDA para entrenar y son más lentos de ejecutar. Para despliegues móviles recomendamos YOLOv5s/m, para despliegues en la nube recomendamos YOLOv5l/x. Consulta nuestra tabla en el README para obtener una comparación completa de todos los modelos.

YOLOv5 Models

  • Comienza con pesos preentrenados. Recomendado para conjuntos de datos pequeños a medianos (p. ej. VOC, VisDrone, GlobalWheat). Pasa el nombre del modelo al argumento --weights. Los modelos se descargan automáticamente desde la última versión de YOLOv5.

    python train.py --data custom.yaml --weights yolov5s.pt
    python train.py --data custom.yaml --weights yolov5m.pt
    python train.py --data custom.yaml --weights yolov5l.pt
    python train.py --data custom.yaml --weights yolov5x.pt
    python train.py --data custom.yaml --weights custom_pretrained.pt
  • Comienza desde cero. Recomendado para conjuntos de datos grandes (p. ej. COCO, Objects365, OIv6). Pasa la arquitectura YAML del modelo que te interese, junto con un argumento vacío --weights '':

    python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml
    python train.py --data custom.yaml --weights '' --cfg yolov5m.yaml
    python train.py --data custom.yaml --weights '' --cfg yolov5l.yaml
    python train.py --data custom.yaml --weights '' --cfg yolov5x.yaml

Ajustes de entrenamiento

Antes de modificar nada, primero entrena con los ajustes predeterminados para establecer una línea base de rendimiento. Puedes encontrar una lista completa de los ajustes de train.py en el argparser de train.py.

  • Épocas. Comienza con 300 épocas. Si esto produce sobreajuste prematuramente, entonces puedes reducir las épocas. Si no ocurre sobreajuste después de 300 épocas, entrena durante más tiempo, p. ej. 600, 1200, etc. épocas.
  • Tamaño de imagen. COCO se entrena a una resolución nativa de --img 640, aunque debido a la gran cantidad de objetos pequeños en el conjunto de datos, puede beneficiarse de entrenar a resoluciones más altas como --img 1280. Si hay muchos objetos pequeños, los conjuntos de datos personalizados se beneficiarán de entrenar a resolución nativa o superior. Los mejores resultados de inferencia se obtienen con el mismo --img que se utilizó durante el entrenamiento, es decir, si entrenas con --img 1280 también deberías probar y detectar con --img 1280.
  • Tamaño de lote. Utiliza el --batch-size más grande que permita tu hardware. Los tamaños de lote pequeños producen estadísticas deficientes de normalización de lotes y deben evitarse. Puedes usar --batch-size -1 para seleccionar automáticamente el tamaño de lote óptimo para tu GPU.
  • Tasa de aprendizaje. La programación de la tasa de aprendizaje predeterminada funciona bien en la mayoría de los casos. Para una convergencia más rápida, puedes intentar usar la bandera --cos-lr para activar la programación de la tasa de aprendizaje del coseno, que reduce gradualmente la tasa de aprendizaje siguiendo una curva de coseno a lo largo de las épocas.
  • Aumentación de datos. YOLOv5 incluye varias técnicas de aumentación como el mosaico, que combina múltiples imágenes de entrenamiento. Para las últimas épocas, considera usar --close-mosaic 10 para desactivar la aumentación de mosaico, lo cual puede ayudar a estabilizar el entrenamiento.
  • Hiperparámetros. Los hiperparámetros predeterminados están en hyp.scratch-low.yaml. Recomendamos entrenar con los hiperparámetros predeterminados primero antes de pensar en modificar alguno. En general, aumentar los hiperparámetros de aumentación reducirá y retrasará el sobreajuste, permitiendo entrenamientos más largos y un mAP final más alto. La reducción en los hiperparámetros de ganancia de componentes de pérdida como hyp['obj'] ayudará a reducir el sobreajuste en esos componentes de pérdida específicos. Para un método automatizado de optimización de estos hiperparámetros, consulta nuestro Tutorial de Evolución de Hiperparámetros.
  • Entrenamiento con precisión mixta. Habilita el entrenamiento con precisión mixta con --amp para acelerar el entrenamiento y reducir el uso de memoria sin sacrificar la precisión del modelo.
  • Entrenamiento multi-GPU. Si tienes varias GPU, usa --device 0,1,2,3 para distribuir el entrenamiento entre ellas, lo que puede reducir significativamente el tiempo de entrenamiento.
  • Parada temprana. Usa --patience 50 para detener el entrenamiento si las métricas de validación no mejoran durante 50 épocas, ahorrando tiempo y evitando el sobreajuste.

Técnicas avanzadas de optimización

  • Aprendizaje por transferencia. Para conjuntos de datos especializados, comienza con pesos preentrenados y descongela gradualmente las capas durante el entrenamiento para adaptar el modelo a tu tarea específica.
  • Poda de modelos. Después del entrenamiento, considera podar tu modelo para eliminar pesos redundantes y reducir el tamaño del modelo sin una pérdida significativa de rendimiento.
  • Ensamblado de modelos. Para aplicaciones críticas, entrena varios modelos con diferentes configuraciones y combina sus predicciones para una mayor precisión.
  • Aumentación durante el tiempo de prueba. Habilita TTA durante la inferencia con --augment para mejorar la precisión de la predicción promediando los resultados de versiones aumentadas de la imagen de entrada.

Lecturas adicionales

Si deseas saber más, un buen punto de partida es la 'Receta para entrenar Redes Neuronales' de Karpathy, que tiene grandes ideas para el entrenamiento que se aplican ampliamente en todos los dominios de ML: https://karpathy.github.io/2019/04/25/recipe/

Para obtener información más detallada sobre los ajustes y configuraciones de entrenamiento, consulta la documentación de ajustes de entrenamiento de Ultralytics, que proporciona explicaciones exhaustivas de todos los parámetros disponibles.

¡Buena suerte 🍀 y haznos saber si tienes cualquier otra pregunta!

Preguntas frecuentes

¿Cómo sé si mi modelo presenta sobreajuste?

Tu modelo puede estar sufriendo sobreajuste si la pérdida de entrenamiento sigue disminuyendo mientras la pérdida de validación comienza a aumentar. Supervisa el mAP de validación; si se estanca o disminuye mientras la pérdida de entrenamiento sigue mejorando, es una señal de sobreajuste. Las soluciones incluyen añadir más datos de entrenamiento, aumentar la aumentación de datos o implementar técnicas de regularización.

¿Cuál es el tamaño de lote óptimo para entrenar YOLOv5?

El tamaño de lote óptimo depende de la memoria de tu GPU. Los tamaños de lote más grandes generalmente proporcionan mejores estadísticas de normalización de lotes y mayor estabilidad de entrenamiento. Utiliza el mayor tamaño de lote que tu hardware pueda manejar sin quedarse sin memoria. Puedes usar --batch-size -1 para determinar automáticamente el tamaño de lote óptimo para tu configuración.

¿Cómo puedo acelerar el entrenamiento de YOLOv5?

Para acelerar el entrenamiento, intenta: habilitar el entrenamiento con precisión mixta con --amp, usar varias GPU con --device 0,1,2,3, almacenar tu conjunto de datos en caché con --cache y optimizar tu tamaño de lote. Considera también usar una variante de modelo más pequeña como YOLOv5s si la precisión absoluta no es crítica.

Comentarios