Link to this sectionYOLOv5'te Dondurulmuş Katmanlarla Transfer Öğrenme#
📚 This guide explains how to freeze YOLOv5 🚀 layers when implementing transfer learning. Transfer learning is a powerful machine learning (ML) technique that allows you to quickly retrain a model on new data without retraining the entire network from scratch. By freezing the weights of initial layers and only updating the parameters of later layers, you can significantly reduce computational resource requirements and training time. However, this approach might slightly impact the final model accuracy.
Link to this sectionBaşlamadan Önce#
Öncelikle, YOLOv5 deposunu klonla ve requirements.txt dosyasında listelenen gerekli bağımlılıkları yükle. Python>=3.8.0 ortamına ve PyTorch>=1.8 sürümünün yüklü 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 dependenciesLink to this sectionKatman Dondurma Nasıl Çalışır#
Bir sinir ağında katmanları dondurduğunda, eğitim sürecinde 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, geriye yayılım sırasında bu katmanlar için gradyanlar hesaplanmaz, böylece hesaplama ve bellek tasarrufu sağlanır.
YOLOv5'in eğitim betiğinde katman dondurmayı nasıl uyguladığı aşağıdadı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 layersLink to this sectionModel 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
...
"""The YOLOv5 architecture typically consists of a backbone (layers 0-9 in standard configurations like YOLOv5s/m/l/x) responsible for feature extraction, and a head (the remaining layers) which performs object detection.
# 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 detectionLink to this sectionDondurma Seçenekleri#
Eğitim komutundaki --freeze argümanını kullanarak hangi katmanların dondurulacağını kontrol edebilirsin. Bu argüman, dondurulmamış ilk modülün dizinini belirtir; bu dizinden önceki tüm modüllerin ağırlıkları dondurulacaktır. Belirli bir bloğun hangi dizinlere karşılık geldiğini doğrulamak istersen, modül sıralamasını incelemek için model.model (bir nn.Sequential) yapısını kullan.
Link to this sectionSadece Omurgayı Dondur#
Modeli yeni nesne sınıflarına uyarlarken, COCO gibi büyük bir veri setinden öğrenilen genel özellik çıkarım yeteneklerini korumak amacıyla tüm omurgayı (0'dan 9'a kadar olan katmanlar) dondurmak yaygın bir yöntemdir:
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.
Link to this sectionSon Tespit Katmanları Dışındaki Her Şeyi Dondur#
Neredeyse tüm ağı dondurup yalnızca son çıktı konvolüsyon katmanlarını (genellikle son modül olan Detect modülünün bir parçasıdır, örneğin YOLOv5s'te 24. modül) eğitilebilir bırakmak için:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24Bu yaklaşım, öğrenilmiş özelliklerin büyük çoğunluğunu korurken modeli esas olarak farklı sayıda çıktı sınıfı için ayarlaman gerektiğinde yararlıdır. İnce ayar için en az hesaplama kaynağını gerektirir.
Link to this sectionPerformans Karşılaştırması#
To illustrate the effects of freezing layers, we trained YOLOv5m on the Pascal VOC dataset for 50 epochs, starting from the official COCO pretrained weights (yolov5m.pt). We compared three scenarios: training all layers (--freeze 0), freezing the backbone (--freeze 10), and freezing all but the final detection layers (--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 10Link to this sectionDoğruluk Sonuçları#
Sonuçlar, katmanları dondurmanın eğitimi önemli ölçüde hızlandırabildiğini ancak nihai mAP (ortalama Hassasiyet) değerinde küçük 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*
Link to this sectionKaynak Kullanımı#
Daha fazla katmanı dondurmak, GPU bellek gereksinimlerini ve genel kullanımı önemli ölçüde azaltır. Bu, dondurulmuş katmanlarla transfer öğrenmeyi, sınırlı donanım kaynaklarıyla çalışırken cazip bir seçenek haline getirir ve normalden daha büyük modellerin eğitilmesine veya daha büyük görüntü boyutlarının kullanılmasına olanak tanır.
Ayrılan GPU Belleği (%)
GPU Kullanımı (%)
Link to this sectionKatman 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 aşırı öğrenmeyi ö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 öğrenmenin incelikleri hakkında daha fazla bilgi edinmek için sözlük girdimize göz at ve performansı optimize etmek için hiperparametre ayarlama gibi teknikleri değerlendir.
Link to this sectionDesteklenen Ortamlar#
Ultralytics, CUDA, CuDNN, Python ve PyTorch gibi temel bağımlılıkların önceden yüklü olduğu çeşitli kullanıma hazır ortamlar sunar.
- Ücretsiz GPU Notebook'ları:
- 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
Link to this sectionProje Durumu#
Bu rozet, tüm YOLOv5 GitHub Actions Sürekli Entegrasyon (CI) testlerinin başarıyla geçtiğini doğrular. 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 üzerinde tutarlı ve güvenilir bir çalışma sağlar, her 24 saatte bir ve her yeni kod gönderiminde otomatik olarak çalışır.