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知識蒸留(Knowledge Distillation)とは?#
知識蒸留は、大規模で精度の高い教師モデルから小規模な生徒モデルへ知識を転送する手法です。生徒モデルは教師モデルの内部特徴表現を模倣するように学習するため、ゼロからトレーニングするよりも高い精度を達成することがよくあります。

蒸留を使用すべき場面:
- デプロイ用に、より小型で高速なモデルが必要な場合
- 同じデータでトレーニングされた精度の高い教師モデルが存在する場合
- 標準的なトレーニングよりも優れた精度を求める場合
知識蒸留は、detect、segment、pose、およびobbタスクで実装されています。現時点で精度向上が実験的に検証されているのはdetectのみです。
Link to this section性能#
Knowledge distillationは、推論コストを一切増加させることなく、YOLO26ファミリー全体で学生モデルのmAPを向上させます。COCOデータセットにおいて、推奨される教師モデルから蒸留(distillation)を行って学習させたモデルと、標準の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)が必要です(一般的なVRAMオーバーヘッドについてはFAQを参照してください)。
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モードでフリーズされたまま、各バッチで推論を実行します。 - 生徒モデルは、標準のタスク損失に加えて蒸留ガイダンスを使用してトレーニングされます。
- 両モデルから、Detectファミリーのヘッドに供給される3つのネックレイヤーで特徴が抽出されます。
- プロジェクターネットワーク(軽量MLP)が、生徒モデルの特徴次元を教師モデルに合わせて調整します。
- スコア重み付きL2損失が、投影された生徒モデルの特徴を教師モデルの特徴と比較し、教師の分類信頼度で重み付けを行います。
- 蒸留損失は、
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:#fffLink to this sectionタスクのサポート#
蒸留実装では、モデルのDetectファミリーヘッドに供給される3つのネックレイヤーから特徴を抽出します。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 sectionトレーニング#
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 sectionよくある質問 (FAQ)#
Link to this section蒸留損失が減少しないのはなぜですか?#
- 教師モデルと生徒モデルが同じYOLO世代のものであることを確認してください。
distill_modelパスが正しく、ファイルが読み込まれていることを確認してください。- 損失値が非常に小さい場合は、
disを増やしてみてください。 - 教師モデルが同じデータセットでトレーニングされていることを確認してください。
Link to this section蒸留は標準的なトレーニングと何が違いますか?#
distill_modelパラメータを追加するだけで、他はすべて同じように動作します。トレーニング中に追加の蒸留損失が計算されますが、保存されるモデルは標準的なYOLOモデルであり、オーバーヘッドはありません。
Link to this section知識蒸留はトレーニングを遅くしますか?#
はい。各バッチで教師モデルが推論を実行するため、トレーニング速度は1.2〜1.5倍遅くなり、GPUメモリは約1.1倍増加します。教師モデルは勾配なしのevalモードで実行されるため、オーバーヘッドは管理可能です。影響を抑えるにはamp=Trueを使用してください。
Link to this sectionどのタスクとモデルがサポートされていますか?#
知識蒸留は、Detectファミリーヘッドに供給される3つのネックレイヤーから特徴を蒸留するため、detect、segment、pose、およびobbタスクで機能します。classifyおよびsemanticタスクはサポートされていません。
精度向上が実験的に検証されているのはdetectのみです。segment、pose、obbは技術的に互換性がありますが、まだベンチマークされていません。
教師モデルと生徒モデルは同じYOLOファミリー(例:YOLOv8、YOLO11、YOLO26など)に属している必要があります。ファミリーをまたぐ蒸留(例:YOLO11の教師とYOLO26の生徒)はサポートされていません。