Transfer Learning mit eingefrorenen Schichten in YOLOv5
📚 Diese Anleitung erklärt, wie man YOLOv5 🚀-Schichten bei der Implementierung von Transfer Learning einfriert. Transferlernen ist eine leistungsstarke Technik des maschinellen Lernens (ML), die es Ihnen ermöglicht, ein Modell schnell auf neue Daten zu trainieren, ohne das gesamte Netzwerk von Grund auf neu zu trainieren. Indem Sie die Gewichte der ersten Schichten einfrieren und nur die Parameter der späteren Schichten aktualisieren, können Sie die Anforderungen an die Rechenressourcen und die Trainingszeit erheblich reduzieren. Dieser Ansatz kann sich jedoch leicht auf die endgültige Modellgenauigkeit auswirken.
Bevor Sie beginnen
Klonen Sie zunächst das YOLOv5 und installieren Sie die notwendigen Abhängigkeiten, die in requirements.txt
. Stellen Sie sicher, dass Sie eine Python.8.0 Umwelt mit PyTorch.8 installiert. Vorgeschult Modelle und erforderlich Datensätze wird automatisch von der neuesten YOLOv5 heruntergeladen. freigeben.
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies
Wie das Layer Freezing funktioniert
Beim Einfrieren von Schichten in einem neuronales Netzverhindern Sie, dass ihre Parameterweights and biases) während des Trainingsprozesses aktualisiert werden. In PyTorch wird dies durch das Setzen des Parameters requires_grad
Attribut der Tensoren der Schicht auf False
. Folglich werden für diese Schichten keine Gradienten berechnet, während Backpropagationund spart damit Rechenzeit und Speicherplatz.
Hier sehen Sie, wie YOLOv5 das Einfrieren von Ebenen in seinem Trainingsskript implementiert:
# 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
Erforschung der Modellarchitektur
Das Verständnis der Struktur des YOLOv5 ist entscheidend für die Entscheidung, welche Schichten eingefroren werden sollen. Sie können die Namen aller Module und ihrer Parameter mit dem folgenden Python überprüfen:
# 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
...
"""
Die YOLOv5 besteht in der Regel aus einem Backbone (Schichten 0-9 in Standardkonfigurationen wie YOLOv5s/m/l/x), das für die Merkmalsextraktion zuständig ist, und einem Head (die übrigen Schichten), der die Objekterkennung durchführt.
# 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
Gefrieroptionen
Sie können steuern, welche Ebenen eingefroren werden, indem Sie die --freeze
Argument im Trainingsbefehl. Dieses Argument spezifiziert den Index des ersten aufgetaut Modul; bei allen Modulen vor diesem Index werden die Gewichte eingefroren.
Nur Backbone einfrieren
Einfrieren des gesamten Backbone (Schichten 0 bis 9), was bei der Anpassung des Modells an neue Objektklassen üblich ist, wobei die allgemeinen Fähigkeiten zur Merkmalsextraktion, die aus einem großen Datensatz wie COCO gelernt wurden, erhalten bleiben:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10
Diese Strategie ist effektiv, wenn Ihr Zieldatensatz ähnliche visuelle Merkmale auf niedriger Ebene (Kanten, Texturen) mit den ursprünglichen Trainingsdaten (z. B. COCO) teilt, aber unterschiedliche Objektkategorien enthält.
Alle außer den letzten Erkennungsebenen einfrieren
Um fast das gesamte Netz einzufrieren, so dass nur die letzten Ausgangsfaltungsschichten (Teil der Detect
Modul, typischerweise das letzte Modul, z. B. Modul 24 in YOLOv5s) trainierbar:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24
Dieser Ansatz ist nützlich, wenn Sie das Modell in erster Linie für eine andere Anzahl von Ausgangsklassen anpassen müssen, während die überwiegende Mehrheit der gelernten Merkmale intakt bleibt. Er erfordert die geringsten Rechenressourcen für die Feinabstimmung.
Leistungsvergleich
Um die Auswirkungen des Einfrierens von Schichten zu veranschaulichen, haben wir YOLOv5m auf den Pascal VOC-Datensatz für 50 Epochenausgehend von der offiziellen COCO-Vorschulung Gewichte (yolov5m.pt
). Wir haben drei Szenarien verglichen: Training aller Schichten (--freeze 0
), das Einfrieren des Rückgrats (--freeze 10
), und das Einfrieren aller Schichten bis auf die letzten Erkennungsschichten (--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
Genauigkeits-Ergebnisse
Die Ergebnisse zeigen, dass das Einfrieren von Schichten das Training erheblich beschleunigen kann, aber zu einer leichten Verringerung der endgültigen mAP (mean Average Precision) führen kann. Das Training aller Schichten ergibt im Allgemeinen die beste Genauigkeit, während das Einfrieren mehrerer Schichten ein schnelleres Training auf Kosten einer potenziell geringeren Leistung ermöglicht.
mAP50-Vergleich während des Trainings
mAP50-95-Vergleich während der Ausbildung
Zusammenfassende Tabelle der Leistungskennzahlen
Nutzung der Ressourcen
Das Einfrieren von mehr Schichten reduziert die GPU Speicherbedarf und die Gesamtauslastung. Dies macht Transfer Learning mit eingefrorenen Ebenen zu einer attraktiven Option bei begrenzten Hardwareressourcen und ermöglicht das Training größerer Modelle oder die Verwendung größerer Bildgrößen, als es sonst möglich wäre.
Zugewiesener GPU (%)
GPU (%)
Wann wird das Layer Freezing eingesetzt?
Das Einfrieren von Schichten beim Transferlernen ist in mehreren Situationen besonders vorteilhaft:
- Begrenzte Rechenressourcen: Wenn Sie nur über begrenzten GPU oder begrenzte Rechenleistung verfügen.
- Kleine Datensätze: Wenn Ihr Zieldatensatz deutlich kleiner ist als der ursprüngliche Pre-Training-Datensatz, hilft das Einfrieren, eine Überanpassung zu verhindern.
- Schnelles Prototyping: Wenn Sie ein bestehendes Modell schnell an eine neue Aufgabe oder einen neuen Bereich anpassen müssen, um eine erste Bewertung vorzunehmen.
- Ähnliche Merkmalsdomänen: Wenn die Low-Level-Merkmale in Ihrem neuen Datensatz denen des Datensatzes sehr ähnlich sind, mit dem das Modell zuvor trainiert wurde.
Erfahren Sie mehr über die Feinheiten des Transfer-Lernens in unserem Glossareintrag und ziehen Sie Techniken wie die Abstimmung von Hyperparametern zur Optimierung der Leistung in Betracht.
Unterstützte Umgebungen
Ultralytics bietet verschiedene gebrauchsfertige Umgebungen mit wesentlichen Abhängigkeiten wie CUDAund CuDNN, Pythonund PyTorch vorinstalliert.
- Kostenlose GPU Notizbücher:
- Google Wolke: GCP-Schnellstart-Anleitung
- Amazon: AWS Schnellstart-Anleitung
- Azure: AzureML-Schnellstart-Anleitung
- Docker: Docker-Schnellstart-Anleitung
Projektstatus
Dieses Abzeichen bestätigt, dass alle YOLOv5 GitHub Actions Continuous Integration (CI) Tests erfolgreich verlaufen sind. Diese CI-Tests evaluieren rigoros die Funktionalität und Leistung von YOLOv5 in den wichtigsten Operationen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu und werden automatisch alle 24 Stunden und bei jeder neuen Codeübergabe durchgeführt.