رؤية YOLO لعام 2026:

كيفية الضبط الدقيق لـ YOLO على مجموعة بيانات مخصّصة#

يعمل الضبط الدقيق على تكييف نموذج مُدرَّب مسبقًا للتعرّف على فئات جديدة، وذلك بالبدء من أوزان متعلَّمة بدلًا من التهيئة العشوائية. وبدلًا من التدريب من الصفر لمئات العصور التدريبية، يستفيد الضبط الدقيق من ميزات COCO المُدرَّبة مسبقًا ويتقارب مع البيانات المخصّصة خلال جزء من الوقت.

يغطّي هذا الدليل الضبط الدقيق لـ YOLO26 على مجموعات بيانات مخصّصة، بدءًا من الاستخدام الأساسي ووصولًا إلى تقنيات متقدمة مثل تجميد الطبقات والتدريب على مرحلتين.

الضبط الدقيق مقابل التدريب من الصفر#

لقد تعلّم النموذج المُدرَّب مسبقًا ميزات بصرية عامة بالفعل - مثل اكتشاف الحواف والتعرّف على النسيج وفهم الأشكال - من ملايين الصور. يعيد التعلّم بالنقل من خلال الضبط الدقيق استخدام تلك المعرفة، ولا يعلّم النموذج إلا مظهر الفئات الجديدة، ولذلك يتقارب بسرعة أكبر ويتطلب بيانات أقل. أما التدريب من الصفر فيتجاهل كل ذلك، ويجبر النموذج على تعلّم كل شيء بدءًا من الأنماط على مستوى البكسل، ما يتطلب موارد أكبر بكثير. راجع دليل إعداد YAML للنموذج لمعرفة اختلاف ملفات .yaml الخاصة بالمعمارية فقط عن نقاط التحقق.

الضبط الدقيقالتدريب من الصفر
أوزان البدءمُدرَّب مسبقًا على COCO (80 فئة)تهيئة عشوائية
الأمرYOLO("yolo26n.pt")YOLO("yolo26n.yaml")
التقاربأسرع - إذ إن العمود الفقري مُدرَّب مسبقًاأبطأ - تتعلّم جميع الطبقات من الصفر
متطلبات البياناتأقل - تعوّض الميزات المُدرَّبة مسبقًا عن قلة البياناتأعلى - يجب أن يتعلّم النموذج جميع الميزات من مجموعة البيانات وحدها
متى يُستخدمالفئات المخصّصة مع الصور الطبيعيةالمجالات المختلفة جوهريًا عن COCO (الطبية والأقمار الصناعية والرادار)
لا يتطلب الضبط الدقيق أي تعليمات برمجية إضافية

عند تحميل ملف .pt باستخدام YOLO("yolo26n.pt")، تُخزَّن الأوزان المُدرَّبة مسبقًا في النموذج. ويؤدي استدعاء .train(data="custom.yaml") بعد ذلك إلى نقل جميع الأوزان المتوافقة تلقائيًا إلى معمارية النموذج الجديدة، وإعادة تهيئة أي طبقات غير متطابقة، مثل رأس الكشف عند اختلاف عدد الفئات، ثم بدء التدريب. ولا يلزم تحميل الأوزان يدويًا أو معالجة الطبقات أو كتابة تعليمات برمجية مخصّصة للتعلّم بالنقل.

كيفية عمل نقل الأوزان المُدرَّبة مسبقًا#

عند ضبط نموذج مُدرَّب مسبقًا على مجموعة بيانات ذات عدد مختلف من الفئات، مثل الانتقال من فئات COCO البالغ عددها 80 إلى 5 فئات مخصّصة، تنفّذ Ultralytics نقلًا للأوزان يراعي الأشكال:

  1. يُنقل العمود الفقري والعنق بالكامل - تستخرج هذه الطبقات ميزات بصرية عامة، وتكون أشكالها مستقلة عن عدد الفئات.
  2. تُعاد تهيئة رأس الكشف جزئيًا - ترتبط أشكال طبقات إخراج التصنيف (cv3 وone2one_cv3) بعدد الفئات (80 مقابل 5). وتُعاد مطابقة الصفوف المتوافقة التي تتطابق أسماء فئاتها قبل تهيئة الصفوف غير المتطابقة. أما طبقات انحدار الصناديق (cv2 وone2one_cv2) في الرأس، فلها أشكال ثابتة بغض النظر عن عدد الفئات، ولذلك تُنقل بالطريقة المعتادة.
  3. تُنقل الغالبية العظمى من الأوزان عند تغيير عدد الفئات. فعلى سبيل المثال، ينقل الضبط الدقيق لـ YOLO26n من COCO (80 فئة) إلى مجموعة بيانات من 5 فئات 606 موترات أوزان من أصل 708، إضافةً إلى أي صفوف تصنيف متوافقة تطابقت أسماؤها.

