YOLO Vision 2026:

Distillazione della conoscenza#

Avvio rapido#

Allena un modello student più piccolo con la guida di un modello teacher più grande aggiungendo l'argomento distill_model:

Esempio
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt")

Cos'è la Knowledge Distillation?#

Knowledge distillation trasferisce la conoscenza da un teacher model grande e accurato a un student model più piccolo. Lo studente impara a imitare le rappresentazioni di caratteristiche interne del teacher, ottenendo spesso una precisione migliore rispetto all'addestramento da zero.

Knowledge distillation workflow image

Usa la distillazione quando:

  • Hai bisogno di un modello più piccolo e veloce per il deployment
  • Hai un modello insegnante ad alta precisione addestrato sugli stessi dati
  • Desideri una precisione migliore di quella offerta dall'addestramento standard
Nota

La knowledge distillation è implementata per i task detect, segment, pose e obb. Solo detect è stato verificato sperimentalmente per i miglioramenti di precisione per il momento.

Performance#

Knowledge distillation migliora il mAP dello student nell'intera famiglia YOLO26 su COCO, senza costi di inferenza aggiuntivi. La tabella sottostante confronta i modelli YOLO26 standard (baseline) con gli stessi modelli addestrati con distillation dal loro teacher consigliato.

Modellodimensione
(pixel)
mAPval
50-95

baseline
mAPval
50-95

distillato
mAPval
50-95 (e2e)

baseline
mAPval
50-95 (e2e)

distillato
YOLO26n-distill64040.941.540.140.9
YOLO26s-distill64048.649.247.848.6
YOLO26m-distill64053.153.952.553.3
YOLO26l-distill64055.056.054.455.5
YOLO26x-distill64057.557.956.957.4
  • I valori di mAPval sono per modello singolo a scala singola sul dataset COCO val2017.
    Riproduci tramite yolo val detect data=coco.yaml device=0
  • I valori e2e utilizzano il percorso di inferenza predefinito senza NMS; i valori non-e2e utilizzano il post-processing NMS tradizionale (end2end=False). Vedi End-to-End Detection per i dettagli.

Prerequisiti#

Prima di iniziare, assicurati di soddisfare i seguenti requisiti:

  • Modello insegnante addestrato: Un modello insegnante pre-addestrato ad alta precisione della stessa famiglia YOLO del modello studente (es. YOLO26).
  • Dataset e task corrispondenti: Sia il modello insegnante che quello studente devono utilizzare esattamente la stessa configurazione di dataset e task.
  • Risorse GPU: Memoria GPU (VRAM) sufficiente per caricare ed eseguire entrambi i modelli contemporaneamente durante l'addestramento (fai riferimento alle FAQ per il consumo tipico di VRAM).

Coppie di modelli raccomandate#

StudenteInsegnante raccomandato
yolo26n.ptyolo26s.pt
yolo26s.ptyolo26m.pt
yolo26m.ptyolo26x.pt
yolo26l.ptyolo26x.pt

La distillazione tra famiglie diverse (es. insegnante YOLO11 con studente YOLO26) non è supportata.

Parametri chiave#

ParametroTipoPredefinitoDescrizione
distill_modelstrNonePercorso del file del modello teacher (es. yolo26x.pt). Impostando questo parametro si abilita knowledge distillation.
disfloat6.0Peso della loss di distillazione. Controlla quanto la loss di distillazione contribuisce alla loss totale di addestramento.

Come funziona#

  1. Il teacher model rimane bloccato in modalità eval ed esegue l'inferenza su ciascun batch
  2. Il modello studente si addestra con le loss standard del task più la guida della distillazione
  3. Le feature vengono estratte da entrambi i modelli presso i tre strati neck che alimentano la head della famiglia Detect
  4. Una rete projector (MLP leggero) allinea le dimensioni delle feature dello studente per corrispondere a quelle dell'insegnante
  5. Una loss L2 pesata per il punteggio confronta le feature proiettate dello studente con quelle dell'insegnante, pesate dalla confidenza di classificazione dell'insegnante
  6. La perdita di distillation si combina con le perdite standard utilizzando il peso dis
