So passt du YOLO für einen eigenen Datensatz an
Fine-Tuning passt ein vortrainiertes Modell an die Erkennung neuer Klassen an, indem es auf gelernten Gewichten statt auf einer zufälligen Initialisierung basiert. Anstatt hunderte Epochen lang von Grund auf zu trainieren, nutzt Fine-Tuning vortrainierte COCO Merkmale und konvergiert in einem Bruchteil der Zeit auf benutzerdefinierten Daten.
Dieser Leitfaden behandelt das Fine-Tuning von YOLO26 auf eigenen Datensätzen, von der grundlegenden Anwendung bis hin zu fortgeschrittenen Techniken wie Einfrieren von Layern und zweistufiges Training.
Fine-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 wird dieses Wissen wiederverwendet und dem Modell nur beigebracht, wie die neuen Klassen aussehen, weshalb es schneller konvergiert und weniger Daten benötigt. Das Training von Grund auf verwirft all dies und zwingt das Modell, alles von Grund auf aus Pixelmustern 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 – das Backbone ist bereits trainiert | Langsamer – alle Layer lernen bei Null |
| Datenanforderungen | Geringer – vortrainierte Merkmale kompensieren weniger Daten | Höher – das Modell muss alle Merkmale allein aus dem Datensatz lernen |
| Wann verwenden | Eigene Klassen mit natürlichen Bildern | Domänen, die sich grundlegend von COCO unterscheiden (Medizin, Satellit, Radar) |
Wenn eine .pt Datei mit YOLO("yolo26n.pt") geladen wird, sind die vortrainierten Gewichte im Modell gespeichert. Der Aufruf von .train(data="custom.yaml") überträgt danach automatisch alle kompatiblen Gewichte auf die neue Modellarchitektur, reinitialisiert alle nicht übereinstimmenden Layer (wie den Detection-Head, wenn die Anzahl der Klassen abweicht) und beginnt das Training. Es ist kein manuelles Laden von Gewichten, keine Manipulation von Layern oder benutzerdefinierter Transfer-Learning-Code erforderlich.
Wie der Transfer vortrainierter Gewichte funktioniert
Wenn ein vortrainiertes Modell auf einem Datensatz mit einer anderen Anzahl von Klassen feinabgestimmt wird (zum Beispiel von den 80 Klassen bei COCO 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 neu initialisiert – die Klassifizierungsausgabe-Layer (
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, daher werden sie normal übertragen. - Die überwiegende Mehrheit der Gewichte wird übertragen bei einer Änderung der Klassenanzahl. Nur die klassifizierungsspezifischen Layer im Detection-Head werden neu initialisiert – Backbone, Neck und Box-Regressionszweige bleiben erhalten.
Bei Datensätzen mit der gleichen Anzahl an Klassen wie beim vortrainierten Modell (zum Beispiel Fine-Tuning von COCO-vortrainierten Gewichten auf einem anderen 80-Klassen-Datensatz) werden 100 % der Gewichte übertragen, einschließlich des Detection-Heads.
Beispiel für einfaches Fine-Tuning
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)Wahl der Modellgröße
Größere Modelle haben mehr Kapazität, aber auch mehr zu aktualisierende Parameter, was bei begrenzten Trainingsdaten das Risiko von Overfitting erhöhen kann. Mit einem kleineren Modell (YOLO26n oder YOLO26s) zu beginnen und nur hochzuskalieren, 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.
Wahl von Optimierer und Lernrate
Die Standardeinstellung optimizer=auto wählt den Optimierer 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-Optimierer) mit lr=0.01
Für die meisten Fine-Tuning-Aufgaben funktioniert die Standardeinstellung ohne manuelle Anpassung gut. Erwäge, den Optimierer explizit festzulegen, wenn:
- Training instabil ist (Verlustspitzen oder Divergenz): versuche
optimizer=AdamW, lr0=0.001für 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 setzt die lr0 und momentum Werte werden ignoriert. Um die Lernrate manuell zu steuern, setze den Optimierer explizit: optimizer=SGD, lr0=0.005.
Layer einfrieren
Das Einfrieren verhindert, dass bestimmte Layer während des Trainings aktualisiert werden. Dies beschleunigt das Training und reduziert Overfitting wenn der Datensatz im Vergleich zur Modellkapazität klein ist.
Die freeze Parameter akzeptiert entweder eine Ganzzahl oder eine Liste. Eine Ganzzahl freeze=10 friert die ersten 10 Layer ein (0 bis 9, was dem Backbone in YOLO26 entspricht). Eine Liste kann Layer-Indizes wie freeze=[0, 3, 5] für teilweises Einfrieren des Backbones oder Modulnamen-Strings wie freeze=["23.cv2"] für eine fein abgestimmte Kontrolle über bestimmte Zweige innerhalb eines Layers enthalten.
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 das Risiko von Overfitting |
| Domäne weit entfernt 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 – ein paar Werte (0, 5, 10) auszuprobieren und den Validierungs-mAP zu vergleichen ist eine praktische Methode, um die beste Einstellung für einen bestimmten Datensatz zu finden.
Wichtige Hyperparameter für das Fine-Tuning
Fine-Tuning erfordert im Allgemeinen weniger Hyperparameter-Anpassungen als das Training von Grund auf. Die Parameter, die am wichtigsten sind, sind:
epochs: Fine-Tuning konvergiert schneller als das Training von Grund auf. Beginne mit einem moderaten Wert und verwendepatiencefür einen vorzeitigen Abbruch, 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 schrittweise von Null, was verhindert, dass große Gradienten-Updates die vortrainierten Merkmale in frühen Iterationen beschädigen. Die Beibehaltung des Standards wird auch für das Fine-Tuning empfohlen.
Für die vollständige Liste der Trainingsparameter siehe die Konfigurationsreferenz für das Training.
Zweistufiges Fine-Tuning
Das zweistufige Fine-Tuning unterteilt das Training in zwei Phasen. Die erste Phase friert das Backbone ein und trainiert nur Neck und Head, wodurch sich die Detection-Layer an die neuen Klassen anpassen können, ohne die vortrainierten Merkmale zu stören. Die zweite Phase hebt das Einfrieren aller Layer auf und trainiert das vollständige Modell mit einer niedrigeren Lernrate, um das 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 das Backbone möglicherweise angepasst werden muss, das Training von allem auf einmal jedoch Instabilität verursacht. Für automatisches Auftauen mit einem Callback-basierten Ansatz siehe Einfrieren und Auftauen des Backbones.
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)Häufige Fehlerquellen
Modell liefert keine Vorhersagen
- Unzureichende Trainingsdaten: das Training mit sehr wenigen Beispielen ist die häufigste Ursache – das Modell kann bei zu wenigen Daten weder lernen noch generalisieren. Stelle sicher, dass du genügend vielfältige Beispiele pro Klasse hast, bevor du nach anderen Ursachen suchst.
- Überprüfe die Dataset-Pfade: falsche Pfade in
data.yamlführen im Stillen zu null Labels. Führeyolo detect val model=yolo26n.pt data=your_data.yamlvor dem Training aus, um sicherzustellen, dass die Labels korrekt geladen werden. - Senke den Konfidenz-Schwellenwert: falls Vorhersagen existieren, aber herausgefiltert werden, versuche
conf=0.1während der Inferenz. - Überprüfe die Klassenanzahl: stelle sicher, dass
ncindata.yamlmit der tatsächlichen Anzahl der Klassen in den Label-Dateien übereinstimmt.
Validierungs-mAP stagniert früh
- Füge mehr Daten hinzu: das Fine-Tuning profitiert erheblich von zusätzlichen Trainingsdaten, insbesondere von vielfältigen Beispielen mit unterschiedlichen Winkeln, Beleuchtungen und Hintergründen.
- Überprüfe das Klassengleichgewicht: unterrepräsentierte Klassen haben einen niedrigen AP. Verwende
cls_pw, um eine inverse Frequenz-Klassengewichtung anzuwenden (beginne mitcls_pw=0.25bei moderatem Ungleichgewicht, erhöhe auf1.0bei starkem Ungleichgewicht). - Reduziere die Augmentierung: bei sehr kleinen Datensätzen kann eine starke Augmentierung mehr schaden als nützen. Versuche
mosaic=0.5SAM 2.1mosaic=0.0. - Erhöhe die Auflösung: bei Datensätzen mit kleinen Objekten, versuche
imgsz=1280, um Details zu erhalten.
Die Leistung bei ursprünglichen Klassen verschlechtert sich nach dem Fine-Tuning
Dies ist als katastrophales Vergessen bekannt – das Modell verliert früher erlerntes Wissen, wenn es ausschließlich mit neuen Daten feinabgestimmt wird. Das Vergessen ist weitgehend unvermeidlich, wenn nicht Bilder des ursprünglichen Datensatzes zusammen mit den neuen Daten einbezogen werden. Um dies zu mildern:
- Datasets zusammenführen: beziehe während des Fine-Tunings Beispiele der ursprünglichen Klassen neben den neuen Klassen mit ein. Dies ist der einzige zuverlässige Weg, um 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-Durchläufen mit einer sehr niedrigen Lernrate.
- Trainiere für weniger Epochen: je länger das Modell ausschließlich mit neuen Daten trainiert, desto stärker nimmt das Vergessen zu.
FAQ
Wie viele Bilder brauche ich, um YOLO feinabzustimmen?
Es gibt kein festes Minimum – die Ergebnisse hängen von der Komplexität der Aufgabe, der Anzahl der Klassen und der Ähnlichkeit der Domain 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 nach oben, falls die Validierungsmetriken nicht ausreichen.
Wie stimme ich YOLO26 auf einem benutzerdefinierten Datensatz fein ab?
Lade eine vortrainierte .pt Datei und rufe .train() mit dem Pfad zu einem benutzerdefinierten data.yaml auf. Ultralytics übernimmt automatisch den Gewichtstransfer, die Neuinitialisierung des Detection Heads und die Auswahl des Optimierers. Siehe den Abschnitt Grundlegendes Fine-Tuning für das vollständige Code-Beispiel.
Warum erkennt mein feinabgestimmtes YOLO-Modell nichts?
Die häufigsten Ursachen sind falsche Pfade in data.yaml (was stillschweigend null Labels erzeugt), eine Diskrepanz zwischen nc in der YAML-Datei und den tatsächlichen Label-Dateien oder ein zu hoher Konfidenz-Schwellenwert. Siehe Häufige Fehlerquellen für eine vollständige Checkliste zur Fehlerbehebung.
Welche YOLO-Layer sollte ich für das Fine-Tuning einfrieren?
Das hängt von der Datensatzgröße und der Domain-Ähnlichkeit ab. Bei kleinen Datensätzen mit einer Domain ähnlich zu COCO verhindert das Einfrieren des Backbones (freeze=10) Overfitting. Bei Domains, die sich stark von COCO unterscheiden, erlaubt das Nicht-Einfrieren aller Layer (freeze=None) dem Backbone, sich anzupassen. Siehe Layer einfrieren für detaillierte Empfehlungen.
Wie verhindere ich katastrophales Vergessen beim Fine-Tuning von YOLO auf neue Klassen?
Beziehe Beispiele der ursprünglichen Klassen in die Trainingsdaten neben den neuen Klassen mit 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 ursprünglichen Klassen für weitere Details.