Passer au contenu

Élagage et clairsemage 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 maintenant les performances.

Qu'est-ce que l'élagage de modèle ?

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

  • Taille de modèle réduite pour un déploiement plus facile sur les appareils aux ressources limitées
  • Vitesses d'inférence plus rapides avec un impact minimal sur la précision
  • Consommation réduite de mémoire et d'énergie
  • Efficacité globale améliorée pour les applications en temps réel

L'élagage fonctionne en identifiant et en supprimant les paramètres qui contribuent minimalement à la performance du modèle, ce qui permet d'obtenir un modèle plus léger avec une précision similaire.

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 les performances de base

Avant de procéder à l'élagage, établissez une performance de base à laquelle vous pourrez vous comparer. 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 fichier README. table.

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/exp

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

Nous pouvons appliquer l'élagage au modèle en utilisant le torch_utils.prune() commande. Pour tester un modèle élagué, nous mettons à jour val.py pour élaguer YOLOv5x à 0,3 de densité (30 % des poids mis à zéro) :

Capture d'écran montrant le code pour l'élagage de YOLOv5x à 30 % de densité

Sortie élaguée à 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

D'après les résultats, nous pouvons observer :

  • 30 % de parcimonie atteinte: 30 % des paramètres de poids du modèle dans nn.Conv2d les couches sont maintenant à zéro
  • Le temps d'inférence reste inchangé : Malgré l'élagage, la vitesse de traitement est essentiellement la même
  • 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

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

Finetuning de modèles élagués

Pour de meilleurs résultats, les modèles élagués doivent être affinés après l'élagage pour retrouver la précision. Cela peut être fait en :

  1. Application de l'élagage avec un niveau de densité souhaité
  2. Entraîner le modèle élagué pendant quelques époques avec un taux d'apprentissage plus faible
  3. Évaluation du modèle élagué affiné par rapport à la base de référence

Ce processus aide les paramètres restants à s'adapter pour compenser les connexions supprimées, récupérant souvent la totalité ou la majeure partie de la précision d'origine.

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.

État du projet

YOLOv5 CI

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.



📅 Créé il y a 1 an ✏️ Mis à jour il y a 2 mois

Commentaires