YOLO Vision 2026:

知識蒸留#

クイックスタート#

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

from ultralytics import YOLO

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

知識蒸留(Knowledge Distillation)とは?#

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

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

蒸留を使用すべき場面:

  • デプロイ用に、より小型で高速なモデルが必要な場合
  • 同じデータでトレーニングされた精度の高い教師モデルが存在する場合
  • 標準的なトレーニングよりも優れた精度を求める場合
注意

知識蒸留は、detectsegmentpose、およびobbタスクで実装されています。現時点で精度向上が実験的に検証されているのは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 data=coco.yaml device=0 で再現します
  • e2e の値はデフォルトのNMSフリー推論パスを使用し、非e2eの値は従来のNMS後処理を使用します (end2end=False)。詳細はエンドツーエンド検出を参照してください。

前提条件#

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

  • トレーニング済み教師モデル: 生徒モデルと同じYOLOファミリー(例:YOLO26)から取得した、事前トレーニング済みの高精度な教師モデル。
  • 一致するデータセットとタスク: 教師モデルと生徒モデルの両方で、全く同じデータセットとタスク構成を使用する必要があります。
  • GPUリソース: トレーニング中に両方のモデルを同時にロードして実行するための十分なGPUメモリ(VRAM)(一般的なVRAMオーバーヘッドについてはFAQを参照してください)。

推奨モデルペア#

生徒推奨教師
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. プロジェクターネットワーク(軽量MLP)が、生徒モデルの特徴次元を教師モデルに合わせて調整します。
  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 + dfl_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つのネック層から特徴を抽出します。segmentpose、およびobbの各ヘッドは同じ Detect アーキテクチャから継承しているため、蒸留はそれらのタスクとも技術的に互換性があります。

警告

現時点で実験的にベンチマークが行われ検証されているのはdetectのみです。segmentpose、または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   dfl_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モデルです。

  • はい。教師モデルが各バッチで推論を実行するため、1.2〜1.5倍遅いトレーニングと約1.1倍多いGPUメモリを想定してください。教師は勾配なしで eval モードで実行されるため、オーバーヘッドを管理可能な状態に保ちます。影響を軽減するには amp=True を使用してください。

  • 知識蒸留は、Detectファミリーヘッドに供給される3つのネックレイヤーから特徴を蒸留するため、detectsegmentpose、およびobbタスクで機能します。classifyおよびsemanticタスクはサポートされていません。

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

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

コメント