YOLOv5 için Hiperparametre Evrimi
📚 Bu kılavuz, YOLOv5 🚀 için hiperparametre evrimini açıklamaktadır. Hiperparametre evrimi, optimizasyon için bir Genetik Algoritma (GA) kullanan bir Hiperparametre Optimizasyonu yöntemidir.
Makine öğrenimindeki hiperparametreler, eğitimin çeşitli yönlerini kontrol eder ve bunlar için en uygun değerleri bulmak zorlu olabilir. Izgara aramaları gibi geleneksel yöntemler şu nedenlerle hızla çözülemez hale gelebilir:
- Yüksek boyutlu arama uzayı
- Boyutlar arasında bilinmeyen korelasyonlar
- Her noktada uygunluğun değerlendirilmesinin maliyetli olması
Bu, genetik algoritmaları hiperparametre aramaları için uygun bir aday yapar.
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
1. Hiperparametreleri Başlat
YOLOv5'in çeşitli eğitim ayarları için kullanılan yaklaşık 30 hiperparametresi vardır. Bunlar şurada tanımlanmıştır: *.yaml
içindeki dosyalar /data/hyps
dizini. Daha iyi ilk tahminler, daha iyi nihai sonuçlar üretecektir, bu nedenle bu değerleri gelişmeden önce düzgün bir şekilde başlatmak önemlidir. Şüpheniz varsa, sıfırdan YOLOv5 COCO eğitimi için optimize edilmiş varsayılan değerleri kullanmanız 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
Fitness, maksimize etmeye çalıştığımız değerdir. YOLOv5'te varsayılan bir fitness fonksiyonunu metriklerin ağırlıklı bir kombinasyonu olarak tanımlıyoruz: mAP@0.5
ağırlığın %10'unu katkıda bulunur ve mAP@0.5:0.95
kalan %90'ına katkıda bulunur, ile Kesinlik P
ve Duyarlılık (Recall) R
mevcut değil. Bunları uygun gördüğünüz şekilde ayarlayabilir veya utils/metrics.py'deki varsayılan uygunluk tanımını kullanabilirsiniz (önerilir).
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] # weights for [P, R, mAP@0.5, mAP@0.5:0.95]
return (x[:, :4] * w).sum(1)
3. Geliştirme
Evrim, iyileştirmek istediğimiz temel bir senaryo hakkında gerçekleştirilir. Bu örnekteki temel senaryo, önceden eğitilmiş YOLOv5s kullanılarak COCO128'in 10 epoch için ince ayar yapılmasıdır. Temel senaryo eğitim komutu:
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache
Hiperparametreleri geliştirmek için bu senaryoya özel, başlangıçta tanımladığımız ilk değerlerden itibaren Bölüm 1.ve içinde tanımlanan uygunluğu en üst düzeye çıkararak Bölüm 2., ekleyin --evolve
:
# 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ı, temel senaryoyu 300 kez, yani 300 nesil boyunca çalıştıracaktır. Nesilleri aracılığıyla değiştirebilirsiniz --evolve
argümanını kullanarak dışa aktarabilirsiniz, örneğin python train.py --evolve 1000
.
Ana genetik operatörler şunlardır: çaprazlama ve mutasyon. Bu çalışmada mutasyon kullanılmaktadır; önceki tüm nesillerden en iyi ebeveynlerin bir kombinasyonuna dayalı olarak yeni yavrular oluşturmak için %80 olasılık ve 0,04 varyans ile. Sonuçlar şuraya kaydedilir: runs/evolve/exp/evolve.csv
ve en yüksek uygunluğa sahip yavru her nesilde kaydedilir 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 minimum 300 nesil evrim öneriyoruz. Evrimin genellikle maliyetli ve zaman alıcı olduğunu unutmayın, çünkü temel senaryo yüzlerce kez eğitilir ve muhtemelen yüzlerce veya binlerce GPU saati gerektirir.
4. Görselleştirme
evolve.csv
şeklinde çizilir evolve.png
by utils.plots.plot_evolve()
evrim bittikten sonra, her bir hiperparametre için uygunluğu (y ekseni) hiperparametre değerlerine (x ekseni) karşı gösteren bir alt grafik bulunur. Sarı, daha yüksek konsantrasyonları gösterir. Dikey dağılımlar, bir parametrenin devre dışı bırakıldığını ve değişmediğini gösterir. Bu, içinde kullanıcı tarafından seçilebilir. meta
train.py içindeki sözlük ve parametreleri sabitlemek ve gelişmelerini önlemek için kullanışlıdı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.
- Ücretsiz GPU Not Defterleri:
- Google Cloud: GCP Hızlı Başlangıç Kılavuzu
- Amazon: AWS Hızlı Başlangıç Kılavuzu
- Azure: AzureML Hızlı Başlangıç Kılavuzu
- Docker: Docker Hızlı Başlangıç Kılavuzu
Proje Durumu
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.