Ultralytics YOLO27: انضم إلى قائمة الانتظار.
Get Started
الدرسمبتدئ

اجمع بيانات عالية الجودة وممثّلة للواقع

اجمع الصور من ظروف النشر الفعلية، وأدرج بيانات الالتقاط الوصفية في كل اسم ملف، وتتبّع التغطية مقارنةً بالمواصفات، وخذ عينات من الفيديو دون إغراق مجموعة البيانات بالصور.

معظم إخفاقات مجموعات البيانات سببها إخفاقات في الجمع. يلتقط الفريق أمثلة واضحة من كاميرا واحدة خلال أسبوع واحد، فتبدو نتائج التحقق ممتازة، ثم ينهار أداء النموذج في الموقع الثاني. يضع الجمع سقف الأداء: فلا جودة الوسوم ولا زيادة البيانات ولا المعلمات الفائقة تستطيع تعليم النموذج عن مشهد لم تتضمنه مجموعة البيانات قط.

النتيجة

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

المسار السريع
إذا كنت تعرف الأساسيات بالفعل، فإليك النسخة المختصرة.
  1. التقط الصور من كاميرات الإنتاج التي سيعمل عليها النموذج.

  2. سمِّ كل ملف camera_day_frame حتى يمكن تجميعه وتدقيقه في الخطوات اللاحقة.

  3. أحصِ الصور لكل كاميرا ويوم وسيناريو مقارنةً بالمواصفات، واجمع ما ينقص.

  4. خذ عينات من الفيديو بحيث لا تحتفظ إلا بالإطارات التي تغيّر فيها المشهد.

  5. استخدم الصور العامة أو المُعدّة أو الاصطناعية لسدّ النواقص المحددة فقط.

عملي

التنوع يتفوق على الحجم#

قارن مجموعتي البيانات الموجهتين إلى النشر نفسه:

مجموعة البياناتنتيجة التحققفي الإنتاج
10,000 إطار شبه متطابق، من كاميرا واحدة، وقت الظهيرة فقطمرتفعة: إطارات التحقق تشبه إطارات التدريبيتراجع الأداء مع كاميرا مختلفة وعند الغسق
1,500 إطار موزعة على 12 سيناريو من المواصفاتأكثر تواضعًايصمد الأداء، لأن ظروف الإنتاج تشبه البيانات

لا ترتفع نتيجة التحقق لمجموعة البيانات الأولى إلا لأن التحقق يقيس الحالة الوحيدة التي تغطيها. في الإنتاج، لا يتجاوز أداء النموذج مستوى أسوأ سيناريو من حيث التغطية يواجهه. أعطِ الأولوية لتغطية المواصفات عند جمع البيانات، ثم للحجم.

اختر المصادر بالترتيب الصحيح#

ينبغي أن يأتي معظم مجموعة البيانات من إعداد الإنتاج الفعلي. يتناول دليل جمع البيانات ووسمها كل مصدر بمزيد من التفصيل:

المصدرمتى يكون مفيدًامتى يكون ضارًا
كاميرات الإنتاج، بث مباشرالأقرب إلى ظروف النشربطيء؛ وقد يتطلب اتفاقيات بيانات
كاميرات الإنتاج، أرشيفيةتنوع كبير في وقت قصيرقد لا تتطابق اللقطات القديمة مع الإعداد الحالي
مجموعات البيانات العامة (COCO، Open Images، VOC)البدء بفئات شائعةاختلاف المجال عن مشاهدك
لقطات مُعدّةحالات حدّية محددة عند الطلبنظيفة أكثر من اللازم؛ يسهل الاعتماد عليها بإفراط
صور اصطناعية أو مولّدةمخاطر وأعطال نادرة لا يمكنك انتظار وقوعهاقد يتعلم النموذج أسلوب المولّد
استخراج الصور من الويبتنوع منخفض التكلفةجودة غير متسقة ومخاطر الترخيص

