Ensemble de modèles YOLOv5#
📚 Ce guide explique comment utiliser l'ensemble de modèles d'Ultralytics YOLOv5 🚀 pendant les tests et l'inférence pour améliorer le mAP et le Recall.
D'après l'ensemble learning :
La modélisation par ensemble est un processus dans lequel 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 training data. Le modèle d'ensemble agrège ensuite la prédiction de chaque modèle de base et aboutit à une prédiction finale unique pour les données inédites. La motivation pour utiliser des 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 par ensemble est utilisée. L'approche recherche la sagesse des foules pour faire une prédiction. Même si le modèle d'ensemble contient plusieurs modèles de base en son sein, il agit et fonctionne comme un modèle unique.
Avant de commencer#
Clone le dépôt et installe requirements.txt dans un environnement Python>=3.8.0, incluant PyTorch>=1.8. Les Models et les datasets se téléchargent automatiquement depuis la dernière release de YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installTester normalement#
Avant de procéder à l'assemblage, établis les performances de référence d'un modèle unique. 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 ton propre point de contrôle issu de l'entraînement d'un jeu de données personnalisé ./weights/best.pt. Pour plus de détails sur tous les modèles disponibles, consulte le pretrained checkpoints table.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --halfSortie :
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.826Test d'ensemble#
Il est possible d'assembler plusieurs modèles pré-entraînés au moment des tests et de l'inférence en ajoutant simplement des modèles supplémentaires à l'argument --weights dans n'importe quelle commande val.py ou detect.py existante. Cet exemple teste ensemble un groupe de 2 modèles :
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --halfTu peux lister autant de points de contrôle que tu le souhaites, y compris des poids personnalisés tels que runs/train/exp-5/weights/best.pt. YOLOv5 exécutera automatiquement chaque modèle, alignera les prédictions image par image et fera la moyenne des sorties avant d'appliquer NMS.
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/exp-3/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.844Inférence d'ensemble#
Ajoute des modèles supplémentaires à l'argument --weights pour exécuter l'inférence par ensemble :
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/imagesSortie :
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/exp-2
Done. (0.223s)
Avantages de l'ensemble de modèles#
L'ensemble de modèles avec YOLOv5 offre plusieurs avantages :
- Précision améliorée : Comme démontré dans les exemples ci-dessus, l'ensemble de plusieurs modèles augmente le mAP de 0,504 à 0,515 et le mAR de 0,681 à 0,689.
- Meilleure généralisation : Combiner des modèles divers aide à réduire le surapprentissage et améliore les performances sur des données variées.
- Robustesse renforcée : Les ensembles sont généralement plus robustes face 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 des conditions environnementales variées.
Le principal compromis est l'augmentation du temps d'inférence, comme le montrent les mesures de vitesse (22,4 ms pour un seul modèle contre 39,5 ms pour l'ensemble).
Quand utiliser l'ensemble de modèles#
Envisage d'utiliser l'ensemble 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 difficiles avec des éclairages, des occlusions ou des échelles variés
- Pendant des compétitions ou des benchmarks où une performance maximale est requise
Pour les applications en temps réel avec des exigences strictes en matière de latence, l'inférence avec 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 des dépendances essentielles telles que CUDA, CUDNN, Python et PyTorch, pour donner un élan à tes 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
Statut du projet#
Ce badge indique que tous les tests d'intégration continue (CI) YOLOv5 GitHub Actions s'exécutent avec succès. Ces tests CI vérifient rigoureusement la fonctionnalité et les performances de YOLOv5 sur divers aspects clés : entraînement, validation, inférence, exportation et 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.