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:
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:
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.
Eğitim sırasında mAP50 karşılaştırması
Eğitim sırasında mAP50-95 karşılaştırması
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.
Ayrılan GPU Belleği (%)
GPU Kullanımı (%)
Katman Dondurma Ne Zaman Kullanılır?
Transfer öğrenimi sırasında katman dondurma özellikle birkaç durumda avantajlıdır:
- Sınırlı Hesaplama Kaynakları: GPU belleği veya işlem gücü konusunda kısıtlamalarınız varsa.
- 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.
- 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.
- 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ş.
- Ü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 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.