YOLOv5'te Dondurulmuş Katmanlarla Transfer Öğrenme#
📚 Bu kılavuz, transfer öğrenmesi uygularken YOLOv5 🚀 katmanlarını nasıl donduracağını (freeze) açıklar. Transfer öğrenmesi, tüm ağı sıfırdan yeniden eğitmek zorunda kalmadan bir modeli yeni veriler üzerinde hızla yeniden eğitmeni sağlayan güçlü bir makine öğrenimi (ML) tekniğidir. Başlangıç katmanlarını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 azaltabilirsin. Ancak bu yaklaşım, nihai model doğruluğunu çok az etkileyebilir.
Başlamadan Önce#
İlk olarak 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 ortama sahip olduğundan emin ol. Önceden eğitilmiş modeller ve gerekli veri setleri, en son YOLOv5 sürümünden otomatik olarak indirilecektir.
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependenciesKatman Dondurma Nasıl Çalışır#
Bir sinir ağında katmanları dondurduğunda, eğitim sürecinde bunların parametrelerinin (ağırlıklar ve sapmalar) güncellenmesini engellersin. PyTorch'ta bu, katmanın tensörlerinin requires_grad özniteliğini False olarak ayarlayarak elde edilir. Sonuç olarak, geri yayılım sırasında bu katmanlar için gradyanlar hesaplanmaz, böylece hesaplama ve bellek tasarrufu sağlanır.
İşte YOLOv5'in eğitim betiğinde katman dondurmayı nasıl uyguladığı:
# 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 layersModel Mimarisi İncelemesi#
YOLOv5 modelinin yapısını anlamak, hangi katmanların dondurulacağına karar vermek için çok önemlidir. Aşağıdaki Python kod parçacığını kullanarak tüm modüllerin isimlerini ve parametrelerini inceleyebilirsin:
# 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şlemlerinden sorumlu bir omurgadan (YOLOv5s/m/l/x gibi standart konfigürasyonlarda 0-9 katmanları) ve nesne tespiti gerçekleştiren bir kafadan (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 detectionDondurma Seçenekleri#
Eğitim komutundaki --freeze argümanını kullanarak hangi katmanların dondurulacağını kontrol edebilirsin. Bu argüman, ilk dondurulmamış modülün indeksini belirtir; bu indeksten önceki tüm modüllerin ağırlıkları dondurulacaktır. Belirli bir bloğa hangi indekslerin karşılık geldiğini teyit etmen gerekirse modül sırasını incelemek için model.model (nn.Sequential) kullan.
Sadece Omurgayı Dondur#
COCO gibi büyük bir veri setinden öğrenilen genel özellik çıkarım yeteneklerini korurken modeli yeni nesne sınıflarına uyarlarken yaygın bir durum olan tüm omurgayı (0 ila 9 arasındaki katmanlar) dondurmak için:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10Bu strateji, hedef veri setin orijinal eğitim verileriyle (örneğin COCO) benzer düşük seviyeli görsel özelliklere (kenarlar, dokular) sahip olduğunda ancak farklı nesne kategorileri içerdiğinde etkilidir.
Son Tespit Katmanları Dışındaki Her Şeyi Dondur#
Neredeyse tüm ağı dondurmak, yalnızca son çıktı konvolüsyon katmanlarını (Detect modülünün bir parçası, tipik olarak son modül, örneğin YOLOv5s'teki 24. modül) eğitilebilir bırakmak için:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24Bu yaklaşım, öğrenilen özelliklerin çok büyük bir kısmını olduğu gibi korurken modeli öncelikli olarak farklı sayıda çıktı sınıfı için ayarlaman gerektiğinde kullanışlıdır. İnce ayar için en az hesaplama kaynağını gerektirir.
Performans Karşılaştırması#
Katmanları dondurmanın etkilerini göstermek için, resmi COCO önceden eğitilmiş ağırlıklarından (yolov5m.pt) başlayarak YOLOv5m'i 50 dönem (epoch) boyunca Pascal VOC veri setinde eğittik. Üç senaryoyu karşılaştırdık: tüm katmanları eğitmek (--freeze 0), omurgayı dondurmak (--freeze 10) ve son tespit 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 10Doğruluk Sonuçları#
Sonuçlar, katmanları dondurmanın eğitimi önemli ölçüde hızlandırabileceğini ancak nihai mAP (ortalama Ortalama Kesinlik) değerinde 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.
Eğitim sırasında mAP50 karşılaştırması
Eğitim sırasında mAP50-95 karşılaştırması
*Summary table of performance metrics*
Kaynak Kullanımı#
Daha fazla katmanı dondurmak, GPU belleği gereksinimlerini ve genel kullanımını büyük ölçüde azaltır. Bu, sınırlı donanım kaynaklarıyla çalışırken dondurulmuş katmanlarla transfer öğrenmesini cazip bir seçenek haline getirir; aksi takdirde mümkün olabilecek durumlara kıyasla daha büyük modelleri eğitmene veya daha büyük görüntü boyutları kullanmana olanak tanır.
Ayrılan GPU Belleği (%)
GPU Kullanımı (%)
Katman Dondurma Ne Zaman Kullanılmalı#
Transfer öğrenme sırasında katman dondurma, birkaç durumda özellikle avantajlıdır:
- Sınırlı Hesaplama Kaynakları: GPU belleği veya işlem gücü konusunda kısıtlamaların varsa.
- Küçük Veri Setleri: Hedef veri setin orijinal ön eğitim veri setinden önemli ölçüde küçük olduğunda, dondurma işlemi aşırı öğrenmeyi (overfitting) önlemeye yardımcı olur.
- Hızlı Prototipleme: Mevcut bir modeli ilk değerlendirme için yeni bir göreve veya alana hızlıca uyarlaman gerektiğinde.
- Benzer Özellik Alanları: Yeni veri setindeki düşük seviyeli özellikler, modelin önceden eğitildiği veri setindekilerle çok benzerse.
Transfer öğrenmesinin incelikleri hakkında daha fazla bilgi edinmek için sözlük girdimizi incele ve performansı optimize etmek için hiperparametre ayarı gibi teknikleri değerlendir.
Desteklenen Ortamlar#
Ultralytics; CUDA, CuDNN, Python ve PyTorch gibi temel bağımlılıkların önceden kurulu olduğu kullanıma hazır çeşitli ortamlar 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 doğrular. Bu CI testleri, şu temel operasyonlarda YOLOv5'in işlevselliğini ve performansını titizlikle değerlendirir: eğitim, doğrulama, çıkarım, dışa aktarma ve kıyaslamalar. Her 24 saatte bir ve her yeni kod işlemesinde otomatik olarak çalışarak macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir çalışma sağlar.