Consejos para obtener los mejores resultados de entrenamiento con YOLOv5#
📚 Esta guía explica cómo obtener 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, hay pasos que puedes 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 y validación, P, R, mAP), curva PR, matriz de confusión, mosaicos de entrenamiento, resultados de prueba e imágenes de estadísticas del conjunto de datos como labels.png. Todo esto se encuentra en tu directorio project/name, típicamente yolov5/runs/train/exp.
Hemos preparado una guía completa a continuación para los usuarios que buscan obtener los mejores resultados en sus entrenamientos de YOLOv5.
Conjunto de datos#
- 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 condiciones climáticas, diferentes iluminaciones, diferentes ángulos, diferentes fuentes (extraídas de Internet, recopiladas localmente, diferentes cámaras), etc.
- Consistencia en el etiquetado. 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 envolver estrechamente cada objeto. No debe existir espacio entre un objeto y su caja delimitadora. A ningún objeto le debe faltar una etiqueta.
- Disciplina en la división de 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*.jpgal iniciar el entrenamiento para verificar que tus etiquetas aparezcan correctas, es decir, consulta 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 entre 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.
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 implementaciones móviles, recomendamos YOLOv5s/m; para implementaciones en la nube, recomendamos YOLOv5l/x. Consulta la tabla de nuestro README para ver una comparación completa de todos los modelos.

-
Comienza a partir de pesos preentrenados. Recomendado para conjuntos de datos pequeños o medianos (es decir, 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 (es decir, COCO, Objects365, OIv6). Pasa el YAML de arquitectura del modelo que te interese, junto con un argumento
--weights ''vacío: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 cualquier cosa, entrena primero con la configuración predeterminada para establecer una línea base de rendimiento. Puedes encontrar una lista completa de la configuración de train.py en el analizador de argumentos de train.py.
- Épocas. Comienza con 300 épocas. Si esto produce sobreajuste prematuramente, puedes reducir las épocas. Si el sobreajuste no ocurre después de 300 épocas, entrena durante más tiempo, por ejemplo, 600, 1200 épocas, etc.
- Tamaño de imagen. COCO se entrena a la 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 su resolución nativa o una mayor. Los mejores resultados de inferencia se obtienen con el mismo--imgcon el que se ejecutó el entrenamiento; es decir, si entrenas a--img 1280, también debes realizar las pruebas y detecciones a--img 1280. - Tamaño de lote. Utiliza el
--batch-sizemás grande que tu hardware permita. Los tamaños de lote pequeños producen malas estadísticas de normalización por lotes y deben evitarse. Puedes usar--batch-size -1para 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 el indicador
--cos-lrpara habilitar la programación de la tasa de aprendizaje coseno, que reduce gradualmente la tasa de aprendizaje siguiendo una curva coseno a lo largo de las épocas. - Aumento de datos. YOLOv5 incluye varias técnicas de aumento como el mosaico, que combina múltiples imágenes de entrenamiento. Ajusta la fuerza del aumento mediante el hiperparámetro
mosaicen tu archivo--hyppara ayudar a estabilizar el entrenamiento. - Hiperparámetros. Los hiperparámetros predeterminados se encuentran en hyp.scratch-low.yaml. Te recomendamos entrenar primero con los hiperparámetros predeterminados antes de pensar en modificar alguno. En general, aumentar los hiperparámetros de aumento reducirá y retrasará el sobreajuste, lo que permitirá entrenamientos más largos y un mAP final más alto. La reducción de 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 obtener un método automatizado para optimizar estos hiperparámetros, consulta nuestro Tutorial de Evolución de Hiperparámetros. - Entrenamiento con precisión mixta. YOLOv5 habilita la Precisión Mixta Automática (AMP) automáticamente cuando se detecta una GPU compatible, lo que acelera el entrenamiento y reduce el uso de memoria sin sacrificar la precisión del modelo.
- Entrenamiento con múltiples GPU. Si tienes varias GPU, usa
--device 0,1,2,3para distribuir el entrenamiento entre ellas, lo que puede reducir significativamente el tiempo de entrenamiento. - Detención temprana. Usa
--patience 50para detener el entrenamiento si las métricas de validación no mejoran durante 50 épocas, lo que ahorra tiempo y previene 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 de entrenar, considera podar tu modelo para eliminar pesos redundantes y reducir el tamaño del modelo sin una pérdida significativa de rendimiento.
- Ensemble de modelos. Para aplicaciones críticas, entrena múltiples modelos con diferentes configuraciones y combina sus predicciones para mejorar la precisión.
- Aumento en tiempo de prueba. Habilita TTA durante la inferencia con
--augmentpara mejorar la precisión de las predicciones promediando los resultados de las versiones aumentadas de la imagen de entrada.
Lecturas adicionales#
Si deseas saber más, un buen lugar para empezar es la 'Receta para Entrenar Redes Neuronales' de Karpathy, que tiene excelentes ideas de entrenamiento aplicables de forma general en todos los dominios de ML: https://karpathy.github.io/2019/04/25/recipe/
Para obtener información más detallada sobre la configuración y los parámetros de entrenamiento, consulta la documentación de configuración de entrenamiento de Ultralytics, que ofrece explicaciones exhaustivas de todos los parámetros disponibles.
¡Buena suerte 🍀 y haznos saber si tienes cualquier otra pregunta!
FAQ#
Tu modelo podría estar sufriendo sobreajuste si la pérdida de entrenamiento continúa 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 el aumento de datos o implementar técnicas de regularización.
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 por lotes y estabilidad en el entrenamiento. Utiliza el tamaño de lote más grande que tu hardware pueda manejar sin quedarse sin memoria. Puedes usar
--batch-size -1para determinar automáticamente el tamaño de lote óptimo para tu configuración.Para acelerar el entrenamiento, prueba: usar múltiples GPU con
--device 0,1,2,3, almacenar tu conjunto de datos en caché con--cachey optimizar el tamaño de tu lote (la precisión mixta se habilita automáticamente en las GPU compatibles). También considera usar una variante de modelo más pequeña como YOLOv5s si la precisión absoluta no es crítica.
