Transferlernen mit eingefrorenen Schichten in YOLOv5
📚 Dieser Leitfaden erklärt, wie man Einfriert YOLOv5 🚀 Schichten bei der Implementierung von Transfer Learning. Transfer Learning ist eine leistungsstarke Machine-Learning-(ML-)Technik, mit der Sie ein Modell schnell mit neuen Daten neu trainieren können, ohne das gesamte Netzwerk von Grund auf neu trainieren zu müssen. Durch das Einfrieren der Gewichtungen der anfänglichen Schichten und das Aktualisieren der Parameter späterer Schichten können Sie den Bedarf an Rechenressourcen und die Trainingszeit erheblich reduzieren. Dieser Ansatz kann sich jedoch geringfügig auf die endgültige Modell-Genauigkeit auswirken.
Bevor Sie beginnen
Klonen Sie zunächst das YOLOv5-Repository und installieren Sie die erforderlichen Abhängigkeiten, die in requirements.txt
. Stellen Sie sicher, dass Sie eine Python>=3.8.0 Umgebung mit PyTorch>=1.8 installiert. Vorab trainiert Modelle und erforderlich Datensätze wird automatisch von der neuesten YOLOv5 Version heruntergeladen Veröffentlichung.
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies
Wie Layer Freezing funktioniert
Wenn Sie Layer in einem einfrieren neuronales Netzwerk, verhindern Sie, dass ihre Parameter (Gewichte und Biases) während des Trainingsprozesses aktualisiert werden. In PyTorch wird dies erreicht, indem Sie die requires_grad
Attribut der Tensoren der Ebene zu False
. Folglich werden für diese Schichten während des Backpropagation, wodurch Rechenleistung und Speicher gespart werden.
Hier wird beschrieben, wie YOLOv5 Layer Freezing 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
Erkundung der Modellarchitektur
Das Verständnis der Struktur des YOLOv5-Modells 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-Snippet ü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-Architektur besteht typischerweise aus einem Backbone (Schichten 0-9 in Standardkonfigurationen wie YOLOv5s/m/l/x), das für die Merkmalsextraktion verantwortlich ist, und einem Head (den verbleibenden 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
Einfrieroptionen
Sie können steuern, welche Layer mithilfe von eingefroren werden. --freeze
Argument im Trainingsbefehl. Dieses Argument gibt den Index des ersten nicht eingefroren Modul; alle Module vor diesem Index haben ihre Gewichte eingefroren.
Nur Backbone einfrieren
Um das gesamte Backbone einzufrieren (Schichten 0 bis 9), was üblich ist, wenn das Modell an neue Objektklassen angepasst wird, während die allgemeinen Merkmalsextraktionsfähigkeiten, die von einem großen Datensatz wie COCO gelernt wurden, beibehalten werden:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10
Diese Strategie ist effektiv, wenn Ihr Zieldatensatz ähnlicheLow-Level visuelle Merkmale (Kanten, Texturen) mit den ursprünglichen Trainingsdaten (z. B. COCO) teilt, aber unterschiedliche Objektkategorien enthält.
Alle bis auf die letzten Erkennungsebenen einfrieren
Um fast das gesamte Netzwerk einzufrieren und nur die letzten Faltungsschichten der Ausgabe zu belassen (Teil des 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 hauptsächlich für eine andere Anzahl von Ausgabeklassen anpassen müssen, während der Großteil der gelernten Features intakt bleibt. Er erfordert die geringsten Rechenressourcen für das Fine-Tuning.
Leistungsvergleich
Um die Auswirkungen des Einfrierens von Schichten zu veranschaulichen, haben wir YOLOv5m auf dem Pascal VOC Datensatz für 50 Epochen, beginnend mit dem offiziellen, vortrainierten COCO Gewichte (yolov5m.pt
). Wir haben drei Szenarien verglichen: das Trainieren aller Schichten (--freeze 0
), das Einfrieren des Backbones (--freeze 10
), und das Einfrieren aller Schichten außer den letzten Erkennungsschichten (--freeze 24
), oder Auto-Modus mit angegebener Auslastungsfraktion (
# 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
Genauigkeitsergebnisse
Die Ergebnisse zeigen, dass das Einfrieren von Layern das Training erheblich beschleunigen kann, aber zu einer leichten Reduzierung der endgültigen mAP (Mean Average Precision) führen kann. Das Trainieren aller Layer führt im Allgemeinen zur besten Genauigkeit, während das Einfrieren von mehr Layern ein schnelleres Training ermöglicht, jedoch möglicherweise zu Lasten der Leistung geht.
mAP50-Vergleich während des Trainings
mAP50-95-Vergleich während des Trainings
Zusammenfassende Tabelle der Leistungsmetriken
Ressourcenauslastung
Das Einfrieren von mehr Layern reduziert den GPU-Speicherbedarf und die Gesamtauslastung erheblich. Dies macht Transfer Learning mit eingefrorenen Layern zu einer attraktiven Option, wenn mit begrenzten Hardwareressourcen gearbeitet wird, da das Training größerer Modelle oder die Verwendung größerer Bildgrößen ermöglicht wird, als dies sonst möglich wäre.
GPU-Speicher zugewiesen (%)
GPU-Auslastung (%)
Wann Layer Freezing verwendet werden sollte
Das Einfrieren von Schichten während des Transferlernens ist in verschiedenen Situationen besonders vorteilhaft:
- Begrenzte Rechenressourcen: Wenn Sie Einschränkungen hinsichtlich GPU-Speicher oder Rechenleistung haben.
- Kleine Datensätze: Wenn Ihr Zieldatensatz deutlich kleiner ist als der ursprüngliche Pre-Training-Datensatz, hilft das Einfrieren, Overfitting zu verhindern.
- Schnelle Prototypenerstellung: Wenn Sie ein bestehendes Modell schnell an eine neue Aufgabe oder Domäne zur ersten Evaluierung anpassen müssen.
- Ähnliche Feature-Domänen: Wenn die Low-Level-Features in Ihrem neuen Datensatz denen in dem Datensatz, mit dem das Modell vortrainiert wurde, sehr ähnlich sind.
Erfahre mehr über die Nuancen des Transferlernens in unserem Glossareintrag und ziehe Techniken wie Hyperparameter-Optimierung in Betracht, um die Leistung zu optimieren.
Unterstützte Umgebungen
Ultralytics bietet verschiedene sofort einsatzbereite Umgebungen mit wesentlichen Abhängigkeiten wie CUDA, CuDNN, Python und PyTorch, die vorinstalliert sind.
- Kostenlose GPU Notebooks:
- Google Cloud: GCP Quickstart-Anleitung
- Amazon: AWS Quickstart-Anleitung
- Azure: AzureML Quickstart-Anleitung
- Docker: Docker Quickstart-Anleitung
Projektstatus
Dieses Badge bestätigt, dass alle YOLOv5 GitHub Actions Continuous Integration (CI)-Tests erfolgreich bestanden wurden. Diese CI-Tests bewerten die Funktionalität und Leistung von YOLOv5 bei wichtigen Operationen rigoros: 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 jedem neuen Code-Commit ausgeführt.