Transfer Learning mit eingefrorenen Schichten in YOLOv5#
📚 Dieser Leitfaden erklärt, wie du YOLOv5 🚀 Layer beim Implementieren von Transferlernen einfrierst (freeze). Transferlernen ist eine leistungsstarke Technik des maschinellen Lernens (ML), mit der du ein Modell schnell mit neuen Daten erneut trainieren kannst, ohne das gesamte Netzwerk von Grund auf neu zu trainieren. Indem du die Gewichtungen der anfänglichen Layer einfrierst und nur die Parameter der späteren Layer aktualisierst, kannst du den Bedarf an Rechenressourcen und die Trainingszeit erheblich reduzieren. Dieser Ansatz kann sich jedoch leicht auf die finale Genauigkeit des Modells auswirken.
Bevor du beginnst#
Klonre als Erstes das YOLOv5-Repository und installiere die erforderlichen Abhängigkeiten, die in requirements.txt aufgeführt sind. Stelle sicher, dass du über eine Python>=3.8.0-Umgebung mit installiertem PyTorch>=1.8 verfügst. Vortrainierte Modelle und benötigte Datensätze werden automatisch von der neuesten YOLOv5-Version heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependenciesWie Layer-Freezing funktioniert#
Wenn du Layer in einem neuronalen Netzwerk einfrierst, verhinderst du, dass deren Parameter (Gewichtungen und Biases) während des Trainingsprozesses aktualisiert werden. In PyTorch wird dies erreicht, indem das Attribut requires_grad der Tensoren des Layers auf False gesetzt wird. Folglich werden für diese Layer während der Rückwärtsberechnung (Backpropagation) keine Gradienten berechnet, was Rechenleistung und Speicher spart.
Hier siehst du, wie YOLOv5 das Einfrieren von Layern 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 layersErkundung der Modellarchitektur#
Das Verständnis der Struktur des YOLOv5-Modells ist entscheidend für die Entscheidung, welche Schichten eingefroren werden sollen. Du kannst die Namen aller Module und deren Parameter mit dem folgenden Python-Schnipsel ü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 (Layer 0–9 in Standardkonfigurationen wie YOLOv5s/m/l/x), der für die Merkmalsextraktion zuständig ist, und einem Head (den verbleibenden Layern), 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 detectionOptionen zum Einfrieren#
Du kannst steuern, welche Layer eingefroren werden, indem du das Argument --freeze im Trainingsbefehl verwendest. Dieses Argument gibt den Index des ersten nicht eingefrorenen Moduls an; bei allen Modulen vor diesem Index werden die Gewichtungen eingefroren. Verwende model.model (ein nn.Sequential), um die Reihenfolge der Module zu überprüfen, wenn du bestätigen musst, welche Indizes einem bestimmten Block entsprechen.
Nur Backbone einfrieren#
Um den gesamten Backbone einzufrieren (Layer 0 bis 9), was üblich ist, wenn das Modell an neue Objektklassen angepasst wird, während die allgemeinen Fähigkeiten zur Merkmalsextraktion beibehalten werden, die aus einem großen Datensatz wie COCO gelernt wurden:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10Diese Strategie ist effektiv, wenn dein 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 finalen Erkennungsschichten einfrieren#
Um fast das gesamte Netzwerk einzufrieren und nur die finalen Faltungsschichten (Convolution-Layer) der Ausgabe (Teil des Moduls Detect, typischerweise das letzte Modul, z. B. Modul 24 in YOLOv5s) trainierbar zu lassen:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24Dieser Ansatz ist nützlich, wenn du das Modell hauptsächlich an eine andere Anzahl von Ausgabeklassen anpassen musst, während die überwiegende Mehrheit der gelernten Merkmale intakt bleibt. Er erfordert die wenigsten Rechenressourcen für das Feintuning.
Leistungsvergleich#
Um die Auswirkungen des Einfrierens von Layern zu veranschaulichen, haben wir YOLOv5m 50 Epochen lang auf dem Pascal VOC-Datensatz trainiert, ausgehend von den offiziellen vortrainierten COCO-Gewichtungen (yolov5m.pt). Wir haben drei Szenarien verglichen: Training aller Layer (--freeze 0), Einfrieren des Backbones (--freeze 10) und Einfrieren aller bis auf die finalen Detektionslayer (--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 10Genauigkeitsergebnisse#
Die Ergebnisse zeigen, dass das Einfrieren von Layern das Training erheblich beschleunigen kann, aber zu einer geringfügigen Verringerung der finalen mAP (mittlere durchschnittliche Präzision / mean Average Precision) führen kann. Das Training aller Layer liefert im Allgemeinen die beste Genauigkeit, während das Einfrieren weiterer Layer ein schnelleres Training auf Kosten einer möglicherweise geringeren Leistung bietet.
mAP50-Vergleich während des Trainings
mAP50-95-Vergleich während des Trainings
*Summary table of performance metrics*
Ressourcennutzung#
Das Einfrieren weiterer Layer reduziert die Anforderungen an den GPU-Speicher und die Gesamtauslastung erheblich. Dies macht Transferlernen mit eingefrorenen Layer zu einer attraktiven Option bei der Arbeit mit begrenzten Hardwareressourcen, wodurch das Training größerer Modelle oder die Verwendung größerer Bildgrößen ermöglicht wird, die sonst möglicherweise nicht möglich wären.
Zugeordneter GPU-Speicher (%)
GPU-Auslastung (%)
Wann man Layer-Freezing verwenden sollte#
Layer-Freezing beim Transfer Learning ist in verschiedenen Situationen besonders vorteilhaft:
- Begrenzte Rechenressourcen: Wenn du Einschränkungen bei GPU-Speicher oder Rechenleistung hast.
- Kleine Datensätze: Wenn dein Zieldatensatz deutlich kleiner ist als der ursprüngliche Vortrainingsdatensatz, hilft das Einfrieren, Overfitting zu verhindern.
- Schnelles Prototyping: Wenn du ein bestehendes Modell schnell für eine erste Evaluierung an eine neue Aufgabe oder Domäne anpassen musst.
- Ähnliche Merkmalsbereiche: Wenn die Merkmale auf niedriger Ebene in deinem neuen Datensatz denen in dem Datensatz sehr ähnlich sind, auf dem das Modell vortrainiert wurde.
Erfahre mehr über die Nuancen des Transferlernens in unserem Glossareintrag und ziehe Techniken wie die Optimierung von Hyperparametern in Betracht, um die Leistung zu maximieren.
Unterstützte Umgebungen#
Ultralytics bietet verschiedene sofort einsatzbereite Umgebungen mit vorinstallierten essenziellen Abhängigkeiten wie CUDA, CuDNN, Python und PyTorch.
- Kostenlose GPU-Notebooks:
- Google Cloud: GCP-Schnellstartanleitung
- Amazon: AWS-Schnellstartanleitung
- Azure: AzureML-Schnellstartanleitung
- Docker: Docker-Schnellstartanleitung
Projektstatus#
Dieses Badge bestätigt, dass alle Continuous Integration (CI)-Tests für YOLOv5 GitHub Actions erfolgreich bestanden wurden. Diese CI-Tests bewerten die Funktionalität und Leistung von YOLOv5 bei zentralen Vorgängen streng: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu, indem sie alle 24 Stunden und bei jedem neuen Code-Commit automatisch ausgeführt werden.