تحديد مواصفات مجموعة البيانات
خطط للسيناريوهات والحصص والتباين والحالات الحدية وصور الخلفية قبل الجمع، وحدد حجم الخطة وفق أهداف Ultralytics للحجم.
تنتهي الفرق التي لا تضع مواصفات بمجموعة من 5,000 صورة نهارية جيدة الإضاءة من كاميرا واحدة، وبنموذج يفشل عند الغسق في أول يوم له في الإنتاج. مواصفات مجموعة البيانات قائمة تسوق للصور: كل سيناريو يجب أن يتعامل معه النموذج، وعدد الصور اللازمة لكل سيناريو، والحالات النادرة التي ينبغي زيادة عيناتها. يستغرق إعدادها ساعة، لكنها تحدد أين يُبذل جهد الجمع.
عملي
موضع المواصفات#
المواصفات هي الجسر بين الهدف والكاميرا. فهي توجه عملية الجمع، وهي الصفحة التي تعود إليها عندما لا يحقق النموذج الأول هدفه:
تعود الدورة إلى المواصفات، لا إلى إعدادات التدريب: فعادةً ما يعني عدم تحقيق الهدف أن هناك سيناريو لم تغطه المواصفات. يصف دليل مراحل مشروع الرؤية الحاسوبية دورة الحياة نفسها.
اكتب السيناريوهات في صفوف#
السيناريو هو توليفة واحدة من ظروف الالتقاط التي يجب أن يتعامل معها النموذج. تجعل الصفوف ذات الحصص الثغرات واضحة قبل أن يحمل أي شخص كاميرا:
| السيناريو | الكاميرات | المواقع | وقت اليوم | الظروف | الحصة | ملاحظات |
|---|---|---|---|---|---|---|
| رصيف التحميل نهاراً | cam-1 إلى cam-4 | الأرصفة A–C | 08:00–17:00 | أي وقت | 1,200 | ساعات الذروة |
| رصيف التحميل ليلاً | cam-1 إلى cam-4 | الأرصفة A–C | 22:00–04:00 | أي وقت | 400 | إضاءة الصوديوم، عدد أقل من الأشخاص |
| التحميل تحت المطر | cam-2، cam-3 | الرصيف B | أي وقت | المطر فقط | 200 | نادر لكنه حاسم |
| مكدسة | أي وقت | أي وقت | أي وقت | منصات > 2 مرتفعة | 150 | تحجب الأشخاص خلفها |
| الخلفية | أي وقت | أي وقت | أي وقت | رصيف تحميل فارغ | 150 | لا كائنات ولا تسميات |
السيناريو الذي لا تستطيع تدوينه لن يراه النموذج أثناء التدريب، وسيكون هو السيناريو الذي يفشل فيه الإنتاج.
حدّد حجم المواصفات وفق أهداف الحجم#
تقدم نصائح Ultralytics لتحقيق أفضل نتائج التدريب قواعد إرشادية للإنتاج:
| الهدف | التوصية |
|---|---|
| الصور لكل فئة | ≥ 1,500 |
| العيّنات الموسومة لكل فئة | ≥ 10,000 |
| صور الخلفية (بلا تسميات) | 0–10% من مجموعة البيانات؛ تبلغ النسبة في COCO نحو 1% |
| التنوع | أوقات وفصول وطقس وإضاءة وزوايا ومصادر وكاميرات مختلفة |
هذه هي الحدود الدنيا لنموذج إنتاجي. تكفي بضع مئات من الكائنات الموسومة لكل فئة لبدء التجارب، وهذا النموذج الأول هو أسرع وسيلة لمعرفة السيناريوهات التي تحتاج إلى مزيد من البيانات. لمعرفة مدى ابتعاد مجموعة بيانات عن الحد المطلوب، أحصِ محتوياتها. يعمل هذا البرنامج النصي على COCO128، وهي عيّنة من COCO تضم 128 صورة وتُنزّل تلقائياً:
from collections import Counter
from pathlib import Path
from ultralytics.data.utils import IMG_FORMATS, check_det_dataset, img2label_paths
IMAGES_PER_CLASS, INSTANCES_PER_CLASS = 1500, 10_000 # Ultralytics production targets
data = check_det_dataset("coco128.yaml") # downloads COCO128 (~7 MB) on first run; swap in your data YAML
images = [p for p in Path(data["train"]).rglob("*.*") if p.suffix[1:].lower() in IMG_FORMATS]
image_count, instance_count, background = Counter(), Counter(), 0
for label in map(Path, img2label_paths([str(p) for p in images])):
classes = [int(r.split()[0]) for r in label.read_text().splitlines() if r.strip()] if label.exists() else []
instance_count.update(classes)
image_count.update(set(classes))
background += not classes
print(f"{len(images)} images, {background} background ({background / len(images):.0%}, target 0-10%)")
print(f"{'class':>12} {'images':>7} {'instances':>10} {'of target':>10}")
ranked = instance_count.most_common()
for cls, n in ranked[:3] + ranked[-3:]: # best and worst covered classes
coverage = min(image_count[cls] / IMAGES_PER_CLASS, n / INSTANCES_PER_CLASS)
print(f"{data['names'][cls]:>12} {image_count[cls]:>7} {n:>10} {coverage:>10.1%}")
never_labeled = [name for i, name in data["names"].items() if i not in instance_count]
print(f"{len(never_labeled)} classes in names with zero labels: {never_labeled[:4]} ...")128 images, 2 background (2%, target 0-10%)
class images instances of target
person 61 254 2.5%
car 12 46 0.5%
cup 10 36 0.4%
bear 1 1 0.0%
banana 1 1 0.0%
skis 1 1 0.0%
9 classes in names with zero labels: ['fire hydrant', 'parking meter', 'sheep', 'cow'] ...طريقة قراءته:
- التغطية هي الأقل بين نسبة الصور ونسبة العيّنات، لأن الفئة تحتاج إلى كليهما. حتى الفئة
person، وهي الأفضل تغطية، لا تبلغ سوى 2.5% من الحد المطلوب للإنتاج. - الفئات ذات العيّنة الواحدة (
bear،banana،skis) لا يمكن تعلّمها أو قياسها. في مجموعة بياناتك، اجمع المزيد منها أو احذفها من الإصدار الأول v1. - الفئات التي لا تملك أي تسميات مدرجة في YAML، لكن لم تُرسم لها أي تسميات. ومع ذلك، يستهلك النموذج سعة في محاولة التنبؤ بها. احذفها من
namesأو اجمع بياناتها قبل التدريب.
غطِّ أبعاد التباين#

