Distillazione della conoscenza#
Guida rapida#
Addestra un modello studente più piccolo con la guida di un modello insegnante 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")Che cos'è la distillazione della conoscenza?#
La distillazione della conoscenza trasferisce la conoscenza da un modello insegnante grande e accurato a un modello studente più piccolo. Lo studente impara a imitare le rappresentazioni interne delle caratteristiche dell'insegnante, ottenendo spesso una precisione migliore rispetto all'addestramento da zero.

Usa la distillazione quando:
- Ti serve un modello più piccolo e veloce per la distribuzione
- Hai un modello insegnante ad alta precisione addestrato sugli stessi dati
- Vuoi una precisione migliore di quella offerta dall'addestramento standard
La distillazione della conoscenza è implementata per le attività detect, segment, pose e obb. Al momento, solo detect è stata verificata sperimentalmente per i miglioramenti della precisione.
Prestazioni#
La distillazione della conoscenza migliora il mAP dello studente nell'intera famiglia YOLO26 su COCO, senza costi aggiuntivi in fase di inferenza. La tabella seguente confronta i modelli YOLO26 standard (baseline) con gli stessi modelli addestrati mediante distillazione dal rispettivo insegnante 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 |
- mAPval values are for single-model single-scale on the COCO val2017 dataset.
Reproduce a distilled row withyolo val detect model=yolo26n-distill.pt data=coco.yaml device=0; addnms=Falsefor the e2e column. - e2e values use the NMS-free inference path (
nms=False); non-e2e values use default NMS post-processing (nms=None). See End-to-End Detection for details.
Prerequisiti#
Prima di iniziare, assicurati di soddisfare i seguenti requisiti:
- Modello insegnante addestrato: un checkpoint
.ptdella stessa famiglia YOLO dello studente. - Attività corrispondente: usa un insegnante per la stessa attività dello studente e addestralo su dati pertinenti.
- Risorse GPU: memoria sufficiente per contenere entrambi i modelli; l'insegnante esegue solo il forward, senza gradienti né stato dell'ottimizzatore.
Coppie di modelli consigliate#
| Studente | Insegnante consigliato |
|---|---|
yolo26n.pt | yolo26s.pt |
yolo26s.pt | yolo26m.pt |
yolo26m.pt | yolo26x.pt |
yolo26l.pt | yolo26x.pt |
La distillazione tra famiglie diverse (ad esempio, un insegnante YOLO11 con uno studente YOLO26) non è supportata.
Parametri principali#
| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
distill_model | str | None | Percorso del file del modello insegnante (ad esempio, yolo26x.pt). L'impostazione di questo parametro abilita la distillazione della conoscenza. |
dis | float | 6.0 | Peso della loss di distillazione. Controlla il contributo della loss di distillazione alla loss totale dell'addestramento. |
Come funziona#
- Il modello insegnante rimane congelato nella modalità
evaled esegue l'inferenza su ogni batch - Il modello studente viene addestrato con le loss standard dell'attività e la guida della distillazione
- Le caratteristiche vengono estratte da entrambi i modelli nei tre livelli neck che alimentano la head della famiglia Detect
- Un proiettore composto da due convoluzioni 1×1 con ReLU allinea ogni mappa delle caratteristiche dello studente ai canali dell'insegnante
- Una loss L2 pesata per il punteggio confronta le caratteristiche proiettate dello studente con quelle dell'insegnante, pesate in base alla confidenza di classificazione dell'insegnante
- La loss di distillazione viene combinata con le loss standard usando 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 + l1_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 delle attività#
L'implementazione della distillazione estrae le caratteristiche dai tre livelli neck che alimentano la head della famiglia Detect del modello. Poiché le head segment, pose e obb ereditano dalla stessa architettura Detect, la distillazione è tecnicamente compatibile anche con queste attività.
La classificazione, la segmentazione semantica, la stima della profondità e RT-DETR non usano una head compatibile della famiglia Detect e non sono supportate.
Solo detect è stata sottoposta a benchmark e verificata sperimentalmente. Puoi eseguire la distillazione per segment, pose o obb, ma i miglioramenti della precisione per queste attività non sono ancora stati convalidati.
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 la distillazione è identico a quello standard. Specifica il percorso distill_model per abilitarla:
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 loss di distillazione:
from ultralytics import YOLO
student = YOLO("yolo26n.pt")
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt", dis=10.0)Ripresa dell'addestramento con distillazione#
L'addestramento con distillazione supporta la ripresa dai checkpoint. Il modello insegnante viene ricostruito automaticamente dal percorso distill_model registrato nel checkpoint:
from ultralytics import YOLO
student = YOLO("runs/detect/train/weights/last.pt")
results = student.train(resume=True)Output dell'addestramento#
Quando la distillazione è abilitata, nei log dell'addestramento compare una colonna aggiuntiva dis_loss:
Epoch GPU_mem box_loss cls_loss l1_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: le dimensioni del file e la velocità di inferenza corrispondono a quelle di 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 loss è molto basso - Assicurati che il modello insegnante sia addestrato sullo stesso dataset
Aggiungi il parametro
distill_model: tutto il resto funziona nello stesso modo. Durante l'addestramento viene calcolata una loss di distillazione aggiuntiva, ma il modello salvato è un modello YOLO standard senza overhead.Sì. L'insegnante aggiunge un forward pass per ogni batch, quindi il sovraccarico in termini di tempo e memoria dipende dalla coppia insegnante/studente. L'insegnante opera in modalità
eval, senza gradienti né stato dell'ottimizzatore.La distillazione della conoscenza funziona con le attività detect, segment, pose e obb, perché distilla le caratteristiche dai tre livelli neck che alimentano la head della famiglia Detect. Classify, semantic, depth e RT-DETR non sono supportati.
Solo detect è stata verificata sperimentalmente per i miglioramenti della precisione. Segment, pose e obb sono tecnicamente compatibili, ma non sono ancora state sottoposte a benchmark.
L'insegnante e lo studente devono appartenere alla stessa famiglia YOLO (ad esempio, YOLOv8, YOLO11 o YOLO26). La distillazione tra famiglie diverse (ad esempio, un insegnante YOLO11 con uno studente YOLO26) non è supportata.