بالنسبة إلى مجموعات البيانات التي تضم العدد نفسه من الفئات الموجود في النموذج المُدرَّب مسبقًا، مثل ضبط أوزان مُدرَّبة مسبقًا على COCO لمجموعة بيانات أخرى من 80 فئة، تُنقل 100% من الأوزان، بما في ذلك رأس الكشف.

نقل الفئات باستخدام الأسماء البديلة#

تنقل Ultralytics صفوف رأس التصنيف المتطابقة حسب اسم الفئة بين مجموعات البيانات، مع تجاهل حالة الأحرف والمسافات البيضاء المحيطة. وعندما تستخدم الفئات المتكافئة أسماءً مختلفة، أعد تسمية فئات نقطة التحقق المصدرية في الذاكرة قبل التحميل. ويحافظ ذلك على أوزان التصنيف المُدرَّبة مسبقًا للمفاهيم المشتركة التي كان سيُتعامل معها بخلاف ذلك على أنها غير متطابقة وتُهيَّأ عشوائيًا.

يعيد مثال Objects365 v2 إلى COCO تسمية الفئات المصدرية في نقطة التحقق المحمّلة، ثم يمرّرها train() بوصفها الأوزان المُدرَّبة مسبقًا:

from ultralytics import YOLO

# Source Objects365 v2 name (lowercased) -> target COCO name
ALIASES = {
    "wild bird": "bird",
    "handbag/satchel": "handbag",
    "luggage": "suitcase",
    "bowl/basin": "bowl",
    "orange/tangerine": "orange",
    "monitor/tv": "tv",
    "stuffed toy": "teddy bear",
    "hair dryer": "hair drier",
}

model = YOLO("path/to/yolo26s-objects365.pt")
# Objects365 class names are Title-Cased, so match on the lowercased name
model.model.names = {i: ALIASES.get(name.lower(), name) for i, name in model.model.names.items()}
model.train(data="coco.yaml", epochs=100, imgsz=640)

يُمكّن الإعداد cls_remap هذا النقل القائم على الأسماء افتراضيًا. ويطبع التدريب Remapped N/M cls head rows from pretrained weights by class name عند نسخ الصفوف المتوافقة؛ اضبط cls_remap=False لتعطيله.

مثال أساسي على الضبط الدقيق#

مثال
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)

اختيار حجم النموذج#

تتمتع النماذج الأكبر بسعة أكبر، لكنها تضم أيضًا عددًا أكبر من المعاملات التي يجب تحديثها، ما قد يزيد خطر فرط التكيّف عندما تكون بيانات التدريب محدودة. يُعد البدء بنموذج أصغر (YOLO26n أو YOLO26s) والتوسّع فقط إذا وصلت مقاييس التحقق إلى حالة ثبات نهجًا عمليًا. ويعتمد حجم النموذج الأمثل على تعقيد المهمة، وعدد الفئات، وتنوّع مجموعة البيانات، والعتاد المتاح للنشر. راجع صفحة نموذج YOLO26 الكاملة للاطلاع على الأحجام المتاحة ومعايير الأداء.

اختيار المحسّن ومعدل التعلّم#

يختار الإعداد الافتراضي optimizer=auto المحسّن ومعدل التعلّم استنادًا إلى إجمالي عدد تكرارات التدريب:

  • 10,000 تكرار أو أقل (مجموعات بيانات صغيرة أو عصور تدريبية قليلة): AdamW مع معدل تعلّم منخفض يُحسب تلقائيًا
  • أكثر من 10,000 تكرار (مجموعات بيانات كبيرة): MuSGD (محسّن هجين يجمع Muon وSGD) مع lr=0.01

