YOLO Vision 2026:

YOLOv5'te Model Budama ve Seyreklik#

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

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 avantajlara sahip daha verimli bir model oluşturur:

  • Kaynakları kısıtlı cihazlarda daha kolay dağıtım için azaltılmış model boyutu
  • Doğruluk üzerinde minimum etkiyle daha yüksek çıkarım hızları
  • Daha düşük bellek kullanımı ve enerji tüketimi
  • Gerçek zamanlı uygulamalar için iyileştirilmiş genel verimlilik

Budama, modelin performansına minimum katkı sağlayan parametreleri belirleyip kaldırarak çalışır ve benzer doğruluğa sahip daha hafif bir model elde edilmesini sağlar.

Başlamadan Önce#

Depoyu klonla ve Python>=3.8.0 ortamında, PyTorch>=1.8 dahil olmak üzere requirements.txt dosyasını yükle. Modeller ve veri kümeleri, en güncel 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 üzere temel performansı belirle. Bu komut, YOLOv5x'i 640 piksel görüntü boyutunda COCO val2017 üzerinde test eder. yolov5x.pt, kullanılabilir en büyük ve en doğru modeldir. Diğer seçenekler yolov5s.pt, yolov5m.pt ve yolov5l.pt ya da özel bir veri kümesiyle yapılan eğitimden kendi kontrol noktan ./weights/best.pt olabilir. Kullanılabilir tüm modellerin ayrıntıları için README'deki tabloya bak.

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

YOLOv5x'e Budama Uygulama (%30 Seyreklik)#

utils/torch_utils.py içinde tanımlanan torch_utils.prune() komutunu kullanarak modele budama uygulayabiliriz. Budanmış bir modeli test etmek için val.py değerini, YOLOv5x'i 0,3 seyreklik düzeyinde budayacak şekilde güncelleriz (ağırlıkların %30'u sıfıra ayarlanır):

YOLOv5 model pruning to 30% sparsity code

%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çların Analizi#

Sonuçlardan şunları gözlemleyebiliriz:

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

Bu, budamanın performans üzerinde yalnızca küçük bir etkiyle model karmaşıklığını önemli ölçüde azaltabileceğini ve kaynakları 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 doğruluğu geri kazanmak amacıyla budanmış modellere budamadan sonra ince ayar uygulanmalıdır. Bu işlem şu şekilde gerçekleştirilebilir:

  1. İstenen seyreklik düzeyini kullanarak budama uygulama
  2. Budanmış modeli daha düşük bir öğrenme oranıyla birkaç epoch boyunca eğitme
  3. İnce ayarı yapılmış budanmış modeli temel performansla karşılaştırarak değerlendirme

Bu işlem, kalan parametrelerin kaldırılan bağlantıları telafi edecek şekilde uyum sağlamasına yardımcı olur ve çoğu zaman özgün doğruluğun büyük bölümünü veya tamamını geri kazandırır.

Desteklenen Ortamlar#

Ultralytics, projelerine hızlı bir başlangıç yapman için CUDA, CUDNN, Python ve PyTorch gibi temel bağımlılıkların önceden yüklendiği, kullanıma hazır çeşitli ortamlar 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 çeşitli önemli alanlardaki işlevselliğini ve performansını titizlikle kontrol eder: eğitim, doğrulama, çıkarım, dışa aktarma ve karşılaştırmalı testler. Testler her 24 saatte bir ve her yeni işleme sonrasında yürütülerek macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir çalışmayı güvence altına alır.

Yorumlar