Ultralytics YOLO27: Trag dich auf die Warteliste ein.
Erste Schritte

YOLO mit einem benutzerdefinierten Datensatz feinabstimmen

Fine-Tuning passt ein vortrainiertes Modell an, damit es neue Klassen erkennt. Dazu werden erlernte Gewichte statt einer zufälligen Initialisierung verwendet. Anstatt das Modell über Hunderte von Epochen von Grund auf zu trainieren, nutzt Fine-Tuning die vortrainierten COCO-Merkmale wieder und konvergiert in einem Bruchteil der Zeit mit 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.

FeinabstimmungTraining von Grund auf
AusgangsgewichteAuf COCO vortrainiert (80 Klassen)Zufällige Initialisierung
BefehlYOLO("yolo26n.pt")YOLO("yolo26n.yaml")
KonvergenzSchneller – das Backbone wurde bereits trainiertLangsamer – alle Layer lernen von Grund auf
DatenbedarfGeringer – vortrainierte Merkmale gleichen die geringere Datenmenge ausHöher – das Modell muss alle Merkmale allein anhand des Datensatzes lernen
Wann verwenden?Benutzerdefinierte Klassen mit natürlichen BildernBereiche, die sich grundlegend von COCO unterscheiden (Medizin, Satelliten, Radar)
Für die Feinabstimmung ist kein zusätzlicher Code erforderlich

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:

  1. Backbone und Neck werden vollständig übertragen – diese Layer extrahieren allgemeine visuelle Merkmale und ihre Formen sind unabhängig von der Klassenanzahl.
  2. 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.
  3. 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#

Beispiel
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 haben eine höhere Kapazität, aber auch mehr Parameter, die aktualisiert werden müssen. Bei begrenzten Trainingsdaten kann dadurch das Risiko von Overfitting steigen. Ein praktischer Ansatz besteht darin, 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. Die optimale Modellgröße hängt von der Komplexität der Aufgabe, der Anzahl der Klassen, der Vielfalt des Datensatzes und der für den Einsatz verfügbaren Hardware ab.

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 Muon-SGD-Hybridoptimierer) 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.001 fü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.
Der automatische Optimierer überschreibt lr0 nicht

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

Beispiel
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:

SzenarioEmpfehlungBegründung
Großer Datensatz, ähnliche Domänefreeze=None (Standard)Genügend Daten, um alle Layer ohne Overfitting anzupassen
Kleiner Datensatz, ähnliche Domänefreeze=10Bewahrt Backbone-Merkmale und reduziert die Anzahl trainierbarer Parameter
Sehr kleiner Datensatzfreeze=23Nur der Detection-Head wird trainiert, wodurch das Overfitting-Risiko minimiert wird
Domäne weit von COCO entferntfreeze=NoneBackbone-Merkmale lassen sich möglicherweise nicht gut übertragen und müssen neu trainiert werden

Auch die Einfriertiefe kann als Hyperparameter behandelt werden. Probiere einige Werte (0, 5, 10) aus und vergleiche den Validierungs-mAP – so findest du praktisch die beste Einstellung für einen bestimmten Datensatz.

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 verwende patience, 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.

Zweistufiges Fine-Tuning
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 nc in data.yaml mit 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_pw anhand des Validierungsdatensatzes ab.
  • Augmentierung reduzieren: Bei sehr kleinen Datensätzen kann eine starke Augmentierung mehr schaden als nutzen. Probiere mosaic=0.5 oder mosaic=0.0 aus.
  • Auflösung erhöhen: Bei Datensätzen mit kleinen Objekten kannst du imgsz=1280 ausprobieren, um Details zu erhalten.

Die Leistung bei ursprünglichen Klassen verschlechtert sich nach dem Fine-Tuning#

Dieses Phänomen wird als katastrophales Vergessen bezeichnet: Das Modell verliert zuvor erworbenes 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 größtenteils nicht vermeiden. Um es abzumildern:

  • 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 eigenen data.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 nc in 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=10 oder 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.

Kommentare4

Stell eine Frage, teile deine Ergebnisse oder hilf jemand anderem.

  1. Yuan Yao(bearbeitet)

    这是我在训练时遇到的一个问题,

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    81/1000      6.68G          0          0          0        195        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.1s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    82/1000      6.68G          0          0          0        184        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.0it/s 11.3s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    83/1000      6.68G          0          0          0        221        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:19
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.1s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    84/1000      6.68G          0          0          0        212        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.2s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    85/1000      6.68G          0          0          0        221        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.2s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    86/1000      6.68G          0          0          0        216        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.0s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    87/1000      6.68G          0          0          0        198        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:19
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.0it/s 11.4s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    88/1000      6.68G          0          0          0        229        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.2s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    89/1000      6.68G          0          0          0        182        640: 100% ━━━━━━━━━━━━ 121/121 1.1s/it 2:18
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.0s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    90/1000      6.68G          0          0          0        218        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.0s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    91/1000      6.68G          0          0          0        181        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:19
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.1s
                   all       1449       8364          0          0          0          0

    mAP一直是0。当时我用的是yaml文件用于训练模型,

    model_name = r"H:\1_yaoyuan\code\01_yolo26\yolo_Project\ultralytics-main\ultralytics\cfg\models\11\yolo11.yaml"

    之后改成了,

    model_name = 'yolo11n.pt' # 首次运行会自动下载

    然后训练才变的正常,

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
     2/1000      5.47G      2.825      1.856     0.8776        131        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.0it/s 11.5s
                   all       1449       8364      0.554      0.314       0.32      0.117
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
     3/1000      5.47G      2.904      1.726     0.8738        206        640: 100% ━━━━━━━━━━━━ 121/121 1.1s/it 2:19
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 1.9it/s 11.9s
                   all       1449       8364      0.496       0.29      0.269      0.085

    这是为什么?微调和从头开始训练差别很大吗? 我问了deepseek,他说:“.yaml 路径迫使模型在毫无知识的情况下承受初始的梯度冲击,导致了数值崩溃;而 .pt 路径让模型从一个稳定的知识基础开始,顺利进入了正常的学习轨道。”

    可如果是这样,如果这个世界还没有yolo的pt文件,那么是不是mAP永远都是0了?

    1. Paula DerrengerUltralytics

      不用道歉,这是很合理的问题!不是的:从 .yaml 构建模型是随机初始化,从 yolo11n.pt 开始则利用预训练特征,通常收敛更快、需要的数据更少;YOLO11 官方示例也支持从零训练,并不需要已有 .pt 才能学会检测。你这里不仅 mAP 为 0,三个 loss 也连续为 0,这不能简单解释为“从零训练比较慢”,更应优先排查训练数值异常;仅凭这些日志,还不能确认 DeepSeek 所说的“梯度冲击”。建议保留 YAML,在原来的 model.train(...) 中加入 amp=False,重新启动训练以排查混合精度问题(AMP 检查说明)。如果仍然全为 0,请贴出完整训练代码、启动到首个异常 epoch 的文本日志,以及 GPU 型号、Ultralytics 和 PyTorch 版本。