Ultralytics YOLO27:
Get Started

YOLOv5 için Hiperparametre Evrimi#

📚 Bu kılavuz, YOLOv5 🚀 için hiperparametre evrimini açıklar. Hiperparametre evrimi, optimizasyon için Hiperparametre Optimizasyonu yöntemini kullanan bir Genetik Algoritma (GA) yöntemidir.

Makine öğrenmesindeki hiperparametreler eğitimin çeşitli yönlerini kontrol eder ve bu parametreler için en uygun değerleri bulmak zor olabilir. Izgara aramaları gibi geleneksel yöntemler şu nedenlerle hızla uygulanamaz hâle gelebilir:

  1. Arama uzayının yüksek boyutlu olması
  2. Boyutlar arasındaki korelasyonların bilinmemesi
  3. Her noktadaki uygunluğun değerlendirilmesinin maliyetli olması

Bu nedenle genetik algoritmalar, hiperparametre aramaları için uygun bir seçenek hâline gelir.

Başlamadan Önce#

Depoyu klonla ve Python>=3.8.0 ortamında PyTorch>=1.8 dahil olmak üzere requirements.txt dosyasındaki gereksinimleri yükle. 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

1. Hiperparametreleri Başlat#

YOLOv5'te çeşitli eğitim ayarları için kullanılan yaklaşık 30 hiperparametre vardır. Bunlar, /data/hyps dizinindeki *.yaml dosyalarında tanımlanır. Daha iyi başlangıç tahminleri daha iyi nihai sonuçlar verir; bu nedenle evrime başlamadan önce bu değerleri doğru şekilde başlatmak önemlidir. Emin değilsen YOLOv5'in COCO üzerinde sıfırdan eğitimi için optimize edilmiş varsayılan değerleri kullanman yeterlidir.

# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# Hyperparameters for low-augmentation COCO training from scratch
# python train.py --batch 64 --cfg yolov5n6.yaml --weights '' --data coco.yaml --img 640 --epochs 300 --linear
# See tutorials for hyperparameter evolution https://github.com/ultralytics/yolov5#tutorials

lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.01 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4
warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
iou_t: 0.20 # IoU training threshold
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3  # anchors per output layer (0 to ignore)
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
copy_paste: 0.0 # segment copy-paste (probability)

2. Uygunluğu Tanımla#

Uygunluk, en üst düzeye çıkarmaya çalıştığımız değerdir. YOLOv5'te varsayılan uygunluk işlevini metriklerin ağırlıklı bir birleşimi olarak tanımlarız: mAP@0.5 ağırlığın %10'una, mAP@0.5:0.95 ise kalan %90'ına katkıda bulunur; kesinlik (P) ve duyarlılık (R) bu birleşime dâhil değildir. Bu ağırlıkları ihtiyacına göre ayarlayabilir veya utils/metrics.py içindeki varsayılan uygunluk tanımını kullanabilirsin (önerilir). Bu uygunluk, hangi sonucun hyp_evolve.yaml dosyasına kaydedileceğini belirler; genetik algoritmanın kendisi ise ebeveynleri ve elitleri yalnızca mAP@0.5 değerine göre sıralar. Dolayısıyla bu ağırlıkları değiştirmek ebeveyn seçimini değiştirmez.

def fitness(x):
    """Return model fitness as the sum of weighted metrics [P, R, mAP@0.5, mAP@0.5:0.95]."""
    w = [0.0, 0.0, 0.1, 0.9]  # [P, R, mAP@0.5, mAP@0.5:0.95] için ağırlıklar
    return (x[:, :4] * w).sum(1)

3. Evrimleştir#

Evrim, iyileştirmeyi hedeflediğimiz bir temel senaryo üzerinde gerçekleştirilir. Bu örnekte temel senaryo, önceden eğitilmiş YOLOv5s kullanarak COCO128 üzerinde 10 epoch boyunca ince ayar yapmaktır. Temel senaryonun eğitim komutu:

python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache

Başlangıç değerlerimizden başlayıp Bölüm 1.'de tanımladığımız ve Bölüm 2.'de tanımlanan uygunluk değerini en üst düzeye çıkararak bu senaryoya özgü hiperparametreleri evrimleştirmek için --evolve ekle:

# Single-GPU
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve

# Multi-GPU with delay
for i in {0..7}; do
  sleep $((30 * i)) # 30-second delay (optional)
  echo "Starting GPU $i..."
  nohup python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log" &
done

