Ultralytics YOLO27:
Get Started

YOLOv5'te Dondurulmuş Katmanlarla Transfer Öğrenimi#

📚 Bu kılavuz, transfer öğrenimi uygularken YOLOv5 🚀 katmanlarının nasıl dondurulacağını açıklar. Transfer öğrenimi, tüm ağı sıfırdan yeniden eğitmeden bir modeli yeni verilerle hızla yeniden eğitmeni sağlayan güçlü bir makine öğrenimi (ML) tekniğidir. İlk katmanların ağırlıklarını dondurup yalnızca sonraki katmanların parametrelerini güncelleyerek hesaplama kaynağı gereksinimlerini ve eğitim süresini önemli ölçüde azaltabilirsin. Ancak bu yaklaşım, son modelin doğruluğunu bir miktar düşürebilir.

Başlamadan Önce#

Önce YOLOv5 deposunu klonla ve requirements.txt içinde listelenen gerekli bağımlılıkları yükle. Python>=3.8.0 ve PyTorch>=1.8 yüklü bir ortamın olduğundan emin ol. Önceden eğitilmiş modeller ve gerekli veri kümeleri, en yeni YOLOv5 sürümünden otomatik olarak indirilir.

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

Katman Dondurma Nasıl Çalışır?#

Bir sinir ağındaki katmanları dondurduğunda, eğitim sürecinde bu katmanların parametrelerinin (ağırlıkların ve bias değerlerinin) güncellenmesini önlersin. PyTorch'ta bu işlem, katman tensörlerinin requires_grad niteliğini False olarak ayarlayarak yapılır. Sonuç olarak, geri yayılım sırasında bu katmanlar için gradyan hesaplanmaz; böylece işlem gücü ve bellekten tasarruf edilir.

YOLOv5'in katman dondurmayı eğitim betiğinde nasıl uyguladığı:

# Freeze specified layers
freeze = [f"model.{x}." for x in (freeze if len(freeze) > 1 else range(freeze[0]))]  # layers to freeze
for k, v in model.named_parameters():
    v.requires_grad = True  # Ensure all parameters are initially trainable
    if any(x in k for x in freeze):
        print(f"Freezing layer: {k}")
        v.requires_grad = False  # Disable gradient calculation for frozen layers

Model Mimarisi'ni İnceleme#

Hangi katmanların dondurulacağına karar vermek için YOLOv5 modelinin yapısını anlamak çok önemlidir. Aşağıdaki Python kod parçacığını kullanarak tüm modüllerin ve parametrelerinin adlarını inceleyebilirsin:

# 'model'in yüklenmiş YOLOv5 model örneğin olduğunu varsayalım
for name, param in model.named_parameters():
    print(name)

