رؤية YOLO لعام 2026:

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

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

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

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

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

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

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

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

عند إجراء ضبط دقيق لنموذج مدرب مسبقًا على مجموعة بيانات ذات عدد مختلف من الفئات (على سبيل المثال، من 80 فئة في COCO إلى 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 -> 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")
model.model.names = {i: ALIASES.get(name, name) for i, name in model.model.names.items()}
model.train(data="coco.yaml", epochs=100, imgsz=640)

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

مثال
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 لتحقيق تقارب أكثر استقراراً
  • الضبط الدقيق لنموذج كبير على مجموعة بيانات صغيرة: معدل تعلم أقل مثل lr0=0.001 يساعد في الحفاظ على الميزات المدربة مسبقاً
المُحسِّن التلقائي يتجاوز lr0 اليدوي

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

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

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

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

مثال
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 دورات) يزيد تدريجياً من معدل التعلم من الصفر، مما يمنع تحديثات التدرج الكبيرة من إتلاف الميزات المدربة مسبقاً في التكرارات المبكرة. يُوصى بالاحتفاظ بالافتراضي حتى عند إجراء الضبط الدقيق.

للحصول على القائمة الكاملة لمعلمات التدريب، راجع مرجع تكوين التدريب.

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

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

يكون هذا النهج مفيداً بشكل خاص عندما يختلف المجال المستهدف اختلافاً كبيراً عن 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, lr0=0.001, name="stage2", exist_ok=True)

المزالق الشائعة#

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

  • بيانات تدريب غير كافية: التدريب باستخدام عينات قليلة جدًا هو السبب الأكثر شيوعًا - لا يستطيع النموذج التعلم أو التعميم من بيانات قليلة جدًا. تأكد من وجود أمثلة متنوعة كافية لكل فئة قبل التحقيق في أسباب أخرى.
  • التحقق من مسارات مجموعة البيانات: المسارات غير الصحيحة في data.yaml تنتج بصمت صفراً من التسميات. قم بتشغيل yolo detect val model=yolo26n.pt data=custom.yaml قبل التدريب للتأكد من تحميل التسميات بشكل صحيح.
  • خفض عتبة الثقة: إذا كانت التنبؤات موجودة ولكن يتم تصفيتها، جرب conf=0.1 أثناء الاستدلال.
  • التحقق من عدد الفئات: تأكد من أن nc في data.yaml يطابق العدد الفعلي للفئات في ملفات التسميات.

مقاييس mAP للتحقق تستقر مبكرًا#

  • أضف المزيد من البيانات: يستفيد الضبط الدقيق بشكل كبير من بيانات التدريب الإضافية، خاصة الأمثلة المتنوعة ذات الزوايا والإضاءة والخلفيات المختلفة.
  • التحقق من توازن الفئات: الفئات الممثلة بشكل ناقصจะมี AP منخفض. استخدم cls_pw لتطبيق ترجيح فئة التردد العكسي (ابدأ بـ cls_pw=0.25 للاختلال المعتدل، وزد إلى 1.0 للاختلال الشديد).
  • تقليل التخصيص/التحسين (Augmentation): بالنسبة لمجموعات البيانات الصغيرة جداً، يمكن أن تضر التحسينات الثقيلة أكثر مما تنفع. جرب mosaic=0.5 أو mosaic=0.0.
  • زيادة الدقة: بالنسبة لمجموعات البيانات التي تحتوي على كائنات صغيرة، جرب imgsz=1280 للحفاظ على التفاصيل.

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

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

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

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

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

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

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

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

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

المساهمون

التعليقات