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

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
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.
| Modello | dimensione (pixel) | mAPval 50-95 baseline | mAPval 50-95 distillato | mAPval 50-95 (e2e) baseline | mAPval 50-95 (e2e) distillato |
|---|---|---|---|---|---|
| YOLO26n-distill | 640 | 40.9 | 41.5 | 40.1 | 40.9 |
| YOLO26s-distill | 640 | 48.6 | 49.2 | 47.8 | 48.6 |
| YOLO26m-distill | 640 | 53.1 | 53.9 | 52.5 | 53.3 |
| YOLO26l-distill | 640 | 55.0 | 56.0 | 54.4 | 55.5 |
| YOLO26x-distill | 640 | 57.5 | 57.9 | 56.9 | 57.4 |
- I valori di mAPval sono per modello singolo a scala singola sul dataset COCO val2017.
Riproduci tramiteyolo 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#
| Studente | Insegnante raccomandato |
|---|---|
yolo26n.pt | yolo26s.pt |
yolo26s.pt | yolo26m.pt |
yolo26m.pt | yolo26x.pt |
yolo26l.pt | yolo26x.pt |
La distillazione tra famiglie diverse (es. insegnante YOLO11 con studente YOLO26) non è supportata.
Parametri chiave#
| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
distill_model | str | None | Percorso del file del modello teacher (es. yolo26x.pt). Impostando questo parametro si abilita knowledge distillation. |
dis | float | 6.0 | Peso della loss di distillazione. Controlla quanto la loss di distillazione contribuisce alla loss totale di addestramento. |
Come funziona#
- Il teacher model rimane bloccato in modalità
evaled esegue l'inferenza su ciascun batch - Il modello studente si addestra con le loss standard del task più la guida della distillazione
- Le feature vengono estratte da entrambi i modelli presso i tre strati neck che alimentano la head della famiglia Detect
- Una rete projector (MLP leggero) allinea le dimensioni delle feature dello studente per corrispondere a quelle dell'insegnante
- Una loss L2 pesata per il punteggio confronta le feature proiettate dello studente con quelle dell'insegnante, pesate dalla confidenza di classificazione dell'insegnante
- 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:#fffSupporto 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.
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.
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:
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:
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:
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 640Il 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_modelsia corretto e che il file venga caricato - Prova ad aumentare
disse 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à
evalsenza gradienti, mantenendo l'overhead gestibile. Usaamp=Trueper 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.