É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 # installTester 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 --halfSortie :
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/exp2Appliquer 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) :
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/exp3Analyse 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.Conv2dsont 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 :
- Appliquer l'élagage avec le niveau de sparsité souhaité
- Entraîner le modèle élagué pendant quelques époques avec un taux d'apprentissage plus faible
- É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.
- Notebooks GPU gratuits :
- Google Cloud : Guide de démarrage rapide de GCP
- Amazon : Guide de démarrage rapide d’AWS
- Azure : Guide de démarrage rapide d’AzureML
- Docker : Guide de démarrage rapide de Docker
État du projet#
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.