YOLO Vision 2026:

知識蒸留#

クイックスタート#

distill_model引数を追加して、大きな教師モデルの指導を受けながら、より小さな生徒モデルをトレーニングします。

from ultralytics import YOLO

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

知識蒸留とは?#

知識蒸留では、大規模で高精度な教師モデルから、より小さな生徒モデルへ知識を転移します。生徒モデルは教師モデルの内部特徴表現を模倣するように学習し、スクラッチからトレーニングする場合より高い精度を達成できることがよくあります。

知識蒸留のワークフロー画像

次の場合に蒸留を使用します:

  • デプロイ用に、より小型で高速なモデルが必要な場合
  • 同じデータでトレーニングされた高精度な教師モデルがある場合
  • 標準的なトレーニングより高い精度が必要な場合
注記

知識蒸留は、detectsegmentposeobbタスクに実装されています。現時点で精度向上が実験的に検証されているのはdetectのみです。

性能#

知識蒸留により、COCO上のYOLO26ファミリー全体で、生徒モデルのmAPが向上します。推論コストの追加はありません。以下の表では、標準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 の値は、COCO val2017 データセットにおけるシングルモデル・シングルスケールのものです。
    蒸留された行を再現するには yolo val detect model=yolo26n-distill.pt data=coco.yaml device=0 を使用し、e2e カラムには nms=False を追加してください。
  • e2e の値はNMSフリーの推論パス (nms=False) を使用し、非e2eの値はデフォルトのNMS後処理 (nms=None) を使用します。詳細は End-to-End Detection を参照してください。

前提条件#

開始する前に、以下の要件を満たしていることを確認してください。

  • トレーニング済みの教師モデル: 生徒モデルと同じYOLOファミリーの.ptチェックポイント。
  • タスクの一致: 生徒モデルと同じタスクの教師モデルを使用し、関連するデータでトレーニングしてください。
  • 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ファミリーのヘッドに入力される3つのネック層で特徴を抽出します
  4. 2つの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ファミリーのヘッドに入力される3つのネック層から特徴を抽出します。segmentposeobbのヘッドは同じDetectアーキテクチャを継承しているため、蒸留はこれらのタスクとも技術的に互換性があります。

Classification、セマンティックセグメンテーション、深度推定、RT-DETRは互換性のあるDetectファミリーのヘッドを使用しないため、サポートされていません。

警告

実験的にベンチマークおよび検証されているのはdetectのみです。segmentposeobbで蒸留を実行できますが、これらのタスクでの精度向上はまだ検証されていません。

その他のタスクに対する知識蒸留
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

エクスポートされたモデルには生徒モデルの重みのみが含まれるため、ファイルサイズと推論速度は通常どおりトレーニングした生徒モデルと同じです。

FAQ#

    • 教師モデルと生徒モデルが同じYOLO世代であることを確認してください
    • distill_modelのパスが正しく、ファイルを読み込めることを確認してください
    • 損失値が非常に小さい場合は、disを増やしてみてください
    • 教師モデルが同じデータセットでトレーニングされていることを確認してください
  • distill_modelパラメーターを追加するだけで、それ以外は同じように動作します。トレーニング中に追加の蒸留損失が計算されますが、保存されるモデルはオーバーヘッドのない標準YOLOモデルです。

  • はい。教師モデルは各バッチでフォワード処理を追加するため、時間とメモリのオーバーヘッドは教師モデルと生徒モデルの組み合わせによって異なります。教師モデルは勾配やオプティマイザー状態を使用せず、evalモードで実行されます。

  • 知識蒸留は、detectsegmentposeobbタスクで使用できます。Detectファミリーのヘッドに入力される3つのネック層から特徴を蒸留するためです。Classifysemanticdepth、RT-DETRはサポートされていません。

    精度向上が実験的に検証されているのはdetectのみです。segment、pose、obbは技術的には互換性がありますが、まだベンチマークされていません。

    教師モデルと生徒モデルは、同じYOLOファミリー(例: YOLOv8、YOLO11、YOLO26)に属している必要があります。ファミリーをまたぐ蒸留(例: YOLO11の教師モデルとYOLO26の生徒モデルの組み合わせ)はサポートされていません。

コメント