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:
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:
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:
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:
Katman Dondurma Ne Zaman Kullanılır?
Transfer öğreniminde katman dondurma özellikle aşağıdaki gibi senaryolarda faydalıdır:
- Sınırlı hesaplama kaynakları: GPU belleği veya işlem gücü kısıtlı olduğunda
- 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
- Hızlı adaptasyon: Bir modeli yeni bir etki alanına hızla uyarlamanız gerektiğinde
- 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.
- Ücretsiz GPU Not Defterleri:
- Google Bulut: 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 '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.