بالنسبة إلى معظم مهام الضبط الدقيق، يعمل الإعداد الافتراضي جيدًا من دون أي ضبط يدوي. فكّر في تحديد المحسّن صراحةً عندما:

  • يكون التدريب غير مستقر (تظهر طفرات في قيمة الخسارة أو تتباعد): جرّب optimizer=AdamW, lr0=0.001 لتحقيق تقارب أكثر استقرارًا
  • تضبط نموذجًا كبيرًا على مجموعة بيانات صغيرة: يمكن لمحسّن صريح مع معدل تعلّم أقل، مثل optimizer=AdamW, lr0=0.001، أن يساعد في الحفاظ على الميزات المُدرَّبة مسبقًا
المحسّن التلقائي يتجاوز lr0 اليدوي

عند استخدام optimizer=auto، يتم تجاهل القيم lr0 وmomentum. للتحكم في معدل التعلّم يدويًا، حدّد المحسّن صراحةً: optimizer=SGD, lr0=0.005.

تجميد الطبقات#

يمنع التجميد طبقات محددة من التحديث أثناء التدريب. ويسرّع ذلك التدريب ويقلل فرط التكيّف عندما تكون مجموعة البيانات صغيرة مقارنةً بسعة النموذج.

تقبل المعلمة freeze عددًا صحيحًا أو قائمة. ويجمّد العدد الصحيح freeze=10 أول 10 طبقات (الفهارس 0-9)، ما يغطي معظم العمود الفقري لـ YOLO26. ويمتد العمود الفقري عبر الطبقات 0-10، لذلك يترك freeze=10 كتلة C2PSA النهائية (الطبقة 10) قابلةً للتدريب؛ استخدم freeze=11 لتجميد العمود الفقري بالكامل. ويمكن أن تحتوي القائمة على فهارس طبقات مثل freeze=[0, 3, 5] لتجميد العمود الفقري جزئيًا، أو سلاسل أسماء الوحدات مثل freeze=["23.cv2", "23.one2one_cv2"] للتحكم الدقيق في فروع محددة داخل طبقة، وهنا فرعا انحدار الصناديق في رأس الكشف.

مثال
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=50, freeze=10)

يعتمد عمق التجميد المناسب على مدى تشابه المجال المستهدف مع البيانات المُدرَّبة مسبقًا، وعلى مقدار بيانات التدريب المتاحة:

السيناريوالتوصيةالأساس المنطقي
مجموعة بيانات كبيرة، ومجال مشابهfreeze=None (افتراضي)بيانات كافية لتكييف جميع الطبقات من دون فرط التكيّف
مجموعة بيانات صغيرة، ومجال مشابهfreeze=10يحافظ على ميزات العمود الفقري ويقلل المعاملات القابلة للتدريب
مجموعة بيانات صغيرة جدًاfreeze=23يُدرَّب رأس الكشف فقط، ما يقلل خطر فرط التكيّف
مجال بعيد عن COCOfreeze=Noneقد لا تنتقل ميزات العمود الفقري جيدًا، وقد تحتاج إلى إعادة التدريب

يمكن أيضًا التعامل مع عمق التجميد بوصفه معلمة فائقة - إذ يُعد اختبار بضع قيم (0 و5 و10) ومقارنة mAP على التحقق طريقةً عملية للعثور على أفضل إعداد لمجموعة بيانات محددة.

المعلمات الفائقة الأساسية للضبط الدقيق#

