Link to this sectionДистилляция знаний#
Link to this sectionБыстрый старт#
Обучай меньшую модель-ученика под руководством большей модели-учителя, добавив аргумент distill_model:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt")Link to this sectionЧто такое дистилляция знаний?#
Дистилляция знаний переносит знания от большой, высокоточной модели-учителя к меньшей модели-ученику. Ученик учится имитировать внутренние представления признаков учителя, часто достигая лучшей точности, чем при обучении с нуля.
Используй дистилляцию, когда:
- Тебе нужна меньшая и более быстрая модель для развертывания
- У тебя есть высокоточная модель-учитель, обученная на тех же данных
- Ты хочешь получить лучшую точность, чем дает стандартное обучение
Дистилляция знаний реализована для задач detect, segment, pose и obb. На данный момент только для detect экспериментально подтверждено повышение точности.
Link to this sectionПроизводительность#
Дистилляция знаний повышает 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 указаны для модели с одним масштабом на наборе данных COCO val2017.
Воспроизведи результат с помощьюyolo val detect data=coco.yaml device=0 - Значения e2e используют стандартный путь инференса без NMS; не-e2e значения используют традиционную постобработку NMS (
end2end=False). Подробности см. в End-to-End Detection.
Link to this sectionПредварительные требования#
Перед началом убедись, что соответствуешь следующим требованиям:
- Обученная модель-учитель: предварительно обученная, высокоточная модель-учитель из того же семейства YOLO, что и модель-ученик (например, YOLO26).
- Совпадающие набор данных и задача: и модель-учитель, и модель-ученик должны использовать абсолютно одинаковую конфигурацию набора данных и задачи.
- GPU-ресурсы: достаточный объем памяти GPU (VRAM) для загрузки и запуска обеих моделей одновременно во время обучения (обратись к FAQ относительно типичных затрат VRAM).
Link to this sectionРекомендуемые пары моделей#
| Ученик | Рекомендуемый учитель |
|---|---|
yolo26n.pt | yolo26s.pt |
yolo26s.pt | yolo26m.pt |
yolo26m.pt | yolo26x.pt |
yolo26l.pt | yolo26x.pt |
Межсемейная дистилляция (например, учитель YOLO11 с учеником YOLO26) не поддерживается.
Link to this sectionКлючевые параметры#
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
distill_model | str | None | Путь к файлу модели-учителя (например, yolo26x.pt). Установка этого параметра активирует дистилляцию знаний. |
dis | float | 6.0 | Вес функции потерь дистилляции. Контролирует вклад потерь от дистилляции в общую функцию потерь при обучении. |
Link to this sectionКак это работает#
- Модель-учитель остается замороженной в режиме
evalи выполняет инференс на каждом батче - Модель-ученик обучается со стандартными потерями задачи плюс руководство от дистилляции
- Признаки извлекаются из обеих моделей на трех слоях «шеи» (neck), которые подаются в голову семейства Detect
- Проекционная сеть (легковесный MLP) выравнивает размерности признаков ученика в соответствии с учителем
- L2-потеря с весовым коэффициентом уверенности сравнивает спроецированные признаки ученика с признаками учителя, взвешенными по уверенности учителя в классификации
- Потеря дистилляции объединяется со стандартными потерями с использованием веса
dis
flowchart TD
A[Input Image Batch] --> T[Teacher Model<br/>frozen, eval mode]
A --> S[Student Model<br/>trainable]
T --> |Detect head inputs| TF[Teacher Features]
S --> |Detect head inputs| SF[Student Features]
SF --> P[1×1 Conv Projector<br/>with ReLU]
P --> AF[Aligned Student Features]
TF --> SW[Score-weighted L2 Loss]
AF --> SW
S --> D[Detection Head]
D --> DL[box_loss + cls_loss + dfl_loss]
SW --> |× dis| DIS[distillation loss]
DL --> TOTAL[Total Loss]
DIS --> TOTAL
TOTAL --> BP[Backpropagate<br/>Student + Projector only]Link to this sectionПоддержка задач#
Реализация дистилляции извлекает признаки из трех слоев «шеи», питающих голову модели семейства Detect. Поскольку головы segment, pose и obb наследуются от той же архитектуры 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")Link to this sectionTraining#
Link to this sectionБазовое обучение#
Обучение с дистилляцией идентично стандартному. Укажи путь 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")Link to this sectionНастройка веса функции потерь дистилляции#
Параметр 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)Link to this sectionВозобновление обучения с дистилляцией#
Обучение с дистилляцией поддерживает возобновление с чекпоинтов. Модель-учитель автоматически пересоздается из пути distill_model:
from ultralytics import YOLO
student = YOLO("runs/detect/train/weights/last.pt")
results = student.train(resume=True)Link to this sectionРезультаты обучения#
Когда дистилляция включена, в журналах обучения появляется дополнительный столбец dis_loss:
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Экспортированная модель содержит только веса ученика — размер файла и скорость инференса соответствуют обычно обученной модели-ученику.
Link to this sectionFAQ#
Link to this sectionПочему моя потеря дистилляции не уменьшается?#
- Убедись, что учитель и ученик из одного поколения YOLO
- Подтверди, что путь
distill_modelверен и файл загружается - Попробуй увеличить
dis, если значение потерь очень мало - Убедись, что модель-учитель обучена на том же наборе данных
Link to this sectionЧем дистилляция отличается от стандартного обучения?#
Добавь параметр distill_model — все остальное работает идентично. Во время обучения вычисляется дополнительная потеря дистилляции, но сохраненная модель является стандартной моделью YOLO без накладных расходов.
Link to this sectionЗамедляет ли дистилляция знаний обучение?#
Да. Ожидай, что обучение будет идти в 1.2-1.5 раза медленнее и потреблять примерно в 1.1 раза больше памяти GPU, так как модель-учитель выполняет инференс на каждом батче. Учитель работает в режиме eval без градиентов, что удерживает накладные расходы на приемлемом уровне. Используй amp=True для снижения влияния.
Link to this sectionКакие задачи и модели поддерживаются?#
Дистилляция знаний работает с задачами detect, segment, pose и obb, так как она дистиллирует признаки из трех слоев «шеи», питающих голову семейства Detect. Задачи classify и semantic не поддерживаются.
Только detect был экспериментально проверен на предмет улучшения точности. Segment, pose и obb технически совместимы, но еще не прошли бенчмаркинг.
Учитель и ученик должны принадлежать к одному семейству YOLO (например, YOLOv8, YOLO11 или YOLO26). Межсемейная дистилляция (например, учитель YOLO11 с учеником YOLO26) не поддерживается.