YOLO Vision 2026:

Дистилляция знаний#

Быстрый старт#

Обучи меньшую студенческую модель под руководством более крупной учительской модели, добавив аргумент 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-distill64040.941.540.140.9
YOLO26s-distill64048.649.247.848.6
YOLO26m-distill64053.153.952.553.3
YOLO26l-distill64055.056.054.455.5
YOLO26x-distill64057.557.956.957.4
  • mAPval values are for single-model single-scale on the COCO val2017 dataset.
    Reproduce a distilled row with yolo val detect model=yolo26n-distill.pt data=coco.yaml device=0; add nms=False for 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.ptyolo26s.pt
yolo26s.ptyolo26m.pt
yolo26m.ptyolo26x.pt
yolo26l.ptyolo26x.pt

Дистилляция между разными семействами (например, учительская модель YOLO11 и студенческая модель YOLO26) не поддерживается.

Основные параметры#

ПараметрТипПо умолчаниюОписание
distill_modelstrNoneПуть к файлу учительской модели (например, yolo26x.pt). Установка этого параметра включает дистилляцию знаний.
disfloat6.0Вес функции потерь дистилляции. Определяет вклад функции потерь дистилляции в общую функцию потерь обучения.

Как это работает#

  1. Учительская модель остается замороженной в режиме eval и выполняет инференс для каждого батча
  2. Студенческая модель обучается со стандартными функциями потерь задачи и дополнительными рекомендациями дистилляции
  3. Признаки извлекаются из обеих моделей на трех слоях шеи, которые подают данные на голову семейства Detect
  4. Проектор из двух сверток 1×1 с ReLU сопоставляет карты признаков студенческой модели с каналами учительской модели
  5. Взвешенная по оценке функция потерь L2 сравнивает проецированные признаки студенческой модели с признаками учительской модели, используя в качестве весов уверенность учительской модели в классификации
  6. Функция потерь дистилляции объединяется со стандартными функциями потерь с использованием веса 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) не поддерживается.

Комментарии