يتطلب الضبط الدقيق عمومًا تعديلات أقل على المعلمات الفائقة مقارنةً بالتدريب من الصفر. والمعلمات الأهم هي:

  • epochs: يتقارب الضبط الدقيق أسرع من التدريب من الصفر. ابدأ بقيمة متوسطة واستخدم patience لإيقاف التدريب مبكرًا عند ثبات مقاييس التحقق.
  • patience: صُمم الإعداد الافتراضي البالغ 100 لتشغيلات التدريب الطويلة. ويؤدي خفضه إلى 10-20 إلى تجنب إهدار الوقت في تشغيلات تقاربت بالفعل.
  • warmup_epochs: يسهّل الإحماء إدخال معدل التعلّم تدريجيًا إلى قيمته المجدولة خلال العصور التدريبية الأولى، ولذلك تقل احتمالية إرباك الدُفعات المبكرة للميزات المُدرَّبة مسبقًا. أبقه غير صفري عند الضبط الدقيق، لكن الإعداد الافتراضي الكامل البالغ 3 عصور تدريبية ليس مطلوبًا: فقد استقر البحث التطوري وراء الضبط الدقيق الرسمي لـ YOLO26 على COCO — وهو استمرار متعدد العصور التدريبية انطلاقًا من أوزان Objects365 — على نحو عصر تدريبي واحد تقريبًا لكل حجم نموذج.

للاطلاع على القائمة الكاملة لمعلمات التدريب، راجع مرجع إعداد التدريب. أما السلوكيات التي لا تكشفها المعلمات، مثل معدلات التعلّم لكل طبقة وقص التدرج أو مقاييس التحقق المخصّصة، فـأنشئ فئة فرعية من المدرّب.

الضبط الدقيق على مرحلتين#

يقسم الضبط الدقيق على مرحلتين التدريب إلى مرحلتين. تجمّد المرحلة الأولى العمود الفقري وتدرّب العنق والرأس فقط، ما يسمح لطبقات الكشف بالتكيّف مع الفئات الجديدة من دون إرباك الميزات المُدرَّبة مسبقًا. وفي المرحلة الثانية، تُلغى حماية جميع الطبقات ويُدرَّب النموذج كاملًا بمعدل تعلّم أقل لتحسين العمود الفقري ليتلاءم مع المجال المستهدف.

يفيد هذا النهج خصوصًا عندما يختلف المجال المستهدف اختلافًا كبيرًا عن COCO (الصور الطبية والصور الجوية والمجهرية)، حيث قد يحتاج العمود الفقري إلى التكيّف، لكن تدريب كل شيء دفعةً واحدة يسبب عدم الاستقرار. ولإلغاء التجميد تلقائيًا باستخدام نهج قائم على الاستدعاءات اللاحقة، راجع تجميد العمود الفقري وإلغاء تجميده.

الضبط الدقيق على مرحلتين
from ultralytics import YOLO

# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)

# Stage 2: unfreeze all, fine-tune with lower lr
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, optimizer="AdamW", lr0=0.001, name="stage2", exist_ok=True)

المشكلات الشائعة#

لا ينتج النموذج أي تنبؤات#

  • بيانات تدريب غير كافية: يُعد التدريب باستخدام عينات قليلة جدًا السبب الأكثر شيوعًا، إذ لا يستطيع النموذج التعلّم أو التعميم من كمية ضئيلة جدًا من البيانات. احرص على توفير أمثلة متنوعة كافية لكل فئة قبل البحث في الأسباب الأخرى.

  • تحقق من مسارات مجموعة البيانات: تؤدي مسارات الصور غير الصالحة إلى ظهور خطأ في مجموعة البيانات. وتُعامل ملفات التسميات الفردية المفقودة أو الفارغة على أنها صور خلفية، ويُبلّغ عنها أثناء الفحص؛ بينما يؤدي تقسيم التدريب الذي لا يحتوي على تسميات إلى ظهور خطأ. تحقّق من مجموعة البيانات قبل التدريب:

    yolo detect val model=yolo26n.pt data=custom.yaml
  • خفّض عتبة الثقة: إذا كانت التنبؤات موجودة لكنها مستبعدة، فجرّب conf=0.1 أثناء الاستدلال.

  • تحقق من عدد الفئات: تأكد من أن nc في data.yaml يطابق العدد الفعلي للفئات في ملفات التسميات.

