كيفية ضبط YOLO بدقة على مجموعة بيانات مخصصة#
يكيّف الضبط الدقيق نموذجًا مدرّبًا مسبقًا للتعرّف على فئات جديدة، وذلك بالبدء من الأوزان المتعلّمة بدلًا من التهيئة العشوائية. وبدلًا من التدريب من الصفر لمئات الحقب، يستفيد الضبط الدقيق من ميزات COCO المدرّبة مسبقًا، ويتقارب مع البيانات المخصصة في جزء من الوقت.
يغطي هذا الدليل الضبط الدقيق لـ YOLO26 على مجموعات بيانات مخصصة، بدءًا من الاستخدام الأساسي وصولًا إلى التقنيات المتقدمة مثل تجميد الطبقات والتدريب على مرحلتين.
الضبط الدقيق مقارنةً بالتدريب من الصفر#
يكون النموذج المدرّب مسبقًا قد تعلّم بالفعل ميزات بصرية عامة من ملايين الصور، مثل اكتشاف الحواف والتعرّف على الأنسجة وفهم الأشكال. ويعيد التعلّم بالنقل عبر الضبط الدقيق استخدام هذه المعرفة، ولا يعلّم النموذج إلا مظهر الفئات الجديدة، ولذلك يتقارب النموذج بسرعة أكبر ويتطلب بيانات أقل. أما التدريب من الصفر فيتخلّص من كل تلك المعرفة ويجبر النموذج على تعلّم كل شيء بدءًا من الأنماط على مستوى البكسل، ما يتطلب موارد أكبر بكثير. راجع دليل تهيئة YAML للنموذج لمعرفة الفرق بين ملفات .yaml التي تحدد البنية فقط ونقاط التحقق.
| الضبط الدقيق | التدريب من الصفر | |
|---|---|---|
| أوزان البدء | مدرّب مسبقًا على COCO (80 فئة) | تهيئة عشوائية |
| الأمر | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| التقارب | أسرع - العمود الفقري مدرّب مسبقًا بالفعل | أبطأ - تتعلّم جميع الطبقات من الصفر |
| متطلبات البيانات | أقل - تعوّض الميزات المدرّبة مسبقًا عن قلة البيانات | أعلى - يجب أن يتعلم النموذج جميع الميزات من مجموعة البيانات وحدها |
| متى يُستخدم | الفئات المخصصة مع الصور الطبيعية | المجالات المختلفة جوهريًا عن COCO (الطب، والأقمار الصناعية، والرادار) |
عند تحميل ملف .pt باستخدام YOLO("yolo26n.pt")، تُخزَّن الأوزان المدرّبة مسبقًا في النموذج. ويؤدي استدعاء .train(data="custom.yaml") بعد ذلك إلى نقل جميع الأوزان المتوافقة تلقائيًا إلى بنية النموذج الجديدة، وإعادة تهيئة أي طبقات غير متطابقة (مثل رأس الكشف عند اختلاف عدد الفئات)، ثم بدء التدريب. لا حاجة إلى تحميل الأوزان يدويًا أو معالجة الطبقات أو كتابة تعليمات برمجية مخصصة للتعلّم بالنقل.
آلية نقل الأوزان المدرّبة مسبقًا#
عند ضبط نموذج مدرّب مسبقًا على مجموعة بيانات يختلف عدد فئاتها (مثل الانتقال من 80 فئة في COCO إلى 5 فئات مخصصة)، تنفّذ Ultralytics نقل الأوزان مع مراعاة الأشكال:
- يُنقل العمود الفقري والعنق بالكامل - تستخرج هذه الطبقات ميزات بصرية عامة، ولا تعتمد أشكالها على عدد الفئات.
- يُعاد تهيئة رأس الكشف جزئيًا - ترتبط أشكال طبقات إخراج التصنيف (
cv3وone2one_cv3) بعدد الفئات (80 مقابل 5). وتُعاد مطابقة الصفوف المتوافقة التي تتطابق أسماؤها قبل تهيئة الصفوف غير المتطابقة. أما طبقات انحدار الصناديق (cv2وone2one_cv2) في الرأس، فلها أشكال ثابتة بصرف النظر عن عدد الفئات، لذا تُنقل بالطريقة المعتادة. - تُنقل الغالبية العظمى من الأوزان عند تغيير عدد الفئات. فعلى سبيل المثال، ينقل الضبط الدقيق لـ YOLO26n من COCO (80 فئة) إلى مجموعة بيانات تضم 5 فئات 606 من أصل 708 موترات أوزان، إضافةً إلى أي صفوف تصنيف متوافقة تُطابق حسب الاسم.
بالنسبة إلى مجموعات البيانات التي تضم العدد نفسه من الفئات الموجودة في النموذج المدرّب مسبقًا (مثل ضبط أوزان مدرّبة مسبقًا على COCO على مجموعة بيانات أخرى تضم 80 فئة)، تُنقل نسبة 100% من الأوزان، بما في ذلك رأس الكشف.
نقل الفئات ذات الأسماء البديلة#
تنقل Ultralytics صفوف رأس التصنيف المتطابقة حسب اسم الفئة بين مجموعات البيانات، مع تجاهل حالة الأحرف والمسافات البيضاء المحيطة. عندما تُستخدم أسماء مختلفة لفئات متكافئة، أعد تسمية فئات نقطة التحقق المصدر في الذاكرة قبل التحميل. يحافظ ذلك على أوزان التصنيف المدرّبة مسبقًا للمفاهيم المشتركة التي ستُعامل لولا ذلك على أنها غير متطابقة وتُهيّأ عشوائيًا.
يعيد مثال Objects365 v2 إلى COCO تسمية الفئات المصدر في نقطة التحقق المحمّلة، ثم يمررها train() بوصفها الأوزان المدرّبة مسبقًا:
from ultralytics import YOLO
# اسم الفئة المصدر Objects365 v2 (بحروف صغيرة) -> اسم الفئة الهدف في COCO
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 بصيغة Title Case، لذا تجري المطابقة باستخدام الاسم بحروف صغيرة
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") # تحميل نموذج مدرّب مسبقًا
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، في الحفاظ على الميزات المدرّبة مسبقًا
عند استخدام 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 | لا يُدرَّب سوى رأس الكشف، ما يقلل خطر فرط التكيّف إلى أدنى حد |
| مجال بعيد عن COCO | freeze=None | قد لا تنتقل ميزات العمود الفقري جيدًا، وقد تحتاج إلى إعادة التدريب |
يمكن أيضًا التعامل مع عمق التجميد بوصفه معلمة فائقة؛ إذ يُعد اختبار بضع قيم (0 و5 و10) ومقارنة mAP على مجموعة التحقق طريقة عملية للعثور على أفضل إعداد لمجموعة بيانات محددة.
المعلمات الفائقة الأساسية للضبط الدقيق#
يتطلب الضبط الدقيق عمومًا تعديلات أقل على المعلمات الفائقة مقارنةً بالتدريب من الصفر. وأهم المعلمات هي:
epochs: يتقارب الضبط الدقيق بسرعة أكبر من التدريب من الصفر. ابدأ بقيمة متوسطة، واستخدمpatienceللإيقاف المبكر عند استقرار مقاييس التحقق.patience: القيمة الافتراضية 100 مصممة لعمليات التدريب الطويلة. ويؤدي خفضها إلى 10-20 إلى تجنب إهدار الوقت على عمليات تدريب وصلت بالفعل إلى التقارب.warmup_epochs: يهيئ الإحماء معدل التعلّم تدريجيًا للوصول إلى القيمة المجدولة خلال الحقب الأولى، ما يقلل احتمال إرباك الميزات المدرّبة مسبقًا في الدفعات المبكرة. أبقِه غير صفري عند الضبط الدقيق، لكن القيمة الافتراضية الكاملة البالغة 3 حقب ليست ضرورية: فقد انتهى البحث التطوري وراء الضبط الدقيق الرسمي لـ YOLO26 على COCO — وهو استمرار متعدد الحقب انطلاقًا من أوزان Objects365 — إلى اختيار نحو حقبة واحدة لكل حجم نموذج.
للاطلاع على القائمة الكاملة لمعاملات التدريب، راجع مرجع إعدادات التدريب. وللتحكم في السلوك الذي لا تتيحه المعلمات — مثل معدلات التعلّم لكل طبقة، أو قص التدرج، أو مقاييس التحقق المخصصة — أنشئ فئة فرعية من أداة التدريب.
الضبط الدقيق على مرحلتين#
يقسّم الضبط الدقيق على مرحلتين التدريب إلى مرحلتين. في المرحلة الأولى، يُجمّد العمود الفقري ويُدرّب العنق والرأس فقط، ما يسمح لطبقات الكشف بالتكيّف مع الفئات الجديدة دون إرباك الميزات المدرّبة مسبقًا. وفي المرحلة الثانية، تُلغى تجميدات جميع الطبقات ويُدرّب النموذج بالكامل بمعدل تعلّم أقل لتحسين العمود الفقري ليتلاءم مع المجال المستهدف.
يفيد هذا النهج بشكل خاص عندما يختلف المجال المستهدف اختلافًا كبيرًا عن COCO (كالصور الطبية والتصوير الجوي والمجهرية)، إذ قد يحتاج العمود الفقري إلى التكيّف، بينما يؤدي تدريب كل شيء دفعة واحدة إلى عدم الاستقرار. لإلغاء التجميد تلقائيًا باستخدام نهج قائم على دالة الاستدعاء اللاحق، راجع تجميد العمود الفقري وإلغاء تجميده.
from ultralytics import YOLO
# المرحلة 1: تجميد العمود الفقري، وتدريب الرأس والعنق
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)
# المرحلة 2: إلغاء تجميد الكل، والضبط الدقيق بمعدل تعلّم أقل
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أو أكثر) واستخدام معدل تعلّم أقل يساعدان على الحفاظ على المعرفة المكتسبة مسبقًا. راجع تراجع الأداء على الفئات الأصلية لمزيد من التفاصيل.