يمزج إطار واحد بالفعل بين أشخاص قريبين وبعيدين، ودراجات، وكلب، وسيارات. يجب أن تخطط المواصفات الحقيقية لهذا النطاق عمداً. لكل بُعد، دوّن ما إذا كانت المواصفات تغطيه أو سبب عدم انطباقه؛ فالصفوف الفارغة تمثل سيناريوهات ستكتشفها أثناء الإنتاج بدلاً من ذلك:
| البُعد | أمثلة |
|---|---|
| الوقت | نهار، ليل، فجر، غسق |
| الطقس | شمس، غائم، مطر، ضباب، ثلج |
| الإضاءة | سطوع، خفوت، وهج، ظلال حادة، مصادر إضاءة مختلطة |
| الكاميرا | الطراز، العدسة، ارتفاع التركيب، مجال الرؤية |
| الجغرافيا | المواقع، المدن، البلدان |
| الأشخاص والمشغّلون | المناوبات، الفرق، الزي الرسمي، معدات الوقاية |
| متغيرات المنتج | وحدات حفظ المخزون (SKU)، تعديلات التغليف، الألوان |
| حجم الكائن | قريب وكبير، متوسط المدى، بعيد وصغير |
| الحجب | واضح، جزئي، شديد، خلف الزجاج |
| حالة المعدات | عدسات متسخة أو ملبدة بالضباب، منصات نقالة تالفة، علامات أرضية بالية |
التنوع أهم من الحجم: 1,500 صورة موزعة على هذه الصفوف أفضل من 5,000 صورة ملتقطة بكاميرا واحدة وقت الظهيرة.
خطط للصور الخلفية والحالات الحدّية#
الصور الخلفية هي إطارات لا تحتوي على كائنات موسومة، مثل رصيف تحميل فارغ. وهي تعلّم النموذج أن المكان خالٍ وتقلل الإيجابيات الكاذبة.
في تنسيق Ultralytics YOLO، صورة الخلفية هي ببساطة صورة لها ملف تسميات فارغ أو لا تملك ملفًا كهذا أصلًا. يحتسب التدريب كلتيهما في سطر الفحص (… 1200 images, 90 backgrounds, 0 corrupt). تحقّق من مطابقة هذا العدد لهدفك البالغ 0–10% قبل الحقبة الأولى.
الحالات الحدّية هي الحجب الشديد، والكائنات المقطوعة عند حافة الإطار، والاتجاهات غير المعتادة، والكائنات المكدسة، والأشياء المتشابهة ظاهريًا، مثل سارية رافعة شوكية بجوار عمود فولاذي. خصص لكل حالة صفًا مستقلًا في الحصة.
إذا أظهر إطار واحد من كل 200 شخصًا خلف منصات نقالة مكدسة، فستضم مجموعة البيانات المجمّعة وفق التكرار الطبيعي نحو 7 إطارات من هذا النوع من أصل 1,500، وهو عدد قليل جدًا للتعلم منه. زِد أخذ عينات الحالات الطرفية عمدًا: ينبغي أن تكون حصصها أكبر بكثير من نسبتها في اللقطات الفعلية.
لن تتصور كل السيناريوهات على الورق. اجعل المواصفات صحيحة إلى حد كبير، ودرّب نموذجًا أوليًا بسرعة، ودع أخطاءه تكشف السيناريوهات التي أغفلتها.
عرض الحل
تُحدَّد الحصص استنادًا إلى هدف الحالات، لا إلى هدف الصور وحده. افترض أن عدّادًا في موقف سيارات يتعامل مع فئتين، وأن لقطات الاختبار الأولية تسجل في المتوسط 3 سيارات و0.5 شاحنة لكل صورة:
| الفئة | الحالات لكل صورة | الصور المطلوبة للوصول إلى 10,000 حالة | الصور المطلوبة للحد الأدنى البالغ 1,500 صورة | الخطة |
|---|---|---|---|---|
car | 3.0 | ≈ 3,300 | 1,500 | 3,300 صورة |
truck | 0.5 | ≈ 20,000 | 1,500 | التقاط موجّه عند مدخل التحميل، حيث تكثر الشاحنات بمقدار 10 مرات |
تغطي اللقطات الاعتيادية السيارات. أما الشاحنات فتتطلب 20,000 صورة عشوائية، لذا تضيف المواصفات صفًا مخصصًا لسيناريو (مدخل التحميل، أيام الأسبوع من 06:00 إلى 10:00) بدلًا من جمع ستة أضعاف كل شيء. أضف صفًا للخلفية بنحو 5% (موقف فارغ ليلًا) وصفوفًا للحالات الحدّية، مثل تغطية الثلج والشاحنات الظاهرة جزئيًا خارج الإطار.