"""
Example Output:
model.0.conv.weight
model.0.bn.weight
model.0.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""

YOLOv5 mimarisi genellikle özellik çıkarımından sorumlu bir omurgadan (YOLOv5s/m/l/x gibi standart yapılandırmalarda 0-9. katmanlar) ve nesne algılamayı gerçekleştiren bir başlıktan (kalan katmanlar) oluşur.

# Example YOLOv5 v6.0 backbone structure
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]]  # Layer 0: Initial convolution (P1/2 stride)
    - [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
    - [-1, 3, C3, [128]]          # Layer 2: C3 module
    - [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
    - [-1, 6, C3, [256]]          # Layer 4: C3 module
    - [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
    - [-1, 9, C3, [512]]          # Layer 6: C3 module
    - [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
    - [-1, 3, C3, [1024]]         # Layer 8: C3 module
    - [-1, 1, SPPF, [1024, 5]]    # Layer 9: Spatial Pyramid Pooling Fast

# Example YOLOv5 v6.0 head structure
head:
    - [-1, 1, Conv, [512, 1, 1]] # Layer 10
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
    - [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
    - [-1, 3, C3, [512, False]] # Layer 13: C3 module
    # ... subsequent head layers for feature fusion and detection

Dondurma Seçenekleri#

Eğitim komutundaki --freeze bağımsız değişkenini kullanarak hangi katmanların dondurulacağını belirleyebilirsin. Bu bağımsız değişken, dondurulmamış ilk modülün dizinini belirtir; bu dizinden önceki tüm modüllerin ağırlıkları dondurulur. Bunun yerine birden çok dizin verirsen (ör. --freeze 0 1 2), yalnızca belirtilen modüller dondurulur. Belirli bir bloğa hangi dizinlerin karşılık geldiğini doğrulaman gerekiyorsa modül sıralamasını incelemek için model.model (bir nn.Sequential) kullan.

Yalnızca Omurgayı Dondur#

Büyük bir veri kümesi olan COCO üzerinde öğrenilen genel özellik çıkarma becerilerini koruyarak modeli yeni nesne sınıflarına uyarlarken yaygın olarak kullanılan omurganın tamamını (0'dan 9'a kadar olan katmanları) dondurmak için:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10

Bu strateji, hedef veri kümen orijinal eğitim verileriyle (ör. COCO) benzer düşük düzeyli görsel özellikleri (kenarlar, dokular) paylaşıyor ancak farklı nesne kategorileri içeriyorsa etkilidir.

Son Algılama Katmanları Dışındaki Tüm Katmanları Dondur#

Ağın neredeyse tamamını dondurup yalnızca son çıktı evrişim katmanlarını (genellikle son modül olan Detect modülünün bir parçası; ör. YOLOv5s'te 24. modül) eğitilebilir bırakmak için:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24

Bu yaklaşım, öğrenilen özelliklerin büyük çoğunluğunu koruyarak modeli farklı sayıda çıktı sınıfına uyarlaman gerektiğinde kullanışlıdır. İnce ayar için en az hesaplama kaynağı gerektiren yöntemdir.

Performans Karşılaştırması#

Katmanları dondurmanın etkilerini göstermek için YOLOv5m modelini resmi COCO önceden eğitilmiş ağırlıklarını (yolov5m.pt) kullanarak Pascal VOC veri kümesi üzerinde 50 epoch boyunca eğittik. Üç senaryoyu karşılaştırdık: tüm katmanları eğitmek (--freeze 0), omurgayı dondurmak (--freeze 10) ve son algılama katmanları dışındaki tüm katmanları dondurmak (--freeze 24).

# Example command for training with backbone frozen
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp data/hyps/hyp.VOC.yaml --freeze 10

Doğruluk Sonuçları#

Sonuçlar, katmanları dondurmanın eğitimi önemli ölçüde hızlandırabileceğini ancak son ortalama hassasiyette (mAP) hafif bir düşüşe yol açabileceğini gösteriyor. Tüm katmanları eğitmek genellikle en iyi doğruluğu sağlar; daha fazla katmanı dondurmak ise olası performans düşüşü pahasına daha hızlı eğitim sunar.

Farklı dondurma stratejilerini karşılaştıran eğitim mAP50 sonuçları Eğitim sırasında mAP50 karşılaştırması

Farklı dondurma stratejilerini karşılaştıran eğitim mAP50-95 sonuçları Eğitim sırasında mAP50-95 karşılaştırması

YOLOv5 frozen layer training performance *Performans ölçütlerinin özet tablosu*

Kaynak Kullanımı#

Daha fazla katmanı dondurmak GPU bellek gereksinimlerini ve genel kaynak kullanımını önemli ölçüde azaltır. Bu, sınırlı donanım kaynaklarıyla çalışırken dondurulmuş katmanlarla transfer öğrenimini cazip bir seçenek hâline getirir; normalde mümkün olmayabilecek daha büyük modellerle eğitim yapmana veya daha büyük görüntü boyutları kullanmana olanak tanır.

Eğitim sırasında ayrılan GPU belleği yüzdesi GPU Bellek Tahsisi (%)

Eğitim sırasında GPU kullanım yüzdesi GPU Kullanımı (%)

Katman Dondurma Ne Zaman Kullanılır?#

Transfer öğrenimi sırasında katman dondurma, özellikle şu durumlarda avantaj sağlar:

  1. Sınırlı Hesaplama Kaynakları: GPU belleği veya işlem gücü konusunda kısıtlamaların varsa.
  2. Küçük Veri Kümeleri: Hedef veri kümen ilk ön eğitim veri kümesinden önemli ölçüde küçük olduğunda, dondurma aşırı öğrenmeyi önlemeye yardımcı olur.
  3. Hızlı Prototipleme: İlk değerlendirme için mevcut bir modeli yeni bir göreve veya alana hızla uyarlaman gerektiğinde.
  4. Benzer Özellik Alanları: Yeni veri kümenin düşük düzeyli özellikleri, modelin önceden eğitildiği veri kümesindekilere çok benzediğinde.

Transfer öğreniminin incelikleri hakkında sözlük girdimizden daha fazla bilgi edin ve performansı optimize etmek için hiperparametre evrimini değerlendirebilirsin.

Desteklenen Ortamlar#

Ultralytics, 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 Continuous Integration Status

Bu rozet, tüm YOLOv5 GitHub Actions sürekli entegrasyon (CI) testlerinin başarıyla geçtiğini doğrular. Bu CI testleri, YOLOv5'in işlevselliğini ve performansını temel işlemler genelinde titizlikle değerlendirir: eğitim, doğrulama, çıkarım, dışa aktarma ve karşılaştırmalı değerlendirmeler. macOS, Windows ve Ubuntu'da tutarlı ve güvenilir çalışmayı sağlar; her 24 saatte bir ve her yeni kod işlemesinde otomatik olarak çalışırlar.

Sık Sorulan Sorular#

  • model.model içindeki ilk N modülü dondurur; böylece bu modüllerin ağırlıkları sabit kalır ve gradyan almaz. --freeze 10 omurgayı, --freeze 24 ise son Detect modülü dışındaki her şeyi dondurur.

  • Yukarıdaki VOC deneyinde tüm katmanları eğitmek en iyi mAP sonucunu verdi; omurgayı dondurmak doğruluğu biraz düşürdü, algılama başlığı dışındaki her şeyi dondurmak ise en büyük düşüşe yol açtı. Buna karşılık, dondurulmuş çalıştırmalar daha hızlı eğitim yapar ve çok daha az GPU belleği kullanır.

  • Görüntülerin ön eğitim verileriyle düşük düzeyli özellikler paylaşıyorsa, veri kümen küçükse veya sınırlı donanımda hızlı bir temel sonuç elde etmen gerekiyorsa. Veri kümesi büyüdüğünde veya mAP'de son birkaç puanı kazanman gerektiğinde tüm katmanları eğit.

  • Evet. Tüm ağa ince ayar yapmak için dondurulmuş modelin best.pt dosyasından, --freeze olmadan yeni bir çalıştırma başlat; genellikle daha düşük bir öğrenme oranı kullanılır.

Yorumlar