Assemblage de modèles YOLOv5

📚 Ce guide explique comment utiliser l'assemblage de modèles Ultralytics YOLOv5 🚀 lors des tests et de l'inférence pour améliorer le mAP et le Recall.

D'après l'apprentissage ensembliste :

La modélisation ensembliste est un processus où plusieurs modèles diversifiés 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 jeux de données d'entraînement. Le modèle d'ensemble agrège ensuite la prédiction de chaque modèle de base pour aboutir à une prédiction finale pour les données non vues. La motivation derrière l'utilisation de modèles ensemblistes 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 du modèle diminue lorsque l'approche ensembliste est utilisée. L'approche recherche la sagesse de la foule pour établir une prédiction. Bien que le modèle d'ensemble contienne 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, en incluant PyTorch>=1.8. Les modèles 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 # install

Test normal

Avant l'assemblage, établis la performance de référence 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 ton propre point de contrôle 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 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'assemblage

Plusieurs modèles pré-entraînés peuvent être assemblés lors des tests et de l'inférence en ajoutant simplement des modèles supplémentaires à l'argument --weights dans n'importe quelle commande existante val.py ou detect.py. 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

Tu 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 par image et calculera la moyenne des 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/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.844

Inférence d'assemblage

Ajoute des modèles supplémentaires à l'argument --weights pour exécuter l'inférence ensembliste :

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/exp-2
Done. (0.223s)
YOLO inference result

Avantages de l'assemblage de modèles

L'assemblage de modèles avec YOLOv5 offre plusieurs avantages :

  1. Précision améliorée : Comme démontré dans 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.
  2. Meilleure généralisation : La combinaison de modèles diversifiés aide à réduire le surapprentissage et améliore les performances sur des données variées.
  3. Robustesse accrue : Les ensembles sont généralement plus robustes face au bruit et aux valeurs aberrantes dans les données.
  4. 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 modèle unique contre 39,5 ms pour l'ensemble).

Quand utiliser l'assemblage de modèles

Envisage 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 varié, des occlusions ou des changements d'échelle
  • 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 les dépendances essentielles telles que CUDA, CUDNN, Python et PyTorch, pour lancer tes projets.

État du projet

YOLOv5 CI

Ce badge indique que tous les tests d'intégration continue (CI) des GitHub Actions de YOLOv5 réussissent. Ces tests CI vérifient rigoureusement la fonctionnalité et les performances de YOLOv5 sous divers aspects clés : entraînement, validation, inférence, export 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.

Commentaires