شرح بنية YOLO: من YOLOv3 إلى YOLO26#
يتكوّن كل نموذج Ultralytics YOLO من ثلاث مراحل: عمود فقري يستخرج السمات، وعنق يدمج السمات عبر المقاييس، ورأس يتنبأ بالصناديق والفئات. يوثّق هذا الدليل الوحدات التي تشكّل كل مرحلة وكيف تغيّرت من YOLOv3 إلى YOLO26، مع تتبّع كل مكوّن إلى تعريفه في ملفات الإعدادات ضمن ultralytics/cfg/models/ وفئات الوحدات في ultralytics/nn/modules/.
يُعرّف كل نموذج تعريفًا تصريحيًا في ملف YAML على هيئة قائمة مرتّبة من الطبقات، وتتبع كل طبقة التنسيق [from, repeats, module, args]: الطبقة أو الطبقات التي تغذّيها، وعدد مرات تكرار الوحدة، وفئة الطبقة (Conv، C3k2، SPPF، Detect، …)، ووسائط المُنشئ. يوثّق دليل إعدادات نموذج YAML هذا التنسيق — بما في ذلك كيفية تغيّر مقياسي repeats وargs مع مضاعفي العمق والعرض للنسخة — إلى جانب نظام حلّ الوحدات بالكامل. يركّز هذا الدليل على الوحدات نفسها وكيف تغيّرت من إصدار إلى آخر.
المراحل الثلاث#
يمرّر كل نموذج Ultralytics YOLO الصورة عبر ثلاث مراحل متتابعة، لكل منها مهمة مميزة:
| المرحلة | المهمة | المخرجات |
|---|---|---|
| العمود الفقري | استخراج السمات من الصورة المُدخلة بدقات متعددة | خرائط السمات عند خطوات 8 و16 و32 (P3 وP4 وP5) |
| العنق | دمج السمات عبر المقاييس لمنح الأجسام الصغيرة والكبيرة سياقًا مناسبًا | خرائط سمات مدمجة متعددة المقاييس |
| الرأس | التنبؤ بصناديق الإحاطة ودرجات الفئات من السمات المدمجة | الكشوف لكل نقطة ارتكاز |
الوحدة الأساسية هي كتلة Conv (المعرّفة في conv.py): التفاف ثنائي الأبعاد، وتطبيع الدفعة، وتنشيط SiLU، تُطبّق بالتتابع. تتكوّن كل وحدة أكبر أدناه من تركيب كتل Conv.
مخططات البنية#
تحافظ كل نسخة على الهيكل نفسه المكوّن من العمود الفقري → العنق → الرأس، وتُغيّر مراحل محددة. تعرض علامات التبويب أدناه بنية كل نسخة: تتبع مراحل العمود الفقري والعنق الإعدادات في ultralytics/cfg/models/، بينما تُرسم رأسا YOLOv3 وYOLOv5 بصورتهما الأصلية المعتمدة على المراسي، لا برأس الإصدار المعتمد على المراسي u الذي تتضمنه إعدادات الحزم فعليًا. يوضّح استعراض علامات التبويب الإضافات التي أدخلها كل جيل. باختصار، يتلخص التطور في الآتي: YOLOv3 كاشف يعتمد على المراسي ويستخدم FPN فقط؛ ويضيف YOLOv5 مسار PAN من الأسفل إلى الأعلى وSPPF؛ وينتقل YOLOv8 إلى كتلة C2f مع رأس لا يعتمد على المراسي وDFL؛ ويُدرج YOLO11 آلية الانتباه C2PSA وكتلة C3k2؛ ويضيف YOLO26 وصلة متبقية SPPF، ويزيل DFL، ويضيف رأسًا اختياريًا لا يستخدم NMS.
تعرض مخططات YOLOv3 وYOLOv5 الرأس الأصلي المعتمد على المراسي. تتضمن حزمة ultralytics ملفي الإعداد المتغيّرين YOLOv3u وYOLOv5u الخاليين من المراسي — وهما يستخدمان العمودين الفقريين Darknet-53 وC3 نفسيهما، مع رأس Detect الخاص بـYOLOv8 — كما هو موضّح ضمن رأس الكشف.
كتل العمود الفقري: Bottleneck → C3 → C2f → C3k2#
يرصّ العمود الفقري كتلة CSP (جزئية عبر المراحل) متكررة بين طبقات خفض الدقة Conv ذات الخطوة 2. وقد شهدت هذه الكتلة المتكررة أكبر قدر من التغيير عبر الإصدارات. توجد جميع الكتل أدناه في block.py؛ ويمثل c1/c2 قنوات الإدخال/الإخراج، بينما يمثل c = 0.5 * c2 العرض المخفي.
Bottleneck (YOLOv3)#
الوحدة الأساسية هي Bottleneck: طبقتا Conv (بحجم النواة الافتراضي (3, 3)) مع جمع متبقٍ اختياري عند shortcut=True وc1 == c2. يرصّ العمود الفقري Darknet-53 في YOLOv3 هذه الوحدات مباشرة، من دون تقسيم CSP، ويجري الكشف عند ثلاثة مقاييس (الخطوات 8 و16 و32).
C3 (YOLOv5)#
تقسم وحدة C3 في YOLOv5 الإدخال على التفافين 1x1: يغذّي cv1 كتل Bottleneck المتتابعة وعددها n (بحجمي نواة (1, 1) ثم (3, 3))، بينما يتجاوزها cv2. يُسلسَل المساران ويُدمجان بواسطة 1x1 ثالث من نوع Conv:
def forward(self, x):
# C3: يُسلسَل مسار الاختناق m(cv1(x)) مع مسار التجاوز cv2(x)، ثم يُدمجان بواسطة cv3
return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))لا يصل إلى التفاف الدمج سوى خرج كتلة الاختناق الأخيرة، لذا يتلقى cv3 خريطتي سمات.
C2f (YOLOv8)#
تغيّر وحدة C2f في YOLOv8 («كتلة اختناق CSP ذات التفافين، أسرع») السمات التي تصل إلى التفاف الدمج:
- تُطبّق
cv1 = Conv(c1, 2 * c, 1)، ثم تقسّمchunk(2)الخرج إلى موترين، لكل منهماcقناة. - تُشغّل كتل
Bottleneck(c, c)من نوعnبالتتابع (بحجمي النواة(3, 3)و(3, 3))، وتتلقى كل كتلة خرج الكتلة السابقة. - تُسلسَل جميع الموترات الوسيطة
n + 2وتُدمج بواسطةcv2 = Conv((2 + n) * c, c2, 1).
بينما تمرر C3 خريطتي سمات إلى التفاف الدمج، تمرر C2f عدد n + 2 — إذ يُعاد استخدام كل خرج وسيط لكتلة الاختناق.
C3k2 (YOLO11 وYOLO26)#
يستخدم YOLO11 وYOLO26 الوحدة C3k2، وهي فئة فرعية من C2f تستبدل الوحدة المتكررة. وتتحول كل كتلة من كتل n، حسب أعلام المُنشئ، إلى:
Bottleneckعادية (افتراضيًا،c3k=False)،- كتلة
C3k(c3k=True) — وهي صيغة منC3ذات حجم نواة قابل للضبط، أو - زوج
Bottleneck+PSABlock(attn=True).
يضبط وسيط YAML الثاني c3k، إلا إذا كان المقياس m أو l أو x، إذ يُفرض عندها أن يكون True — وهكذا تخدم وحدة yolo11.yaml واحدة المتغيرات الخمسة. لذلك، تنشئ [-1, 2, C3k2, [512, False]] البنى الداخلية لـBottleneck عند n وs، بينما تنشئ البنى الداخلية لـC3k عند m وl وx؛ ويمثل الرقم 512 عدد القنوات قبل التحجيم، الذي يحوّله مضاعف العرض الخاص بالمتغير إلى 128 عند n وإلى 768 عند x. في وحدات CSP، يصبح الحقل repeats — وقيمته هنا 2 قبل تحجيمه بمضاعف العمق الخاص بالمتغير — عدد التكرارات الداخلية للكتلة بدلًا من رصّ وحدات منفصلة.
التجميع المكاني: SPP → SPPF#
في نهاية العمود الفقري، توسّع كتلة تجميع الهرم المكاني مجال الاستقبال. استبدل YOLOv5 وحدة SPP الأصلية متعددة النوى بوحدة SPPF (تجميع الهرم المكاني - السريع): يُطبّق فيها MaxPool2d(kernel_size=5, stride=1, padding=2) واحد n = 3 مرات متتابعة، ثم تُسلسَل المدخلات وجميع المخرجات الثلاثة المجمّعة وتُدمج بواسطة Conv من نوع 1x1. وهذا مكافئ رياضيًا لـSPP(k=(5, 9, 13)) لكنه أقل كلفة، لأن عمليات التجميع المتسلسلة 5x5 تغطي مجالات الاستقبال للنوى الأكبر.
يمرّر YOLO26 علم وصلة مختصرة (SPPF, [1024, 5, 3, True])؛ وبما أن c1 == c2 == 1024 عند أعمق طبقة، تضيف SPPF وصلة متبقية (return y + x).
الانتباه المكاني: C2PSA (YOLO11 وما بعده)#
أضاف YOLO11 C2PSA بعد SPPF. وهي كتلة CSP يتكوّن فرعها النشط من رصّة من وحدات PSABlock من نوع n (انتباه حساس للموضع): تقسّم cv1 = Conv(c1, 2 * c, 1) السمات، ويمرّ نصفها عبر رصّة PSABlock، ثم تدمج cv2 = Conv(2 * c, c1, 1) السمات المتسلسلة. وتطبّق كل وحدة PSABlock انتباهًا متعدد الرؤوس، يتبعه نموذج تغذية أمامية من طبقتين (Conv(c, 2 * c, 1) → Conv(2 * c, c, 1))، ولكل منهما وصلة متبقية. ويحافظ YOLO26 على العمود الفقري نفسه C3k2 + C2PSA.
العنق: FPN + PAN#
يدمج العنق خرائط السمات P3/P4/P5 للعمود الفقري باستخدام شبكة هرم السمات (FPN) من الأعلى إلى الأسفل، تليها شبكة تجميع المسارات (PAN) من الأسفل إلى الأعلى. في قسم الرأس ضمن YAML، تمثل FPN الوحدتين nn.Upsample + Concat (لنقل المعلومات الدلالية إلى دقات أعلى)، وتمثل PAN الوحدتين Conv + Concat ذواتي الخطوة 2 (لإعادة معلومات تحديد الموقع إلى الأعلى):
# YOLO11 head (FPN top-down, then PAN bottom-up)
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 2, C3k2, [512, False]] # 13
# ... second upsample + concat to P3 ...
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4 (PAN)
- [-1, 2, C3k2, [512, False]] # 19يعيد العنق استخدام كتلة العمود الفقري الخاصة بجيله — C3 في YOLOv5، وC2f في YOLOv8، وC3k2 في YOLO11 وYOLO26 — لذا تستخدم كل نقطة دمج الوحدة نفسها التي يستخدمها العمود الفقري. وتغذّي المخرجات الثلاثة المدمجة الرأس. ويُستثنى YOLOv3: فعنقه يستخدم FPN من الأعلى إلى الأسفل فقط (ولا يحتوي قسم الرأس في YAML على خفض دقة بخطوة 2)، من دون مسار PAN من الأسفل إلى الأعلى الذي قدّمه YOLOv5.
رأس الكشف: معتمد على المراسي → خالٍ من المراسي → خالٍ من NMS#
يحوّل الرأس خرائط السمات الثلاث المدمجة إلى تنبؤات لمهمة الكشف. وقد تغيّر تصميمه عبر الإصدارات من الاعتماد على المراسي إلى الاستغناء عنها، ثم إلى الاستغناء عن NMS.
Detect خالٍ من المراسي ومنفصل الفروع#
استخدم YOLOv3 وYOLOv5 الأصليان رأسًا معتمدًا على المراسي ومترابط الفروع: صناديق مراسي محددة مسبقًا وفرع مشترك للتنبؤ بالصناديق والفئات. وتحافظ مستودعات ultralytics/yolov3 وultralytics/yolov5 المستقلة على هذا التصميم المعتمد على المراسي. أما الحزمة الرئيسية ultralytics فتتضمن بدلًا من ذلك المتغيرين YOLOv3u وYOLOv5u الخاليين من المراسي — وهما يستخدمان العمودين الفقريين Darknet-53 وC3 نفسيهما، مع رأس Detect الخالي من المراسي الخاص بـYOLOv8 — كما أن ملفي الإعداد yolov3.yaml وyolov5.yaml الموثقين هنا يخصان متغيرات u هذه، وليس التصميم التاريخي.
رأس Detect (head.py) خالٍ من المراسي ومنفصل الفروع: يشغّل فرعين متوازيين لكل مستوى هرمي، ويتنبأ مباشرة عند نقاط الشبكة بدلًا من استخدام صناديق المراسي.
- فرع الصناديق (
cv2):Conv(x, c2, 3)→Conv(c2, c2, 3)→Conv2d(c2, 4 * reg_max, 1). - فرع الفئات (
cv3): في YOLO11 وYOLO26، وحدتان قابلتان للفصل عمقيًا (DWConv+1x1 Conv) →Conv2d(c3, nc, 1)؛ أما YOLOv8 فيستخدم الصيغة القديمة، وهي طبقتان3x3 Conv→Conv2d(c3, nc, 1).
لذلك تُصدر كل نقطة ارتكاز no = nc + 4 * reg_max مخرجات. ويؤدي الاستغناء عن المراسي المحددة مسبقًا إلى حذف أحجام صناديق المراسي ونسب أبعادها من المعلمات الفائقة التي يجب ضبطها.
خسارة البؤرة التوزيعية (DFL)#
يقدّر YOLOv8 وYOLO11 كل إحداثي من إحداثيات الصندوق الأربع على هيئة توزيع على reg_max = 16 خانة بدلًا من قيمة عددية واحدة (الصيغة التكاملية من الخسارة البؤرية المعممة). تعيد الوحدة DFL تشكيل قنوات الصندوق 4 * reg_max إلى (4, reg_max)، وتطبّق softmax على reg_max خانة، ثم تأخذ الفهرس المتوقع للخانة — أي حاصل ضرب كل فهرس خانة في احتمال softmax الخاص به ثم جمع النتائج — بوصفه الإحداثي المتنبأ به. ويُنفّذ ذلك باستخدام التفاف ثابت 1x1 تكون أوزانه مؤشرات الخانات arange(reg_max)، لذا يُحسب المجموع الموزون بعملية ضرب نقطي واحدة.
YOLO26: خالٍ من NMS وDFL#
يضبط YOLO26 معاملي YAML اللذين يقرأهما الرأس مباشرة:
end2end: True— تنسخDetectفروع الرأس بعمق إلى رأس أحادي المطابقة (one2one_cv2/one2one_cv3) يتعلم تنبؤًا واحدًا لكل جسم. ينشئ إعداد YAML هذا رأسي التدريب كليهما؛ وفي وقت التشغيل، تختارnms=Falseالرأس أحادي المطابقة وتحذف خطوة المعالجة اللاحقة لقمع غير الأعظميات (NMS). راجع دليل الكشف الشامل من البداية إلى النهاية للاطلاع على تفاصيل الاستدلال والتصدير.reg_max: 1— عند استخدام خانة واحدة، تصبحself.dflهيnn.Identity()وno = nc + 4؛ ويتنبأ الرأس بالإحداثيات مباشرة، ولا تظهر أي عملية DFL في مخطط ONNX المُصدّر.
عبر أحجام نماذجه الخمسة (n/s/m/l/x)، يحقق YOLO26 قيمة mAP تتراوح بين 40.9 و57.5 على COCO، مع زمن استجابة يتراوح بين 1.7 و11.8 مللي ثانية على T4 باستخدام TensorRT، وفقًا لما ورد في ورقة YOLO26.
ملخص حسب الإصدار#
| الإصدار | كتلة العمود الفقري | التجميع المكاني | الانتباه | رأس الكشف | DFL |
|---|---|---|---|---|---|
| YOLOv3 | Darknet-53 (Bottleneck) | لا يوجد في ملف الإعداد الأساسي | لا يوجد | الأصلي: معتمد على المراسي؛ المتغير u: خالٍ من المراسي | لا / نعم (u) |
| YOLOv5 | C3 (CSP) | SPPF | لا يوجد | الأصلي: معتمد على المراسي؛ المتغير u: خالٍ من المراسي | لا / نعم (u) |
| YOLOv8 | C2f | SPPF | لا يوجد | خالٍ من المراسي، منفصل الفروع | نعم (reg_max=16) |
| YOLO11 | C3k2 | SPPF | C2PSA | خالٍ من المراسي، منفصل الفروع | نعم (reg_max=16) |
| YOLO26 | C3k2 | SPPF + وصلة مختصرة | C2PSA | خالٍ من المراسي، رأسان؛ وخالٍ من NMS اختياريًا | أُزيل (reg_max=1) |
للاطلاع على تفاصيل كل نموذج وجداول الأداء وأمثلة الاستخدام، راجع الصفحات المخصصة لـYOLOv3 وYOLOv5 وYOLOv8 وYOLO11 وYOLO26.
افحص البنية بنفسك#
تعرض الطريقة model.info() ملخصًا للطبقات والمعلمات وFLOPs، وتتوفر قائمة الوحدات المُحلّلة في model.model.model.
from ultralytics import YOLO
# تحميل نموذج مدرَّب مسبقًا
model = YOLO("yolo11n.pt")
# ادمج طبقات Conv + BatchNorm لتتطابق الأعداد مع المواصفات المنشورة
model.fuse()
# اطبع ملخصًا: الطبقات والمعلمات والتدرجات وGFLOPs
model.info()
# افحص رأس الكشف (الوحدة الأخيرة في الشبكة)
head = model.model.model[-1]
print(type(head).__name__, "| reg_max:", head.reg_max, "| DFL layer:", type(head.dfl).__name__)يوضح تشغيل المقتطف عبر ثلاثة أجيال التغييرات بالأرقام. هذه مخرجات فعلية لنماذج مدمجة من حزمة ultralytics، وتطابق أعداد المعلمات وFLOPs المنشورة في صفحة كل نموذج:
| النموذج | الطبقات | المعلمات | GFLOPs | reg_max | طبقة DFL |
|---|---|---|---|---|---|
| YOLOv8n | 72 | 3,151,904 | 8.7 | 16 | DFL |
| YOLO11n | 100 | 2,616,248 | 6.5 | 16 | DFL |
| YOLO26n | 120 | 2,408,932 | 5.5 | 1 | Identity |
يعرض YOLO26n القيمة reg_max=1 وطبقة DFL Identity. ويستخدم التنبؤ والتحقق افتراضيًا أسلوب المطابقة من واحد إلى متعدد مع NMS؛ اضبط nms=False للاستدلال الخالي من NMS. ويُدرّب كلا الرأسين.
تُعرض قيم المعلمات وFLOPs للنموذج المدمج (model.fuse())، الذي يدمج كل Conv وطبقة تطبيع الدفعة الخاصة به. وهذا يطابق المواصفات المنشورة؛ إذ يعرض ملف نقطة تحقق محمّل حديثًا أعدادًا أعلى قليلًا قبل الدمج.
الخلاصة#
تغيّرت بنية YOLO عبر الإصدارات مرحلةً تلو الأخرى: انتقل العمود الفقري من Darknet-53 إلى كتل C3 وC2f وC3k2 القائمة على CSP والمزوّدة بآلية الانتباه C2PSA؛ وحافظ العنق على بنيته FPN + PAN بينما أصبحت SPP هي SPPF؛ وانتقل الرأس من الاعتماد على المراسي إلى عدم الاعتماد عليها، ثم إلى تصميم YOLO26 الخالي من DFL، مع رأس اختياري شامل من البداية إلى النهاية لا يستخدم NMS.
لتعريف معماريات مخصصة، راجع دليل إعداد YAML للنموذج، أو قارن النماذج على صفحات النماذج. ولطرح الأسئلة، تواصل معنا عبر GitHub أو Discord.
الأسئلة الشائعة#
يحتوي نموذج YOLO على عمود فقري يستخرج السمات من الصورة عند خطوات 8 و16 و32، وعنق يدمج تلك السمات عبر المقاييس باستخدام FPN وPAN، ورأس يتنبأ بمربعات الإحاطة ودرجات الفئات. تتبع جميع نماذج Ultralytics YOLO من YOLOv3 إلى YOLO26 هذا التصميم ذي المراحل الثلاث.
C2f(YOLOv8) هي كتلة CSP تضم مخرجات كل خرائط السمات الداخليةBottleneck—n + 2— قبل التفاف الدمج الخاص بها، بينما تمرر كتلةC3الأقدم خريطتين فقط. أماC3k2(YOLO11 وYOLO26) فهي فئة فرعية منC2f، ويمكنها استبدال كلBottleneckبكتلةC3k(وهي متغيرC3بحجم نواة قابل للضبط) عند تعيين العلامةc3k. وتُعرّف الكتلتان فيblock.py.تُجري YOLO11 ثلاثة تغييرات بنيوية على YOLOv8: تستبدل كتلة العمود الفقري والعنق
C2fبـC3k2، وتُدرج كتلة انتباه ذاتيC2PSAبعدSPPF، وتنقل فرع التصنيف في الرأس إلى التفافات أخف قابلة للفصل العمقي. ويحافظ كلا النموذجين على رأسDetectمفكك الارتباط، والخالي من المراسي، مع انحدار DFLreg_max=16، لذا تخفض هذه التغييرات أعداد المعلمات وFLOPs مع رفع الدقة، بدلًا من إعادة تصميم واجهة الكشف.نماذج Ultralytics YOLO الحديثة خالية من المراسي. تستخدم YOLOv8 وYOLO11 وYOLO26 رأس
Detectمفكك الارتباط وخاليًا من المراسي، مع فرعين منفصلين لانحدار الصناديق والتصنيف. اعتمد الإصداران الأصليان YOLOv3 وYOLOv5 على المراسي، لكن Ultralytics توفرهما بمتغيري YOLOv3u وYOLOv5u، اللذين تستخدم إعداداتهما رأسًا خاليًا من المراسي مثل YOLOv8.نعم — يتضمن YOLO26 رأسًا من نوع واحد إلى واحد يدعم الاستدلال دون NMS باستخدام
nms=False. ويستخدم مسار الاستدلال الافتراضي من نوع واحد إلى متعدد NMS، كما يتلقى كلا الرأسين إشرافًا أثناء التدريب. راجع دليل الكشف من طرف إلى طرف للاطلاع على التفاصيل.تُجري DFL انحدارًا لكل إحداثي من إحداثيات الصندوق بوصفه توزيع softmax على
reg_maxحاوية (16 افتراضيًا في YOLOv8 وYOLO11)، ثم تأخذ القيمة المتوقعة بوصفها الإحداثي بدلًا من التنبؤ بقيمة عددية واحدة. وتضبط YOLO26 القيمةreg_max=1، فتتحول طبقة DFL إلى عملية هوية، وينحدر الرأس إلى الإحداثيات مباشرة، ولا تظهر أي عملية DFL في مخططات ONNX أو TensorRT المصدّرة.حمّل النموذج في Python واستدعِ
model.info()للحصول على ملخص للطبقات والمعلمات وGFLOPs. توجد الطبقات المحللة فيmodel.model.model— فعلى سبيل المثال،model.model.model[-1]هو رأسDetect، ويعرض سمات مثلreg_maxوdfl. وتُعرّف المعمارية كاملةً في ملف إعداد YAML للنموذج.