كيفية ضبط 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 نقل الأوزان مع مراعاة الأشكال:
- يُنقل الجزء الأساسي والعنق بالكامل — تستخرج هذه الطبقات سمات بصرية عامة، ولا تعتمد أشكالها على عدد الفئات.
- يُعاد تهيئة رأس الكشف جزئيًا - لا يرتبط عدد الفئات (80 مقابل 5) بالشكل إلا في الالتفاف النهائي لكل فرع تصنيف (
cv3،one2one_cv3)؛ وتُنقل الطبقات المخفية للفرع إذا اشترك النموذجان في المقياس نفسه. تُطابَق الصفوف المتوافقة التي تتطابق أسماؤها قبل تهيئة الصفوف غير المتطابقة. تتمتع طبقات انحدار الصندوق (cv2،one2one_cv2) في الرأس بأشكال ثابتة بصرف النظر عن عدد الفئات، لذا تُنقل بصورة اعتيادية. - تُنقل الغالبية العظمى من الأوزان عند تغيير عدد الفئات. على سبيل المثال، عند ضبط YOLO26n بدقة من COCO (80 فئة) على مجموعة بيانات تضم 5 فئات، تُنقل 696 من أصل 708 موتر أوزان، إضافةً إلى أي صفوف تصنيف متوافقة تتطابق أسماؤها.
بالنسبة إلى مجموعات البيانات التي تتساوى في عدد فئاتها مع النموذج المدرّب مسبقًا (مثل ضبط أوزان مدرّبة على COCO لمجموعة بيانات أخرى تضم 80 فئة)، تُنقل نسبة 100% من الأوزان، بما فيها رأس الكشف.
نقل الفئات ذات الأسماء البديلة#
تنقل Ultralytics صفوف رأس التصنيف المتطابقة بحسب أسماء الفئات بين مجموعات البيانات، مع تجاهل حالة الأحرف والمسافات البيضاء المحيطة. عندما تستخدم الفئات المتكافئة أسماء مختلفة، أعد تسمية فئات نقطة التحقق المصدر في الذاكرة قبل التحميل. يحافظ هذا على أوزان التصنيف المدرّبة مسبقًا للمفاهيم المشتركة التي كان سيُتعامل معها بخلاف ذلك على أنها غير متطابقة وتُهيّأ عشوائيًا.
يعيد هذا المثال الانتقال من الإصدار 2 من Objects365 إلى COCO تسمية الفئات المصدر في نقطة التحقق المحمّلة، ثم يمررها train() بوصفها الأوزان المدرّبة مسبقًا:
from ultralytics import YOLO
# اسم المصدر في Objects365 (بحروف صغيرة) -> اسم الفئة المستهدفة في 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 بحروف كبيرة في بدايات الكلمات، لذا تجري المطابقة بالاسم المكتوب بحروف صغيرة
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. للتحكم يدويًا في معدل التعلم، حدّد المُحسِّن صراحةً: 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أو أعلى) واستخدام معدل تعلم أقل يساعدان على الحفاظ على المعرفة المدرّبة مسبقًا. راجع يتدهور الأداء على الفئات الأصلية لمزيد من التفاصيل.