İçeriğe geç

YOLOv5'te Dondurulmuş Katmanlar ile Transfer Öğrenimi

📚 Bu kılavuzda nasıl dondurulacağı açıklanmaktadır YOLOv5Transfer öğrenimini uygularken 🚀 katmanları. Transfer öğrenimi, tüm ağı sıfırdan eğitmeden bir modeli yeni veriler üzerinde hızlı bir şekilde yeniden eğitmenize olanak tanıyan güçlü bir makine öğrenimi (ML) tekniğidir. İlk katmanların ağırlıklarını dondurarak ve yalnızca sonraki katmanların parametrelerini güncelleyerek, hesaplama kaynağı gereksinimlerini ve eğitim süresini önemli ölçüde azaltabilirsiniz. Ancak bu yaklaşım nihai model doğruluğunu biraz etkileyebilir.

Başlamadan Önce

İlk olarak, YOLOv5 deposunu klonlayın ve aşağıda listelenen gerekli bağımlılıkları yükleyin requirements.txt. Bir tane olduğundan emin olun Python.8.0 ile çevre PyTorch.8 yüklü. Önceden eğitimli modeller ve gerekli veri kümeleri en son YOLOv5'ten otomatik olarak indirilecektir. serbest bırakma.

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

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

Katmanları dondurduğunuzda sinir ağıparametrelerininweights and biases önyargılar) eğitim süreci sırasında güncellenmesini önlersiniz. PyTorch'ta bu, aşağıdaki ayarlarla gerçekleştirilir requires_grad katman tensörlerinin özniteliği False. Sonuç olarak, bu katmanlar için gradyanlar hesaplanmaz. geri yayılımhesaplama ve bellek tasarrufu sağlar.

YOLOv5 'in eğitim komut dosyasında katman dondurmayı nasıl uyguladığı aşağıda açıklanmıştır:

# Freeze specified layers
freeze = [f"model.{x}." for x in range(freeze)]  # Define layers to freeze based on module index
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 Mimarisini Keşfetme

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

# Assuming 'model' is your loaded YOLOv5 model instance
for name, param in model.named_parameters():
    print(name)

"""
Example Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.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 tipik olarak özellik çıkarma işleminden sorumlu bir omurga (YOLOv5s/m/l/x gibi standart yapılandırmalarda 0-9 katmanları) ve nesne algılama işlemini gerçekleştiren bir başlıktan (geri 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

kullanarak hangi katmanların dondurulacağını kontrol edebilirsiniz. --freeze eğitim komutundaki argüman. Bu bağımsız değişken ilk eğitimin indeksini belirtir. Dondurulmamış modülü; bu dizinden önceki tüm modüllerin ağırlıkları dondurulacaktır.

Yalnızca Omurgayı Dondur

COCO gibi büyük bir veri kümesinden öğrenilen genel özellik çıkarma yeteneklerini korurken modeli yeni nesne sınıflarına uyarlarken yaygın olan tüm omurgayı (0'dan 9'a kadar olan katmanlar) dondurmak:

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

Bu strateji, hedef veri kümeniz orijinal eğitim verileriyle (örneğin COCO) benzer düşük seviyeli görsel özellikleri (kenarlar, dokular) paylaştığında ancak farklı nesne kategorileri içerdiğinde etkilidir.

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

Neredeyse tüm ağı dondurmak için, yalnızca son çıktı konvolüsyon katmanlarını (ağın bir parçası Detect modül, tipik olarak son modül, örneğin YOLOv5s'de modül 24) eğitilebilir:

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

Bu yaklaşım, öğrenilen özelliklerin büyük çoğunluğunu sağlam tutarken modeli farklı sayıda çıktı sınıfı için ayarlamanız gerektiğinde kullanışlıdır. İnce ayar için en az hesaplama kaynağı gerektirir.

Performans Karşılaştırması

Dondurucu katmanların etkilerini göstermek için YOLOv5m'yi Pascal VOC veri seti 50 için çağlarresmi COCO ön eğitiminden başlayarak ağırlıklar (yolov5m.pt). Üç senaryoyu karşılaştırdık: tüm katmanları eğitmek (--freeze 0), omurgayı dondurma (--freeze 10) ve son algılama katmanları hariç tümünün dondurulması (--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 hyp.finetune.yaml --freeze 10

Doğruluk Sonuçları

Sonuçlar, katmanların dondurulmasının eğitimi önemli ölçüde hızlandırabileceğini ancak nihai mAP'de (ortalama Ortalama Hassasiyet) hafif bir düşüşe yol açabileceğini göstermektedir. Tüm katmanları eğitmek genellikle en iyi doğruluğu sağlarken, daha fazla katmanı dondurmak potansiyel olarak daha düşük performans pahasına daha hızlı eğitim sunar.

Farklı dondurma stratejilerinin karşılaştırıldığı eğitim mAP50 sonuçları Eğitim sırasında mAP50 karşılaştırması

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

Performans sonuçlarını özetleyen tablo Performans ölçümlerinin özet tablosu

Kaynak Kullanımı

Daha fazla katmanı dondurmak önemli ölçüde azaltır GPU bellek gereksinimleri ve genel kullanım. Bu durum, sınırlı donanım kaynaklarıyla çalışırken donmuş katmanlarla transfer öğrenmeyi cazip bir seçenek haline getirerek daha büyük modellerin eğitilmesine veya aksi takdirde mümkün olandan daha büyük görüntü boyutlarının kullanılmasına olanak tanır.

Eğitim sırasında GPU belleğine ayrılan yüzde Ayrılan GPU Belleği (%)

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

Katman Dondurma Ne Zaman Kullanılır?

Transfer öğrenimi sırasında katman dondurma özellikle birkaç durumda avantajlıdır:

  1. Sınırlı Hesaplama Kaynakları: GPU belleği veya işlem gücü konusunda kısıtlamalarınız varsa.
  2. Küçük Veri Kümeleri: Hedef veri kümeniz orijinal ön eğitim veri kümesinden önemli ölçüde daha küçük olduğunda, dondurma işlemi aşırı uyumu önlemeye yardımcı olur.
  3. Hızlı Prototipleme: İlk değerlendirme için mevcut bir modeli yeni bir göreve veya etki alanına hızlı bir şekilde uyarlamanız gerektiğinde.
  4. Benzer Özellik Alanları: Yeni veri kümenizdeki düşük seviyeli özellikler, modelin önceden eğitildiği veri kümesindekilere çok benziyorsa.

Sözlük girişimizde transfer öğrenmenin incelikleri hakkında daha fazla bilgi edinin ve performansı optimize etmek için hiperparametre ayarlama gibi teknikleri değerlendirin.

Desteklenen Ortamlar

Ultralytics , aşağıdaki gibi temel bağımlılıklara sahip çeşitli kullanıma hazır ortamlar sunar CUDA, CuDNN, Pythonve PyTorch önceden yüklenmiş.

Proje Durumu

YOLOv5 Sürekli Entegrasyon Durumu

Bu rozet, tüm YOLOv5 GitHub Actions Sürekli Entegrasyon (CI) testlerinin başarıyla geçtiğini onaylar. Bu CI testleri, YOLOv5 ' in işlevselliğini ve performansını temel işlemlerde titizlikle değerlendirir: 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, her 24 saatte bir ve her yeni kod işleminde otomatik olarak çalışırlar.

📅1 yıl önce oluşturuldu ✏️ 15 gün önce güncellendi

Yorumlar