Assemblage de modèles YOLOv5#
📚 Ce guide explique comment utiliser l’assemblage de modèles Ultralytics YOLOv5 🚀 pendant les tests et l’inférence afin d’améliorer le mAP et le rappel.
Extrait de l’apprentissage d’ensemble :
La modélisation par ensemble est un processus qui consiste à créer plusieurs modèles diversifié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 pour produire une prédiction finale unique sur les données inédites. L’objectif 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 diversifiés et indépendants, l’erreur de prédiction diminue lorsque l’approche par ensemble est utilisée. Cette approche s’appuie sur la sagesse collective pour effectuer une prédiction. Même si le modèle d’ensemble contient plusieurs modèles de base, 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, notamment PyTorch>=1.8. Les modèles et les jeux de données sont téléchargés automatiquement depuis la dernière version de YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installTester normalement#
Avant l’assemblage, établis les performances de référence d’un modèle unique. Cette commande teste YOLOv5x sur COCO val2017 avec 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 checkpoint issu de l’entraînement sur un jeu de données personnalisé ./weights/best.pt. Pour plus de détails sur tous les modèles disponibles, consulte le tableau des checkpoints préentraînés.
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 de l’ensemble#
Plusieurs modèles préentraînés peuvent être assemblés au moment du test et de l’inférence en ajoutant simplement des modèles supplémentaires à l’argument --weights dans toute commande val.py ou detect.py existante. Cet exemple teste un ensemble de 2 modèles :
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --halfTu peux répertorier autant de checkpoints que tu le souhaites, y compris des poids personnalisés tels que runs/train/exp5/weights/best.pt. YOLOv5 exécute automatiquement chaque modèle, aligne les prédictions pour chaque image et moyenne les sorties avant d’effectuer la 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/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.844Inférence avec un ensemble#
Ajoute des modèles supplémentaires à l’argument --weights pour exécuter l’inférence avec un 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/exp2
Done. (0.223s)
Avantages de l’assemblage de modèles#
L’assemblage de modèles avec YOLOv5 offre plusieurs avantages :
- Précision améliorée : comme le montrent les exemples ci-dessus, l’assemblage de plusieurs modèles augmente le mAP de 0.504 à 0.515 et le mAR de 0.681 à 0.689.
- Meilleure généralisation : la combinaison de modèles diversifiés contribue à réduire le surapprentissage et améliore 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 métriques de vitesse (22.4 ms pour un modèle unique contre 39.5 ms pour un ensemble).
Quand utiliser l’assemblage de modèles#
Envisage d’utiliser l’assemblage de modèles dans les situations suivantes :
- Lorsque la précision est plus importante que la vitesse d’inférence
- Pour les applications critiques où les faux négatifs doivent être réduits au minimum
- Lors du traitement d’images difficiles présentant des variations d’éclairage, des occultations ou des changements d’échelle
- Lors de compétitions ou d’évaluations comparatives nécessitant des performances maximales
Pour les applications en temps réel soumises à 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 fournit une gamme d'environnements prêts à l'emploi, chacun incluant déjà les dépendances essentielles telles que CUDA, CUDNN, Python et PyTorch, pour te permettre de démarrer rapidement tes projets.
- Notebooks GPU gratuits :
- Google Cloud : Guide de démarrage rapide de GCP
- Amazon : Guide de démarrage rapide d’AWS
- Azure : Guide de démarrage rapide d’AzureML
- Docker : Guide de démarrage rapide de Docker
État du projet#
Ce badge indique que tous les tests d’intégration continue (CI) de YOLOv5 GitHub Actions passent avec succès. Ces tests de CI vérifient rigoureusement les fonctionnalités et les performances de YOLOv5 sous plusieurs aspects essentiels : entraînement, validation, inférence, exportation et benchmarks. Ils garantissent un fonctionnement cohérent et fiable sur macOS, Windows et Ubuntu, avec des tests exécutés toutes les 24 heures et à chaque nouveau commit.