Ensamblado de modelos de YOLOv5#
📚 Esta guía explica cómo usar el ensamblado de modelos de Ultralytics YOLOv5 🚀 durante las pruebas y la inferencia para mejorar mAP y sensibilidad.
El modelado ensamblado es un proceso en el que se crean varios modelos diversos para predecir un resultado, ya sea mediante el uso de distintos algoritmos de modelado o de diferentes conjuntos de datos de entrenamiento. A continuación, el modelo ensamblado agrega la predicción de cada modelo base y genera una predicción final para los datos no vistos. La motivación para usar modelos ensamblados es reducir el error de generalización de la predicción. Siempre que los modelos base sean diversos e independientes, el error de predicción del modelo disminuye al utilizar el enfoque de ensamblado. Este enfoque busca la sabiduría colectiva para realizar una predicción. Aunque el modelo ensamblado contiene varios modelos base, actúa y funciona como un único modelo.
Antes de empezar#
Clona el repositorio e instala requirements.txt en un entorno de Python>=3.8.0, incluido PyTorch>=1.8. Los modelos y los conjuntos de datos se descargan automáticamente desde la última versión de YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installPrueba normal#
Antes de realizar el ensamblado, establece el rendimiento de referencia de un único modelo. Este comando prueba YOLOv5x en COCO val2017 con un tamaño de imagen de 640 píxeles. yolov5x.pt es el modelo más grande y preciso disponible. Otras opciones son yolov5s.pt, yolov5m.pt y yolov5l.pt, o tu propio checkpoint del entrenamiento con un conjunto de datos personalizado ./weights/best.pt. Para obtener información sobre todos los modelos disponibles, consulta la tabla de checkpoints preentrenados.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --halfSalida:
val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients
val: Scanning '../datasets/coco/val2017' images and labels...4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:01<00:00, 2846.03it/s]
val: New cache created: ../datasets/coco/val2017.cache
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [02:30<00:00, 1.05it/s]
all 5000 36335 0.746 0.626 0.68 0.49
Speed: 0.1ms pre-process, 22.4ms inference, 1.4ms NMS per image at shape (32, 3, 640, 640) # <--- baseline speed
Evaluating pycocotools mAP... saving runs/val/exp/yolov5x_predictions.json...
...
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.504 # <--- baseline mAP
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.688
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.546
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.351
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.551
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.644
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.382
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.628
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.681 # <--- baseline mAR
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.524
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.735
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.826Prueba del ensamblado#
Puedes ensamblar varios modelos preentrenados durante las pruebas y la inferencia simplemente añadiendo modelos adicionales al argumento --weights en cualquier comando existente de val.py o detect.py. En este ejemplo se prueba conjuntamente un ensamblado de 2 modelos:
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --halfPuedes enumerar tantos checkpoints como quieras, incluidos pesos personalizados como runs/train/exp5/weights/best.pt. YOLOv5 ejecutará automáticamente cada modelo, alineará las predicciones por imagen y promediará las salidas antes de realizar NMS.
Salida:
val: data=./data/coco.yaml, weights=['yolov5x.pt', 'yolov5l6.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.6, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients # Model 1
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients # Model 2
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt'] # Ensemble notice
val: Scanning '../datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:00<00:00, 49695545.02it/s]
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [03:58<00:00, 1.52s/it]
all 5000 36335 0.747 0.637 0.692 0.502
Speed: 0.1ms pre-process, 39.5ms inference, 2.0ms NMS per image at shape (32, 3, 640, 640) # <--- ensemble speed
Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.515 # <--- ensemble mAP
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.699
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.557
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.356
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.563
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.668
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.387
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.638
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.689 # <--- ensemble mAR
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.743
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.844Inferencia con ensamblado#
Añade modelos adicionales al argumento --weights para ejecutar la inferencia con ensamblado:
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/imagesSalida:
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']
image 1/2 /content/yolov5/data/images/bus.jpg: 640x512 4 persons, 1 bus, 1 tie, Done. (0.063s)
image 2/2 /content/yolov5/data/images/zidane.jpg: 384x640 3 persons, 2 ties, Done. (0.056s)
Results saved to runs/detect/exp2
Done. (0.223s)
Ventajas del ensamblado de modelos#
El ensamblado de modelos con YOLOv5 ofrece varias ventajas:
- Mayor precisión: Como demuestran los ejemplos anteriores, ensamblar varios modelos aumenta mAP de 0.504 a 0.515 y mAR de 0.681 a 0.689.
- Mejor generalización: Combinar modelos diversos ayuda a reducir el sobreajuste y mejora el rendimiento con datos variados.
- Mayor robustez: Los ensamblados suelen ser más robustos frente al ruido y los valores atípicos de los datos.
- Fortalezas complementarias: Distintos modelos pueden destacar en la detección de diferentes tipos de objetos o en distintas condiciones ambientales.
La principal contrapartida es el aumento del tiempo de inferencia, como muestran las métricas de velocidad (22.4 ms para un único modelo frente a 39.5 ms para el ensamblado).
Cuándo usar el ensamblado de modelos#
Considera usar el ensamblado de modelos en estos casos:
- Cuando la precisión sea más importante que la velocidad de inferencia
- En aplicaciones críticas en las que deban minimizarse los falsos negativos
- Al procesar imágenes complejas con iluminación, oclusión o escala variables
- Durante competiciones o evaluaciones comparativas en las que se requiera el máximo rendimiento
Para aplicaciones en tiempo real con requisitos estrictos de latencia, puede ser más adecuada la inferencia con un único modelo.
Entornos compatibles#
Ultralytics ofrece una variedad de entornos listos para usar, cada uno preinstalado con dependencias esenciales como CUDA, CUDNN, Python y PyTorch, para que puedas iniciar tus proyectos.
- Cuadernos de GPU gratuitos:
- Google Cloud: Guía de inicio rápido de GCP
- Amazon: Guía de inicio rápido de AWS
- Azure: Guía de inicio rápido de AzureML
- Docker: Guía de inicio rápido de Docker
Estado del proyecto#
Esta insignia indica que todas las pruebas de Integración continua (CI) de GitHub Actions de YOLOv5 se superan correctamente. Estas pruebas de CI comprueban rigurosamente la funcionalidad y el rendimiento de YOLOv5 en varios aspectos clave: entrenamiento, validación, inferencia, exportación y benchmarks. Garantizan un funcionamiento uniforme y fiable en macOS, Windows y Ubuntu, con pruebas que se realizan cada 24 horas y con cada nuevo commit.