引言

你有没有遇到过这种情况:模型太大部署不了,换小模型吧精度又掉得肉疼?这是模型落地的经典两难——大模型精度高但跑不动,小模型跑得快但精度差。以 YOLO26 为例:YOLO26x 精度高达 mAP 54.7 但推理耗时 6.4ms,不适合边缘设备;YOLO26n 速度快至 1.1ms 但精度仅 mAP 37.2,关键场景不够可靠。直接训练小模型受限于模型容量,很难追平大模型。

知识蒸馏(Knowledge Distillation)就是专门解决这个问题的技术。核心理念很朴素:让一个已经训练好的大模型(Teacher)在训练过程中"教"一个小模型(Student),小模型不光学标注答案,还学大模型的内部特征表示。相当于老师不光告诉学生"这道题选C",还把自己的解题过程讲给学生听。

Ultralytics 在 YOLO 中把这个能力做成了一行代码。不需要改架构、不需要改数据、不需要额外后处理——加一个 distill_model 参数就搞定。最终部署时只保留小模型,既享受大模型的精度收益,又不增加推理开销。


模型简介

Ultralytics YOLO 的知识蒸馏功能已原生集成在 model.train() 中,通过 distill_model 参数指定教师模型即可启用。

  • 支持任务:检测(detect)、分割(segment)、姿态(pose)、旋转框(obb)
  • 支持模型:同代 YOLO 家族内任意大小配对(YOLOv8 / YOLO11 / YOLO26)
  • 训练开销:速度降低 1.2–1.5 倍,显存增加约 10%
  • 导出模型:仅含学生权重,文件大小和推理速度与常规训练完全一致

推荐模型配对

学生模型 教师模型 典型场景
YOLO26n YOLO26s 极致轻量,边缘设备
YOLO26s YOLO26m 移动端,平衡精度与速度
YOLO26m YOLO26l 桌面端,较高精度要求
YOLO26l YOLO26x 追求最优精度

模型架构与核心创新

在这里插入图片描述

基础架构:知识蒸馏不改变模型结构。训练时同时加载教师模型(冻结、eval 模式)和学生模型(正常训练),通过特征对齐损失将教师知识迁移到学生。

核心创新:

  1. 一行代码蒸馏:只需在 model.train() 中加 distill_model="yolo26s.pt" 即可启用,无需任何额外配置,其余流程与常规训练完全一致。

  2. 三层 Neck 特征对齐:在 Detect 头的三个输入层(neck 输出)分别提取师生特征,通过轻量 1×1 卷积投影器(+ReLU)对齐维度后,用分数加权 L2 损失计算差异。

  3. 推理零成本:蒸馏只在训练阶段生效,导出的模型仅包含学生权重——文件大小和推理速度与正常训练完全一致。


基本原理

在这里插入图片描述

核心机制:特征层蒸馏 + 检测头联合训练

输入图像 → 教师模型(冻结,eval模式)→ 教师特征(3层neck)
输入图像 → 学生模型(可训练)        → 学生特征(3层neck)
                                              ↓
                                        1×1 Conv投影器(ReLU)
                                              ↓
                                        对齐后的学生特征
                                              ↓
教师特征 ──→ 分数加权L2损失 ←── 对齐后的学生特征
                  ↓
            蒸馏损失(× dis权重)
                  ↓
学生模型 → 检测头 → box_loss + cls_loss + dfl_loss
                  ↓
          总损失 = 检测损失 + dis × 蒸馏损失
                  ↓
          反向传播(仅更新学生 + 投影器)

三个关键设计

  1. 教师模型冻结推理:每个 batch 训练时,教师模型以 eval 模式冻结运行一次前向传播,提取三个 neck 层的特征图。不计算教师梯度,显存开销约增加 10%。

  2. 1×1 卷积投影器:学生 neck 层的特征维度可能与教师不同。一个 1×1 卷积 + ReLU 的轻量投影器将学生特征映射到教师空间,确保 L2 损失能正确计算。该投影器随学生一起训练。

  3. 分数加权 L2 损失:蒸馏损失不是简单算 MSE。教师模型的分类置信度作为权重——教师越确信的区域,学生越要认真学。最终蒸馏损失乘以 dis 系数(默认 6.0)与标准检测损失相加。

关键参数

参数 说明 默认值
distill_model 教师模型路径,支持 .pt 文件或已训练模型
dis 蒸馏损失权重,调大加强教师引导,调小更偏向标注真值 6.0
end2end 是否端到端蒸馏 False

使用方法

快速开始:一行代码启用蒸馏

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt")

加载学生模型(yolo26n),训练时通过 distill_model 指定教师模型(yolo26s),其余参数与常规训练完全一致,无需额外配置。distill_model 支持相对路径、绝对路径或模型名,会自动下载对应权重。

调整蒸馏损失权重

