Дистилляция знаний
Быстрый старт#
Обучи компактную модель-ученик под руководством более крупной модели-учителя, добавив аргумент 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 (базовые) с теми же моделями, обученными с дистилляцией от рекомендованных для них учителей.
| Модель | размер (пиксели) | mAPval50-95 базовая | mAPval50-95 дистиллированная | mAPval50-95 (e2e) базовая | mAPval50-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 приведены для одной модели и одного масштаба на наборе данных COCO val2017.
Чтобы воспроизвести строку с дистилляцией, используйyolo val detect model=yolo26n-distill.pt data=coco.yaml device=0; для столбца e2e добавьnms=False. - Для значений e2e используется путь инференса без NMS (
nms=False); для остальных значений используется стандартная постобработка NMS (nms=None). Подробнее см. в разделе «Сквозное обнаружение объектов».
Предварительные требования#
Перед началом убедись, что выполнены следующие требования:
- Обученная модель-учитель: контрольная точка
.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и выполняет инференс на каждом батче - Модель-ученик обучается со стандартными функциями потерь для задачи и подсказками дистилляции
- Признаки извлекаются из обеих моделей на трёх слоях neck, подающих данные на голову семейства Detect
- Проектор из двух свёрточных слоёв 1×1 с ReLU приводит карты признаков ученика к числу каналов учителя
- Функция потерь L2 с весами по оценкам сравнивает проецированные признаки ученика с признаками учителя, взвешивая их по уверенности классификации учителя
- Функция потерь дистилляции объединяется со стандартными функциями потерь с весом
dis
Поддержка задач#
Реализация дистилляции извлекает признаки из трёх слоёв neck, подающих данные на голову модели семейства 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
# Загрузи модель-ученика
student = YOLO("yolo26m.pt")
# Обучи модель с дистилляцией знаний от более крупной модели-учителя
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, поскольку при ней дистиллируются признаки из трёх слоёв neck, подающих данные на голову семейства Detect. Задачи classify, semantic, depth и RT-DETR не поддерживаются.
Экспериментально подтверждено повышение точности только для задачи detect. Задачи segment, pose и obb технически совместимы, но пока не проходили тестирование.
Учитель и ученик должны принадлежать к одному семейству YOLO (например, YOLOv8, YOLO11 или YOLO26). Дистилляция между разными семействами (например, учитель YOLO11 и ученик YOLO26) не поддерживается.
Комментарии5
Задай вопрос, поделись результатами или помоги кому-нибудь.
CharbelMsallem
Cool! If same dataset, can the class mapping or the number of classes differ from parent to student but using the same images and split?
CharbelMsallem
I mean classes of student be a subset of parent classes
Glenn JocherUltralyticsSame images/splits can be reused, but for the supported distillation path the teacher and student should use the same task and
data.yamlclass configuration (nc,names, and class indices), per the Knowledge Distillation guide. If the student should learn only a subset, create a subset dataset/YAML with labels remapped to contiguous IDs and train or fine-tune a teacher on that same subset/mapping before using it asdistill_model.CharbelMsallem
okat thanks!
andyrey
Very interesting and useful, thank you!