تقطير المعرفة (Knowledge Distillation)#
البداية السريعة#
تدريب نموذج طالب أصغر بتوجيه من نموذج معلم أكبر عن طريق إضافة الوسيط distill_model:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt")ما هي تقطير المعرفة (Knowledge Distillation)؟#
التطفير المعرفي (Knowledge distillation) ينقل المعرفة من نموذج معلم كبير وعالي الدقة إلى نموذج طالب أصغر. يتعلم الطالب محاكاة تمثيلاتها الداخلية للسمات الخاصة بالمعلم، وغالباً ما يحقق دقة أفضل من التدريب من الصفر.

استخدم التقطير عندما:
- تحتاج إلى نموذج أصغر وأسرع للنشر
- لديك نموذج معلم عالي الدقة مدرب على نفس البيانات
- تريد دقة أفضل مما يوفره التدريب القياسي
يتم تنفيذ تقطير المعرفة لمهام الكشف (detect)، التجزئة (segment)، تحديد الوضعية (pose)، و المربعات الموجهة (obb). حالياً، تم التحقق تجريبياً من تحسينات الدقة لمهمة الكشف (detect) فقط.
الأداء#
يحسن التطفير المعرفي mAP للطالب عبر عائلة YOLO26 بأكملها على COCO، دون أي تكلفة استنتاج إضافية. يقارن الجدول أدناه نماذج 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) للحصول على التفاصيل.
المتطلبات الأساسية#
قبل البدء، تأكد من استيفاء المتطلبات التالية:
- نموذج معلم مدرب: نموذج معلم مدرب مسبقاً وعالي الدقة من نفس عائلة YOLO مثل نموذج الطالب (مثلاً، YOLO26).
- تطابق مجموعة البيانات والمهمة: يجب أن يستخدم كل من نموذج المعلم والطالب نفس مجموعة البيانات وإعدادات المهمة تماماً.
- موارد وحدة معالجة الرسومات (GPU): ذاكرة GPU كافية (VRAM) لتحميل وتشغيل كلا النموذجين في نفس الوقت أثناء التدريب (راجع الأسئلة الشائعة (FAQ) لمعرفة استهلاك VRAM الإضافي النموذجي).
أزواج النماذج الموصى بها#
| الطالب | المعلم الموصى به |
|---|---|
yolo26n.pt | yolo26s.pt |
yolo26s.pt | yolo26m.pt |
yolo26m.pt | yolo26x.pt |
yolo26l.pt | yolo26x.pt |
التقطير بين العائلات المختلفة (مثلاً، معلم YOLO11 مع طالب YOLO26) غير مدعوم.
المعاملات الرئيسية#
| المعامل | النوع | الافتراضي | الوصف |
|---|---|---|---|
distill_model | str | None | مسار ملف نموذج المعلم (على سبيل المثال، yolo26x.pt). يؤدي تعيين هذا إلى تمكين التطفير المعرفي. |
dis | float | 6.0 | وزن خسارة التقطير. يتحكم في مدى مساهمة خسارة التقطير في إجمالي خسارة التدريب. |
كيف يعمل#
- يظل نموذج المعلم مجمداً في وضع
evalويقوم بتشغيل الاستنتاج على كل دفعة - يتم تدريب نموذج الطالب بخسائر المهمة القياسية بالإضافة إلى توجيه التقطير
- يتم استخراج الميزات من كلا النموذجين عند طبقات العنق الثلاث التي تغذي رأس عائلة Detect
- تعمل شبكة الإسقاط (projector network) (شبكة MLP خفيفة) على مواءمة أبعاد ميزات الطالب لتطابق المعلم
- تقارن خسارة L2 المرجحة بالنتيجة (score-weighted L2 loss) ميزات الطالب المسقطة بميزات المعلم، مرجحة بثقة التصنيف الخاصة بالمعلم
- تندمج خسارة التطفير مع الخسائر القياسية باستخدام وزن
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. نظراً لأن رؤوس 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")التدريب#
التدريب الأساسي#
التدريب مع التطفير مطابق للتدريب القياسي. قم بتوفير مسار 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)استئناف تدريب التقطير#
يدعم تدريب التطفير استئناف التدريب من نقاط التحقق (Checkpoints). يتم إعادة بناء نموذج المعلم تلقائياً من مسار 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يحتوي النموذج المُصدر على أوزان الطالب فقط—يتطابق حجم الملف وسرعة الاستنتاج مع نموذج طالب مدرب بشكل طبيعي.
الأسئلة الشائعة#
- تحقق من أن المعلم والطالب من نفس جيل YOLO
- تأكد من أن مسار
distill_modelصحيح وأن الملف يتم تحميله - حاول زيادة
disإذا كانت قيمة الخسارة صغيرة جداً - تأكد من أن نموذج المعلم مدرب على نفس مجموعة البيانات
أضف معلمة
distill_model—وكل ما عدا ذلك يعمل بشكل متطابق. يتم حساب خسارة تطفير إضافية أثناء التدريب، ولكن النموذج المحفوظ هو نموذج YOLO قياسي بدون أي عبء إضافي.نعم. توقع تدريباً أبطأ بمقدار 1.2-1.5x وذاكرة GPU أكثر بنحو ~1.1x نظراً لأن نموذج المعلم يقوم بتشغيل الاستنتاج على كل دفعة. يعمل المعلم في وضع
evalبدون تدرجات (gradients)، مما يحافظ على العبء الإضافي قابلاً للإدارة. استخدمamp=Trueلتقليل التأثير.تعمل تقطير المعرفة مع مهام detect، segment، pose، و obb لأنها تقطر الميزات من طبقات العنق الثلاث التي تغذي رأس عائلة Detect. مهام classify و semantic غير مدعومة.
تم التحقق تجريبياً من تحسينات الدقة لمهمة detect فقط. مهام segment، و pose، و obb متوافقة تقنياً ولكن لم يتم عمل معايير قياسية لها بعد.
يجب أن ينتمي المعلم والطالب إلى نفس عائلة YOLO (مثلاً، YOLOv8، YOLO11، أو YOLO26). التقطير بين العائلات (مثلاً، معلم YOLO11 مع طالب YOLO26) غير مدعوم.