Link to this sectionSo optimierst du YOLO für einen benutzerdefinierten Datensatz#
Fine-tuning passt ein vortrainiertes Modell an die Erkennung neuer Klassen an, indem es von gelernten Gewichten ausgeht, statt zufällig zu initialisieren. Anstatt Hunderte von Epochen lang von Grund auf neu zu trainieren, nutzt Fine-tuning vortrainierte COCO-Merkmale und konvergiert bei benutzerdefinierten Daten in einem Bruchteil der Zeit.
Dieser Leitfaden behandelt das Fine-tuning von YOLO26 mit benutzerdefinierten Datensätzen, von der grundlegenden Verwendung bis hin zu fortgeschrittenen Techniken wie Layer-Einfrieren und zweistufigem Training.
Link to this sectionFine-tuning vs. Training von Grund auf#
Ein vortrainiertes Modell hat bereits allgemeine visuelle Merkmale – Kantenerkennung, Texturerkennung, Formverständnis – aus Millionen von Bildern gelernt. Transfer Learning durch Fine-tuning nutzt dieses Wissen wieder und bringt dem Modell nur bei, wie die neuen Klassen aussehen, weshalb es schneller konvergiert und weniger Daten benötigt. Das Training von Grund auf verwirft all das und zwingt das Modell, alles von Grund auf zu lernen, was deutlich mehr Ressourcen erfordert.
| Feinabstimmung | Training von Grund auf | |
|---|---|---|
| Startgewichte | Vortrainiert auf COCO (80 Klassen) | Zufällige Initialisierung |
| Befehl | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Konvergenz | Schneller – Backbone ist bereits trainiert | Langsamer – alle Layer lernen bei null |
| Datenanforderungen | Geringer – vortrainierte Merkmale kompensieren weniger Daten | Höher – Modell muss alle Merkmale allein aus dem Datensatz lernen |
| Wann anwenden | Benutzerdefinierte Klassen mit natürlichen Bildern | Domänen, die sich grundlegend von COCO unterscheiden (medizinisch, Satellit, Radar) |
Wenn eine .pt-Datei mit YOLO("yolo26n.pt") geladen wird, sind die vortrainierten Gewichte im Modell gespeichert. Der anschließende Aufruf von .train(data="custom.yaml") überträgt automatisch alle kompatiblen Gewichte auf die neue Modellarchitektur, reinitialisiert alle Layer, die nicht übereinstimmen (wie den Detection Head bei einer abweichenden Klassenanzahl), und beginnt das Training. Manuelles Laden von Gewichten, Layer-Manipulation oder benutzerdefinierter Transfer-Learning-Code sind nicht erforderlich.
Link to this sectionWie der Transfer vortrainierter Gewichte funktioniert#
Wenn ein vortrainiertes Modell auf einem Datensatz mit einer anderen Anzahl an Klassen gefinetuned wird (zum Beispiel von den 80 COCO-Klassen auf 5 benutzerdefinierte Klassen), führt Ultralytics einen formbewussten Gewichtstransfer durch:
- Backbone und Neck werden vollständig übertragen – diese Layer extrahieren allgemeine visuelle Merkmale, und ihre Formen sind unabhängig von der Anzahl der Klassen.
- Detection Head wird teilweise reinitialisiert – die Klassifizierungsausgangsschichten (
cv3,one2one_cv3) haben Formen, die an die Klassenanzahl gebunden sind (80 vs. 5), daher können sie nicht übertragen werden und werden zufällig initialisiert. Box-Regressions-Layer (cv2,one2one_cv2) im Head haben unabhängig von der Klassenanzahl feste Formen und werden daher normal übertragen. - Die überwiegende Mehrheit der Gewichte wird übertragen, wenn sich die Klassenanzahl ändert. Zum Beispiel werden beim Fine-tuning von YOLO26n von COCO (80 Klassen) auf einen 5-Klassen-Datensatz 606 von 708 Gewichtstensoren übertragen: Nur die von der Klassenanzahl abhängigen Klassifizierungsschichten werden reinitialisiert, während der Backbone, der Neck und die Box-Regressionszweige intakt bleiben.
Bei Datensätzen mit der gleichen Anzahl an Klassen wie beim vortrainierten Modell (zum Beispiel beim Fine-tuning von COCO-vortrainierten Gewichten auf einem anderen 80-Klassen-Datensatz) werden 100 % der Gewichte übertragen, einschließlich des Detection Head.
Link to this sectionGrundlegendes Beispiel für Fine-tuning#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)Link to this sectionWahl einer Modellgröße#
Größere Modelle haben mehr Kapazität, aber auch mehr Parameter, die aktualisiert werden müssen, was das Risiko von Overfitting bei begrenzten Trainingsdaten erhöhen kann. Mit einem kleineren Modell (YOLO26n oder YOLO26s) zu beginnen und nur dann zu skalieren, wenn die Validierungsmetriken stagnieren, ist ein praktischer Ansatz. Die optimale Modellgröße hängt von der Komplexität der Aufgabe, der Anzahl der Klassen, der Vielfalt des Datensatzes und der für die Bereitstellung verfügbaren Hardware ab. Siehe die vollständige YOLO26-Modellseite für verfügbare Größen und Leistungsbenchmarks.
Link to this sectionAuswahl von Optimizer und Lernrate#
Die Standardeinstellung optimizer=auto wählt den Optimizer und die Lernrate basierend auf der Gesamtzahl der Trainingsiterationen aus:
- < 10.000 Iterationen (kleine Datensätze oder wenige Epochen): AdamW mit einer niedrigen, automatisch berechneten Lernrate
- > 10.000 Iterationen (große Datensätze): MuSGD (ein hybrider Muon+SGD-Optimizer) mit lr=0.01
Für die meisten Fine-tuning-Aufgaben funktioniert die Standardeinstellung gut ohne manuelle Anpassung. Ziehe eine explizite Einstellung des Optimizers in Betracht, wenn:
- Das Training instabil ist (Loss-Spikes oder Divergenz): Versuche
optimizer=AdamW, lr0=0.001für eine stabilere Konvergenz - Fine-tuning eines großen Modells auf einem kleinen Datensatz: eine niedrigere Lernrate wie
lr0=0.001hilft, vortrainierte Merkmale zu bewahren
Wenn optimizer=auto gesetzt ist, werden die Werte für lr0 und momentum ignoriert. Um die Lernrate manuell zu steuern, setze den Optimizer explizit: optimizer=SGD, lr0=0.005.
Link to this sectionLayer einfrieren#
Einfrieren verhindert, dass bestimmte Layer während des Trainings aktualisiert werden. Dies beschleunigt das Training und reduziert Overfitting, wenn der Datensatz im Verhältnis zur Modellkapazität klein ist.
Der Parameter freeze akzeptiert entweder eine Ganzzahl oder eine Liste. Eine Ganzzahl wie freeze=10 friert die ersten 10 Layer ein (Indizes 0-9), was den größten Teil des YOLO26-Backbone abdeckt. Der Backbone umfasst die Layer 0-10, daher lässt freeze=10 den letzten C2PSA-Block (Layer 10) trainierbar; verwende freeze=11, um den gesamten Backbone einzufrieren. Eine Liste kann Layer-Indizes wie freeze=[0, 3, 5] für teilweises Backbone-Einfrieren enthalten oder Modulnamens-Strings wie freeze=["23.cv2", "23.one2one_cv2"] für eine fein abgestimmte Kontrolle über bestimmte Zweige innerhalb eines Layers (hier beide Box-Regressionszweige des Detection Head).
model.train(data="custom.yaml", epochs=50, freeze=10)Die richtige Einfriertiefe hängt davon ab, wie ähnlich die Zieldomäne den vortrainierten Daten ist und wie viele Trainingsdaten verfügbar sind:
| Szenario | Empfehlung | Begründung |
|---|---|---|
| Großer Datensatz, ähnliche Domäne | freeze=None (Standard) | Genug Daten, um alle Layer ohne Overfitting anzupassen |
| Kleiner Datensatz, ähnliche Domäne | freeze=10 | Bewahrt Backbone-Merkmale, reduziert trainierbare Parameter |
| Sehr kleiner Datensatz | freeze=23 | Nur der Detection Head trainiert, minimiert Overfitting-Risiko |
| Domäne weit weg von COCO | freeze=None | Backbone-Merkmale übertragen sich möglicherweise nicht gut und müssen neu trainiert werden |
Die Einfriertiefe kann auch als Hyperparameter behandelt werden – das Ausprobieren einiger Werte (0, 5, 10) und das Vergleichen des Validierungs-mAP ist ein praktischer Weg, die beste Einstellung für einen spezifischen Datensatz zu finden.
Link to this sectionWichtige Hyperparameter für das Fine-tuning#
Fine-tuning erfordert im Allgemeinen weniger Hyperparameter-Anpassungen als das Training von Grund auf. Die Parameter, die am meisten zählen, sind:
epochs: Fine-tuning konvergiert schneller als das Training von Grund auf. Beginne mit einem moderaten Wert und verwendepatience, um vorzeitig zu stoppen, wenn die Validierungsmetriken stagnieren.patience: Der Standardwert von 100 ist für lange Trainingsläufe ausgelegt. Eine Reduzierung auf 10-20 vermeidet Zeitverschwendung bei Läufen, die bereits konvergiert sind.warmup_epochs: Der Standard-Warmup (3 Epochen) erhöht die Lernrate allmählich von null, was verhindert, dass große Gradienten-Updates in frühen Iterationen vortrainierte Merkmale beschädigen. Es wird empfohlen, den Standard auch beim Fine-tuning beizubehalten.
Für die vollständige Liste der Trainingsparameter, siehe die Trainingskonfigurationsreferenz.
Link to this sectionZweistufiges Fine-tuning#
Zweistufiges Fine-tuning unterteilt das Training in zwei Phasen. Die erste Stufe friert den Backbone ein und trainiert nur den Neck und Head, wodurch sich die Detektionsschichten an die neuen Klassen anpassen können, ohne vortrainierte Merkmale zu zerstören. Die zweite Stufe taut alle Layer auf und trainiert das gesamte Modell mit einer niedrigeren Lernrate, um den Backbone für die Zieldomäne zu verfeinern.
Dieser Ansatz ist besonders nützlich, wenn sich die Zieldomäne erheblich von COCO unterscheidet (medizinische Bilder, Luftaufnahmen, Mikroskopie), wobei der Backbone möglicherweise eine Anpassung benötigt, das gleichzeitige Training von allem jedoch zu Instabilität führt. Für automatisches Auftauen mit einem Callback-basierten Ansatz, siehe Backbone einfrieren und auftauen.
from ultralytics import YOLO
# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)
# Stage 2: unfreeze all, fine-tune with lower lr
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, lr0=0.001, name="stage2", exist_ok=True)Link to this sectionHäufige Fehlerquellen#
Link to this sectionModell liefert keine Vorhersagen#
- Unzureichende Trainingsdaten: Das Training mit sehr wenigen Proben ist die häufigste Ursache – das Modell kann aus zu wenigen Daten nicht lernen oder generalisieren. Stelle sicher, dass genug vielfältige Beispiele pro Klasse vorhanden sind, bevor du andere Ursachen untersuchst.
- Datensatzpfade überprüfen: Falsche Pfade in
data.yamlführen stillschweigend zu null Labels. Führeyolo detect val model=yolo26n.pt data=custom.yamlvor dem Training aus, um zu bestätigen, dass Labels korrekt geladen werden. - Niedrigerer Konfidenz-Schwellenwert: Wenn Vorhersagen existieren, aber herausgefiltert werden, versuche
conf=0.1während der Inferenz. - Klassenanzahl verifizieren: Stelle sicher, dass
ncindata.yamlmit der tatsächlichen Anzahl der Klassen in den Label-Dateien übereinstimmt.
Link to this sectionValidierungs-mAP stagniert früh#
- Mehr Daten hinzufügen: Fine-tuning profitiert signifikant von zusätzlichen Trainingsdaten, insbesondere von vielfältigen Beispielen mit unterschiedlichen Winkeln, Beleuchtungen und Hintergründen.
- Klassengleichgewicht prüfen: Unterrepräsentierte Klassen haben ein niedriges AP. Verwende
cls_pw, um eine inverse Frequenzklassen-Gewichtung anzuwenden (beginne mitcls_pw=0.25für moderate Ungleichgewichte, erhöhe auf1.0für schwerwiegende Ungleichgewichte). - Augmentierung reduzieren: Bei sehr kleinen Datensätzen kann eine starke Augmentierung mehr schaden als nutzen. Versuche
mosaic=0.5odermosaic=0.0. - Auflösung erhöhen: Bei Datensätzen mit kleinen Objekten versuche
imgsz=1280, um Details zu bewahren.
Link to this sectionLeistung verschlechtert sich bei Originalklassen nach dem Fine-tuning#
Dies ist als katastrophales Vergessen bekannt – das Modell verliert zuvor gelerntes Wissen, wenn es ausschließlich auf neuen Daten gefinetuned wird. Vergessen ist größtenteils unvermeidlich, ohne Original-Datensatzbilder neben den neuen Daten einzubeziehen. Um dies abzumildern:
- Datensätze zusammenführen: Füge Beispiele der Originalklassen neben den neuen Klassen während des Fine-tunings hinzu. Dies ist der einzige zuverlässige Weg, Vergessen zu verhindern.
- Backbone und Neck einfrieren: Das Einfrieren von Backbone und Neck, sodass nur der Detection Head trainiert wird, hilft bei kurzen Fine-tuning-Läufen mit einer sehr niedrigen Lernrate.
- Weniger Epochen trainieren: Je länger das Modell ausschließlich auf neuen Daten trainiert, desto mehr nimmt das Vergessen zu.
Link to this sectionFAQ#
Link to this sectionWie viele Bilder benötige ich, um YOLO zu finetunen?#
Es gibt kein festes Minimum – die Ergebnisse hängen von der Komplexität der Aufgabe, der Anzahl der Klassen und der Ähnlichkeit der Domäne zu COCO ab. Vielfältigere Bilder (unterschiedliche Beleuchtung, Winkel, Hintergründe) sind wichtiger als die bloße Menge. Beginne mit dem, was du hast, und skaliere hoch, wenn die Validierungsmetriken unzureichend sind.
Link to this sectionWie finetune ich YOLO26 auf einem benutzerdefinierten Datensatz?#
Lade eine vortrainierte .pt-Datei und rufe .train() mit dem Pfad zu einer benutzerdefinierten data.yaml auf. Ultralytics übernimmt automatisch den Gewichtstransfer, die Reinitialisierung des Detection Head und die Auswahl des Optimizers. Siehe den Abschnitt Grundlegendes Fine-tuning für das vollständige Code-Beispiel.
Link to this sectionWarum erkennt mein gefinetuntes YOLO-Modell nichts?#
Die häufigsten Ursachen sind falsche Pfade in data.yaml (was stillschweigend zu null Labels führt), eine Diskrepanz zwischen nc im YAML und den tatsächlichen Label-Dateien oder ein zu hoher Konfidenz-Schwellenwert. Siehe Häufige Fehlerquellen für eine vollständige Checkliste zur Fehlerbehebung.
Link to this sectionWelche YOLO-Layer sollte ich zum Fine-tuning einfrieren?#
Das hängt von der Datensatzgröße und der Domänenähnlichkeit ab. Bei kleinen Datensätzen mit einer Domäne, die COCO ähnelt, verhindert das Einfrieren des Backbone (freeze=10) Overfitting. Für Domänen, die weit von COCO entfernt sind, erlaubt das Offenlassen aller Layer (freeze=None), dass sich der Backbone anpasst. Siehe Layer einfrieren für detaillierte Empfehlungen.
Link to this sectionWie verhindere ich katastrophales Vergessen beim Fine-tuning von YOLO auf neuen Klassen?#
Füge Beispiele der Originalklassen in die Trainingsdaten neben den neuen Klassen ein. Wenn das nicht möglich ist, hilft das Einfrieren von mehr Layern (freeze=10 oder höher) und die Verwendung einer niedrigeren Lernrate, um das vortrainierte Wissen zu bewahren. Siehe Leistung verschlechtert sich bei Originalklassen für weitere Details.