Skip to content

Élagage du modèle et éparpillement dans YOLOv5

📚 Ce guide explique comment appliquer l'élagage aux modèles YOLOv5 🚀 pour créer des réseaux plus efficaces tout en maintenant les performances.

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

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

  • Taille réduite du modèle pour un déploiement plus facile sur des appareils à ressources limitées
  • Des inférences plus rapides avec un impact minimal sur la précision
  • Réduction de l'utilisation de la mémoire et de la consommation d'énergie
  • Amélioration de l'efficacité globale des applications en temps réel

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

Avant de commencer

Cloner le repo et installer le fichier requirements.txt dans un fichier 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èreversion de YOLOv5 .

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

Test des performances de base

Avant de procéder à l'élagage, établissez une performance de référence à 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.ptou votre propre point de contrôle à partir de l'entraînement d'un ensemble de données personnalisé ./weights/best.pt. Pour plus de détails sur tous les modèles disponibles, voir le 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_hybrid=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% Sparsité)

Nous pouvons appliquer un élagage au modèle à l'aide de la fonction torch_utils.prune() commande. Pour tester un modèle élagué, nous mettons à jour val.py pour réduire YOLOv5x à 0,3 sparsity (30% des poids fixés à zéro) :

Capture d'écran montrant le code d'élagage de YOLOv5x à 30% de sparsité

30 % de la production élaguée :

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_hybrid=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 obtenus nous permettent d'observer ce qui suit :

  • 30% d'espacement atteint: 30% des paramètres de poids du modèle en nn.Conv2d les couches sont désormais nulles
  • Le temps d'inférence reste inchangé: Malgré l'élagage, la vitesse de traitement reste essentiellement la même.
  • Impact minime sur les performances: le mAP est passé de 0,507 à 0,489 (soit une réduction de 3,6 % seulement).
  • Réduction de la taille du modèle: Le modèle élagué nécessite moins de mémoire pour le stockage.

Cela démontre que l'élagage peut réduire de manière significative la complexité du modèle avec seulement un impact mineur sur la performance, ce qui en fait une technique d'optimisation efficace pour le déploiement dans des environnements à ressources limitées.

Ajustement des modèles élagués

Pour obtenir les meilleurs résultats, les modèles élagués doivent être affinés après l'élagage pour retrouver leur précision. Cela peut se faire de la manière suivante :

  1. Application de l'élagage avec un niveau d'éparpillement souhaité
  2. Entraînement du modèle élagué pendant quelques époques avec un taux d'apprentissage plus faible
  3. Évaluation du modèle élagué affiné par rapport au modèle de base

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

Environnements pris en charge

Ultralytics fournit une série d'environnements prêts à l'emploi, chacun étant préinstallé avec des dépendances essentielles telles que CUDACUDNN, Pythonet PyTorchpour lancer vos projets.

État d'avancement du projet

YOLOv5 CI

Ce badge indique que tous les tests d'intégration continue (CI) deYOLOv5 GitHub Actions ont été passés avec succès. Ces tests d'intégration continue vérifient rigoureusement la fonctionnalité et les performances de YOLOv5 sur différents aspects clés : formation, validation, inférence, exportation et tests de référence. 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.

📅C réé il y a 1 an ✏️ Mis à jour il y a 8 jours

Commentaires