رؤية YOLO لعام 2026:

شرح بنية YOLO: من YOLOv3 إلى YOLO26#

يقوم كل نموذج من نماذج Ultralytics YOLO ببنائه عبر ثلاث مراحل: العمود الفقري (backbone) الذي يستخرج الميزات، والعنق (neck) الذي يدمجها عبر المقاييس المختلفة، والرأس (head) الذي يتنبأ بالمربعات والفئات. يوثق هذا الدليل الوحدات التي تشكل كل مرحلة وكيف تغيرت من YOLOv3 إلى YOLO26، متتبعًا كل مكون حتى تعريفه في ملفات التكوين الموجودة تحت ultralytics/cfg/models/ وفئات الوحدات في ultralytics/nn/modules/.

يتم تعريف كل نموذج بشكل تقريري في ملف YAML كقائمة مرتبة من الطبقات، حيث تتبع كل طبقة تنسيق [from, repeats, module, args]: الطبقة (الطبقات) التي تغذيها، وعدد مرات تكرار الوحدة، وفئة الطبقة (Conv، C3k2، SPPF، Detect، …)، ووسائط المُنشئ الخاصة بها. يوثق دليل تكوين نموذج YAML هذا التنسيق — بما في ذلك كيفية قياس repeats وargs مع مضاعفات العمق والعرض للمتغير — إلى جانب نظام دمج الوحدات بالكامل. يركز هذا الدليل على الوحدات نفسها وكيف تغيرت من إصدار إلى آخر.

المراحل الثلاث#

يوجه كل نموذج Ultralytics YOLO الصورة عبر ثلاث مراحل متسلسلة، كل منها له وظيفة متميزة:

المرحلةالوظيفةالمخرجات
Backboneاستخراج الميزات من صورة الإدخال بدقة متعددةخرائط الميزات عند الخطوات 8، 16، و 32 (P3، P4، P5)
Neckدمج الميزات عبر المقاييس بحيث يكون للأجسام الصغيرة والكبيرة سياقخرائط الميزات المدمجة متعددة المقاييس
Headالتنبؤ بمربعات الإحاطة ونتائج الفئات من الميزات المدمجةالاكتشافات لكل نقطة ارساء

الوحدة الأساسية هي كتلة Conv (المعرفة في conv.py): التفاف ثنائي الأبعاد، التطبيع الدفعي، وتنشيط SiLU، والتي تُطبق بالتسلسل. يتم بناء كل وحدة أكبر أدناه من خلال دمج كتل Conv.

مخططات البنية#

يحافظ كل إصدار على الهيكل العظمي نفسه العمود الفقري ← العنق ← الرأس ويغير مراحل محددة. توضح علامات التبويب أدناه البنية حسب الإصدار: تتبع مراحل العمود الفقري والعنق التكوينات الموجودة في ultralytics/cfg/models/، بينما تُرسم رؤوس YOLOv3 وYOLOv5 في شكلها الأصلي المستند إلى المراسي بدلاً من رأس متغير u الخالي من المراسي الذي تشحنه تكوينات حزمتهم بالفعل. يوضح التمرير عبر علامات التبويب ما أضافه كل جيل. باختصار، التطور هو: YOLOv3 هو كاشف يعتمد على FPN فقط ويعتمد على المراسي؛ يضيف YOLOv5 مسار PAN التصاعدي وSPPF؛ ينتقل YOLOv8 إلى كتلة C2f مع رأس خالي من المراسي، DFL؛ يدخل YOLO11 انتباه C2PSA وكتلة C3k2؛ ويضيف YOLO26 متبقي SPPF ويجعل الرأس خاليًا من NMS وخاليًا من DFL. تتبع ألوان العقد اتفاقية رسم تخطيطي للتوثيق: مدخل أخضر، عمود فقري أزرق، تجميع مكاني وانتباه رمادي مزرق، عنق برتقالي، رأس ومخرج بنفسجي.

flowchart TD
    IN[Input 640x640]:::start --> ST[Conv stem<br/>5x stride-2 down to P1-P5]:::proc
    ST --> BB[Darknet-53 backbone<br/>stacked Bottleneck]:::proc
    BB --> FPN[Neck FPN only<br/>top-down Upsample + Concat]:::decide
    FPN --> HD[Detect head<br/>3 scales, anchor-based]:::out
    HD --> O[Predictions + NMS]:::out
    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef decide fill:#FF9800,color:#fff
    classDef out fill:#9C27B0,color:#fff

تُظهر مخططات YOLOv3 وYOLOv5 الرأس الأصلي المستند إلى المراسي. تشحن حزمة ultralytics تكوينات YOLOv3u وYOLOv5u الخالية من المراسي — وهما نفس عمودي Darknet-53 وC3 الفقريين مع رأس Detect الخاص بـ YOLOv8 — والموصوفتين تحت رأس الكشف.

كتل Backbone: 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)#

