İçeriğe geç

YOLOv5'te Dondurulmuş Katmanlar ile Transfer Öğrenimi

📚 Bu kılavuz, transfer öğrenimini uygularken YOLOv5 🚀 katmanlarının nasıl dondurulacağını açıklar. Transfer öğrenimi, tüm ağı yeniden eğitmek zorunda kalmadan bir modeli yeni veriler üzerinde hızlı bir şekilde yeniden eğitmenize olanak tanıyan güçlü bir tekniktir. Başlangıç ağırlıklarının bir kısmını dondurarak ve yalnızca geri kalanını güncelleyerek, hesaplama kaynaklarını ve eğitim süresini önemli ölçüde azaltabilirsiniz, ancak bu yaklaşım nihai model doğruluğunu biraz etkileyebilir.

Başlamadan Önce

Depoyu klonlayın ve requirements.txt dosyasını bir Python.8.0 ortamı dahil olmak üzere PyTorch.8. 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

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

Bir sinir ağındaki katmanları dondurduğunuzda, esasen parametrelerini eğitilemez olarak ayarlamış olursunuz. Bu katmanlar için gradyanlar sıfıra ayarlanır ve geriye yayılma sırasında herhangi bir ağırlık güncellemesi önlenir. Bu, YOLOv5'in eğitim sürecinde aşağıdaki şekilde uygulanır:

# Freeze
freeze = [f"model.{x}." for x in range(freeze)]  # layers to freeze
for k, v in model.named_parameters():
    v.requires_grad = True  # train all layers
    if any(x in k for x in freeze):
        print(f"freezing {k}")
        v.requires_grad = False

Model Mimarisini Keşfetme

Modelin belirli bölümlerini etkin bir şekilde dondurmak için katman yapısını anlamak faydalı olacaktır. Tüm modül adlarını şu şekilde görüntüleyebilirsiniz:

for k, v in model.named_parameters():
    print(k)

"""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 bir omurga (katmanlar 0-9) ve bir kafadan (kalan katmanlar) oluşur:

# YOLOv5 v6.0 backbone
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2
    - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
    - [-1, 3, C3, [128]]
    - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
    - [-1, 6, C3, [256]]
    - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
    - [-1, 9, C3, [512]]
    - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
    - [-1, 3, C3, [1024]]
    - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv5 v6.0 head
head:
    - [-1, 1, Conv, [512, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 6], 1, Concat, [1]] # cat backbone P4
    - [-1, 3, C3, [512, False]] # 13
    # ... remaining head layers

Dondurma Seçenekleri

Yalnızca Omurgayı Dondur

Öğrenilen özellik çıkarma yeteneklerini korurken modeli yeni sınıflara uyarlamak için yararlı olan yalnızca omurgayı (katmanlar 0-9) dondurmak:

python train.py --freeze 10

Bu yaklaşım özellikle yeni veri kümenizin orijinal eğitim verileriyle benzer düşük seviyeli özellikleri paylaştığı ancak farklı sınıflara veya nesnelere sahip olduğu durumlarda etkilidir.

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

Detect modülündeki son çıktı konvolüsyon katmanları hariç tüm modeli dondurmak için:

python train.py --freeze 24

Bu yaklaşım, modelin öğrenilen özelliklerinin çoğunu korumak istediğinizde ancak farklı sayıda sınıfı tespit etmek için uyarlamanız gerektiğinde idealdir.

Performans Karşılaştırması

YOLOv5m'yi, resmi COCO ön eğitimli ağırlıklarından başlayarak farklı dondurma stratejileri kullanarak VOC veri kümesi üzerinde eğittik:

python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

Doğruluk Sonuçları

Sonuçlar, katmanları dondurmanın eğitimi hızlandırdığını ancak nihai doğruluğu biraz azalttığını göstermektedir:

Dondurma eğitimi mAP50 sonuçları

Dondurma eğitimi mAP50-95 sonuçları

Tablo sonuçları

Kaynak Kullanımı

Daha fazla katmanın dondurulması GPU bellek gereksinimlerini ve kullanımını azaltarak bu tekniği daha büyük modellerin eğitilmesi veya daha yüksek çözünürlüklü görüntülerin kullanılması için değerli hale getirir:

Eğitim GPU ayrılan bellek yüzdesi

Eğitim GPU bellek kullanım yüzdesi

Katman Dondurma Ne Zaman Kullanılır?

Transfer öğreniminde katman dondurma özellikle aşağıdaki gibi senaryolarda faydalıdır:

  1. Sınırlı hesaplama kaynakları: GPU belleği veya işlem gücü kısıtlı olduğunda
  2. Küçük veri kümeleri: Yeni veri kümeniz aşırı uyum sağlamadan tam bir modeli eğitmek için çok küçük olduğunda
  3. Hızlı adaptasyon: Bir modeli yeni bir etki alanına hızla uyarlamanız gerektiğinde
  4. Belirli görevler için ince ayar: Genel bir modeli özel bir uygulamaya uyarlarken

Transfer öğrenme teknikleri ve uygulamaları hakkında daha fazla bilgi için transfer öğrenme sözlüğü girişine bakınız.

Desteklenen Ortamlar

Ultralytics gibi temel bağımlılıklarla önceden yüklenmiş bir dizi kullanıma hazır ortam sağlar. CUDA, CUDNN, 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.

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

Yorumlar