Ensemble de modèles YOLOv5
📚 Ce guide explique comment utiliser l'assemblage de modèles Ultralytics YOLOv5 🚀 pendant les tests et l'inférence pour améliorer la mAP et le rappel.
De l'apprentissage d'ensemble :
La modélisation d'ensemble est un processus où plusieurs modèles divers sont créés pour prédire un résultat, soit en utilisant de nombreux algorithmes de modélisation différents, soit en utilisant différents ensembles de données d'entraînement. Le modèle d'ensemble agrège ensuite la prédiction de chaque modèle de base et aboutit à une prédiction finale pour les données non vues. La motivation de l'utilisation de modèles d'ensemble est de réduire l'erreur de généralisation de la prédiction. Tant que les modèles de base sont divers et indépendants, l'erreur de prédiction du modèle diminue lorsque l'approche d'ensemble est utilisée. L'approche recherche la sagesse de la foule pour faire une prédiction. Même si le modèle d'ensemble comporte plusieurs modèles de base, il agit et fonctionne comme un seul modèle.
Avant de commencer
Clonez le dépôt et installez requirements.txt dans un environnement Python>=3.8.0, incluant PyTorch>=1.8. Les modèles et les ensembles de données sont téléchargés automatiquement à partir de la dernière version de YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Tester normalement
Avant l'assemblage, établissez la performance de base d'un seul modèle. Cette commande teste YOLOv5x sur COCO val2017 à une taille d'image de 640 pixels. yolov5x.pt
est le modèle le plus grand et le plus précis disponible. Les autres options sont yolov5s.pt
, yolov5m.pt
et yolov5l.pt
, ou votre propre checkpoint provenant de la formation d'un ensemble de données personnalisé ./weights/best.pt
. Pour plus de détails sur tous les modèles disponibles, consultez le Tableau des points de contrôle pré-entraînés.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half
Sortie :
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.826
Test d'ensemble
Plusieurs modèles pré-entraînés peuvent être assemblés ensemble au moment du test et de l'inférence en ajoutant simplement des modèles supplémentaires au --weights
argument dans n’importe quelle commande val.py ou detect.py existante. Cet exemple teste un ensemble de 2 modèles ensemble :
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half
Sortie :
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.844
Inférence d'ensemble
Ajouter des modèles supplémentaires au --weights
argument pour exécuter l’inférence d’ensemble :
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images
Sortie :
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)
Avantages de l'assemblage de modèles
L’assemblage de modèles avec YOLOv5 offre plusieurs avantages :
- Amélioration de la précision : Comme le montrent les exemples ci-dessus, l'assemblage de plusieurs modèles augmente la mAP de 0,504 à 0,515 et la mAR de 0,681 à 0,689.
- Meilleure généralisation : La combinaison de divers modèles permet de réduire le surapprentissage et d’améliorer les performances sur des données variées.
- Robustesse accrue : Les ensembles sont généralement plus robustes au bruit et aux valeurs aberrantes dans les données.
- Forces complémentaires : Différents modèles peuvent exceller dans la détection de différents types d'objets ou dans différentes conditions environnementales.
Le principal compromis est l'augmentation du temps d'inférence, comme le montrent les mesures de vitesse (22,4 ms pour un modèle unique contre 39,5 ms pour un ensemble).
Quand utiliser l'assemblage de modèles
Envisagez d'utiliser l'assemblage de modèles dans ces scénarios :
- Lorsque la précision est plus importante que la vitesse d'inférence
- Pour les applications critiques où les faux négatifs doivent être minimisés
- Lors du traitement d'images complexes avec un éclairage, une occlusion ou une échelle variables
- Pendant les compétitions ou les benchmarks où une performance maximale est requise
Pour les applications en temps réel avec des exigences de latence strictes, l'inférence d'un modèle unique peut être plus appropriée.
Environnements pris en charge
Ultralytics propose une gamme d'environnements prêts à l'emploi, chacun préinstallé avec les dépendances essentielles telles que CUDA, CUDNN, Python et PyTorch, pour démarrer vos projets.
- Notebooks GPU Gratuits:
- Google Cloud : Guide de démarrage rapide GCP
- Amazon : Guide de démarrage rapide AWS
- Azure : Guide de démarrage rapide AzureML
- Docker: Guide de démarrage rapide Docker
État du projet
Ce badge indique que tous les tests d'intégration continue (CI) YOLOv5 GitHub Actions réussissent. Ces tests CI vérifient rigoureusement la fonctionnalité et les performances de YOLOv5 à travers divers aspects clés : l'entraînement, la validation, l'inférence, l'exportation et les benchmarks. Ils garantissent un fonctionnement cohérent et fiable sur macOS, Windows et Ubuntu, avec des tests effectués toutes les 24 heures et à chaque nouveau commit.