# Continuous training (use with caution)
# for i in {0..7}; do
#   sleep $((30 * i))  # 30-second delay (optional)
#   echo "Starting continuous training on GPU $i..."
#   (
#     while true; do
#       python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log"
#     done
#   ) &
# done

Varsayılan evrim ayarları 300 nesil boyunca çalışır ve her nesilde temel senaryo, popülasyondaki 50 bireyin her biri için bir kez eğitilir. Nesil sayısını --evolve bağımsız değişkeniyle değiştirebilirsin; örneğin python train.py --evolve 1000.

Başlıca genetik operatörler çaprazlama ve mutasyondur. Her nesilde her birey eğitilir ve mAP@0.5 ile puanlanır, turnuva seçimiyle ebeveynler belirlenir ve en uygun elit bireyler ebeveyn havuzuna eklenir; ardından evrim ilerledikçe oranları uyarlanan çaprazlama ve mutasyonla sonraki popülasyon oluşturulur. Sonuçlar runs/evolve/exp/evolve.csv konumuna kaydedilir ve en yüksek uygunluk değerine sahip yavru her nesilde runs/evolve/exp/hyp_evolve.yaml olarak kaydedilir:

# YOLOv5 Hyperparameter Evolution Results
# Best generation: 287
# Last generation: 300
#    metrics/precision,       metrics/recall,      metrics/mAP_0.5, metrics/mAP_0.5:0.95,         val/box_loss,         val/obj_loss,         val/cls_loss
#              0.54634,              0.55625,              0.58201,              0.33665,             0.056451,             0.042892,             0.013441

lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4
warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
iou_t: 0.20 # IoU training threshold
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3  # anchors per output layer (0 to ignore)
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
copy_paste: 0.0 # segment copy-paste (probability)

En iyi sonuçlar için en az 300 nesil evrim öneriyoruz. Evrimin genellikle maliyetli ve zaman alıcı olduğunu unutma; temel senaryo binlerce kez eğitilir ve bu işlem yüzlerce hatta binlerce GPU saati gerektirebilir.

Evrim tamamlandığında, örneğin python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt ile eğitimi kaydedilen dosyaya yönlendirerek keşfedilen ayarları yeniden kullanabilirsin.

4. Görselleştir#

Evrim tamamlandıktan sonra evolve.csv, her hiperparametre için uygunluğu (y ekseni) hiperparametre değerlerine (x ekseni) karşı gösteren bir alt grafik içerecek şekilde utils.plots.plot_evolve() tarafından evolve.png olarak çizilir. Sarı renk, daha yüksek yoğunlukları gösterir. Dikey dağılımlar, bir parametrenin devre dışı bırakıldığını ve mutasyona uğramadığını belirtir. Bu ayar train.py içindeki meta sözlüğünden seçilebilir; parametreleri sabitlemek ve evrimleşmelerini önlemek için kullanışlıdır.

YOLOv5 hiperparametre evrimi uygunluk sonuçları

Desteklenen Ortamlar#

Ultralytics, projelerine hızlıca başlaman için CUDA, CUDNN, Python ve PyTorch gibi temel bağımlılıkların önceden yüklü olduğu çeşitli kullanıma hazır 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 işlevselliğini ve performansını eğitim, doğrulama, çıkarım, dışa aktarma ve karşılaştırmalı testler gibi temel alanlarda titizlikle denetler. Testler her 24 saatte bir ve her yeni gönderimde gerçekleştirilerek macOS, Windows ve Ubuntu'da tutarlı ve güvenilir çalışma sağlanır.

Sık Sorulan Sorular#

  • Her nesilde temel senaryo, 50 üyeli popülasyondaki her birey için bir kez eğitilir; bu nedenle COCO128 üzerinde 10 epoch'luk bir çalıştırmada 300 nesil, tek bir çalıştırmanın maliyetinin yaklaşık 15.000 katına karşılık gelir. Temel senaryoyu kısa ve temsili tut. Yukarıdaki çoklu GPU döngüsü tek bir aramayı paylaşmak yerine her GPU'da bağımsız bir arama başlatır; bu nedenle sabit bir bütçeyle çalışıyorsan süreç başına --evolve değerini düşür.

  • Evet. --evolve varsayılan olarak 300 nesildir; daha fazla nesil çalıştırmak için --evolve 1000 gibi bir sayı ver.

  • train.py içindeki meta sözlüğünde ilgili girdinin ilk değerini False olarak ayarla. Hariç tutulan parametreler başlangıç değerlerini korur ve evolve.png içinde dikey çizgiler olarak görünür.

  • Kaydedilen dosyayı normal bir eğitim çalıştırmasına ver: python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.

Yorumlar