استخدم الصور المُعدّة والعامة والاصطناعية لسدّ نواقص محددة ومسمّاة في المواصفات، وتتبّع نسبتها في مجموعة البيانات كي تتمكن من قياس مدى فائدتها. في Ultralytics Platform، تضيف ميزة إنشاء صور مشابهة تنويعات مولّدة لصورة موجودة إلى مجموعة البيانات، دون وسوم وجاهزة للتوسيم.

أدرج البيانات الوصفية في اسم الملف#

يحتاج كل ملف صورة إلى معرّف كاميرا واحد على الأقل، ويوم الالتقاط، ورقم إطار أو مقطع. من دون هذه المعلومات، لن تتمكن لاحقًا من التقسيم حسب المجموعة، أو تتبّع مشكلة تراجعية وصولًا إلى مصدرها، أو جمع مزيد من البيانات لسيناريو ناقص التمثيل. واسم الملف هو الوسيلة الأكثر موثوقية لحمل هذه المعلومات: إذ يبقى cam2_2026-05-01_000124.jpg محفوظًا في كل أداة وتصدير وتحميل. يتيح البحث في مجموعات البيانات على Ultralytics Platform البحث بأسماء الملفات والبيانات الوصفية المخصصة، لذلك تظل هذه المفاتيح قابلة للبحث بعد التحميل.

ينشئ هذا البرنامج النصي مجموعة بيانات التدريب العملي التي يستخدمها باقي المقرر. ينسخ الصور الموسومة من COCO128 ويعيد تسميتها كما لو أن أربع كاميرات التقطتها على مدار أربعة أيام، مع زيادة جمع cam1 بالطريقة المعتادة مع الكاميرا المتاحة بسهولة:

import shutil
from pathlib import Path

from ultralytics.data.utils import check_det_dataset, img2label_paths

data = check_det_dataset("coco128.yaml")  # 128 COCO images stand in for your camera captures
out = Path("datasets/practice")
(out / "images").mkdir(parents=True, exist_ok=True)
(out / "labels").mkdir(parents=True, exist_ok=True)

for i, image in enumerate(sorted(Path(data["train"]).glob("*.jpg"))):
    camera = ("cam1", "cam1", "cam2", "cam3", "cam4")[i % 5]  # cam1 over-collected, like a real site
    name = f"{camera}_2026-05-0{i // 32 + 1}_{i:06d}"  # camera, capture day, frame number
    shutil.copy(image, out / "images" / f"{name}.jpg")
    label = Path(img2label_paths([str(image)])[0])
    if label.exists():
        shutil.copy(label, out / "labels" / f"{name}.txt")

print(len(list((out / "images").glob("*.jpg"))), "images written to", out)
128 images written to datasets/practice

مربع حوار مجموعة بيانات جديدة في Ultralytics Platform: أسقط الصور أو مقاطع الفيديو أو مجموعات البيانات بتنسيق YOLO أو COCO أو NDJSON، ثم اضبط اسم مجموعة البيانات وعنوان URL والوصف ونوع المهمة والترخيص وتمويه الوجوه وإمكانية الظهور

يحافظ التحميل إلى Ultralytics Platform على أسماء الملفات هذه. ويقبل مربع حوار التحميل أيضًا مقاطع الفيديو ومجموعات البيانات كاملة، وتتضمن إعداداته تمويه الوجوه لحماية الخصوصية.

تتبّع التغطية مقارنةً بالمواصفات#

مع وجود البيانات الوصفية في أسماء الملفات، يصبح قياس التغطية مسألة عدّ. حدّد الحصص وفقًا لمواصفاتك، ودع البرنامج النصي يحدد ما ينبغي جمعه بعد ذلك:

from collections import Counter
from pathlib import Path

QUOTA = {"cam1": 30, "cam2": 30, "cam3": 30, "cam4": 30}  # images per camera, from your spec

images = sorted(Path("datasets/practice/images").glob("*.jpg"))
cameras = Counter(p.stem.split("_")[0] for p in images)
days = Counter(p.stem.split("_")[1] for p in images)

for camera, quota in QUOTA.items():
    gap = quota - cameras[camera]
    print(f"{camera}: {cameras[camera]:3d} / {quota}  {'ok' if gap <= 0 else f'collect {gap} more'}")
