É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) :
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 :
- Application de l'élagage avec un niveau de densité souhaité
- Entraîner le modèle élagué pendant quelques époques avec un taux d'apprentissage plus faible
- É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.
- Notebooks GPU Gratuits:
- Google Cloud : Guide de démarrage rapide GCP
- Amazon : Guide de démarrage rapide AWS
- Azure : Guide de démarrage rapide AzureML
- Docker: Guide de démarrage rapide Docker
État du projet
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.