Ultralytics YOLO27: انضم إلى قائمة الانتظار.
ابدأ

كيفية ضبط 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. يُعاد تهيئة رأس الكشف جزئيًا - لا يرتبط عدد الفئات (80 مقابل 5) بالشكل إلا في الالتفاف النهائي لكل فرع تصنيف (cv3، one2one_cv3)؛ وتُنقل الطبقات المخفية للفرع إذا اشترك النموذجان في المقياس نفسه. تُطابَق الصفوف المتوافقة التي تتطابق أسماؤها قبل تهيئة الصفوف غير المتطابقة. تتمتع طبقات انحدار الصندوق (cv2، one2one_cv2) في الرأس بأشكال ثابتة بصرف النظر عن عدد الفئات، لذا تُنقل بصورة اعتيادية.
  3. تُنقل الغالبية العظمى من الأوزان عند تغيير عدد الفئات. على سبيل المثال، عند ضبط 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)، ثم زيادة الحجم فقط إذا استقرت مقاييس التحقق. ويعتمد حجم النموذج الأمثل على تعقيد المهمة، وعدد الفئات، وتنوع مجموعة البيانات، والأجهزة المتاحة للنشر.

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

يختار الإعداد الافتراضي 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. للتحكم يدويًا في معدل التعلم، حدّد المُحسِّن صراحةً: 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

# ⁨المرحلة 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 أو أعلى) واستخدام معدل تعلم أقل يساعدان على الحفاظ على المعرفة المدرّبة مسبقًا. راجع يتدهور الأداء على الفئات الأصلية لمزيد من التفاصيل.

التعليقات4

اطرح سؤالًا، وشارك نتائجك، أو ساعد شخصًا آخر.

  1. Yuan Yao(تم التعديل)

    这是我在训练时遇到的一个问题,

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    81/1000      6.68G          0          0          0        195        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.1s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    82/1000      6.68G          0          0          0        184        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.0it/s 11.3s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    83/1000      6.68G          0          0          0        221        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:19
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.1s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    84/1000      6.68G          0          0          0        212        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.2s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    85/1000      6.68G          0          0          0        221        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.2s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    86/1000      6.68G          0          0          0        216        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.0s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    87/1000      6.68G          0          0          0        198        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:19
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.0it/s 11.4s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    88/1000      6.68G          0          0          0        229        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.2s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    89/1000      6.68G          0          0          0        182        640: 100% ━━━━━━━━━━━━ 121/121 1.1s/it 2:18
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.0s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    90/1000      6.68G          0          0          0        218        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.0s
                   all       1449       8364          0          0          0          0
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    91/1000      6.68G          0          0          0        181        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:19
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.1it/s 11.1s
                   all       1449       8364          0          0          0          0

    mAP一直是0。当时我用的是yaml文件用于训练模型,

    model_name = r"H:\1_yaoyuan\code\01_yolo26\yolo_Project\ultralytics-main\ultralytics\cfg\models\11\yolo11.yaml"

    之后改成了,

    model_name = 'yolo11n.pt' # 首次运行会自动下载

    然后训练才变的正常,

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
     2/1000      5.47G      2.825      1.856     0.8776        131        640: 100% ━━━━━━━━━━━━ 121/121 1.2s/it 2:20
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 2.0it/s 11.5s
                   all       1449       8364      0.554      0.314       0.32      0.117
    
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
     3/1000      5.47G      2.904      1.726     0.8738        206        640: 100% ━━━━━━━━━━━━ 121/121 1.1s/it 2:19
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 23/23 1.9it/s 11.9s
                   all       1449       8364      0.496       0.29      0.269      0.085

    这是为什么?微调和从头开始训练差别很大吗? 我问了deepseek,他说:“.yaml 路径迫使模型在毫无知识的情况下承受初始的梯度冲击,导致了数值崩溃;而 .pt 路径让模型从一个稳定的知识基础开始,顺利进入了正常的学习轨道。”

    可如果是这样,如果这个世界还没有yolo的pt文件,那么是不是mAP永远都是0了?

    1. Paula DerrengerUltralytics

      不用道歉,这是很合理的问题!不是的:从 .yaml 构建模型是随机初始化,从 yolo11n.pt 开始则利用预训练特征,通常收敛更快、需要的数据更少;YOLO11 官方示例也支持从零训练,并不需要已有 .pt 才能学会检测。你这里不仅 mAP 为 0,三个 loss 也连续为 0,这不能简单解释为“从零训练比较慢”,更应优先排查训练数值异常;仅凭这些日志,还不能确认 DeepSeek 所说的“梯度冲击”。建议保留 YAML,在原来的 model.train(...) 中加入 amp=False,重新启动训练以排查混合精度问题(AMP 检查说明)。如果仍然全为 0,请贴出完整训练代码、启动到首个异常 epoch 的文本日志,以及 GPU 型号、Ultralytics 和 PyTorch 版本。