print("days:", dict(sorted(days.items())))
cam1:  52 / 30  ok
cam2:  26 / 30  collect 4 more
cam3:  25 / 30  collect 5 more
cam4:  25 / 30  collect 5 more
days: {'2026-05-01': 32, '2026-05-02': 32, '2026-05-03': 32, '2026-05-04': 32}

قاعدة اتخاذ القرار: توقف عن الجمع من أي مصدر تجاوز حصته، ووجّه الجهد إلى النواقص. هنا، تضم cam1 بالفعل 40% من الصور. وسيؤدي قضاء أسبوع آخر في جمع لقطاتها إلى زيادة الحجم، لا إلى إضافة تغطية جديدة.

خذ عينات من الفيديو دون إغراق مجموعة البيانات#

الفيديو هو أقل المصادر تكلفةً وأسهلها إساءةً في الاستخدام. فعند 30 إطارًا في الثانية، تنتج الدقيقة الواحدة 1,800 إطار شبه متطابق، كما أن وسم اللحظة نفسها مرتين يكلّف المال ويضخّم المقاييس. احتفظ بإطار فقط عندما يكون المشهد قد تغيّر منذ آخر إطار احتفظت به:

from pathlib import Path

import cv2

from ultralytics.utils.downloads import safe_download

video = "solutions_ci_demo.mp4"  # a short public demo clip; swap in your own footage
safe_download(f"https://github.com/ultralytics/assets/releases/download/v0.0.0/{video}")
Path("frames").mkdir(exist_ok=True)

cap = cv2.VideoCapture(video)
fps = cap.get(cv2.CAP_PROP_FPS)
read = kept = 0
last = None
while True:
    ok, frame = cap.read()
    if not ok:
        break
    thumb = cv2.cvtColor(cv2.resize(frame, (64, 64)), cv2.COLOR_BGR2GRAY).astype(float)
    if last is None or abs(thumb - last).mean() > 10:  # keep a frame only when the scene has changed
        cv2.imwrite(f"frames/clip01_{read:06d}.jpg", frame)  # the clip ID stays in the filename
        kept, last = kept + 1, thumb
    read += 1

print(f"{read} frames at {fps:.0f} FPS -> {kept} kept")
62 frames at 30 FPS -> 6 kept

يحتوي المقطع الذي تبلغ مدته ثانيتين على 62 إطارًا، لكن فيه 6 لحظات متميزة بصريًا فقط. يقارن البرنامج النصي صورًا مصغرة صغيرة بتدرّج الرمادي، لذا فهو سريع عند معالجة ساعات من اللقطات. ارفع عتبة 10 للاحتفاظ بعدد أقل من الإطارات من الكاميرات الثابتة، واخفضها للمشاهد سريعة الحركة. وزّع الميزانية على المقاطع أيضًا: فـ20 إطارًا من كل واحد من 50 مقطعًا أفضل من 1,000 إطار من مقطع واحد.

إطارات المقطع الواحد عينة واحدة، لا عينات متعددة

يشترك إطاران يفصل بينهما ثانية واحدة في الإضاءة والخلفية، وعادةً في الكائنات نفسها. إذا وُضعا في مجموعتي التدريب والتحقق، فسيُقيّم التحقق على صور سبق للنموذج أن رآها فعليًا. احتفظ بمعرّف المقطع في كل اسم ملف حتى يتمكن تقسيم مجموعة البيانات على نحو صحيح من إبقاء المقطع متماسكًا.

تجنّب مزالق جمع البيانات#

