دليل إعدادات YAML للنموذج#
يُعد ملف إعدادات YAML للنموذج المخطط المعماري للشبكات العصبية من Ultralytics. ويحدد كيفية اتصال الطبقات، والمعلمات التي تستخدمها كل وحدة، وكيفية تحجيم الشبكة بالكامل لتناسب أحجام النماذج المختلفة.
بنية الإعدادات#
تُنظَّم ملفات YAML للنموذج في ثلاثة أقسام رئيسية تعمل معًا لتحديد البنية.
قسم المعلمات#
يحدد قسم parameters الخصائص العامة للنموذج وسلوكه عند التحجيم:
# Parameters
nc: 80 # number of classes
scales: # compound scaling constants [depth, width, max_channels]
n: [0.50, 0.25, 1024] # nano: shallow layers, narrow channels
s: [0.50, 0.50, 1024] # small: shallow depth, standard width
m: [0.50, 1.00, 512] # medium: moderate depth, full width
l: [1.00, 1.00, 512] # large: full depth and width
x: [1.00, 1.50, 512] # extra-large: maximum performance
kpt_shape: [17, 3] # pose models only- يحدد
ncعدد الفئات التي يتنبأ بها النموذج. - يحدد
scalesعوامل التحجيم المركب التي تضبط عمق النموذج وعرضه والحد الأقصى للقنوات لإنتاج متغيرات بأحجام مختلفة (من النانوي إلى الكبير جدًا). - ينطبق
kpt_shapeعلى نماذج تقدير الوضعيات. ويمكن أن يكون[N, 2]لـ(x, y)من النقاط المفتاحية أو[N, 3]لـ(x, y, visibility).
تتيح لك المعلمة scales إنشاء نماذج متعددة الأحجام من ملف YAML أساسي واحد. على سبيل المثال، عند تحميل yolo26n.yaml، يقرأ Ultralytics الملف الأساسي yolo26.yaml ويطبّق عوامل التحجيم n (depth=0.50، width=0.25) لإنشاء المتغير النانوي.
إذا حددت مجموعة البيانات قيمة مختلفة لـ nc أو kpt_shape، فسيُجري Ultralytics تلقائيًا تجاوزًا لإعدادات النموذج أثناء التشغيل لتتوافق مع ملف YAML لمجموعة البيانات.
بنية العمود الفقري والرأس#
تتكون بنية النموذج من قسمي العمود الفقري (استخراج الميزات) والرأس (المخصص للمهمة):
nc: 80
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0: Initial convolution
- [-1, 1, Conv, [128, 3, 2]] # 1: Downsample
- [-1, 3, C2f, [128, True]] # 2: Feature processing
head:
- [-1, 1, nn.Upsample, [None, 2, nearest]] # 3: Upsample
- [[-1, 0], 1, Concat, [1]] # 4: Spatially compatible skip connection
- [-1, 3, C2f, [256]] # 5: Process features
- [[5], 1, Detect, [nc]] # 6: Detection layerتستمر فهارس الطبقات عبر العمود الفقري والرأس، ويجب أن تتطابق الأبعاد المكانية لخرائط الميزات التي تُدمج.
تنسيق مواصفات الطبقة#
تتبع كل طبقة النمط الموحد التالي: [from, repeats, module, args]
| المكوّن | الغرض | أمثلة |
|---|---|---|
| from | اتصالات الإدخال | -1 (السابقة)، 6 (الطبقة 6)، [4, 6, 8] (إدخالات متعددة) |
| repeats | عدد مرات التكرار | 1 (مرة واحدة)، 3 (تكرار 3 مرات) |
| module | نوع الوحدة | Conv, C2f, TorchVision, Detect |
| args | وسيطات الوحدة | [64, 3, 2] (القنوات، حجم النواة، الخطوة) |
أنماط الاتصال#
ينشئ الحقل from أنماطًا مرنة لتدفق البيانات في شبكتك:
- [-1, 1, Conv, [64, 3, 2]] # Takes input from previous layerتبدأ فهرسة الطبقات من 0. وتشير الفهارس السالبة إلى الطبقات السابقة (-1 = الطبقة السابقة)، بينما تشير الفهارس الموجبة إلى طبقات محددة بحسب مواضعها.
تكرار الوحدة#
تنشئ المعلمة repeats أقسامًا أعمق في الشبكة:
- [-1, 3, C2f, [128, True]] # Creates 3 consecutive C2f blocks
- [-1, 1, Conv, [64, 3, 2]] # Single convolution layerيُضرب عدد مرات التكرار الفعلي في عامل تحجيم العمق المحدد في إعدادات حجم النموذج.
الوحدات المتاحة#
تُنظَّم الوحدات بحسب وظائفها وتُعرَّف في دليل وحدات Ultralytics. تعرض الجداول التالية وحدات شائعة الاستخدام حسب الفئة، ويتوفر الكثير غيرها في الشيفرة المصدرية:
العمليات الأساسية#
| الوحدة | الغرض | المصدر | الوسيطات |
|---|---|---|---|
Conv | التفاف + BatchNorm + تنشيط | conv.py | [out_ch, kernel, stride, pad, groups] |
nn.Upsample | رفع الدقة المكانية | PyTorch | [size, scale_factor, mode] |
nn.Identity | عملية تمرير دون تغيير | PyTorch | [] |
الكتل المركبة#
| الوحدة | الغرض | المصدر | الوسيطات |
|---|---|---|---|
C2f | عنق زجاجة CSP مع عمليتي التفاف | block.py | [out_ch, shortcut, groups, expansion] |
SPPF | تجميع هرمي مكاني (سريع) | block.py | [out_ch, kernel_size] |
Concat | دمج بحسب القنوات | conv.py | [dimension] |
الوحدات المتخصصة#
| الوحدة | الغرض | المصدر | الوسيطات |
|---|---|---|---|
TorchVision | تحميل أي نموذج من torchvision | block.py | [out_ch, model_name, weights, unwrap, truncate, split] |
Index | استخراج موتر محدد من قائمة | conv.py | [out_ch, index] |
Detect | رأس كشف YOLO | head.py | [nc] |
يمثل هذا مجموعة فرعية من الوحدات المتاحة. للاطلاع على القائمة الكاملة للوحدات ومعلماتها، استكشف دليل الوحدات.
الميزات المتقدمة#
التكامل مع TorchVision#
تتيح وحدة TorchVision دمج أي نموذج TorchVision بسلاسة بوصفه عمودًا فقريًا:
from ultralytics import YOLO
# نموذج بعمود فقري ConvNeXt
model = YOLO("convnext_backbone.yaml")
results = model.train(data="imagenet10", epochs=100)اضبط المعلمة الأخيرة على True للحصول على خرائط ميزات وسيطة للكشف متعدد المقاييس.
وحدة Index لاختيار الميزات#
عند استخدام نماذج تُخرج خرائط ميزات متعددة، تختار وحدة Index مخرجات محددة:
nc: 80
backbone:
- [-1, 1, TorchVision, [768, convnext_tiny, DEFAULT, True, 2, True]] # Multi-output
head:
- [0, 1, Index, [192, 4]] # Select 4th feature map (192 channels)
- [0, 1, Index, [384, 6]] # Select 6th feature map (384 channels)
- [0, 1, Index, [768, 8]] # Select 8th feature map (768 channels)
- [[1, 2, 3], 1, Detect, [nc]] # Multi-scale detectionنظام تحديد الوحدات#
يُعد فهم كيفية تحديد Ultralytics لمواقع الوحدات واستيرادها أمرًا أساسيًا للتخصيص:
آلية البحث عن الوحدات#
يستخدم Ultralytics نظامًا من ثلاث طبقات في parse_model:
# منطق تحديد الوحدات الأساسي
m = (
getattr(torch.nn, m[3:])
if m.startswith("nn.")
else getattr(__import__("torchvision").ops, m[16:])
if m.startswith("torchvision.ops.")
else globals()[m]
) # الحصول على الوحدة- وحدات PyTorch: الأسماء التي تبدأ بـ
'nn.'← مساحة الأسماءtorch.nn - عمليات TorchVision: الأسماء التي تبدأ بـ
'torchvision.ops.'← مساحة الأسماءtorchvision.ops - وحدات Ultralytics: جميع الأسماء الأخرى ← المساحة العامة عبر عمليات الاستيراد
سلسلة استيراد الوحدات#
تصبح الوحدات القياسية متاحة عبر عمليات الاستيراد في tasks.py:
from ultralytics.nn.modules import ( # noqa: F401
SPPF,
C2f,
Conv,
Detect,
# ... وحدات كثيرة أخرى
Index,
TorchVision,
)دمج الوحدات المخصصة#
تعديل الشيفرة المصدرية#
يُعد تعديل الشيفرة المصدرية الطريقة الأكثر مرونة لدمج وحداتك المخصصة، لكنه قد يكون صعبًا. لتعريف وحدة مخصصة واستخدامها، اتبع الخطوات التالية:
-
ثبّت Ultralytics في وضع التطوير باستخدام طريقة استنساخ Git الواردة في دليل البدء السريع.
-
عرّف وحدتك في
ultralytics/nn/modules/block.py:class CustomBlock(nn.Module): """Custom block with Conv-BatchNorm-ReLU sequence.""" def __init__(self, c1, c2): """Initialize CustomBlock with input and output channels.""" super().__init__() self.layers = nn.Sequential(nn.Conv2d(c1, c2, 3, 1, 1), nn.BatchNorm2d(c2), nn.ReLU()) def forward(self, x): """Forward pass through the block.""" return self.layers(x) -
اجعل وحدتك متاحة على مستوى الحزمة في
ultralytics/nn/modules/__init__.py:from .block import CustomBlock # noqa makes CustomBlock available as ultralytics.nn.modules.CustomBlock -
أضف عمليات الاستيراد في
ultralytics/nn/tasks.py:from ultralytics.nn.modules import CustomBlock # noqa -
أضف الوحدة إلى
base_modulesداخلparse_model(). تحصل الوحدات في هذه المجموعة تلقائيًا على قنوات الإدخال والإخراج:base_modules = frozenset( { # الوحدات الحالية... CustomBlock, } ) -
استخدم الوحدة في ملف YAML للنموذج:
# custom_model.yaml nc: 1 backbone: - [-1, 1, CustomBlock, [64]] head: - [-1, 1, Classify, [nc]] -
تحقق من FLOPs للتأكد من عمل المرور الأمامي:
from ultralytics import YOLO model = YOLO("custom_model.yaml", task="classify") model.info() # ينبغي أن يطبع قيمة FLOPs غير صفرية إذا كان يعمل
أمثلة على الإعدادات#
نموذج كشف أساسي#
# Simple YOLO detection model
nc: 80
scales:
n: [0.33, 0.25, 1024]
backbone:
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]] # 2
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]] # 4
- [-1, 1, SPPF, [256, 5]] # 5
head:
- [-1, 1, Conv, [256, 3, 1]] # 6
- [[6], 1, Detect, [nc]] # 7نموذج ذو عمود فقري من TorchVision#
# ConvNeXt backbone with YOLO head
nc: 80
backbone:
- [-1, 1, TorchVision, [768, convnext_tiny, DEFAULT, True, 2, True]]
head:
- [0, 1, Index, [192, 4]] # P3 features
- [0, 1, Index, [384, 6]] # P4 features
- [0, 1, Index, [768, 8]] # P5 features
- [[1, 2, 3], 1, Detect, [nc]] # Multi-scale detectionنموذج تصنيف#
# Simple classification model
nc: 1000
backbone:
- [-1, 1, Conv, [64, 7, 2, 3]]
- [-1, 1, nn.MaxPool2d, [3, 2, 1]]
- [-1, 4, C2f, [64, True]]
- [-1, 1, Conv, [128, 3, 2]]
- [-1, 8, C2f, [128, True]]
head:
- [-1, 1, Classify, [nc]]يجري Classify بالفعل تجميعًا متوسطًا تكيفيًا داخليًا.
أفضل الممارسات#
نصائح لتصميم البنية#
ابدأ ببساطة: ابدأ بالبنى المثبتة قبل تخصيصها. استخدم إعدادات YOLO الحالية كقوالب، وأجرِ التعديلات تدريجيًا بدلًا من البناء من الصفر.
اختبر تدريجيًا: تحقّق من صحة كل تعديل خطوةً بخطوة. أضف وحدة مخصصة واحدة في كل مرة، وتأكد من عملها قبل الانتقال إلى التغيير التالي.
راقب القنوات: تأكد من تطابق أبعاد القنوات بين الطبقات المتصلة. يجب أن تطابق قنوات الإخراج (c2) لإحدى الطبقات قنوات الإدخال (c1) للطبقة التالية في التسلسل.
استخدم الوصلات التخطيّة: استفد من إعادة استخدام السمات باستخدام أنماط [[-1, N], 1, Concat, [1]]. تساعد هذه الوصلات على تدفق التدرجات، وتمكّن النموذج من دمج السمات من مقاييس مختلفة.
اختر المقياس المناسب: اختر مقاييس النموذج استنادًا إلى قيودك الحسابية. استخدم مقياس nano (n) للأجهزة الطرفية، وsmall (s) لتحقيق أداء متوازن، والمقاييس الأكبر (m، l، x) لتحقيق أقصى دقة.
اعتبارات الأداء#
العمق مقابل العرض: تستخرج الشبكات العميقة سمات هرمية معقدة عبر طبقات تحويل متعددة، بينما تعالج الشبكات العريضة معلومات أكثر بالتوازي في كل طبقة. وازن بينهما وفقًا لتعقيد مهمتك.
الوصلات التخطيّة: تحسّن تدفق التدرجات أثناء التدريب، وتتيح إعادة استخدام السمات في جميع أنحاء الشبكة. وهي مهمة بوجه خاص في البنى الأعمق لمنع تلاشي التدرجات.
كتل عنق الزجاجة: تقلل التكلفة الحسابية مع الحفاظ على قدرة النموذج التعبيرية. تستخدم وحدات مثل C2f معلمات أقل من الالتفافات القياسية، مع الحفاظ على قدرة تعلم السمات.
السمات متعددة المقاييس: ضرورية لكشف الكائنات ذات الأحجام المختلفة في الصورة نفسها. استخدم أنماط شبكة هرم السمات (FPN) مع رؤوس كشف متعددة بمقاييس مختلفة.
استكشاف الأخطاء وإصلاحها#
المشكلات الشائعة#
| المشكلة | السبب | الحل |
|---|---|---|
KeyError: 'ModuleName' | لم يتم استيراد الوحدة | أضف إلى عمليات الاستيراد في tasks.py |
| عدم تطابق أبعاد القنوات | مواصفات args غير صحيحة | تحقّق من توافق قنوات الإدخال والإخراج |
AttributeError: 'int' object has no attribute | نوع الوسيطة غير صحيح | راجع وثائق الوحدة لمعرفة أنواع الوسائط الصحيحة |
| فشل إنشاء النموذج | مرجع from غير صالح | تأكد من وجود الطبقات المشار إليها |
نصائح لتصحيح الأخطاء#
عند تطوير بنى مخصصة، يساعد التصحيح المنهجي على اكتشاف المشكلات مبكرًا:
استخدم رأس الهوية للاختبار
استبدل الرؤوس المعقدة بـ nn.Identity لعزل مشكلات العمود الفقري:
nc: 1
backbone:
- [-1, 1, CustomBlock, [64]]
head:
- [-1, 1, nn.Identity, []] # Pass-through for debuggingيتيح ذلك فحص مخرجات العمود الفقري مباشرةً:
import torch
from ultralytics import YOLO
model = YOLO("debug_model.yaml", task="detect")
output = model.model(torch.randn(1, 3, 640, 640))
print(f"Output shape: {output.shape}") # Should match expected dimensionsفحص بنية النموذج
يمكن أن يساعد التحقق من عدد FLOPs وطباعة كل طبقة أيضًا في تصحيح المشكلات في إعداد النموذج المخصص. ينبغي أن يكون عدد FLOPs غير صفري للنموذج الصالح. إذا كان صفرًا، فمن المرجح وجود مشكلة في المرور الأمامي. ينبغي أن يكشف تنفيذ مرور أمامي بسيط عن الخطأ المحدد الذي يحدث.
from ultralytics import YOLO
# Build model with verbose output to see layer details
model = YOLO("debug_model.yaml", task="detect", verbose=True)
# Check model FLOPs. Failed forward pass causes 0 FLOPs.
model.info()
# Inspect individual layers
for i, layer in enumerate(model.model.model):
print(f"Layer {i}: {layer}")التحقق خطوةً بخطوة
- ابدأ بأبسط ما يمكن: اختبر أولًا أبسط بنية ممكنة
- أضف تدريجيًا: ابنِ التعقيد طبقةً تلو الأخرى
- تحقّق من الأبعاد: تأكد من توافق القنوات والأبعاد المكانية
- تحقّق من القياس: اختبر مقاييس نموذج مختلفة (
n،s،m)
الأسئلة الشائعة#
اضبط المعلمة
ncفي أعلى ملف YAML لتطابق عدد الفئات في مجموعة بياناتك.nc: 5 # 5 classesنعم. يمكنك استخدام أي وحدة مدعومة، بما في ذلك أعمدة TorchVision الفقرية، أو تعريف وحدة مخصصة خاصة بك واستيرادها كما هو موضح في دمج الوحدات المخصصة.
استخدم قسم
scalesفي ملف YAML لتعريف عوامل قياس العمق والعرض والحد الأقصى للقنوات. سيطبقها النموذج تلقائيًا عند تحميل ملف YAML الأساسي مع إلحاق المقياس باسم الملف (مثلًا،yolo26n.yaml).يحدد هذا التنسيق كيفية إنشاء كل طبقة:
from: مصدر الإدخال (المصادر)repeats: عدد مرات تكرار الوحدةmodule: نوع الطبقةargs: وسيطات الوحدة
تحقّق من تطابق قنوات الإخراج لطبقة ما مع قنوات الإدخال المتوقعة للطبقة التالية. استخدم
print(model.model.model)لفحص بنية نموذجك.راجع الشيفرة المصدرية في الدليل
ultralytics/nn/modulesللاطلاع على جميع الوحدات المتاحة ووسائطها.عرّف وحدتك في الشيفرة المصدرية، واستوردها كما هو موضح في تعديل الشيفرة المصدرية، ثم أشر إليها باسمها في ملف YAML.
نعم، يمكنك استخدام
model.load("path/to/weights")لتحميل الأوزان من نقطة تحقق مدرّبة مسبقًا. لكن لن تُحمّل بنجاح إلا أوزان الطبقات المتطابقة.استخدم
model.info()للتحقق من أن عدد FLOPs غير صفري. ينبغي أن يُظهر النموذج الصالح عدد FLOPs غير صفري. إذا كان صفرًا، فاتبع الاقتراحات الواردة في نصائح تصحيح الأخطاء للعثور على المشكلة.