Zum Inhalt springen

Modell-Bereinigung und Sparsamkeit in YOLOv5

📚 In diesem Leitfaden wird erklärt, wie man Pruning auf YOLOv5 🚀-Modelle anwendet, um effizientere Netzwerke zu erstellen und gleichzeitig die Leistung zu erhalten.

Was ist Model Pruning?

Modellbeschneidung ist eine Technik zur Verringerung der Größe und Komplexität von neuronalen Netzen durch die Entfernung weniger wichtiger Parameter (Gewichte und Verbindungen). Dieser Prozess schafft ein effizienteres Modell mit mehreren Vorteilen:

  • Reduzierte Modellgröße für eine einfachere Bereitstellung auf Geräten mit eingeschränkten Ressourcen
  • Schnellere Schlussfolgerungen mit minimalen Auswirkungen auf die Genauigkeit
  • Geringere Speichernutzung und geringerer Energieverbrauch
  • Verbesserte Gesamteffizienz für Echtzeitanwendungen

Beim Pruning werden Parameter identifiziert und entfernt, die nur minimal zur Leistung des Modells beitragen, was zu einem leichteren Modell mit ähnlicher Genauigkeit führt.

Bevor Sie beginnen

Repo klonen und requirements.txt in einem Python>=3.8.0 Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuestenVersion von YOLOv5 heruntergeladen.

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

Test Baseline-Leistung

Legen Sie vor dem Beschneiden eine Basisleistung fest, mit der Sie vergleichen können. Dieser Befehl testet YOLOv5x auf COCO val2017 bei einer Bildgröße von 640 Pixeln. yolov5x.pt ist das größte und genaueste verfügbare Modell. Andere Optionen sind yolov5s.pt, yolov5m.pt und yolov5l.ptoder Ihren eigenen Kontrollpunkt aus dem Training eines eigenen Datensatzes ./weights/best.pt. Einzelheiten zu allen verfügbaren Modellen finden Sie in der README Tabelle.

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_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

Pruning auf YOLOv5x anwenden (30% Sparsamkeit)

Wir können das Modell mit der Methode torch_utils.prune() Befehl. Um ein beschnittenes Modell zu testen, aktualisieren wir val.py um YOLOv5x auf 0,3 Sparsamkeit zu reduzieren (30% der Gewichte werden auf Null gesetzt):

Screenshot zeigt den Code für die Beschneidung von YOLOv5x auf 30% Sparsamkeit

30% beschnittene Leistung:

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

Ergebnisse Analyse

Aus den Ergebnissen geht hervor, dass:

  • 30% Sparsamkeit erreicht: 30% der Gewichtsparameter des Modells in nn.Conv2d Schichten sind jetzt Null
  • Die Inferenzzeit bleibt unverändert: Trotz Pruning ist die Verarbeitungsgeschwindigkeit im Wesentlichen dieselbe
  • Minimale Auswirkung auf die Leistung: mAP sank leicht von 0,507 auf 0,489 (nur 3,6 % Reduzierung)
  • Reduzierung der Modellgröße: Das beschnittene Modell benötigt weniger Speicherplatz für die Speicherung

Dies zeigt, dass Pruning die Modellkomplexität bei nur geringen Auswirkungen auf die Leistung erheblich reduzieren kann, was es zu einer effektiven Optimierungstechnik für den Einsatz in ressourcenbeschränkten Umgebungen macht.

Feinabstimmung beschnittener Modelle

Um beste Ergebnisse zu erzielen, sollten die beschnittenen Modelle nach dem Beschneiden fein abgestimmt werden, um die Genauigkeit wiederherzustellen. Dies kann wie folgt geschehen:

  1. Anwendung des Pruning mit einem gewünschten Sparsamkeitsgrad
  2. Training des beschnittenen Modells für einige Epochen mit einer geringeren Lernrate
  3. Bewertung des feinabgestimmten, beschnittenen Modells im Vergleich zum Basismodell

Dieser Prozess hilft den verbleibenden Parametern, sich anzupassen, um die entfernten Verbindungen zu kompensieren, und stellt oft den größten Teil oder die gesamte ursprüngliche Genauigkeit wieder her.

Unterstützte Umgebungen

Ultralytics bietet eine Reihe gebrauchsfertiger Umgebungen, die jeweils mit wichtigen Abhängigkeiten vorinstalliert sind, z. B. CUDA, CUDNN, Python, und PyTorchvorinstalliert, um Ihre Projekte in Gang zu bringen.

Projektstatus

YOLOv5 CI

Dieses Abzeichen zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI) Tests erfolgreich bestanden wurden. Diese CI-Tests überprüfen die Funktionalität und Leistung von YOLOv5 in verschiedenen Schlüsselbereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu, wobei die Tests alle 24 Stunden und bei jeder neuen Übertragung durchgeführt werden.

📅 Erstellt vor 1 Jahr ✏️ Aktualisiert vor 8 Tagen

Kommentare