Link to this sectionشرح بنية 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 مع مضاعفات العمق والعرض للمتغير - جنبًا إلى جنب مع نظام تحليل الوحدة بالكامل. يركز هذا الدليل على الوحدات نفسها وكيف تغيرت من إصدار إلى آخر.
Link to this sectionالمراحل الثلاث#
يوجه كل نموذج Ultralytics YOLO الصورة عبر ثلاث مراحل متسلسلة، كل منها له وظيفة متميزة:
| المرحلة | الوظيفة | المخرجات |
|---|---|---|
| Backbone | استخراج الميزات من صورة الإدخال بدقة متعددة | خرائط الميزات عند الخطوات 8، 16، و 32 (P3، P4، P5) |
| Neck | دمج الميزات عبر المقاييس بحيث يكون للأجسام الصغيرة والكبيرة سياق | خرائط الميزات المدمجة متعددة المقاييس |
| Head | التنبؤ بمربعات الإحاطة ونتائج الفئات من الميزات المدمجة | الاكتشافات لكل نقطة ارساء |
الوحدة الأساسية هي كتلة Conv (المحددة في conv.py): التفاف ثنائي الأبعاد، batch normalization، وتنشيط SiLU، مطبقة بالتسلسل. يتم بناء كل وحدة أكبر أدناه من خلال تكوين كتل Conv.
Link to this sectionمخططات البنية#
يحتفظ كل إصدار بنفس هيكل backbone → neck → head ويغير مراحل محددة. تظهر علامات التبويب أدناه البنية لكل إصدار: تتبع مراحل backbone و neck التكوينات في ultralytics/cfg/models/، بينما يتم رسم رؤوس YOLOv3 و YOLOv5 في شكلها الأصلي المستند إلى الارتساء بدلاً من رأس u-variant الخالي من الارتساء الذي تشحنه تكوينات الحزمة الخاصة بهم بالفعل. يوضح التنقل عبر علامات التبويب ما أضافه كل جيل. باختصار، التطور هو: YOLOv3 هو كاشف يعتمد على الارتساء ويقتصر على FPN فقط؛ يضيف YOLOv5 مسار PAN السفلي و SPPF؛ يتحول YOLOv8 إلى كتلة C2f مع رأس خالي من الارتساء DFL؛ يدرج YOLO11 انتباه C2PSA وكتلة C3k2؛ ويضيف YOLO26 بقايا SPPF ويجعل الرأس خاليًا من NMS وخاليًا من DFL. تتبع ألوان العقدة اتفاقية مخطط التوثيق: إدخال أخضر، backbone أزرق، تجميع مكاني وانتباه رمادي، neck برتقالي، رأس ومخرج بنفسجي.
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 — الموصوفة تحت رأس الاكتشاف.
Link to this sectionكتل Backbone: Bottleneck → C3 → C2f → C3k2#
يقوم الـ backbone بتكديس كتلة CSP (جزئية عبر المرحلة) متكررة بين طبقات أخذ العينات الفرعية Conv ذات الخطوة 2. تلك الكتلة المتكررة هي التي تغيرت أكثر عبر الإصدارات. تعيش جميع الكتل أدناه في block.py; c1/c2 هي قنوات الإدخال/الإخراج و c = 0.5 * c2 هو العرض المخفي.
Link to this sectionBottleneck (YOLOv3)#
الوحدة الأساسية هي Bottleneck: طبقتان Conv (نواة افتراضية (3, 3)) مع إضافة بقايا اختيارية عندما يكون shortcut=True و c1 == c2. يقوم backbone Darknet-53 الخاص بـ YOLOv3 بتكديس هذه مباشرة، بدون تقسيم CSP، ويكتشف على ثلاثة مقاييس (خطوات 8، 16، 32).
Link to this sectionC3 (YOLOv5)#
YOLOv5's C3 splits the input across two 1x1 convolutions: cv1 feeds n sequential Bottleneck blocks (kernels (1, 1) then (3, 3)), cv2 bypasses them. The two paths are concatenated and fused by a third 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))فقط مخرج الـ bottleneck النهائي يصل إلى التفاف الدمج، لذا يرى cv3 خرائط ميزتين.
Link to this sectionC2f (YOLOv8)#
YOLOv8's C2f ("CSP Bottleneck with 2 convolutions, faster") changes which features reach the fusion conv:
cv1 = Conv(c1, 2 * c, 1)، ثم تقومchunk(2)بتقسيم المخرج إلى اثنين من موترات القنواتc.- تعمل
nمن كتلBottleneck(c, c)(نواة(3, 3),(3, 3)) بالتسلسل، حيث يتم تغذية كل منها بمخرج الكتلة السابقة. - يتم ربط جميع الموترات الوسيطة
n + 2ودمجها بواسطةcv2 = Conv((2 + n) * c, c2, 1).
حيث يمرر C3 خرائط ميزتين إلى التفاف الدمج الخاص به، يمرر C2f عدد n + 2 — يتم إعادة استخدام كل مخرج bottleneck وسيط.
Link to this sectionC3k2 (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، قبل أن يتم قياسه بواسطة مضاعف عمق المتغير - هو عدد التكرار الداخلي للكتلة بدلاً من تكديس وحدات منفصلة.
Link to this sectionالتجميع المكاني: SPP → SPPF#
At the end of the backbone, a spatial-pyramid-pooling block widens the receptive field. YOLOv5 replaced the original multi-kernel SPP with SPPF (Spatial Pyramid Pooling - Fast): a single MaxPool2d(kernel_size=5, stride=1, padding=2) applied n = 3 times in sequence, with the input and all three pooled outputs concatenated and fused by a 1x1 Conv. This is mathematically equivalent to SPP(k=(5, 9, 13)) but cheaper, because the chained 5x5 pools cover the larger kernels' receptive fields.
يمرر YOLO26 علم اختصار (SPPF, [1024, 5, 3, True]); نظرًا لأن c1 == c2 == 1024 في الطبقة الأكثر عمقًا، يضيف SPPF اتصال بقايا (return y + x).
Link to this sectionالانتباه المكاني: 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 بنفس backbone C3k2 + C2PSA.
Link to this sectionNeck: FPN + PAN#
يقوم الـ neck بدمج خرائط ميزات P3/P4/P5 الخاصة بـ backbone مع شبكة هرمية للميزات (FPN) من الأعلى إلى الأسفل متبوعة بشبكة تجميع مسار (PAN) من الأسفل إلى الأعلى. في قسم رأس YAML، FPN هو nn.Upsample + Concat (نقل المعلومات الدلالية إلى دقة أعلى) و PAN هو Conv خطوة 2 + Concat (نقل معلومات التوطين مرة أخرى إلى الأعلى):
# 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يعيد الـ neck استخدام كتلة backbone الخاصة بجيله - C3 في YOLOv5، C2f في YOLOv8، C3k2 في YOLO11 و YOLO26 - لذا تعمل كل نقطة دمج بنفس الوحدة التي يستخدمها backbone. تغذي المخرجات المدمجة الثلاثة الرأس. YOLOv3 هو الاستثناء: الـ neck الخاص به هو FPN من الأعلى إلى الأسفل فقط (رأس YAML الخاص به لا يحتوي على أخذ عينات فرعية خطوة 2)، بدون مسار PAN من الأسفل إلى الأعلى الذي قدمه YOLOv5.
Link to this sectionرأس الاكتشاف: مستند إلى الارتساء → خالي من الارتساء → خالي من NMS#
يحول الرأس خرائط الميزات الثلاث المدمجة إلى تنبؤات لـ مهمة الاكتشاف. لقد تغير تصميمه عبر الإصدارات، من مستند إلى الارتساء إلى خالي من الارتساء إلى خالي من NMS.
Link to this sectionرأس 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 مخرجًا. تؤدي إزالة الارتساء المحددة مسبقًا إلى إسقاط أحجام ونسب مربعات الارتساء من المعلمات الفائقة التي يجب ضبطها.
Link to this sectionخسارة التنسيق التوزيعي (DFL)#
يقوم YOLOv8 و YOLO11 بتنظيم كل من إحداثيات المربع الأربعة كتوزيع عبر reg_max = 16 حاوية بدلاً من قياس واحد (الشكل التكاملي من Generalized Focal Loss). تعيد وحدة DFL تشكيل قنوات المربع 4 * reg_max إلى (4, reg_max)، وتطبق softmax عبر حاويات reg_max، وتأخذ فهرس الحاوية المتوقع - كل فهرس حاوية مرجح باحتمالية softmax الخاصة به، ثم مجموعها - كإحداثي متوقع. يتم تنفيذ هذا كتفافة 1x1 ثابتة أوزانها هي فهارس الحاوية arange(reg_max)، لذا فإن المجموع المرجح هو ناتج نقطي واحد.
Link to this sectionYOLO26: خالي من NMS، خالي من DFL#
يضبط YOLO26 معلمتي YAML يقرأهما الرأس مباشرة:
end2end: True- ينسخDetectفروعه بعمق إلى رأس واحد لواحد (one2one_cv2/one2one_cv3) ينتج تنبؤًا واحدًا لكل كائن، مما يزيل خطوة المعالجة اللاحقة Non-Maximum Suppression (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 عند 1.7-11.8 مللي ثانية T4 TensorRT زمن الوصول، كما هو مذكور في ورقة YOLO26.
Link to this sectionملخص إصدار تلو الآخر#
| الإصدار | كتلة Backbone | التجميع المكاني | الانتباه | رأس الاكتشاف | 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 (end2end) | تمت إزالته (reg_max=1) |
للحصول على تفاصيل كل نموذج، وجداول الأداء، وأمثلة الاستخدام، راجع الصفحات الفردية لـ YOLOv3, YOLOv5, YOLOv8, YOLO11, و YOLO26.
Link to this sectionافحص البنية بنفسك#
تطبع طريقة model.info() ملخصًا للطبقة، والمعلمة، و FLOPs، وقائمة الوحدات المحللة متاحة على model.model.model.
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 المنشورة على كل صفحة نموذج:
| النموذج | الطبقات | المعاملات | GFLOPs | reg_max | end2end | طبقة DFL |
|---|---|---|---|---|---|---|
| YOLOv8n | 72 | 3,151,904 | 8.7 | 16 | False | DFL |
| YOLO11n | 100 | 2,616,248 | 6.5 | 16 | False | DFL |
| YOLO26n | 122 | 2,408,932 | 5.4 | 1 | True | Identity |
يُبلغ YOLO26n عن reg_max=1, end2end=True, وطبقة DFL Identity — التوقيع المعماري لرأسه الخالي من NMS والخالي من DFL.
يتم الإبلاغ عن قيم المعلمات وFLOPs للنموذج المدمج (model.fuse())، الذي يدمج كل طبقة Conv مع طبقة التسوية الدفعية الخاصة بها. يتطابق هذا مع المواصفات المنشورة؛ حيث يبلغ نقطة الفحص المحملة حديثًا عن أعداد أعلى قليلاً قبل الدمج.
Link to this sectionالخلاصة#
عبر الإصدارات، تغيرت بنية YOLO مرحلة تلو الأخرى: انتقل العمود الفقري (backbone) من Darknet-53 إلى كتل C3 وC2f وC3k2 القائمة على CSP مع آلية الانتباه C2PSA؛ احتفظ الرقبة (neck) بهيكلها FPN + PAN بينما تحول SPP إلى SPPF؛ وانتقل الرأس (head) من الاعتماد على المرساة (anchor-based) إلى كونه خالٍ من المرساة، ثم إلى تصميم YOLO26 المتكامل الخالي من NMS والخالي من DFL.
لتحديد بنيات مخصصة، راجع دليل تكوين YAML للنموذج، أو قارن النماذج في صفحات النماذج. للاستفسارات، تواصل معنا على GitHub أو Discord.
Link to this sectionالأسئلة الشائعة#
Link to this sectionما هي المراحل الثلاث لبنية YOLO؟#
يحتوي نموذج YOLO على عمود فقري (backbone) يستخرج الميزات من الصورة بخطوات 8 و16 و32، ورقبة (neck) تدمج تلك الميزات عبر المقاييس باستخدام FPN وPAN، ورأس (head) يتنبأ بصناديق الإحاطة (bounding boxes) ونتائج التصنيف. يتبع كل نموذج Ultralytics YOLO من YOLOv3 إلى YOLO26 هذا التصميم المكون من ثلاث مراحل.
Link to this sectionما الفرق بين كتل C2f وC3k2؟#
C2f (في YOLOv8) هي كتلة CSP تقوم بدمج مخرجات كل Bottleneck داخلي — n + 2 من خرائط الميزات — قبل عملية الالتفاف (convolution) الخاصة بالدمج، حيث تمرر C3 الأقدم 2 فقط. C3k2 (في YOLO11 وYOLO26) هي فئة فرعية من C2f يمكنها استبدال كل Bottleneck بكتلة C3k (متغير من C3 مع حجم نواة قابل للتكوين) عندما يتم ضبط علامة c3k الخاصة بها. كلاهما محدد في block.py.
Link to this sectionما الذي تغير في البنية بين YOLOv8 وYOLO11؟#
أجرت YOLO11 ثلاثة تغييرات هيكلية على YOLOv8: استبدلت كتلة العمود الفقري والرقبة C2f بـ C3k2، وأدرجت كتلة الانتباه الذاتي C2PSA بعد SPPF، وحولت فرع التصنيف في الرأس إلى التفاتات أخف قابلة للفصل بعمق (depthwise-separable). كلاهما يحتفظ بنفس الرأس Detect غير المعتمد على المرساة والمفكك مع انحدار reg_max=16 DFL، لذا فإن التغييرات تقلل من أعداد المعلمات وFLOPs مع زيادة الدقة بدلاً من إعادة تصميم واجهة الكشف.
Link to this sectionهل YOLO خالية من المرساة (anchor-free)؟#
نماذج Ultralytics YOLO الحديثة خالية من المرساة. تستخدم YOLOv8 وYOLO11 وYOLO26 رأس Detect غير معتمد على المرساة ومفكك مع فروع منفصلة لانحدار الصندوق والتصنيف. كانت نماذج YOLOv3 وYOLOv5 الأصلية تعتمد على المرساة، لكن Ultralytics توفرها كإصدارات YOLOv3u وYOLOv5u، والتي تستخدم ملفات تكوينها نفس الرأس الخالي من المرساة مثل YOLOv8.
Link to this sectionهل أزالت YOLO26 خاصية NMS؟#
نعم — تقوم YOLO26 بضبط end2end=True، مما يمنح Detect رأساً من واحد إلى واحد ينتج تنبؤاً واحداً لكل كائن ويزيل خطوة المعالجة اللاحقة غير القصوى (Non-Maximum Suppression) المطلوبة من قبل النماذج السابقة. راجع دليل الكشف المتكامل (End-to-End) للحصول على التفاصيل.
Link to this sectionما هو فقدان التوزيع البؤري (DFL) ولماذا أزالته YOLO26؟#
يقوم DFL بانحدار كل إحداثي صندوق كتوزيع softmax عبر صناديق reg_max (16 افتراضياً في YOLOv8 وYOLO11) ويأخذ القيمة المتوقعة كإحداثي، بدلاً من التنبؤ بعدد عددي واحد. تضبط YOLO26 قيمة reg_max=1، لذا تصبح طبقة DFL عملية هوية، ويقوم الرأس بانحدار الإحداثيات مباشرة، ولا تظهر أي عملية DFL في رسوم ONNX أو TensorRT المصدرة.
Link to this sectionكيف يمكنني رؤية بنية نموذج YOLO معين؟#
قم بتحميل النموذج في Python واستدعِ model.info() للحصول على ملخص للطبقة والمعلمات وGFLOPs. توجد الطبقات التي تم تحليلها في model.model.model — على سبيل المثال، model.model.model[-1] هو رأس Detect، الذي يكشف عن سمات مثل reg_max وend2end. البنية الكاملة محددة في ملف تكوين YAML الخاص بالنموذج.