Zum Inhalt springen

Transferlernen mit eingefrorenen Schichten

📚 Diese Anleitung erklärt, wie man YOLOv5 🚀 Schichten einfriert, wenn Transfer-Lernen. Transferlernen ist eine nützliche Methode, um ein Modell schnell auf neue Daten zu trainieren, ohne dass das gesamte Netz neu trainiert werden muss. Stattdessen wird ein Teil der anfänglichen Gewichte an Ort und Stelle eingefroren, und der Rest der Gewichte wird zur Berechnung des Verlusts verwendet und vom Optimierer aktualisiert. Dies erfordert weniger Ressourcen als ein normales Training und ermöglicht kürzere Trainingszeiten, kann aber auch zu einer Verringerung der endgültigen Trainingsgenauigkeit führen.

Bevor Sie beginnen

Repo klonen und requirements.txt in einem Python>=3.8.0 Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuestenVersion von YOLOv5 heruntergeladen.

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

Backbone einfrieren

Alle Schichten, die mit der train.py freeze Liste in train.py werden eingefroren, indem ihre Gradienten auf Null gesetzt werden, bevor das Training beginnt.

# 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

Um eine Liste der Modulnamen anzuzeigen:

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
...
model.23.m.0.cv2.bn.weight
model.23.m.0.cv2.bn.bias
model.24.m.0.weight
model.24.m.0.bias
model.24.m.1.weight
model.24.m.1.bias
model.24.m.2.weight
model.24.m.2.bias
"""

Ein Blick auf die Modellarchitektur zeigt, dass die Schichten 0-9 das Rückgrat des Modells bilden:

# 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

    - [-1, 1, Conv, [256, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 4], 1, Concat, [1]] # cat backbone P3
    - [-1, 3, C3, [256, False]] # 17 (P3/8-small)

    - [-1, 1, Conv, [256, 3, 2]]
    - [[-1, 14], 1, Concat, [1]] # cat head P4
    - [-1, 3, C3, [512, False]] # 20 (P4/16-medium)

    - [-1, 1, Conv, [512, 3, 2]]
    - [[-1, 10], 1, Concat, [1]] # cat head P5
    - [-1, 3, C3, [1024, False]] # 23 (P5/32-large)

    - [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)

Wir können also die Freeze-Liste so definieren, dass sie alle Module enthält, die 'model.0.' - 'model.9.' in ihrem Namen enthalten:

python train.py --freeze 10

Alle Ebenen einfrieren

Um das gesamte Modell mit Ausnahme der letzten Faltungsschichten in Detect() einzufrieren, setzen wir freeze list so, dass es alle Module mit 'model.0.' - 'model.23.' in ihrem Namen enthalten:

python train.py --freeze 24

Ergebnisse

Wir trainieren YOLOv5m auf VOC für die beiden oben genannten Szenarien, zusammen mit einem Standardmodell (kein Einfrieren), ausgehend von dem offiziellen COCO Pre-Training --weights yolov5m.pt:

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

Genauigkeitsvergleich

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

Einfrieren von Trainingsergebnissen mAP50

Ergebnisse des Gefriertrainings mAP50-95

Ergebnisse der Tabelle

GPU Vergleich der Inanspruchnahme

Interessanterweise ist die Auslastung von GPU umso geringer, je mehr Module eingefroren sind und je weniger GPU Speicher zum Trainieren benötigt wird. Dies deutet darauf hin, dass größere Modelle oder Modelle, die mit einer größeren Bildgröße trainiert wurden, vom Einfrieren profitieren können, um schneller zu trainieren.

Schulung GPU zugewiesener Speicher in Prozent

Training GPU Speicherauslastung in Prozent

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 1 Monat

Kommentare