المأزقالعَرَضالحل
جمع البيانات خلال أسبوع واحدقيمة mAP مرتفعة على بيانات التحقق، مع إخفاقات في فصول أو نوبات أخرىوزّع عمليات الالتقاط على أسابيع أو أشهر
كاميرا واحدةيفشل النموذج مع الكاميرا الثانيةالتقط صورًا من كل نوع كاميرا تنشره
بيانات مُعدّة فقطيفشل النموذج في التعامل مع الفوضى الواقعيةاجعل الصور المُعدّة أقلية صغيرة ومُتابَعة
إطارات مكررةمقاييس مضخّمة وهدر في أعمال وضع الوسومخذ عينات عند تغيّر المشهد؛ وتتخطى Ultralytics Platform أيضًا النسخ المطابقة تمامًا عند الرفع
مشغّل واحد أو وردية واحدةمظاهر غير مخطط لها واختلال توازن الفئاتخذ عينات من ورديات ومواقع وأشخاص مختلفين
غياب الحالات النادرةيفوّت النموذج أحداث السلامة الأهمالتقاط موجّه أو إعداد مشاهد أو استكمال اصطناعي

التحيز مشكلة في جمع البيانات، لا في النمذجة: فلا توجد قيمة للمعاملات الفائقة تعالج غياب مجموعة لم تتضمنها البيانات أصلًا. يسرد دليل جمع البيانات أربعة عوامل مؤثرة: تنوّع المصادر، والتمثيل المتوازن، وإعادة تدقيق التغطية بانتظام، والتخفيف من التحيز بوسائل مثل زيادة أخذ العينات من المجموعات الأقل تمثيلًا.

إذا كانت الصور تتضمن وجوهًا أو لوحات تسجيل أو بيانات شخصية أخرى، فأنت بحاجة إلى موافقة وسياسة للاحتفاظ بالبيانات قبل بدء الجمع. يُعد مدخل خصوصية البيانات في المسرد نقطة بداية جيدة، ويتناول الخصوصية والمناطق والامتثال كيفية إبقاء البيانات ضمن النطاق القضائي المناسب باستخدام dataRegion.

جرّبه

شغّل make_practice_set.py، ثم عدّل الحصص في coverage.py لتطابق مواصفاتك (أو أبقِ على حصص التدريب العملي) وشغّله. لمشروعك الفعلي، أعد تسمية 50 صورة حديثة وفق النمط camera_day_frame، ثم نفّذ عليها عملية احتساب التغطية نفسها. الناتج المطلوب: تقرير تغطية وخطة جمع تسرد كل مصدر تجاوز حصته وكل فجوة وحجمها.

متى يُعدّ مكتملًا
تكون قد أتممت الدرس عند تحقق جميع الشروط التالية.
  • يحمل اسم ملف كل صورة اسم كاميرا (أو مصدر) ويوم الالتقاط ورقم الإطار أو المقطع.

  • يقارن تقرير التغطية أعداد الصور لكل كاميرا أو يوم أو سيناريو بحصص المواصفات.

  • تُؤخذ عينات الفيديو عند تغيّر المشهد، وتحتفظ الإطارات المختارة بمعرّف المقطع.

عرض الحل

بالنسبة إلى مجموعة التدريب العملي، يقدّم تقرير التغطية خطة مباشرة:

المصدرالعدد / الحصةالإجراء
cam152 / 30أوقف الجمع؛ فقد بلغت النسبة 40% من إجمالي الصور بالفعل
cam226 / 30اجمع 4 صور أخرى
cam325 / 30اجمع 5 صور أخرى
cam425 / 30اجمع 5 صور أخرى

تغطي كل كاميرا الأيام الأربعة كلها، لذا فالفجوات تخص كل كاميرا، لا كل يوم. وزّع الصور الـ14 الجديدة على يومين جديدين على الأقل، كي تضيف ظروفًا جديدة بدلًا من تكرار مشاهد فترة ما بعد الظهر نفسها. إذا تعذّر على كاميرا ما توفير حصتها (كاميرا لا ترى سوى المشاهد الليلية)، فأضف صفًا في المواصفات للظرف المفقود، وسجّل ما إذا كانت الصور المُعدّة أو المُولّدة ستسد هذه الفجوة، حتى يتسنى قياس أثرها لاحقًا.

ما الخطوة التالية

بعد جمع الصور، يحوّلها الدرس التالي إلى وسوم متسقة من المرة الأولى.

سجّل الدخول لحفظ التقدم