تخطي إلى المحتوى

تهيئة نموذج 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]
  1. وحدات PyTorch النمطية: الأسماء التي تبدأ بـ 'nn.'torch.nn مساحة الاسم
  2. عمليات TorchVision الشعلة: الأسماء التي تبدأ بـ 'ops.'torchvision.ops مساحة الاسم
  3. وحداتUltralytics : جميع الأسماء الأخرى → مساحة الأسماء العامة عبر عمليات الاستيراد

سلسلة استيراد الوحدات النمطية

تصبح الوحدات القياسية متاحة من خلال عمليات الاستيراد في tasks.py:

from ultralytics.nn.modules import (  # noqa: F401, E501
    SPPF,
    C2f,
    Conv,
    Detect,
    # ... many more modules
    Index,
    TorchVision,
)

دمج الوحدات النمطية المخصصة

تعديل شفرة المصدر

إن تعديل الشيفرة المصدرية هي الطريقة الأكثر تنوعًا لدمج وحداتك المخصصة، ولكنها قد تكون صعبة. لتعريف وحدة نمطية مخصصة واستخدامها، اتبع الخطوات التالية:

  1. تحديد الوحدة الخاصة بك في 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)
    
  2. كشف الوحدة النمطية الخاصة بك على مستوى الحزمة في ultralytics/nn/modules/__init__.py:

    from .block import CustomBlock  # noqa makes CustomBlock available as ultralytics.nn.modules.CustomBlock
    
  3. إضافة إلى الواردات في ultralytics/nn/tasks.py:

    from ultralytics.nn.modules import CustomBlock  # noqa
    
  4. التعامل مع الوسائط الخاصة (إذا لزم الأمر) في الداخل 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:]]
    
  5. استخدم الوحدة النمطية في نموذج YAML الخاص بك:

    # custom_model.yaml
    nc: 1
    backbone:
        - [-1, 1, CustomBlock, [64]]
    head:
        - [-1, 1, Classify, [nc]]
    
  6. تحقق من 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}")

التحقق من الصحة خطوة بخطوة

  1. ابدأ بالحد الأدنى: اختبر بأبسط بنية ممكنة أولاً
  2. أضف تدريجياً: بناء طبقة التعقيد طبقة تلو الأخرى
  3. تحقق من الأبعاد: تحقق من توافق حجم القناة والحجم المكاني
  4. التحقق من صحة القياس: اختبار بمقاييس نموذجية مختلفة (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 غير صفري. إذا كان صفراً، اتبع الاقتراحات في نصائح لتصحيح الأخطاء للعثور على المشكلة



📅 تم إنشاؤه منذ 0 أيام ✏️ تم التحديث منذ 0 أيام