İçeriğe geç

Hiperparametre evrimi

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

ML'deki hiperparametreler eğitimin çeşitli yönlerini kontrol eder ve bunlar için optimum değerleri bulmak zor olabilir. Izgara aramaları gibi geleneksel yöntemler, 1) yüksek boyutlu arama uzayı 2) boyutlar arasındaki bilinmeyen korelasyonlar ve 3) her noktada uygunluğu değerlendirmenin pahalı doğası nedeniyle hızla zorlaşabilir ve GA'yı hiperparametre aramaları için uygun bir aday haline getirir.

Başlamadan Önce

Repoyu klonlayın ve requirements.txt dosyasını bir Python>=3.8.0 ortamı dahil olmak üzere PyTorch>=1.8. Modeller ve veri setleri 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şlatma

YOLOv5 çeşitli eğitim ayarları için kullanılan yaklaşık 30 hiper parametreye sahiptir. Bunlar şurada tanımlanmıştır *.yaml içindeki dosyalar /data/hyps dizini. Daha iyi başlangıç tahminleri daha iyi nihai sonuçlar üretecektir, bu nedenle geliştirmeden önce bu değerleri düzgün bir şekilde başlatmak önemlidir. Şüpheniz varsa, YOLOv5 COCO eğitimi için sıfırdan optimize edilmiş varsayılan değerleri kullanın.

# 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. Fitness'ı tanımlayın

Uygunluk, maksimize etmeye çalıştığımız değerdir. YOLOv5 adresinde, metriklerin ağırlıklı bir kombinasyonu olarak varsayılan bir uygunluk fonksiyonu tanımlıyoruz: mAP@0.5 ağırlığın %10'una katkıda bulunur ve mAP@0.5:0.95 kalan %90'ına katkıda bulunurken Hassasiyet P ve Geri Çağırma R yok. Bunları uygun gördüğünüz şekilde ayarlayabilir veya utils/metrics.py'deki varsayılan fitness tanımını kullanabilirsiniz (önerilir).

def fitness(x):
    # Model fitness as a weighted combination of metrics
    w = [0.0, 0.0, 0.1, 0.9]  # weights for [P, R, mAP@0.5, mAP@0.5:0.95]
    return (x[:, :4] * w).sum(1)

3. Evrimleşmek

Evrim, geliştirmeye çalıştığımız temel bir senaryo hakkında gerçekleştirilir. Bu örnekteki temel senaryo, önceden eğitilmiş YOLOv5'ler kullanılarak COCO128'in 10 epok için ince ayarlanmasıdır. Temel senaryo eğitim komutu şöyledir:

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

Hiperparametreleri geliştirmek için bu senaryoya özgü'de tanımlanan başlangıç değerlerimizden başlayarak Bölüm 1.'de tanımlanan uygunluğu maksimize etmektir. Bölüm 2., ekle --evolve:

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

# Multi-GPU
for i in 0 1 2 3 4 5 6 7; do
  sleep $(expr 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

# Multi-GPU bash-while (not recommended)
for i in 0 1 2 3 4 5 6 7; do
  sleep $(expr 30 \* $i) &&  # 30-second delay (optional)
  echo 'Starting GPU '$i'...' &&
  "$(while true; do nohup python train.py... --device $i --evolve 1 > evolve_gpu_$i.log; done)" &
done

Varsayılan evrim ayarları temel senaryoyu 300 kez, yani 300 nesil boyunca çalıştıracaktır. Nesilleri şu yolla değiştirebilirsiniz --evolve argümanı, yani python train.py --evolve 1000.

Ana genetik operatörler şunlardır çapraz geçiş ve mutasyon. Bu çalışmada, önceki tüm nesillerden en iyi ebeveynlerin bir kombinasyonuna dayanan yeni yavrular oluşturmak için %80 olasılık ve 0,04 varyans ile mutasyon kullanılmıştır. Sonuçlar şu adrese kaydedilir runs/evolve/exp/evolve.csvolarak kaydedilir ve en yüksek uygunluğa sahip yavru her nesilde runs/evolve/hyp_evolved.yaml:

# 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. Temel senaryo yüzlerce kez eğitildiğinden ve muhtemelen yüzlerce veya binlerce GPU saati gerektirdiğinden, evrimin genellikle pahalı ve zaman alıcı olduğunu unutmayın.

4. Görselleştirin

evolve.csv olarak çizilir evolve.png tarafından utils.plots.plot_evolve() Evrim hiperparametre değerlerine (x-ekseni) karşı uygunluğu (y-ekseni) gösteren hiperparametre başına bir alt grafikle tamamlandıktan sonra. Sarı, daha yüksek konsantrasyonları gösterir. Dikey dağılımlar bir parametrenin devre dışı bırakıldığını ve mutasyona uğramadığını gösterir. Bu kullanıcı tarafından seçilebilir meta sözlüğüdür ve parametreleri sabitlemek ve evrimleşmelerini önlemek için kullanışlıdır.

evolve

Desteklenen Ortamlar

Ultralytics her biri CUDA, CUDNN gibi temel bağımlılıklarla önceden yüklenmiş bir dizi kullanıma hazır ortam sağlar, Pythonve PyTorchProjelerinizi başlatmak için.

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 'un işlevselliğini ve performansını çeşitli temel yönlerden titizlikle kontrol eder: eğitim, doğrulama, çıkarım, dışa aktarma ve kıyaslamalar. Her 24 saatte bir ve her yeni işlemde yapılan testlerle macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir çalışma sağlarlar.



Oluşturuldu 2023-11-12, Güncellendi 2023-12-03
Yazarlar: glenn-jocher (2)

Yorumlar