İçeriğe geç

YOLOv5'te Model Budama ve Seyreltme

📚 Bu kılavuz, performansı korurken daha verimli ağlar oluşturmak için YOLOv5 🚀 modellerine budama işleminin nasıl uygulanacağını açıklamaktadır.

Model Budama Nedir?

Model budama, daha az önemli parametreleri (ağırlıklar ve bağlantılar) kaldırarak sinir ağlarının boyutunu ve karmaşıklığını azaltmak için kullanılan bir tekniktir. Bu işlem, çeşitli faydaları olan daha verimli bir model oluşturur:

  • Kaynak kısıtlı cihazlara daha kolay dağıtım için küçültülmüş model boyutu
  • Doğruluk üzerinde minimum etki ile daha hızlı çıkarım hızları
  • Daha düşük bellek kullanımı ve enerji tüketimi
  • Gerçek zamanlı uygulamalar için genel verimlilikte iyileştirme

Budama, modelin performansına minimum düzeyde katkıda bulunan parametreleri belirleyip kaldırarak çalışır ve sonuç olarak benzer doğruluğa sahip daha hafif bir model elde edilir.

Başlamadan Önce

requirements.txt'i bir Python>=3.8.0 ortamında, PyTorch>=1.8 dahil olmak üzere klonlayın ve kurun. Modeller ve veri kümeleri, en son YOLOv5 sürümünden otomatik olarak indirilir.

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

Temel Performansı Test Etme

Budamadan önce, karşılaştırma yapmak için bir temel performans belirleyin. Bu komut, 640 piksel görüntü boyutunda COCO val2017 üzerinde YOLOv5x'i test eder. yolov5x.pt mevcut en büyük ve en doğru modeldir. Diğer seçenekler şunlardır: yolov5s.pt, yolov5m.pt ve yolov5l.pt, veya özel bir veri kümesini eğiterek kendi kontrol noktanızı kullanabilirsiniz. ./weights/best.pt. Mevcut tüm modeller hakkında ayrıntılı bilgi için README'ye bakın tablo.

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

Çıktı:

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

YOLOv5x'e Budama Uygula (%30 Seyreklik)

Modeli budama için kullanabiliriz: torch_utils.prune() komutu. Kırpılmış bir modeli test etmek için şunu güncelliyoruz: val.py YOLOv5x modelini %0,3 yoğunluğa (ağırlıkların %30'u sıfıra ayarlanmış) budamak için:

YOLOv5x'in %30 seyrekliğe kadar budanmasına ilişkin kodu gösteren ekran görüntüsü

%30 budanmış çıktı:

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

Sonuç Analizi

Sonuçlardan şunu gözlemleyebiliriz:

  • %30 seyreklik elde edildi: %30'u modelin ağırlık parametrelerinin nn.Conv2d katmanlar artık sıfır
  • Çıkarım süresi değişmeden kaldı: Kırpmaya rağmen, işlem hızı esasen aynıdır
  • Minimum performans etkisi: mAP, 0,507'den 0,489'a hafifçe düştü (yalnızca %3,6 azalma)
  • Model boyutu küçültme: Kırpılmış model, depolama için daha az bellek gerektirir

Bu, budamanın performansı yalnızca küçük bir etkiyle önemli ölçüde azaltabileceğini ve bunun da kaynak kısıtlı ortamlarda dağıtım için etkili bir optimizasyon tekniği olduğunu gösterir.

Budanmış Modellerde İnce Ayar

En iyi sonuçlar için, kırpılmış modeller doğruluğu geri kazanmak için kırpıldıktan sonra ince ayar yapılmalıdır. Bu şu şekilde yapılabilir:

  1. İstenen bir seyreklik düzeyiyle budama uygulama
  2. Kırpılmış modeli daha düşük bir öğrenme oranıyla birkaç epoch için eğitme
  3. İnce ayarlı budanmış modelin temel modele karşı değerlendirilmesi

Bu işlem, kalan parametrelerin kaldırılan bağlantıları telafi etmek için uyum sağlamasına yardımcı olur ve genellikle orijinal doğruluğun çoğunu veya tamamını geri kazandırır.

Desteklenen Ortamlar

Ultralytics, projelerinize hızlı bir başlangıç yapmanız için her biri CUDA, CUDNN, Python ve PyTorch gibi temel bağımlılıklarla önceden yüklenmiş bir dizi kullanıma hazır ortam sunar.

Proje Durumu

YOLOv5 CI

Bu rozet, tüm YOLOv5 GitHub Actions Sürekli Entegrasyon (CI) testlerinin başarıyla geçtiğini gösterir. Bu CI testleri, YOLOv5'in işlevselliğini ve performansını çeşitli temel açılardan titizlikle kontrol eder: eğitim, doğrulama, çıkarım, dışa aktarma ve kıyaslamalar. macOS, Windows ve Ubuntu'da tutarlı ve güvenilir çalışmayı sağlarlar; testler her 24 saatte bir ve her yeni commit'te yapılır.



📅 1 yıl önce oluşturuldu ✏️ 1 ay önce güncellendi

Yorumlar