Link to this sectionTransfer Learning mit eingefrorenen Schichten in YOLOv5#
📚 Dieser Leitfaden erklärt, wie du YOLOv5 🚀-Schichten einfrierst (freeze), wenn du Transfer Learning implementierst. Transfer Learning ist eine leistungsstarke Technik des maschinellen Lernens (ML), mit der du ein Modell schnell auf neuen Daten nachtrainieren kannst, ohne das gesamte Netzwerk von Grund auf neu zu trainieren. Indem du die Gewichte der anfänglichen Schichten einfrierst und nur die Parameter späterer Schichten aktualisierst, kannst du den Bedarf an Rechenressourcen und die Trainingszeit erheblich reduzieren. Dieser Ansatz kann jedoch die endgültige Modell-Genauigkeit leicht beeinflussen.
Link to this sectionBevor du beginnst#
Klone zuerst das YOLOv5-Repository und installiere die notwendigen Abhängigkeiten, die in der requirements.txt aufgeführt sind. Stelle sicher, dass du eine Python>=3.8.0-Umgebung mit installiertem PyTorch>=1.8 hast. Vortrainierte Modelle und erforderliche Datensätze werden automatisch vom neuesten YOLOv5-Release heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependenciesLink to this sectionWie Layer-Freezing funktioniert#
Wenn du Schichten in einem neuronalen Netzwerk einfrierst, verhinderst du, dass deren Parameter (Gewichte und Biases) während des Trainingsprozesses aktualisiert werden. In PyTorch erreichst du dies, indem du das Attribut requires_grad der Tensoren der Schicht auf False setzt. Folglich werden für diese Schichten während der Backpropagation keine Gradienten berechnet, was Rechenleistung und Speicher spart.
So implementiert YOLOv5 das Einfrieren von Schichten in seinem Trainingsskript:
# 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 layersLink to this sectionErkundung 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 (Schichten 0-9 in Standardkonfigurationen wie YOLOv5s/m/l/x), der 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 detectionLink to this sectionOptionen zum Einfrieren#
Du kannst steuern, welche Schichten eingefroren werden, indem du das Argument --freeze im Trainingsbefehl verwendest. Dieses Argument gibt den Index des ersten nicht eingefrorenen Moduls an; alle Module vor diesem Index haben ihre Gewichte eingefroren. Verwende model.model (ein nn.Sequential), um die Modulreihenfolge zu überprüfen, falls du bestätigen musst, welche Indizes einem bestimmten Block entsprechen.
Link to this sectionNur Backbone einfrieren#
Um den gesamten Backbone einzufrieren (Schichten 0 bis 9), was üblich ist, wenn das Modell an neue Objektklassen angepasst wird, während die allgemeinen Fähigkeiten zur Merkmalsextraktion, die von einem großen Datensatz wie COCO gelernt wurden, beibehalten werden sollen:
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.
Link to this sectionAlle außer den finalen Erkennungsschichten einfrieren#
Um fast das gesamte Netzwerk einzufrieren und nur die finalen Ausgabe-Faltungsschichten (Teil des Detect-Moduls, 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 für eine unterschiedliche Anzahl von Ausgabeklassen anpassen musst, während die überwiegende Mehrheit der gelernten Merkmale intakt bleibt. Er erfordert die geringsten Rechenressourcen für das Fine-Tuning.
Link to this sectionLeistungsvergleich#
Um die Auswirkungen des Einfrierens von Schichten zu veranschaulichen, haben wir YOLOv5m auf dem Pascal VOC-Datensatz für 50 Epochen trainiert, ausgehend von den offiziellen, auf COCO vortrainierten Gewichten (yolov5m.pt). Wir verglichen drei Szenarien: Training aller Schichten (--freeze 0), Einfrieren des Backbones (--freeze 10) und Einfrieren aller bis auf die finalen 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 data/hyps/hyp.VOC.yaml --freeze 10Link to this sectionGenauigkeitsergebnisse#
Die Ergebnisse zeigen, dass das Einfrieren von Schichten das Training erheblich beschleunigen kann, aber zu einer leichten Verringerung der finalen mAP (mean Average Precision) führen kann. Das Training aller Schichten liefert im Allgemeinen die beste Genauigkeit, während das Einfrieren von mehr Schichten ein schnelleres Training auf Kosten einer potenziell geringeren Leistung ermöglicht.
mAP50-Vergleich während des Trainings
mAP50-95-Vergleich während des Trainings
*Summary table of performance metrics*
Link to this sectionRessourcennutzung#
Das Einfrieren von mehr Schichten reduziert den Bedarf an GPU-Speicher und die Gesamtauslastung erheblich. Dies macht Transfer Learning mit eingefrorenen Schichten zu einer attraktiven Option bei begrenzten Hardwareressourcen, wodurch das Training größerer Modelle oder die Verwendung größerer Bildgrößen ermöglicht wird, als es sonst möglich wäre.
Belegter GPU-Speicher (%)
GPU-Auslastung (%)
Link to this sectionWann 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 Pre-Training-Datensatz, 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 Transfer Learnings in unserem Glossareintrag und ziehe Techniken wie Hyperparameter-Tuning zur Optimierung der Leistung in Betracht.
Link to this sectionUnterstü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 Schnellstartanleitung
- Amazon: AWS Schnellstartanleitung
- Azure: AzureML Schnellstartanleitung
- Docker: Docker Schnellstartanleitung
Link to this sectionProjektstatus#
Dieses Abzeichen bestätigt, dass alle Continuous Integration (CI)-Tests der YOLOv5 GitHub Actions erfolgreich bestanden wurden. Diese CI-Tests bewerten rigoros die Funktionalität und Leistung von YOLOv5 bei wichtigen Vorgängen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb auf macOS, Windows und Ubuntu, indem sie automatisch alle 24 Stunden und bei jedem neuen Code-Commit ausgeführt werden.