YOLO Vision 2026 :

Élagage et sparsité des modèles dans YOLOv5#

📚 Ce guide explique comment appliquer l'élagage aux modèles YOLOv5 🚀 afin de créer des réseaux plus efficaces tout en préservant leurs performances.

Qu'est-ce que l'élagage des modèles ?#

L'élagage de modèles est une technique utilisée pour réduire la taille et la complexité des réseaux neuronaux en supprimant les paramètres moins importants (poids et connexions). Ce processus crée un modèle plus efficace offrant plusieurs avantages :

  • Taille de modèle réduite pour faciliter le déploiement sur des appareils aux ressources limitées
  • Vitesses d'inférence plus élevées avec un impact minimal sur la précision
  • Utilisation réduite de la mémoire et de la consommation énergétique
  • Efficacité globale améliorée pour les applications en temps réel

L'élagage consiste à identifier et à supprimer les paramètres qui contribuent peu aux performances du modèle, ce qui donne un modèle plus léger avec une précision similaire.

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 # install

Tester les performances de référence#

Avant l'élagage, établis des performances de référence à utiliser pour la comparaison. 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 du README.

python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half

Sortie :

val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, 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, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)

Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [01:12<00:00,  2.16it/s]
                 all       5000      36335      0.732      0.628      0.683      0.496
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640)  # <--- base speed

Evaluating pycocotools mAP... saving runs/val/exp2/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.507  # <--- base mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.689
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.552
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.345
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.559
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.652
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.381
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.630
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.682
 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.731
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.829
Results saved to runs/val/exp2

Appliquer l'élagage à YOLOv5x (30 % de sparsité)#

Nous pouvons appliquer l'élagage au modèle à l'aide de la commande torch_utils.prune() définie dans utils/torch_utils.py. Pour tester un modèle élagué, nous mettons à jour val.py afin d'élaguer YOLOv5x avec une sparsité de 0,3 (30 % des poids mis à zéro) :

YOLOv5 model pruning to 30% sparsity code

Sortie après un élagage de 30 % :

val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, 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, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)

Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
Pruning model...  0.3 global sparsity
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [01:11<00:00,  2.19it/s]
                 all       5000      36335      0.724      0.614      0.671      0.478
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640)  # <--- prune speed

Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.489  # <--- prune mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.677
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.537
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.334
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.542
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.635
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.370
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.612
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.664
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.496
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.722
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.803
Results saved to runs/val/exp3

Analyse des résultats#

Les résultats permettent d'observer les éléments suivants :

  • Sparsité de 30 % atteinte : 30 % des paramètres de poids du modèle dans les couches nn.Conv2d sont désormais nuls
  • Le temps d'inférence reste inchangé : malgré l'élagage, la vitesse de traitement est pratiquement identique
  • Impact minimal sur les performances : la mAP a légèrement diminué, passant de 0.507 à 0.489 (soit une réduction de seulement 3.6 %)
  • Réduction de la taille du modèle : le modèle élagué nécessite moins de mémoire pour le stockage

Cela montre que l'élagage peut réduire considérablement la complexité du modèle avec un impact limité sur les performances, ce qui en fait une technique d'optimisation efficace pour le déploiement dans des environnements aux ressources limitées.

Réglage fin des modèles élagués#

Pour obtenir les meilleurs résultats, les modèles élagués doivent faire l'objet d'un réglage fin après l'élagage afin de retrouver leur précision. Pour cela, tu peux :

  1. Appliquer l'élagage avec le niveau de sparsité souhaité
  2. Entraîner le modèle élagué pendant quelques époques avec un taux d'apprentissage plus faible
  3. Évaluer le modèle élagué réglé finement par rapport aux performances de référence

Ce processus aide les paramètres restants à s'adapter pour compenser les connexions supprimées, ce qui permet souvent de retrouver une grande partie, voire la totalité, de la précision d'origine.

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.

État du projet#

YOLOv5 CI

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.

Commentaires