دليل تكوين YAML للنموذج#
يعمل ملف تكوين YAML للنموذج كمخطط معماري للشبكات العصبية في Ultralytics. ويحدد كيفية اتصال الطبقات، والمعلمات التي تستخدمها كل وحدة، وكيفية تغيير حجم الشبكة بالكامل عبر أحجام النماذج المختلفة.
بنية التكوين#
تُنظَّم ملفات YAML للنموذج في ثلاثة أقسام رئيسية تعمل معًا لتعريف البنية.
قسم المعلمات#
يحدد قسم المعلمات الخصائص العامة للنموذج وسلوك تغيير حجمه:
# 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
# Model with ConvNeXt backbone
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:
# Core resolution logic
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]
) # get module- وحدات PyTorch: الأسماء التي تبدأ بـ
'nn.'← مساحة الأسماءtorch.nn - عمليات TorchVision: الأسماء التي تبدأ بـ
'torchvision.ops.'← مساحة الأسماءtorchvision.ops - وحدات Ultralytics: جميع الأسماء الأخرى ← المساحة العامة عبر عمليات الاستيراد
سلسلة استيراد الوحدات#
تتوفر الوحدات القياسية عبر عمليات الاستيراد في tasks.py:
from ultralytics.nn.modules import ( # noqa: F401
SPPF,
C2f,
Conv,
Detect,
# ... many more modules
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( { # Existing modules... 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() # should print non-zero FLOPs if working
أمثلة على الإعدادات#
نموذج كشف أساسي#
# 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]]. تساعد هذه الوصلات على تدفق التدرجات، وتتيح للنموذج دمج الميزات من مقاييس مختلفة.
وسّع النطاق على نحو مناسب: اختر مقاييس النموذج استنادًا إلى قيودك الحسابية. استخدم المقياس النانوي (n) للأجهزة الطرفية، والصغير (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 غير صفري. وإذا كان يساوي صفرًا، فاتبع الاقتراحات الواردة في نصائح تصحيح الأخطاء للعثور على المشكلة.