تهيئة نموذج 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
في scales
تتيح لك المعلمة إنشاء أحجام نماذج متعددة من YAML أساسي واحد. على سبيل المثال، عندما تقوم بتحميل yolo11n.yaml
،تقرأ Ultralytics القاعدة yolo11.yaml
ويطبق n
عوامل القياس (depth=0.50
, width=0.25
) لبناء متغير النانو.
nc
و kpt_shape
تعتمد على مجموعة البيانات
إذا كانت مجموعة البيانات الخاصة بك تحدد nc
أو kpt_shape
ستتجاوز Ultralytics تلقائيًا تكوين النموذج في وقت التشغيل لمطابقة مجموعة البيانات YAML.
بنية العمود الفقري والرأس
تتألف بنية النموذج من أقسام العمود الفقري (استخراج الميزة) والرأس (خاص بالمهمة):
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]] # 6: Upsample
- [[-1, 2], 1, Concat, [1]] # 7: Skip connection
- [-1, 3, C2f, [256]] # 8: Process features
- [[8], 1, Detect, [nc]] # 9: Detection layer
تنسيق مواصفات الطبقة
كل طبقة تتبع النمط المتسق: [from, repeats, module, args]
مكون | الغرض | أمثلة |
---|---|---|
من | توصيلات الإدخال | -1 (السابق), 6 (الطبقة 6), [4, 6, 8] (متعدد المدخلات) |
التكرار | عدد مرات التكرار | 1 (فردي), 3 (كرر 3 مرات) |
الوحدة | نوع الوحدة | Conv , C2f , TorchVision , Detect |
الحجج | وسيطات الوحدة النمطية | [64, 3, 2] (القنوات، النواة، الخطوة) |
أنماط الاتصال
في from
ينشئ الحقل أنماطاً مرنة لتدفق البيانات عبر شبكتك:
- [-1, 1, Conv, [64, 3, 2]] # Takes input from previous layer
- [[-1, 6], 1, Concat, [1]] # Combines current layer with layer 6
- [[4, 6, 8], 1, Detect, [nc]] # Detection head using 3 feature scales
فهرسة الطبقات
تتم فهرسة الطبقات بدءًا من 0. تشير المؤشرات السالبة إلى الطبقات السابقة (-1
= الطبقة السابقة)، بينما تشير المؤشرات الموجبة إلى طبقات محددة حسب موضعها.
تكرار الوحدة النمطية
في repeats
تنشئ المعلمة أقسام شبكة أعمق:
- [-1, 3, C2f, [128, True]] # Creates 3 consecutive C2f blocks
- [-1, 1, Conv, [64, 3, 2]] # Single convolution layer
يتم ضرب عدد التكرار الفعلي في عامل قياس العمق من تكوين حجم النموذج الخاص بك.
الوحدات المتوفرة
يتم تنظيم الوحدات النمطية حسب الوظيفة وتعريفها في دليل وحداتUltralytics . تُظهر الجداول التالية الوحدات النمطية الشائعة الاستخدام حسب الفئة، مع توفر العديد من الوحدات الأخرى في التعليمات البرمجية المصدرية:
العمليات الأساسية
الوحدة النمطية | الغرض | المصدر | الوسائط |
---|---|---|---|
Conv |
التحام + دفعة واحدة + دفعة واحدة + تنشيط | conv.py | [out_ch, kernel, stride, pad, groups] |
nn.Upsample |
أخذ العينات المكانية | PyTorch | [size, scale_factor, mode] |
nn.Identity |
عملية التمرير | PyTorch | [] |
الكتل المركبة
الوحدة النمطية | الغرض | المصدر | الوسائط |
---|---|---|---|
C2f |
عنق الزجاجة CSP مع 2 التواءات | كتلة.py | [out_ch, shortcut, expansion] |
SPPF |
التجميع الهرمي المكاني (سريع) | كتلة.py | [out_ch, kernel_size] |
Concat |
التسلسل على مستوى القناة | conv.py | [dimension] |
الوحدات المتخصصة
الوحدة النمطية | الغرض | المصدر | الوسائط |
---|---|---|---|
TorchVision |
تحميل أي طراز تورتش فيجن | كتلة.py | [out_ch, model_name, weights, unwrap, truncate, split] |
Index |
استخراج tensor المحدد من القائمة | كتلة.py | [out_ch, index] |
Detect |
رأس كاشف YOLO | head.py | [nc, anchors, ch] |
قائمة الوحدات النمطية الكاملة
يمثل هذا مجموعة فرعية من الوحدات النمطية المتاحة. للحصول على القائمة الكاملة للوحدات النمطية ومعلماتها، استكشف دليل الوحدات النمطية.
الميزات المتقدمة
تكامل TorchVision
تتيح وحدة TorchVision التكامل السلس لأي طراز TorchVision كعمود فقري:
from ultralytics import YOLO
# Model with ConvNeXt backbone
model = YOLO("convnext_backbone.yaml")
results = model.train(data="coco8.yaml", epochs=100)
backbone:
- [-1, 1, TorchVision, [768, convnext_tiny, DEFAULT, True, 2, False]]
head:
- [-1, 1, Classify, [nc]]
تفاصيل المعلمات:
768
: قنوات الإخراج المتوقعةconvnext_tiny
: البنية النموذجية (الموديلات المتوفرة)DEFAULT
: استخدام الأوزان المدربة مسبقاًTrue
: إزالة رأس التصنيف2
: اقتطاع آخر طبقتينFalse
: إرجاع tensor واحد (وليس قائمة)
ميزات متعددة المقاييس
اضبط المعلمة الأخيرة على True
للحصول على خرائط ميزات وسيطة للكشف متعدد النطاقات.
وحدة الفهرس لاختيار الميزات
عند استخدام النماذج التي تُخرج خرائط ميزات متعددة، تحدد وحدة الفهرس مخرجات محددة:
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 "nn." in m else getattr(torchvision.ops, m[4:]) if "ops." in m else globals()[m]
- وحدات PyTorch النمطية: الأسماء التي تبدأ بـ
'nn.'
→torch.nn
مساحة الاسم - عمليات TorchVision الشعلة: الأسماء التي تبدأ بـ
'ops.'
→torchvision.ops
مساحة الاسم - وحداتUltralytics : جميع الأسماء الأخرى → مساحة الأسماء العامة عبر عمليات الاستيراد
سلسلة استيراد الوحدات النمطية
تصبح الوحدات القياسية متاحة من خلال عمليات الاستيراد في tasks.py
:
from ultralytics.nn.modules import ( # noqa: F401, E501
SPPF,
C2f,
Conv,
Detect,
# ... many more modules
Index,
TorchVision,
)
دمج الوحدات النمطية المخصصة
تعديل شفرة المصدر
إن تعديل الشيفرة المصدرية هي الطريقة الأكثر تنوعًا لدمج وحداتك المخصصة، ولكنها قد تكون صعبة. لتعريف وحدة نمطية مخصصة واستخدامها، اتبع الخطوات التالية:
-
تحديد الوحدة الخاصة بك في
ultralytics/nn/modules/block.py
:class CustomBlock(nn.Module): def __init__(self, c1, c2): super().__init__() self.layers = nn.Sequential(nn.Conv2d(c1, c2, 3, 1, 1), nn.BatchNorm2d(c2), nn.ReLU()) def forward(self, x): 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
-
التعامل مع الوسائط الخاصة (إذا لزم الأمر) في الداخل
parse_model()
فيultralytics/nn/tasks.py
:elif m is CustomBlock: c1, c2 = ch[f], args[0] # input channels, output channels args = [c1, c2, *args[1:]]
-
استخدم الوحدة النمطية في نموذج 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]]
- [-1, 1, nn.AdaptiveAvgPool2d, [1]]
head:
- [-1, 1, Classify, [nc]]
أفضل الممارسات
نصائح التصميم المعماري
ابدأ ببساطة: ابدأ ببنى مثبتة قبل التخصيص. استخدم تكوينات 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")
output = model.model(torch.randn(1, 3, 640, 640))
print(f"Output shape: {output.shape}") # Should match expected dimensions
فحص البنية النموذجية
يمكن أن يساعد التحقق من عدد الآلات الحاسبة FLOPs وطباعة كل طبقة أيضًا في تصحيح أخطاء تكوين النموذج المخصص. يجب أن يكون عدد الآلات الحاسبة غير صفري لنموذج صالح. إذا كان صفرًا، فمن المحتمل أن تكون هناك مشكلة في التمرير الأمامي. من المفترض أن يُظهر تشغيل تمرير أمامي بسيط الخطأ الذي تمت مواجهته بالضبط.
from ultralytics import YOLO
# Build model with verbose output to see layer details
model = YOLO("debug_model.yaml", 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
هل يمكنني استخدام العمود الفقري المخصص في نموذج YAML الخاص بي؟
نعم. يمكنك استخدام أي وحدة مدعومة، بما في ذلك العمود الفقري ل TorchVision، أو تحديد وحدتك المخصصة الخاصة بك واستيرادها كما هو موضح في تكامل الوحدة المخصصة.
كيف يمكنني قياس حجم نموذجي لأحجام مختلفة (نانو، صغير، متوسط، إلخ)؟
استخدم scales
القسم في YAML الخاص بك لتحديد عوامل القياس للعمق والعرض والحد الأقصى للقنوات. سيطبق النموذج هذه العوامل تلقائيًا عند تحميل ملف YAML الأساسي مع إلحاق المقياس باسم الملف (على سبيل المثال yolo11n.yaml
).
ماذا يعني [from, repeats, module, args]
التنسيق يعني؟
يحدد هذا التنسيق كيفية بناء كل طبقة:
from
:: مصدر (مصادر) الإدخالrepeats
:: عدد مرات تكرار الوحدةmodule
:: نوع الطبقةargs
:: الحجج الخاصة بالوحدة
كيف يمكنني استكشاف أخطاء عدم تطابق القنوات وإصلاحها؟
تحقق من أن قنوات الخرج لطبقة واحدة تطابق قنوات الدخل المتوقعة للطبقة التالية. استخدم print(model.model.model)
لفحص بنية النموذج الخاص بك.
أين يمكنني العثور على قائمة بالوحدات النمطية المتاحة ووسائطها؟
تحقق من التعليمات البرمجية المصدرية في ultralytics/nn/modules
دليل لجميع الوحدات المتاحة ووسائطها.
كيف يمكنني إضافة وحدة نمطية مخصصة إلى تكوين YAML الخاص بي؟
عرّف وحدتك النمطية في الشيفرة المصدرية، واستوردها كما هو موضح في تعديل الشيفرة المصدرية، وأشر إليها بالاسم في ملف YAML الخاص بك.
هل يمكنني استخدام الأوزان المدربة مسبقًا مع YAML مخصص؟
نعم، يمكنك استخدام model.load("path/to/weights")
لتحميل الأوزان من نقطة تفتيش مُدرَّبة مسبقًا. ومع ذلك، سيتم تحميل أوزان الطبقات المتطابقة فقط بنجاح.
كيف يمكنني التحقق من صحة تكوين النموذج الخاص بي؟
استخدم model.info()
للتحقق مما إذا كان عدد وحدات FLOP غير صفري. يجب أن يُظهر النموذج الصحيح عدد وحدات FLOPs غير صفري. إذا كان صفراً، اتبع الاقتراحات في نصائح لتصحيح الأخطاء للعثور على المشكلة