تصل mAP الخاصة بالتحقق إلى حالة ثبات مبكرًا#

  • أضف مزيدًا من البيانات: يستفيد الضبط الدقيق بدرجة كبيرة من بيانات التدريب الإضافية، وخصوصًا الأمثلة المتنوعة ذات الزوايا والإضاءة والخلفيات المختلفة.
  • تحقق من توازن الفئات: ستحصل الفئات قليلة التمثيل على AP منخفضة. أضف مزيدًا من الأمثلة أو اضبط cls_pw على مجموعة التحقق.
  • قلل الزيادة الاصطناعية: بالنسبة إلى مجموعات البيانات الصغيرة جدًا، قد تضر الزيادة الاصطناعية الشديدة أكثر مما تنفع. جرّب mosaic=0.5 أو mosaic=0.0.
  • زِد الدقة: بالنسبة إلى مجموعات البيانات التي تحتوي على أجسام صغيرة، جرّب imgsz=1280 للحفاظ على التفاصيل.

يتدهور الأداء على الفئات الأصلية بعد الضبط الدقيق#

يُعرف هذا باسم النسيان الكارثي - إذ يفقد النموذج المعرفة التي تعلّمها سابقًا عند ضبطه حصريًا على بيانات جديدة. ويصعب تجنب النسيان إلى حد كبير من دون تضمين صور من مجموعة البيانات الأصلية إلى جانب البيانات الجديدة. وللتخفيف من ذلك:

  • ادمج مجموعات البيانات: أدرج أمثلة من الفئات الأصلية إلى جانب الفئات الجديدة أثناء الضبط الدقيق. وهذه هي الطريقة الموثوقة الوحيدة لمنع النسيان.
  • جمّد العمود الفقري والعنق: يساعد تجميد العمود الفقري والعنق معًا بحيث يتدرّب رأس الكشف فقط في تشغيلات الضبط الدقيق القصيرة ذات معدل التعلّم المنخفض جدًا.
  • درّب لعدد أقل من العصور التدريبية: كلما طال تدريب النموذج على البيانات الجديدة حصريًا، ازداد النسيان.

الأسئلة الشائعة#

  • لا يوجد حد أدنى ثابت - إذ تعتمد النتائج على تعقيد المهمة، وعدد الفئات، ومدى تشابه المجال مع COCO. وتهم الصور الأكثر تنوعًا، من حيث الإضاءة والزوايا والخلفيات المختلفة، أكثر من الكمية المجردة. ابدأ بما لديك، وزِد البيانات إذا كانت مقاييس التحقق غير كافية.

  • حمّل ملف .pt مُدرَّبًا مسبقًا واستدعِ .train() مع مسار data.yaml مخصّص. تتولى Ultralytics تلقائيًا نقل الأوزان وإعادة تهيئة رأس الكشف واختيار المحسّن. راجع قسم الضبط الدقيق الأساسي للاطلاع على مثال التعليمات البرمجية الكامل.

  • تتمثل الأسباب الأكثر شيوعًا في مسارات الصور غير الصالحة، أو ملفات التسميات المفقودة أو الفارغة، أو عدم تطابق nc في YAML مع ملفات التسميات الفعلية، أو ارتفاع عتبة الثقة أكثر من اللازم. راجع المشكلات الشائعة للاطلاع على قائمة فحص كاملة لاستكشاف الأخطاء وإصلاحها.

  • يعتمد ذلك على حجم مجموعة البيانات ومدى تشابه المجال. بالنسبة إلى مجموعات البيانات الصغيرة ذات المجال المشابه لـ COCO، يمنع تجميد العمود الفقري (freeze=10) فرط التكيّف. أما بالنسبة إلى المجالات المختلفة جدًا عن COCO، فإن ترك جميع الطبقات غير مجمّدة (freeze=None) يسمح للعمود الفقري بالتكيّف. راجع تجميد الطبقات للاطلاع على توصيات مفصلة.

  • أدرج أمثلة من الفئات الأصلية في بيانات التدريب إلى جانب الفئات الجديدة. وإذا تعذر ذلك، فإن تجميد مزيد من الطبقات (freeze=10 أو أعلى) واستخدام معدل تعلّم أقل يساعدان في الحفاظ على المعرفة المُدرَّبة مسبقًا. راجع يتدهور الأداء على الفئات الأصلية لمزيد من التفاصيل.

المساهمون

التعليقات