YOLOv5'te Dondurulmuş Katmanlarla Transfer Öğrenimi#
📚 Bu kılavuz, transfer öğrenimi uygulanırken YOLOv5 🚀 katmanlarının nasıl dondurulacağını açıklar. Transfer öğrenimi, tüm ağı sıfırdan yeniden eğitmeden bir modeli yeni veriler üzerinde hızlıca yeniden eğitmeni sağlayan güçlü bir makine öğrenimi (ML) tekniğidir. İlk katmanların ağırlıklarını dondurup yalnızca sonraki katmanların parametrelerini güncelleyerek hesaplama kaynakları gereksinimlerini ve eğitim süresini önemli ölçüde azaltabilirsin. Ancak bu yaklaşım, nihai modelin doğruluğunu biraz etkileyebilir.
Başlamadan Önce#
Öncelikle 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 ortamın olduğundan emin ol. Önceden eğitilmiş modeller ve gerekli veri kümeleri, en son YOLOv5 sürümünden otomatik olarak indirilir.
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ğındaki katmanları dondurduğunda, eğitim süreci sırasında parametrelerinin (ağırlıklar ve bias'lar) güncellenmesini engellersin. PyTorch'ta bu işlem, katmanın tensörlerinin requires_grad özniteliğinin False olarak ayarlanmasıyla gerçekleştirilir. Bunun sonucunda, geri yayılım sırasında bu katmanlar için gradyanlar hesaplanmaz ve hesaplama ile bellek tasarrufu sağlanır.
YOLOv5, katman dondurmayı eğitim betiğinde şu şekilde uygular:
# 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 İnceleniyor#
Hangi katmanların dondurulacağına karar vermek için YOLOv5 modelinin yapısını anlamak çok önemlidir. Aşağıdaki Python kod parçacığını kullanarak tüm modüllerin ve parametrelerinin adlarını 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 genellikle özellik çıkarma işleminden sorumlu bir omurgadan (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 (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 bağımsız değişkenini kullanarak hangi katmanların dondurulacağını kontrol edebilirsin. Bu bağımsız değişken, ilk dondurulmamış modülün dizinini belirtir; bu dizinden önceki tüm modüllerin ağırlıkları dondurulur. Belirli bir bloğa hangi dizinlerin karşılık geldiğini doğrulaman gerekiyorsa modül sıralamasını incelemek için model.model (bir nn.Sequential) kullan.
Yalnızca Omurgayı Dondur#
Büyük bir veri kümesi olan COCO gibi bir veri kümesinden öğrenilen genel özellik çıkarma yeteneklerini korurken modeli yeni nesne sınıflarına uyarlarken yaygın olarak kullanılan omurganın tamamını (0'dan 9'a kadar katmanlar) dondurmak için:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10Bu strateji, hedef veri kümen özgün eğitim verileriyle (ör. COCO) benzer düşük seviyeli görsel özellikleri (kenarlar, dokular) paylaşıyor, ancak farklı nesne kategorileri içeriyorsa etkilidir.
Son Algılama Katmanları Dışındaki Tüm Katmanları Dondur#
Yalnızca son çıktı evrişim katmanlarını (Detect modülünün bir parçası ve genellikle son modül; örneğin YOLOv5s'te 24. modül) eğitilebilir bırakarak ağın neredeyse tamamını dondurmak için:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24Bu yaklaşım, öğrenilen özelliklerin büyük çoğunluğunu korurken modelin çıktı sınıfı sayısını farklı bir sayıya uyarlaman gerektiğinde kullanışlıdır. İnce ayar için en az hesaplama kaynağı gerektirir.
Performans Karşılaştırması#
Katman dondurmanın etkilerini göstermek için YOLOv5m'yi Pascal VOC veri kümesi üzerinde 50 epoch boyunca, resmi COCO önceden eğitilmiş ağırlıklarından (yolov5m.pt) başlayarak eğittik. Üç senaryoyu karşılaştırdık: tüm katmanların eğitilmesi (--freeze 0), omurganın dondurulması (--freeze 10) ve son algılama katmanları dışındaki tüm katmanları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 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 Kesinlik) değerinde küçük bir düşüşe yol açabileceğini gösteriyor. Tüm katmanların eğitilmesi genellikle en iyi doğruluğu sağlar; daha fazla katmanı dondurmak ise performansın potansiyel olarak düşmesi 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ı önemli ölçüde azaltır. Bu, dondurulmuş katmanlarla transfer öğrenimini sınırlı donanım kaynaklarıyla çalışırken cazip bir seçenek hâline getirir ve normalde mümkün olmayabilecek daha büyük modelleri eğitmene veya daha büyük görüntü boyutlarını kullanmana olanak tanır.
GPU Belleği Ayrılan (%)
GPU Kullanımı (%)
Katman Dondurma Ne Zaman Kullanılmalı#
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 varsa.
- Küçük Veri Kümeleri: Hedef veri kümen özgün ön eğitim veri kümesinden önemli ölçüde küçük olduğunda, dondurma aşırı öğrenmeyi önlemeye yardımcı olur.
- Hızlı Prototip Oluşturma: İlk değerlendirme için mevcut bir modeli yeni bir göreve veya alana hızlıca uyarlaman gerektiğinde.
- Benzer Özellik Alanları: Yeni veri kümenizdeki düşük seviyeli özellikler, modelin önceden eğitildiği veri kümesindeki özelliklere çok benziyorsa.
Transfer öğreniminin incelikleri hakkında sözlük girdimizde daha fazla bilgi edin ve performansı optimize etmek için hiperparametre ayarlama gibi teknikleri değerlendirin.
Desteklenen Ortamlar#
Ultralytics, CUDA, CuDNN, Python ve PyTorch gibi temel bağımlılıkların önceden yüklü 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, YOLOv5'in temel işlemler genelindeki işlevselliğini ve performansını titizlikle değerlendirir: eğitim, doğrulama, çıkarım, dışa aktarma ve kıyaslamalar. Testler, macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir çalışmayı sağlar; her 24 saatte bir ve her yeni kod gönderiminde otomatik olarak çalıştırılır.