YOLO Vision 2026:

Modell-Pruning und Sparsität in YOLOv5#

📚 Dieser Leitfaden erklärt, wie du Pruning auf YOLOv5 🚀-Modelle anwendest, um effizientere Netzwerke zu erstellen und dabei die Leistung beizubehalten.

Was ist Modell-Pruning?#

Modell-Pruning ist eine Technik, mit der sich Größe und Komplexität neuronaler Netzwerke reduzieren lassen, indem weniger wichtige Parameter (Gewichte und Verbindungen) entfernt werden. Dieser Prozess erstellt ein effizienteres Modell mit mehreren Vorteilen:

  • Reduzierte Modellgröße für eine einfachere Bereitstellung auf Geräten mit begrenzten Ressourcen
  • Höhere Inferenzgeschwindigkeit bei minimalen Auswirkungen auf die Genauigkeit
  • Geringerer Speicherbedarf und Energieverbrauch
  • Verbesserte Gesamteffizienz für Echtzeitanwendungen

Pruning funktioniert, indem Parameter identifiziert und entfernt werden, die nur minimal zur Leistung des Modells beitragen. Dadurch entsteht ein leichteres Modell mit ähnlicher Genauigkeit.

Bevor du beginnst#

Klone das Repository und installiere requirements.txt in einer Python>=3.8.0-Umgebung einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch aus der neuesten YOLOv5-Version heruntergeladen.

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

Referenzleistung testen#

Lege vor dem Pruning eine Referenzleistung fest, mit der du vergleichen kannst. Dieser Befehl testet YOLOv5x auf COCO val2017 mit einer Bildgröße von 640 Pixeln. yolov5x.pt ist das größte und genaueste verfügbare Modell. Weitere Optionen sind yolov5s.pt, yolov5m.pt und yolov5l.pt oder dein eigener Checkpoint aus dem Training eines benutzerdefinierten Datensatzes ./weights/best.pt. Einzelheiten zu allen verfügbaren Modellen findest du in der Tabelle der README.

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

Ausgabe:

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

Pruning auf YOLOv5x anwenden (30 % Sparsität)#

Wir können das Modell mit dem in utils/torch_utils.py definierten Befehl torch_utils.prune() einem Pruning unterziehen. Um ein Modell nach dem Pruning zu testen, aktualisieren wir val.py, um YOLOv5x auf eine Sparsität von 0.3 zu beschneiden (30 % der Gewichte werden auf null gesetzt):

YOLOv5 model pruning to 30% sparsity code

Ausgabe nach 30 % Pruning:

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

Ergebnisanalyse#

Aus den Ergebnissen können wir Folgendes beobachten:

  • 30 % Sparsität erreicht: 30 % der Gewichtsparameter des Modells in den nn.Conv2d-Schichten sind jetzt null
  • Inferenzzeit bleibt unverändert: Trotz des Prunings ist die Verarbeitungsgeschwindigkeit im Wesentlichen gleich
  • Minimale Auswirkungen auf die Leistung: mAP sank geringfügig von 0.507 auf 0.489 (nur eine Verringerung um 3.6 %)
  • Reduzierte Modellgröße: Das Modell nach dem Pruning benötigt weniger Speicherplatz für die Speicherung

Dies zeigt, dass Pruning die Modellkomplexität deutlich reduzieren kann und sich nur geringfügig auf die Leistung auswirkt. Dadurch eignet es sich als effektive Optimierungstechnik für die Bereitstellung in Umgebungen mit begrenzten Ressourcen.

Feinabstimmung von Modellen nach dem Pruning#

Für optimale Ergebnisse sollten Modelle nach dem Pruning feinabgestimmt werden, um die Genauigkeit wiederherzustellen. Dies kann folgendermaßen erfolgen:

  1. Pruning mit dem gewünschten Sparsitätsgrad anwenden
  2. Das Modell nach dem Pruning einige Epochen lang mit einer niedrigeren Lernrate trainieren
  3. Das feinabgestimmte Modell nach dem Pruning mit der Referenzleistung vergleichen

Dieser Prozess hilft den verbleibenden Parametern, sich an die entfernten Verbindungen anzupassen und diese auszugleichen, wodurch häufig ein Großteil oder die gesamte ursprüngliche Genauigkeit wiederhergestellt wird.

Unterstützte Umgebungen#

Ultralytics stellt eine Reihe sofort einsatzbereiter Umgebungen bereit, in denen wichtige Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch bereits installiert sind, damit du deine Projekte schnell starten kannst.

Projektstatus#

YOLOv5 CI

Dieses Abzeichen zeigt an, dass alle GitHub-Actions für YOLOv5-Tests zur kontinuierlichen Integration (CI) erfolgreich durchlaufen. Diese CI-Tests prüfen die Funktionalität und Leistung von YOLOv5 in verschiedenen wichtigen Bereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu. Die Tests werden alle 24 Stunden sowie bei jedem neuen Commit durchgeführt.

Kommentare