Дистилляция знаний#
Быстрый старт#
Обучи меньшую студенческую модель под руководством более крупной учительской модели, добавив аргумент distill_model:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt")Что такое дистилляция знаний?#
Дистилляция знаний переносит знания от большой, точной учительской модели к меньшей студенческой модели. Студенческая модель учится имитировать внутренние представления признаков учительской модели и часто достигает более высокой точности, чем при обучении с нуля.

Используй дистилляцию, если:
- Тебе нужна меньшая и более быстрая модель для развертывания
- У тебя есть высокоточная учительская модель, обученная на тех же данных
- Ты хочешь получить более высокую точность, чем при стандартном обучении
Дистилляция знаний реализована для задач detect, segment, pose и obb. На данный момент экспериментально подтверждено повышение точности только для detect.
Производительность#
Дистилляция знаний повышает mAP студенческой модели во всем семействе YOLO26 на COCO без дополнительных затрат на инференс. В таблице ниже стандартные модели YOLO26 (базовый уровень) сравниваются с теми же моделями, обученными с дистилляцией от рекомендованной учительской модели.
| Модель | размер (пиксели) | mAPval 50-95 базовый уровень | mAPval 50-95 дистиллированная модель | mAPval 50-95 (e2e) базовый уровень | mAPval 50-95 (e2e) дистиллированная модель |
|---|---|---|---|---|---|
| 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.
Предварительные требования#
Перед началом убедись, что выполняются следующие требования:
- Обученная учительская модель: чекпоинт
.ptиз того же семейства YOLO, что и студенческая модель. - Соответствующая задача: используй учительскую модель для той же задачи, что и студенческая, и обучай ее на релевантных данных.
- Ресурсы GPU: достаточно памяти для хранения обеих моделей; учительская модель выполняет только прямой проход без градиентов и состояния оптимизатора.
Рекомендуемые пары моделей#
| Студенческая модель | Рекомендуемая учительская модель |
|---|---|
yolo26n.pt | yolo26s.pt |
yolo26s.pt | yolo26m.pt |
yolo26m.pt | yolo26x.pt |
yolo26l.pt | yolo26x.pt |
Дистилляция между разными семействами (например, учительская модель YOLO11 и студенческая модель YOLO26) не поддерживается.
Основные параметры#
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
distill_model | str | None | Путь к файлу учительской модели (например, yolo26x.pt). Установка этого параметра включает дистилляцию знаний. |
dis | float | 6.0 | Вес функции потерь дистилляции. Определяет вклад функции потерь дистилляции в общую функцию потерь обучения. |
Как это работает#
- Учительская модель остается замороженной в режиме
evalи выполняет инференс для каждого батча - Студенческая модель обучается со стандартными функциями потерь задачи и дополнительными рекомендациями дистилляции
- Признаки извлекаются из обеих моделей на трех слоях шеи, которые подают данные на голову семейства Detect
- Проектор из двух сверток 1×1 с ReLU сопоставляет карты признаков студенческой модели с каналами учительской модели
- Взвешенная по оценке функция потерь L2 сравнивает проецированные признаки студенческой модели с признаками учительской модели, используя в качестве весов уверенность учительской модели в классификации
- Функция потерь дистилляции объединяется со стандартными функциями потерь с использованием веса
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:#fffПоддержка задач#
Реализация дистилляции извлекает признаки из трех слоев шеи, которые подают данные на голову семейства Detect модели. Поскольку головы segment, pose и obb наследуют ту же архитектуру Detect, дистилляция технически совместима и с этими задачами.
Классификация, семантическая сегментация, оценка глубины и RT-DETR не используют совместимую голову семейства Detect и не поддерживаются.
Экспериментально протестирована и подтверждена только задача detect. Ты можешь запускать дистилляцию для segment, pose или obb, но повышение точности для этих задач пока не подтверждено.
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")Обучение#
Базовое обучение#
Обучение с дистилляцией идентично стандартному обучению. Укажи путь distill_model, чтобы включить ее:
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")Настройка веса функции потерь дистилляции#
Параметр dis (по умолчанию: 6.0) управляет вкладом функции потерь дистилляции:
from ultralytics import YOLO
student = YOLO("yolo26n.pt")
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt", dis=10.0)Возобновление обучения с дистилляцией#
Обучение с дистилляцией поддерживает возобновление из чекпоинтов. Учительская модель автоматически создается заново по пути distill_model, записанному в чекпоинте:
from ultralytics import YOLO
student = YOLO("runs/detect/train/weights/last.pt")
results = student.train(resume=True)Результаты обучения#
При включенной дистилляции в логах обучения появляется дополнительный столбец 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 640Экспортированная модель содержит только веса студенческой модели — размер файла и скорость инференса соответствуют обычно обученной студенческой модели.
Часто задаваемые вопросы#
- Убедись, что учительская и студенческая модели относятся к одному поколению YOLO
- Проверь, что путь
distill_modelуказан правильно и файл загружается - Попробуй увеличить
dis, если значение функции потерь очень мало - Убедись, что учительская модель обучена на том же датасете
Добавь параметр
distill_model— все остальное работает так же. Во время обучения дополнительно вычисляется функция потерь дистилляции, но сохраненная модель остается стандартной моделью YOLO без дополнительных накладных расходов.Да. Учительская модель добавляет прямой проход для каждого батча, поэтому дополнительные затраты времени и памяти зависят от пары учительской и студенческой моделей. Учительская модель работает в режиме
evalбез градиентов и состояния оптимизатора.Дистилляция знаний работает с задачами detect, segment, pose и obb, поскольку извлекает признаки из трех слоев шеи, которые подают данные на голову семейства Detect. Classify, semantic, depth и RT-DETR не поддерживаются.
Экспериментально подтверждено повышение точности только для detect. Задачи segment, pose и obb технически совместимы, но пока не прошли сравнительное тестирование.
Учительская и студенческая модели должны принадлежать к одному семейству YOLO (например, YOLOv8, YOLO11 или YOLO26). Дистилляция между разными семействами (например, учительская модель YOLO11 и студенческая модель YOLO26) не поддерживается.