İçeriğe geç

Dondurulmuş katmanlarla transfer öğrenme

📚 This guide explains how to freeze YOLOv5 🚀 layers when transfer learning. Transfer learning is a useful way to quickly retrain a model on new data without having to retrain the entire network. Instead, part of the initial weights are frozen in place, and the rest of the weights are used to compute loss and are updated by the optimizer. This requires less resources than normal training and allows for faster training times, though it may also result in reductions to final trained accuracy.

Başlamadan Önce

Repoyu klonlayın ve requirements.txt dosyasını bir Python>=3.8.0 ortamı dahil olmak üzere PyTorch>=1.8. Modeller ve veri setleri 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

Omurgayı Dondur

train.py ile eşleşen tüm katmanlar freeze train.py'deki liste, eğitim başlamadan önce gradyanları sıfıra ayarlanarak dondurulacaktı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

Modül adlarının bir listesini görmek için:

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
...
model.23.m.0.cv2.bn.weight
model.23.m.0.cv2.bn.bias
model.24.m.0.weight
model.24.m.0.bias
model.24.m.1.weight
model.24.m.1.bias
model.24.m.2.weight
model.24.m.2.bias
"""

Model mimarisine baktığımızda, model omurgasının 0-9 katmanları olduğunu görebiliriz:

# 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

    - [-1, 1, Conv, [256, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 4], 1, Concat, [1]] # cat backbone P3
    - [-1, 3, C3, [256, False]] # 17 (P3/8-small)

    - [-1, 1, Conv, [256, 3, 2]]
    - [[-1, 14], 1, Concat, [1]] # cat head P4
    - [-1, 3, C3, [512, False]] # 20 (P4/16-medium)

    - [-1, 1, Conv, [512, 3, 2]]
    - [[-1, 10], 1, Concat, [1]] # cat head P5
    - [-1, 3, C3, [1024, False]] # 23 (P5/32-large)

    - [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)

böylece dondurma listesini adında 'model.0.' olan tüm modülleri içerecek şekilde tanımlayabiliriz. - 'model.9.' olan tüm modülleri içerecek şekilde tanımlayabiliriz:

python train.py --freeze 10

Tüm Katmanları Dondur

Detect() içindeki son çıktı konvolüsyon katmanları hariç tüm modeli dondurmak için, dondurma listesini adında 'model.0.' olan tüm modülleri içerecek şekilde ayarladık. - 'model.23.' içeren tüm modülleri içerecek şekilde ayarladık:

python train.py --freeze 24

Sonuçlar

YOLOv5m'yi, resmi COCO ön eğitiminden başlayarak varsayılan bir modelle (dondurma yok) birlikte yukarıdaki senaryoların her ikisinde de VOC üzerinde eğitiyoruz --weights yolov5m.pt:

train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

Doğruluk Karşılaştırması

The results show that freezing speeds up training, but reduces final accuracy slightly.

Dondurma eğitimi mAP50 sonuçları

Dondurma eğitimi mAP50-95 sonuçları

Tablo sonuçları

GPU Kullanım Karşılaştırması

İlginç bir şekilde, ne kadar çok modül dondurulursa, eğitmek için o kadar az GPU bellek gerekir ve GPU kullanımı o kadar düşük olur. Bu, daha büyük modellerin veya daha büyük --image-size'da eğitilen modellerin daha hızlı eğitilmek için dondurma işleminden faydalanabileceğini göstermektedir.

Eğitim GPU ayrılan bellek yüzdesi

Eğitim GPU bellek kullanım yüzdesi

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.

Proje Durumu

YOLOv5 CI

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.


📅 Created 11 months ago ✏️ Updated 17 days ago

Yorumlar