يقوم نموذج YOLOv5 التابع لـ C3 بتقسيم المدخلات عبر عمليتي التفاف (1x1): حيث يقوم cv1 بتغذية كتل Bottleneck متسلسلة n (بمرشحات (1, 1) ثم (3, 3))، بينما يتجاوزها cv2. يتم دمج المسارين ودمجهما بواسطة عملية التفاف ثالثة 1x1 Conv:

def forward(self, x):
    # C3: bottleneck path m(cv1(x)) concatenated with bypass cv2(x), then fused by cv3
    return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

فقط مخرج العنق الزجاجي النهائي يصل إلى التفاف الدمج، لذلك ترى cv3 خريطتي ميزات.

C2f (YOLOv8)#

يقوم نموذج YOLOv8 (عنق زجاجة CSP مع عمليتي التفاف، أسرع) C2f بتغيير الميزات التي تصل إلى طبقة التفاف الدمج:

  1. cv1 = Conv(c1, 2 * c, 1)، ثم يقسم chunk(2) المخرج إلى موترين بقناة c.
  2. تعمل كتل n Bottleneck(c, c) (النواة (3, 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؛ على سبيل المثال، يبني [-1, 2, C3k2, [512, True]] وحدة C3k2 واحدة عند 512 قناة إخراج تكون كتلها الداخلية C3k (نظرًا لـ c3k=True). بالنسبة لوحدة CSP، يصبح حقل repeats — هنا 2، قبل قياسه بواسطة مضاعف عمق المتغير — هو عدد التكرار الداخلي للكتلة بدلاً من تكديس وحدات منفصلة.

التجميع المكاني: SPP → SPPF#

في نهاية العمود الفقري، يعمل كتلة تجميع هرمية مكانية على توسيع مجال الاستقبال. استبدل YOLOv5 وحدة SPP متعددة النواة الأصلية بـ SPPF (التجميع الهرمي المكاني - سريع): MaxPool2d(kernel_size=5, stride=1, padding=2) واحد يتم تطبيقه n = 3 مرات بالتسلسل، مع ربط المدخلات وجميع المخرجات الثلاثة المجمعة ودمجها بواسطة 1x1 Conv. هذا مكافئ رياضيًا لـ 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 فرعها النشط هو كومة من وحدات n PSABlock (الانتباه الحساس للموقع): يقسم 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 الفقري.

Neck: 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 ConvConv2d(c3, nc, 1).

لذلك تصدر كل نقطة مرساة مخرجات no = nc + 4 * reg_max. تؤدي إزالة المراسي المحددة مسبقًا إلى إسقاط أحجام المربعات المرساة ونسب الأبعاد من المعلمات الفائقة التي يجب ضبطها.

خسارة التنسيق التوزيعي (DFL)#

تقوم YOLOv8 وYOLO11 بانحدار كل إحداثي من إحداثيات المربعات الـ 4 كـ توزيع على حاويات 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) ينتج تنبؤًا واحدًا لكل كائن، مما يزيل خطوة المعالجة اللاحقة لإلغاء القمع غير الأقصى (NMS). راجع دليل الكشف الشامل للحصول على تفاصيل التصدير والترحيل.
  • reg_max: 1 — بحاوية واحدة، يصبح self.dfl هو nn.Identity() وno = nc + 4؛ يقوم الرأس بانحدار الإحداثيات مباشرة ولا تظهر أي عملية DFL في رسم ONNX المُصدّر.

عبر أحجام نماذجها الخمسة (n/s/m/l/x)، تصل YOLO26 إلى 40.9-57.5 mAP على COCO بزمن وصول T4 TensorRT يتراوح بين 1.7-11.8 مللي ثانية، كما هو موضح في ورقة YOLO26 البحثية.

ملخص إصدار تلو الآخر#

الإصداركتلة Backboneالتجميع المكانيالانتباهرأس الاكتشافDFL
YOLOv3Darknet-53 (Bottleneck)لا شيء في التكوين الأساسيلا شيءالأصلي: مستند إلى المراسي؛ متغير u: خالٍ من المراسيلا / نعم (u)
YOLOv5C3 (CSP)SPPFلا شيءالأصلي: مستند إلى المراسي؛ متغير u: خالٍ من المراسيلا / نعم (u)
YOLOv8C2fSPPFلا شيءخالي من الارتساء، منفصلنعم (reg_max=16)
YOLO11C3k2SPPFC2PSAخالي من الارتساء، منفصلنعم (reg_max=16)
YOLO26C3k2SPPF + اختصارC2PSAخالٍ من المراسي، خالٍ من NMS (end2end)مُزال (reg_max=1)

للحصول على تفاصيل لكل نموذج، وجداول الأداء، وأمثلة الاستخدام، راجع الصفحات الفردية لـ YOLOv3، وYOLOv5، وYOLOv8، وYOLO11، وYOLO26.

افحص البنية بنفسك#

تطبع طريقة model.info() ملخصًا للطبقة والمعلمات وFLOPs، ويكون قائمة الوحدات المحللة متاحة على model.model.model.

افحص بنية نموذج YOLO
from ultralytics import YOLO

# Load a pretrained model
model = YOLO("yolo11n.pt")

# Fuse Conv + BatchNorm layers so counts match the published specs
model.fuse()

# Print a summary: layers, parameters, gradients, GFLOPs
model.info()

# Inspect the detection head (the last module in the network)
head = model.model.model[-1]
print(type(head).__name__, "| reg_max:", head.reg_max, "| end2end:", head.end2end)

يُظهر تشغيل المقتطف عبر ثلاثة أجيال التغييرات عدديًا. هذه مخرجات نموذجية حقيقية مدمجة من حزمة ultralytics، وتطابق أعداد المعلمات وFLOPs المنشورة على كل صفحة نموذج:

النموذجالطبقاتالمعاملاتGFLOPsreg_maxend2endطبقة DFL
YOLOv8n723,151,9048.716FalseDFL
YOLO11n1002,616,2486.516FalseDFL
YOLO26n1222,408,9325.41TrueIdentity

يبلغ YOLO26n عن reg_max=1، وend2end=True، وطبقة DFL Identity — التوقيع المعماري لرأسه الخالي من NMS والخالي من DFL.

أعداد مدمجة مقابل غير مدمجة

يتم الإبلاغ عن قيم المعلمات وFLOPs للنموذج المدمج (model.fuse())، والذي يدمج كل Conv وطبقة التطبيع الدفعي الخاصة بها. يتطابق هذا مع المواصفات المنشورة؛ يبلغ نقطة التفتيش المحملة حديثًا عن أعداد أعلى قليلاً قبل الدمج.

الخلاصة#

عبر الإصدارات، تغيرت بنيات YOLO مرحلة واحدة تلو الأخرى: انتقل العمود الفقري من Darknet-53 إلى كتل C3 وC2f وC3k2 المعتمدة على CSP مع انتباه C2PSA؛ حافظ العنق على هيكل FPN + PAN الخاص به بينما أصبح SPP هو SPPF؛ وانتقل الرأس من المستند إلى المراسي إلى الخالي من المراسي، ثم إلى تصميم YOLO26 الشامل الخالي من NMS وخالي من DFL.

لتعريف بنيات مخصصة، راجع دليل تكوين نموذج YAML، أو قارن النماذج على صفحات النماذج. للاستفسارات، تواصل معنا على GitHub أو Discord.

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

  • يحتوي نموذج YOLO على عمود فقري (backbone) يستخرج الميزات من الصورة بخطوات 8 و16 و32، ورقبة (neck) تدمج تلك الميزات عبر المقاييس باستخدام FPN وPAN، ورأس (head) يتنبأ بصناديق الإحاطة (bounding boxes) ونتائج التصنيف. يتبع كل نموذج Ultralytics YOLO من YOLOv3 إلى YOLO26 هذا التصميم المكون من ثلاث مراحل.

  • C2f (YOLOv8) هي كتلة CSP تربط مخرجات كل Bottleneck داخلي — خريطات ميزات n + 2 — قبل التفاف الدمج الخاص بها، حيث يمرر C3 الأقدم 2 فقط. C3k2 (YOLO11 وYOLO26) هي فئة فرعية من C2f يمكنها استبدال كل Bottleneck بكتلة C3k (متغير C3 بحجم نواة قابل للتكوين) عند تعيين علامة c3k الخاصة بها. كلاهما معرف في block.py.

  • يجري YOLO11 ثلاثة تغييرات هيكلية على YOLOv8: حيث يستبدل العمود الفقري وكتلة العنق لـ C2f بـ C3k2، ويدرج كتلة انتباه ذاتي C2PSA بعد SPPF، ويحول فرع التصنيف الخاص برأس النموذج إلى عمليات التفاف أخف قابلة للفصل حسب العمق. يحافظ كلاهما على نفس رأس Detect المنفصل وغير المرتبط بالمراسي مع انحدار DFL reg_max=16، وبالتالي تخفض التغييرات عدد المعلمات والعمليات الحسابية (FLOPs) مع رفع الدقة بدلاً من إعادة تصميم واجهة الكشف.

  • نماذج Ultralytics YOLO الحديثة خالية من المراسي. تستخدم YOLOv8 وYOLO11 وYOLO26 رأس Detect خاليًا من المراسي ومفصولاً مع فروع منفصلة لانحدار المربعات والتصنيف. كانت YOLOv3 وYOLOv5 الأصليتان تعتمدان على المراسي، لكن Ultralytics تشحنهما كمتغيرين YOLOv3u وYOLOv5u، تستخدم تكوينهما نفس الرأس الخالي من المراسي مثل YOLOv8.

  • نعم — تقوم YOLO26 بتعيين end2end=True، مما يمنح Detect رأسًا واحدًا لواحد ينتج تنبؤًا واحدًا لكل كائن ويزيل خطوة المعالجة اللاحقة لإلغاء القمع غير الأقصى المطلوبة بواسطة النماذج الأقدم. راجع دليل الكشف الشامل للحصول على التفاصيل.

  • يقوم 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 وend2end. البنية الكاملة معرفة في ملف تكوين YAML الخاص بالنموذج.

المساهمون

التعليقات