Vai al contenuto

Pruning del modello e sparsità in YOLOv5

📚 Questa guida spiega come applicare il pruning ai modelli YOLOv5 🚀 per creare reti più efficienti mantenendo le prestazioni.

Che cos'è il Model Pruning?

Il model pruning è una tecnica utilizzata per ridurre le dimensioni e la complessità delle reti neurali rimuovendo i parametri meno importanti (pesi e connessioni). Questo processo crea un modello più efficiente con diversi vantaggi:

  • Dimensioni ridotte del modello per facilitare l'implementazione su dispositivi con risorse limitate
  • Velocità di inferenza più elevate con un impatto minimo sull'accuratezza
  • Riduzione dell'utilizzo della memoria e del consumo energetico
  • Miglioramento dell'efficienza complessiva per le applicazioni in tempo reale

Il pruning funziona identificando e rimuovendo i parametri che contribuiscono minimamente alle prestazioni del modello, ottenendo un modello più leggero con un'accuratezza simile.

Prima di iniziare

Clonare il repo e installare il file requirements.txt in un file Python>=3.8.0 con l'inclusione di PyTorch>=1.8. I modelli e i dataset vengono scaricati automaticamente dall'ultimarelease di YOLOv5 .

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

Prestazioni di base del test

Prima di procedere alla potatura, stabilire una prestazione di base con cui confrontarsi. Questo comando testa YOLOv5x su COCO val2017 con immagini di 640 pixel. yolov5x.pt è il modello più grande e preciso disponibile. Altre opzioni sono yolov5s.pt, yolov5m.pt e yolov5l.pto il proprio checkpoint dall'addestramento di un set di dati personalizzato. ./weights/best.pt. Per informazioni dettagliate su tutti i modelli disponibili, consultare il file README. tavolo.

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

Uscita:

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

Applicare la potatura a YOLOv5x (30% di spaziosità)

Si può applicare il pruning al modello utilizzando il metodo torch_utils.prune() comando. Per testare un modello tagliato, aggiorniamo val.py per ridurre YOLOv5x a una sparsità di 0,3 (30% dei pesi impostati a zero):

Schermata che mostra il codice per il pruning di YOLOv5x al 30% di sparsity

30% di potatura:

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

Analisi dei risultati

Dai risultati si può osservare che:

  • 30% di sparsità raggiunta: 30% dei parametri di peso del modello in nn.Conv2d gli strati sono ora pari a zero
  • Il tempo di inferenza rimane invariato: Nonostante il pruning, la velocità di elaborazione è essenzialmente la stessa.
  • Impatto minimo sulle prestazioni: mAP è sceso leggermente da 0,507 a 0,489 (riduzione del 3,6%).
  • Riduzione delle dimensioni del modello: Il modello ridotto richiede meno memoria per l'archiviazione.

Questo dimostra che il pruning può ridurre significativamente la complessità del modello con un impatto minimo sulle prestazioni, rendendolo una tecnica di ottimizzazione efficace per l'impiego in ambienti con risorse limitate.

Messa a punto dei modelli potati

Per ottenere risultati ottimali, i modelli potati devono essere messi a punto dopo la potatura per recuperare l'accuratezza. Questo può essere fatto da:

  1. Applicazione del pruning con un livello di sparsità desiderato
  2. Addestramento del modello potato per alcune epoche con un tasso di apprendimento inferiore
  3. Valutazione del modello potato e perfezionato rispetto alla linea di base

Questo processo aiuta i parametri rimanenti ad adattarsi per compensare le connessioni rimosse, spesso recuperando la maggior parte o la totalità dell'accuratezza originale.

Ambienti supportati

Ultralytics fornisce una serie di ambienti pronti all'uso, ognuno dei quali è preinstallato con le dipendenze essenziali quali CUDA, CUDNN, Python, e PyTorchper avviare i vostri progetti.

Stato del progetto

YOLOv5 CI

Questo badge indica che tutti i test di Continuous Integration (CI) di YOLOv5 GitHub Actions sono stati superati con successo. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 in vari aspetti chiave: formazione, validazione, inferenza, esportazione e benchmark. Assicurano un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test condotti ogni 24 ore e su ogni nuovo commit.

📅C reato 1 anno fa ✏️ Aggiornato 8 giorni fa

Commenti