YOLO mit einem benutzerdefinierten Datensatz feinabstimmen#
Feinabstimmung passt ein vortrainiertes Modell an, damit es neue Klassen erkennt. Dazu werden erlernte Gewichte statt einer zufälligen Initialisierung verwendet. Anstatt Hunderte von Epochen von Grund auf zu trainieren, nutzt die Feinabstimmung vortrainierte COCO-Merkmale und konvergiert in einem Bruchteil der Zeit auf benutzerdefinierten Daten.
Diese Anleitung behandelt die Feinabstimmung von YOLO26 mit benutzerdefinierten Datensätzen – von der grundlegenden Nutzung bis hin zu fortgeschrittenen Techniken wie dem Einfrieren von Layern und dem Training in zwei Phasen.
Feinabstimmung oder Training von Grund auf#
Ein vortrainiertes Modell hat anhand von Millionen von Bildern bereits allgemeine visuelle Merkmale gelernt – Kantenerkennung, Texturerkennung und Formerkennung. Transferlernen durch Feinabstimmung nutzt dieses Wissen wieder und bringt dem Modell nur bei, wie die neuen Klassen aussehen. Deshalb konvergiert es schneller und benötigt weniger Daten. Beim Training von Grund auf wird all dieses Wissen verworfen und das Modell muss alles neu lernen, ausgehend von Pixelmustern. Das erfordert deutlich mehr Ressourcen. In der Anleitung zur YAML-Konfiguration von Modellen erfährst du, wie sich reine Architekturdateien .yaml von Checkpoints unterscheiden.
| Feinabstimmung | Training von Grund auf | |
|---|---|---|
| Ausgangsgewichte | Auf COCO vortrainiert (80 Klassen) | Zufällige Initialisierung |
| Befehl | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Konvergenz | Schneller – das Backbone wurde bereits trainiert | Langsamer – alle Layer lernen von Grund auf |
| Datenbedarf | Geringer – vortrainierte Merkmale gleichen die geringere Datenmenge aus | Höher – das Modell muss alle Merkmale allein anhand des Datensatzes lernen |
| Wann verwenden? | Benutzerdefinierte Klassen mit natürlichen Bildern | Bereiche, die sich grundlegend von COCO unterscheiden (Medizin, Satelliten, Radar) |
Wenn eine .pt-Datei mit YOLO("yolo26n.pt") geladen wird, werden die vortrainierten Gewichte im Modell gespeichert. Ein anschließender Aufruf von .train(data="custom.yaml") überträgt automatisch alle kompatiblen Gewichte auf die neue Modellarchitektur, initialisiert nicht passende Schichten neu (etwa die letzte Klassifizierungsschicht, wenn sich die Anzahl der Klassen unterscheidet) und startet das Training. Manuelles Laden von Gewichten, Bearbeiten von Schichten oder eigener Code für Transfer Learning sind nicht erforderlich.
So funktioniert die Übertragung vortrainierter Gewichte#
Wenn ein vortrainiertes Modell mit einem Datensatz feinabgestimmt wird, der eine andere Klassenanzahl aufweist (zum Beispiel die 80 COCO-Klassen im Vergleich zu 5 benutzerdefinierten Klassen), überträgt Ultralytics die Gewichte unter Berücksichtigung der Tensorformen:
- Backbone und Neck werden vollständig übertragen – diese Layer extrahieren allgemeine visuelle Merkmale und ihre Formen sind unabhängig von der Klassenanzahl.
- Der Erkennungskopf wird teilweise neu initialisiert – nur die letzte Faltung jedes Klassifizierungszweigs (
cv3,one2one_cv3) hat eine Form, die an die Klassenanzahl gebunden ist (80 gegenüber 5); die verborgenen Schichten des Zweigs werden übertragen, wenn beide Modelle dieselbe Größenvariante verwenden. Kompatible Zeilen mit übereinstimmenden Klassennamen werden neu zugeordnet, bevor nicht übereinstimmende Zeilen initialisiert werden. Die Box-Regressionsschichten (cv2,one2one_cv2) im Kopf haben unabhängig von der Klassenanzahl feste Formen und werden daher normal übertragen. - Der weitaus größte Teil der Gewichte wird übertragen, wenn die Klassenanzahl geändert wird. Beim Feinabstimmen von YOLO26n mit COCO (80 Klassen) auf einen Datensatz mit 5 Klassen werden beispielsweise 696 von 708 Gewichtstensoren übertragen, zusätzlich zu allen kompatiblen Klassifizierungszeilen, die anhand des Namens zugeordnet werden.
Bei Datensätzen mit derselben Klassenanzahl wie das vortrainierte Modell werden 100 % der Gewichte einschließlich des Erkennungskopfs übertragen (zum Beispiel bei der Feinabstimmung von mit COCO vortrainierten Gewichten auf einem anderen Datensatz mit 80 Klassen).
Klassen mit Namensaliasen übertragen#
Ultralytics überträgt übereinstimmende Zeilen des Klassifizierungskopfs anhand der Klassennamen zwischen Datensätzen. Dabei werden Groß- und Kleinschreibung sowie umgebende Leerzeichen ignoriert. Wenn gleichbedeutende Klassen unterschiedliche Namen haben, benenne die Klassen des Quell-Checkpoints vor dem Laden im Arbeitsspeicher um. So bleiben vortrainierte Klassifizierungsgewichte für gemeinsame Konzepte erhalten, die andernfalls als nicht passend gelten und zufällig initialisiert würden.
Dieses Objects365-Beispiel überträgt von v2 zu COCO: Es benennt die Klassen des geladenen Quell-Checkpoints um, die train() anschließend als vortrainierte Gewichte übergibt:
from ultralytics import YOLO
# Quellname aus Objects365 v2 (in Kleinbuchstaben) -> Zielname in COCO
ALIASES = {
"wild bird": "bird",
"handbag/satchel": "handbag",
"luggage": "suitcase",
"bowl/basin": "bowl",
"orange/tangerine": "orange",
"monitor/tv": "tv",
"stuffed toy": "teddy bear",
"hair dryer": "hair drier",
}
model = YOLO("path/to/yolo26s-objects365.pt")
# Die Klassennamen in Objects365 beginnen mit Großbuchstaben. Vergleiche daher die Namen in Kleinbuchstaben.
model.model.names = {i: ALIASES.get(name.lower(), name) for i, name in model.model.names.items()}
model.train(data="coco.yaml", epochs=100, imgsz=640)Die Einstellung cls_remap aktiviert diese namensbasierte Übertragung standardmäßig. Während des Trainings wird Remapped N/M cls head rows from pretrained weights by class name ausgegeben, wenn kompatible Zeilen kopiert werden. Setze cls_remap=False, um die Funktion zu deaktivieren.
Einfaches Beispiel für eine Feinabstimmung#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # vortrainiertes Modell laden
model.train(data="custom.yaml", epochs=50, imgsz=640)Modellgröße auswählen#
Größere Modelle bieten mehr Kapazität, haben aber auch mehr Parameter, die aktualisiert werden müssen. Bei begrenzten Trainingsdaten kann dadurch das Risiko einer Überanpassung steigen. Ein praktischer Ansatz ist, mit einem kleineren Modell (YOLO26n oder YOLO26s) zu beginnen und nur dann zu einem größeren Modell zu wechseln, wenn sich die Validierungsmetriken nicht mehr verbessern. Welche Modellgröße optimal ist, hängt von der Komplexität der Aufgabe, der Klassenanzahl, der Vielfalt des Datensatzes und der für die Bereitstellung verfügbaren Hardware ab. Auf der vollständigen YOLO26-Modellseite findest du verfügbare Größen und Leistungsbenchmarks.
Optimierer und Lernrate auswählen#
Die Standardeinstellung optimizer=auto wählt Optimierer und Lernrate anhand der Gesamtzahl der Trainingsiterationen aus:
- 10.000 Iterationen oder weniger (kleine Datensätze oder wenige Epochen): AdamW mit einer niedrigen, automatisch berechneten Lernrate
- Mehr als 10.000 Iterationen (große Datensätze): MuSGD (ein Hybridoptimierer aus Muon und SGD) mit lr=0.01
Bei den meisten Feinabstimmungsaufgaben funktioniert die Standardeinstellung gut, ohne dass eine manuelle Abstimmung erforderlich ist. Lege den Optimierer explizit fest, wenn:
- Das Training instabil ist (die Verlustfunktion zeigt starke Ausschläge oder divergiert): Versuche
optimizer=AdamW, lr0=0.001für eine stabilere Konvergenz. - Ein großes Modell mit einem kleinen Datensatz feinabgestimmt wird: Ein expliziter Optimierer mit niedrigerer Lernrate, etwa
optimizer=AdamW, lr0=0.001, kann helfen, vortrainierte Merkmale zu erhalten.
Wenn optimizer=auto gesetzt ist, wird der Wert lr0 ignoriert. Um die Lernrate manuell festzulegen, gib den Optimierer explizit an: optimizer=SGD, lr0=0.005.
Layer einfrieren#
Beim Einfrieren werden bestimmte Layer während des Trainings nicht aktualisiert. Das beschleunigt das Training und verringert die Gefahr der Überanpassung, wenn der Datensatz im Verhältnis zur Modellkapazität klein ist.
Der Parameter freeze akzeptiert entweder eine Ganzzahl oder eine Liste. Eine Ganzzahl freeze=10 friert die ersten 10 Layer (Indizes 0–9) ein, die den Großteil des YOLO26-Backbones ausmachen. Das Backbone umfasst die Layer 0–10. Daher lässt freeze=10 den letzten C2PSA-Block (Layer 10) trainierbar; verwende freeze=11, um das gesamte Backbone einzufrieren. Eine Liste kann Layer-Indizes wie freeze=[0, 3, 5] für das teilweise Einfrieren des Backbones oder Modulnamen als Zeichenfolgen wie freeze=["23.cv2", "23.one2one_cv2"] enthalten, um bestimmte Zweige innerhalb eines Layers gezielt zu steuern (hier beide Box-Regression-Zweige des Erkennungskopfs).
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=50, freeze=10)Die passende 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) | Genügend Daten, um alle Layer ohne Overfitting anzupassen |
| Kleiner Datensatz, ähnliche Domäne | freeze=10 | Bewahrt Backbone-Merkmale und reduziert die Anzahl trainierbarer Parameter |
| Sehr kleiner Datensatz | freeze=23 | Nur der Detection-Head wird trainiert, wodurch das Overfitting-Risiko minimiert wird |
| Domäne weit von COCO entfernt | freeze=None | Backbone-Merkmale lassen sich möglicherweise nicht gut übertragen und müssen neu trainiert werden |
Die Einfriertiefe lässt sich auch als Hyperparameter behandeln – einige Werte (0, 5, 10) auszuprobieren und die Validierungs-mAP zu vergleichen, ist ein praktischer Weg, um die beste Einstellung für einen bestimmten Datensatz zu finden.
Wichtige Hyperparameter für das Fine-Tuning#
Beim Fine-Tuning sind in der Regel weniger Anpassungen der Hyperparameter erforderlich als beim Training von Grund auf. Besonders wichtig sind:
epochs: Fine-Tuning konvergiert schneller als das Training von Grund auf. Beginne mit einem moderaten Wert und verwendepatience, um das Training frühzeitig zu beenden, wenn sich die Validierungsmetriken nicht mehr verbessern.patience: Der Standardwert 100 ist für lange Trainingsläufe ausgelegt. Wenn du ihn auf 10–20 reduzierst, verschwendest du keine Zeit mit Trainingsläufen, die bereits konvergiert sind.warmup_epochs: Warmup führt die Lernrate während der ersten Epochen schrittweise an den vorgesehenen Wert heran, sodass frühe Batches vortrainierte Merkmale weniger leicht beeinträchtigen. Behalte beim Fine-Tuning einen Wert größer als null bei, aber der Standardwert von 3 Epochen ist nicht nötig: Die evolutionäre Suche für das offizielle YOLO26-COCO-Fine-Tuning – eine Fortsetzung über mehrere Epochen mit den Objects365-Gewichten – ergab für jede Modellgröße ungefähr eine Epoche.
Die vollständige Liste der Trainingsparameter findest du in der Referenz zur Trainingskonfiguration. Wenn du Funktionen benötigst, die sich mit den Parametern nicht abbilden lassen – etwa Lernraten pro Layer, Gradienten-Clipping oder benutzerdefinierte Validierungsmetriken –, leite den Trainer ab.
Zweistufiges Fine-Tuning#
Beim zweistufigen Fine-Tuning wird das Training in zwei Phasen aufgeteilt. In der ersten Phase wird das Backbone eingefroren und nur der Neck und der Head werden trainiert. So können sich die Detection-Layer an die neuen Klassen anpassen, ohne vortrainierte Merkmale zu beeinträchtigen. In der zweiten Phase werden alle Layer aufgetaut und das gesamte Modell wird mit einer niedrigeren Lernrate trainiert, um das Backbone für die Zieldomäne zu verfeinern.
Dieser Ansatz eignet sich besonders, wenn sich die Zieldomäne deutlich von COCO unterscheidet (medizinische Bilder, Luftbilder, Mikroskopie). In solchen Fällen muss das Backbone möglicherweise angepasst werden, doch das gleichzeitige Training aller Layer führt zu Instabilität. Einen Ansatz zum automatischen Auftauen mit einem Callback findest du unter Backbone einfrieren und auftauen.
from ultralytics import YOLO
# Phase 1: Backbone einfrieren, Head und Neck trainieren
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)
# Phase 2: alle Layer auftauen, mit niedrigerer Lernrate feinabstimmen
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, optimizer="AdamW", lr0=0.001, name="stage2", exist_ok=True)Häufige Probleme#
Das Modell gibt keine Vorhersagen aus#
-
Zu wenige Trainingsdaten: Das Training mit sehr wenigen Beispielen ist die häufigste Ursache – das Modell kann aus zu wenigen Daten weder lernen noch generalisieren. Stelle sicher, dass für jede Klasse genügend vielfältige Beispiele vorhanden sind, bevor du andere Ursachen untersuchst.
-
Datensatzpfade überprüfen: Ungültige Bildpfade verursachen einen Datensatzfehler. Einzelne fehlende oder leere Labeldateien werden als Hintergrundbilder behandelt und beim Scannen gemeldet; enthält der Trainingssplit keine Labels, wird ein Fehler ausgegeben. Überprüfe den Datensatz vor dem Training:
yolo detect val model=yolo26n.pt data=custom.yaml -
Konfidenzschwelle senken: Wenn Vorhersagen vorhanden sind, aber herausgefiltert werden, verwende bei der Inferenz
conf=0.1. -
Anzahl der Klassen überprüfen: Stelle sicher, dass
ncindata.yamlmit der tatsächlichen Anzahl der Klassen in den Labeldateien übereinstimmt.
Die Validierungs-mAP stagniert früh#
- Mehr Daten hinzufügen: Zusätzliches Trainingsmaterial ist beim Fine-Tuning besonders hilfreich, vor allem vielfältige Beispiele mit unterschiedlichen Blickwinkeln, Lichtverhältnissen und Hintergründen.
- Klassenverteilung überprüfen: Unterrepräsentierte Klassen erzielen eine niedrige AP. Füge weitere Beispiele hinzu oder stimme
cls_pwanhand des Validierungsdatensatzes ab. - Augmentierung reduzieren: Bei sehr kleinen Datensätzen kann eine starke Augmentierung mehr schaden als nutzen. Probiere
mosaic=0.5odermosaic=0.0aus. - Auflösung erhöhen: Bei Datensätzen mit kleinen Objekten kannst du
imgsz=1280ausprobieren, um Details zu erhalten.
Die Leistung bei ursprünglichen Klassen verschlechtert sich nach dem Fine-Tuning#
Dieses Phänomen ist als katastrophales Vergessen bekannt: Das Modell verliert zuvor gelerntes Wissen, wenn es ausschließlich mit neuen Daten feinabgestimmt wird. Ohne Bilder aus dem ursprünglichen Datensatz zusammen mit den neuen Daten lässt sich das Vergessen kaum vermeiden. So kannst du es verringern:
- Datensätze zusammenführen: Füge beim Fine-Tuning Beispiele der ursprünglichen Klassen zusammen mit den neuen Klassen ein. Nur so lässt sich das Vergessen zuverlässig verhindern.
- Backbone und Neck einfrieren: Wenn Backbone und Neck eingefroren bleiben und nur der Detection-Head trainiert wird, kann dies bei kurzen Fine-Tuning-Läufen mit sehr niedriger Lernrate helfen.
- Weniger Epochen trainieren: Je länger das Modell ausschließlich mit neuen Daten trainiert wird, desto stärker nimmt das Vergessen zu.
Häufig gestellte Fragen#
Es gibt keine feste Mindestanzahl – die Ergebnisse hängen von der Komplexität der Aufgabe, der Anzahl der Klassen und der Ähnlichkeit der Domäne mit COCO ab. Vielfältige Bilder (mit unterschiedlichen Lichtverhältnissen, Blickwinkeln und Hintergründen) sind wichtiger als die reine Menge. Beginne mit den verfügbaren Daten und erweitere den Datensatz, falls die Validierungsmetriken nicht ausreichen.
Lade eine vortrainierte
.pt-Datei und rufe.train()mit dem Pfad zu einer eigenendata.yaml-Datei auf. Ultralytics übernimmt automatisch die Übertragung der Gewichte, die Neuinitialisierung der Klassifizierungsschicht und die Auswahl des Optimierers. Das vollständige Codebeispiel findest du im Abschnitt Grundlagen der Feinabstimmung.Die häufigsten Ursachen sind ungültige Bildpfade, fehlende oder leere Labeldateien, eine Abweichung zwischen
ncin der YAML-Datei und den tatsächlichen Labeldateien oder eine zu hohe Konfidenzschwelle. Eine vollständige Checkliste zur Fehlerbehebung findest du unter Häufige Probleme.Das hängt von der Datensatzgröße und der Ähnlichkeit der Domänen ab. Bei kleinen Datensätzen mit einer COCO ähnlichen Domäne verhindert das Einfrieren des Backbones (
freeze=10) Overfitting. Bei Domänen, die sich stark von COCO unterscheiden, kann sich das Backbone anpassen, wenn alle Layer aufgetaut bleiben (freeze=None). Ausführliche Empfehlungen findest du unter Layer einfrieren.Füge Beispiele der ursprünglichen Klassen zusammen mit den neuen Klassen in die Trainingsdaten ein. Falls das nicht möglich ist, hilft es, mehr Layer einzufrieren (
freeze=10oder höher) und eine niedrigere Lernrate zu verwenden, um das vortrainierte Wissen zu bewahren. Weitere Informationen findest du unter Die Leistung bei ursprünglichen Klassen verschlechtert sich.