Zum Inhalt springen

Transfer Learning mit eingefrorenen Schichten in YOLOv5

📚 In diesem Leitfaden wird erklärt, wie man YOLOv5 🚀-Schichten bei der Implementierung von Transfer Learning einfriert. Transferlernen ist eine leistungsstarke Technik, mit der Sie ein Modell schnell auf neue Daten umlernen können, ohne das gesamte Netz umlernen zu müssen. Indem Sie einen Teil der anfänglichen Gewichte einfrieren und nur den Rest aktualisieren, können Sie die Rechenressourcen und die Trainingszeit erheblich reduzieren, obwohl dieser Ansatz die endgültige Modellgenauigkeit leicht beeinträchtigen kann.

Bevor Sie beginnen

Klonen Sie das Repo und installieren Sie requirements.txt in einem Python.8.0 Umgebung, einschließlich PyTorch.8. Modelle und Datensätze werden automatisch von der neuestenYOLOv5-Version heruntergeladen.

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

Wie das Layer Freezing funktioniert

Wenn Sie Schichten in einem neuronalen Netz einfrieren, setzen Sie deren Parameter im Wesentlichen so, dass sie nicht trainierbar sind. Die Gradienten für diese Schichten werden auf Null gesetzt, was eine Aktualisierung der Gewichte während der Backpropagation verhindert. Dies wird im Trainingsprozess von YOLOv5 wie folgt umgesetzt:

# 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

Erforschung der Modellarchitektur

Um bestimmte Teile des Modells effektiv einfrieren zu können, ist es hilfreich, die Schichtstruktur zu verstehen. Sie können alle Modulnamen mit anzeigen:

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
...
"""

Die YOLOv5 besteht aus einem Backbone (Schichten 0-9) und einem Head (restliche Schichten):

# 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
    # ... remaining head layers

Gefrieroptionen

Nur Backbone einfrieren

Nur das Grundgerüst (Schichten 0-9) einfrieren, was für die Anpassung des Modells an neue Klassen nützlich ist, während die erlernten Fähigkeiten zur Merkmalsextraktion erhalten bleiben:

python train.py --freeze 10

Dieser Ansatz ist besonders effektiv, wenn Ihr neuer Datensatz ähnliche Low-Level-Merkmale mit den ursprünglichen Trainingsdaten teilt, aber andere Klassen oder Objekte aufweist.

Alle außer Erkennungsebenen einfrieren

Zum Einfrieren des gesamten Modells mit Ausnahme der letzten Ausgangsfaltungsschichten im Modul Erkennen:

python train.py --freeze 24

Dieser Ansatz ist ideal, wenn Sie die meisten der gelernten Merkmale des Modells beibehalten wollen, es aber anpassen müssen, um eine andere Anzahl von Klassen zu erkennen.

Leistungsvergleich

Wir haben YOLOv5m auf dem VOC-Datensatz mit verschiedenen Freezing-Strategien trainiert, ausgehend von den offiziellen COCO-Pre-Trainingsgewichten:

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

Genauigkeits-Ergebnisse

Die Ergebnisse zeigen, dass das Einfrieren von Schichten das Training beschleunigt, aber die endgültige Genauigkeit leicht verringert:

Einfrieren von Trainingsergebnissen mAP50

Ergebnisse des Gefriertrainings mAP50-95

Ergebnisse der Tabelle

Nutzung der Ressourcen

Das Einfrieren von mehr Schichten reduziert den Speicherbedarf und die Auslastung der GPU , was diese Technik für das Training größerer Modelle oder die Verwendung von Bildern mit höherer Auflösung wertvoll macht:

Schulung GPU zugewiesener Speicher in Prozent

Training GPU Speicherauslastung in Prozent

Wann wird das Layer Freezing eingesetzt?

Das Einfrieren von Schichten beim Transferlernen ist besonders in Szenarien wie diesen von Vorteil:

  1. Begrenzte Berechnungsressourcen: Wenn der GPU oder die Verarbeitungsleistung begrenzt ist
  2. Kleine Datensätze: Wenn Ihr neuer Datensatz zu klein ist, um ein vollständiges Modell ohne Überanpassung zu trainieren
  3. Schnelle Anpassung: Wenn Sie ein Modell schnell an einen neuen Bereich anpassen müssen
  4. Feinabstimmung für spezifische Aufgaben: Wenn ein allgemeines Modell an eine spezielle Anwendung angepasst wird

Weitere Informationen über Transfer-Learning-Techniken und ihre Anwendungen finden Sie im Glossar-Eintrag zum Transfer-Learning.

Unterstützte Umgebungen

Ultralytics bietet eine Reihe gebrauchsfertiger Umgebungen, die jeweils mit wichtigen Abhängigkeiten vorinstalliert sind, z. B. CUDA, CUDNN, Python, und PyTorchvorinstalliert, um Ihre Projekte in Gang zu bringen.

Projektstatus

YOLOv5 CI

Dieses Abzeichen zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI) Tests erfolgreich bestanden wurden. Diese CI-Tests überprüfen die Funktionalität und Leistung von YOLOv5 in verschiedenen Schlüsselbereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu, wobei die Tests alle 24 Stunden und bei jeder neuen Übertragung durchgeführt werden.

📅 Erstellt vor 1 Jahr ✏️ Aktualisiert vor 8 Tagen

Kommentare