flowchart TD
    A[Input Image Batch]:::start --> T[Teacher Model<br/>frozen, eval mode]:::extern
    A --> S[Student Model<br/>trainable]:::proc

    T --> |Detect head inputs| TF[Teacher Features]:::extern
    S --> |Detect head inputs| SF[Student Features]:::proc

    SF --> P[1×1 Conv Projector<br/>with ReLU]:::decide
    P --> AF[Aligned Student Features]:::proc

    TF --> SW[Score-weighted L2 Loss]:::proc
    AF --> SW

    S --> D[Detection Head]:::proc
    D --> DL[box_loss + cls_loss + dfl_loss]:::proc

    SW --> |× dis| DIS[distillation loss]:::proc
    DL --> TOTAL[Total Loss]:::out
    DIS --> TOTAL

    TOTAL --> BP[Backpropagate<br/>Student + Projector only]:::out

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef decide fill:#FF9800,color:#fff
    classDef out fill:#9C27B0,color:#fff
    classDef extern fill:#607D8B,color:#fff

Supporto ai task#

L'implementazione di distillation estrae le caratteristiche dai tre layer del neck che alimentano la testa della famiglia Detect del modello. Poiché le teste segment, pose e obb ereditano dalla stessa architettura Detect, distillation è tecnicamente compatibile anche con quei task.

Avviso

Solo detect è stato sottoposto a benchmark e verificato sperimentalmente. Puoi eseguire la distillazione per segment, pose o obb, ma i miglioramenti di precisione per quei task non sono ancora stati validati.

Knowledge Distillation per altri task
from ultralytics import YOLO

# Segment
model = YOLO("yolo26n-seg.pt")
model.train(data="coco8-seg.yaml", epochs=100, distill_model="yolo26s-seg.pt")

# Pose
model = YOLO("yolo26n-pose.pt")
model.train(data="coco8-pose.yaml", epochs=100, distill_model="yolo26s-pose.pt")

# OBB
model = YOLO("yolo26n-obb.pt")
model.train(data="dota8.yaml", epochs=100, distill_model="yolo26s-obb.pt")

Addestramento#

Addestramento di base#

L'addestramento con distillation è identico all'addestramento standard. Fornisci il percorso distill_model per abilitarlo:

Addestramento con Knowledge Distillation
from ultralytics import YOLO

# Load a student model
student = YOLO("yolo26m.pt")

# Train with knowledge distillation from a larger teacher model
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26x.pt")

Regolazione del peso della loss di distillazione#

Il parametro dis (predefinito: 6.0) controlla il contributo della perdita di distillation:

Peso di distillazione personalizzato
from ultralytics import YOLO

student = YOLO("yolo26n.pt")
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt", dis=10.0)

Riprendere l'addestramento con distillazione#

L'addestramento con distillation supporta la ripresa da checkpoint. Il modello teacher viene ricostruito automaticamente dal percorso distill_model:

Riprendi l'addestramento con distillazione
from ultralytics import YOLO

student = YOLO("runs/detect/train/weights/last.pt")
results = student.train(resume=True)

Output di addestramento#

Quando distillation è abilitata, appare un'ulteriore colonna dis_loss nei log di addestramento:

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss   dis_loss  Instances       Size
      1/80      46.2G      1.566      5.404    0.003249      6.658        231        640

Il modello esportato contiene solo i pesi dello studente—la dimensione del file e la velocità di inferenza corrispondono a un modello studente addestrato normalmente.

FAQ#

    • Verifica che insegnante e studente appartengano alla stessa generazione YOLO
    • Conferma che il percorso distill_model sia corretto e che il file venga caricato
    • Prova ad aumentare dis se il valore della perdita è molto piccolo
    • Assicurati che il modello insegnante sia addestrato sullo stesso dataset
  • Aggiungi il parametro distill_model, tutto il resto funziona in modo identico. Una perdita di distillation extra viene calcolata durante l'addestramento, ma il modello salvato è un modello YOLO standard senza overhead.

  • Sì. Aspettati un addestramento più lento di 1.2-1.5x e circa 1.1x in più di memoria GPU perché il modello teacher esegue l'inferenza su ogni batch. Il teacher viene eseguito in modalità eval senza gradienti, mantenendo l'overhead gestibile. Usa amp=True per ridurre l'impatto.

  • La knowledge distillation funziona con i task detect, segment, pose e obb perché distilla le feature dai tre strati neck che alimentano la head della famiglia Detect. I task classify e semantic non sono supportati.

    Solo detect è stato verificato sperimentalmente per i miglioramenti di precisione. Segment, pose e obb sono tecnicamente compatibili ma non ancora sottoposti a benchmark.

    L'insegnante e lo studente devono appartenere alla stessa famiglia YOLO (es. YOLOv8, YOLO11 o YOLO26). La distillazione tra famiglie diverse (es. un insegnante YOLO11 con uno studente YOLO26) non è supportata.

Commenti