from ultralytics import YOLO

student = YOLO("yolo26n.pt")
results = student.train(
    data="coco8.yaml",
    epochs=100,
    distill_model="yolo26s.pt",
    dis=10.0
)

dis 参数控制蒸馏损失在总损失中的占比。蒸馏损失不下降时可适当增大 dis 值(如 10–15),适合学生模型容量较大时加强教师约束。

多任务支持

from ultralytics import YOLO

# 分割
model = YOLO("yolo26n-seg.pt")
model.train(data="coco8-seg.yaml", epochs=100, distill_model="yolo26s-seg.pt")

# 姿态
model = YOLO("yolo26n-pose.pt")
model.train(data="coco8-pose.yaml", epochs=100, distill_model="yolo26s-pose.pt")

# 旋转框
model = YOLO("yolo26n-obb.pt")
model.train(data="dota8.yaml", epochs=100, distill_model="yolo26s-obb.pt")

检测、分割、姿态、旋转框四个任务均支持蒸馏,因为蒸馏发生在 neck 层的三个输出特征上。分类和语义分割任务暂不支持,因其不使用 Detect-family 检测头。

从中断点恢复蒸馏训练

from ultralytics import YOLO

student = YOLO("runs/detect/train/weights/last.pt")
results = student.train(resume=True)

last.pt 恢复时,教师模型会根据原始配置自动重建,无需重新指定 distill_model


实验结果

训练日志

蒸馏训练时,日志中会额外出现 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

dis_loss 衡量学生特征与教师特征的差异,随训练逐步下降表示学生的特征表示正在接近教师。

COCO 基准测试

在 COCO 上,蒸馏带来的 mAP 提升覆盖整个 YOLO26 系列:

学生模型 教师模型 基线 mAP 蒸馏后 mAP 提升
YOLO26n YOLO26s 40.9 41.5 +0.6
YOLO26s YOLO26m 48.6 49.2 +0.6
YOLO26m YOLO26x 53.1 53.9 +0.8
YOLO26l YOLO26x 55.0 56.0 +1.0
YOLO26x YOLO26x 57.5 57.9 +0.4

越大模型获益越明显(YOLO26l +1.0 mAP),最小模型也有稳定提升(+0.6)。而且这些精度提升不带来任何部署代价——模型文件大小不变、推理速度不变。

训练开销

指标 变化
训练速度 降低至 1/1.2 – 1/1.5(教师模型每 batch 前向一次)
显存占用 增加约 10%
推理速度 与常规训练完全一致
模型文件大小 与常规训练完全一致

教师模型以 eval 模式运行不计算梯度,开销可控。配合 amp=True 混合精度训练可进一步降低显存压力。


应用场景

  • 边缘设备部署:需要在 Jetson 或手机端跑模型,n/s 级小模型是唯一选择。用蒸馏训练可以让小模型精度逼近中号模型,而不需要任何推理端改动。
  • 快速迭代微调:用已有的 YOLO26x 作为教师,蒸馏训练一个定制数据的 YOLO26n,既快又准。
  • 多任务扩展:虽然目前只有 detect 任务经过完整验证,但 segment、pose、obb 任务技术上兼容——代码就绪,等官方基准测试。

局限与展望

当前局限:

  • 师生模型必须同代(同为 YOLOv8 / YOLO11 / YOLO26),不支持跨代蒸馏
  • 仅检测任务经过完整精度验证,分割/姿态/旋转框技术上兼容但未充分 benchmark
  • 分类和语义分割任务暂不支持
  • 训练速度下降 1.2–1.5 倍,显存增加约 10%

未来方向:

蒸馏是模型压缩工具链中最"无痛"的一环。不需要量化、不需要剪枝、不需要改推理代码——训练时多等一会儿,导出的模型直接部署,精度白捡。随着 Ultralytics 持续迭代,跨家族蒸馏和更多任务的适配值得期待。


总结

核心优势:

  • 零门槛接入:一行 distill_model 参数即可启用,其余流程不变
  • 无部署代价:导出模型不含教师权重,推理速度/文件大小与常规训练一致
  • 稳定涨点:COCO 上 mAP 提升 0.4–1.0,覆盖 n/s/m/l/x 全系列
  • 多任务覆盖:检测、分割、姿态、旋转框四大任务均支持
  • 训练可恢复:支持从 checkpoint 恢复,教师模型自动重建

最佳实践:

  • 推荐配对:n→s、s→m、m→l、l→x,逐级蒸馏效果最稳定
  • dis 参数:默认 6.0 适用于多数场景,蒸馏损失不下降时可增至 10–15
  • 配合 amp=True:混合精度训练降低显存压力

以上就是 YOLO 知识蒸馏的核心解读。你觉得知识蒸馏、量化、剪枝这三种模型压缩手段哪个最实用?欢迎在评论区聊聊。

—THE END—

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