Ultralytics YOLO27: انضم إلى قائمة الانتظار.
Get Started
الإنشاء باستخدام Ultralytics Platform·أنشئ مجموعة البيانات·الدرس 2/10
الدرسمتوسط

أضف البيانات وجهّزها

تحقّق محليًا من مجموعة البيانات قبل رفعها، وخذ عينات مدروسة من الفيديو، وجهّز مجموعة بيانات على المنصة من المحاولة الأولى.

أقل أخطاء مجموعات البيانات تكلفةً هو ما تكتشفه قبل الرفع. تُتجاوز تسميات Pascal VOC بصمت، وتُرفض الصور التي يقل حجمها عن 28 بكسل، ولا ينتج من فيديو مدته 30 دقيقة سوى 100 إطار، يُظهر معظمها مشهدًا خاليًا. يتضمن هذا الدرس فحصًا يستغرق دقيقتين قبل الرفع، وأخذ عينات مقصودًا من الفيديو، وقراءة مؤشرات المعالجة في المنصة لضمان وصول بيانات التدريب كاملة.

النتيجة

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

المسار السريع
إذا كنت تعرف الأساسيات بالفعل، فإليك النسخة المختصرة.
  1. أجرِ الفحص قبل الرفع: عدد الصور والتسميات في كل تقسيم، والصور الصغيرة جدًا أو الكبيرة جدًا، والملفات غير المدعومة، وتسميات VOC.

  2. في Annotate، انقر على New Dataset؛ ثم اختر المصدر ونوع المهمة ومستوى الظهور الخاص.

  3. خذ عينات مسبقة من مقاطع الفيديو الطويلة بنفسك: تحتفظ المنصة بما يصل إلى 100 إطار لكل فيديو.

  4. اقرأ علامتي التبويب Errors وCharts، ثم انقر على الشارة حتى تعرض Ready.

عملي

أنشئ مجموعة البيانات#

صفحة الملف الشخصي في Ultralytics Platform، وتعرض علامة تبويب Datasets وبطاقات مجموعات البيانات وزر New Dataset

افتح Annotate في الشريط الجانبي وانقر على New Dataset. يطلب مربع الحوار تحديد مصدر واسم ونوع المهمة وترخيص اختياري وتمويه الوجوه ومستوى الظهور:

مربع حوار New Dataset في Ultralytics Platform، مع علامات تبويب لمصادر Upload وURL وCloud وOn Premise، ومنطقة إسقاط للرفع تعرض التنسيقات المقبولة وحدود الحجم، وعناصر تحكم لنوع المهمة والترخيص وتمويه الوجوه ومستوى الظهور

المصدراستخدمه عندماالخطة
الرفعتوجد الملفات على جهازك: صور أو مقاطع فيديو أو أرشيفات أو صادرات NDJSONجميع الأقسام
عنوان URLيتوفر رابط عام لـ.zip أو .tar أو .tar.gz أو .tgz أو .ndjson؛ وتُنزّله المنصة من جهة الخادمجميع الأقسام
السحابةتوجد البيانات بالفعل في Google Cloud Storage أو Amazon S3 أو Azure Blob Storage، وينبغي أن تبقى فيهاPro، Enterprise
داخل مقر المؤسسةيجب ألا تغادر وحدات البكسل أجهزتك مطلقًاEnterprise

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

يحدد نوع المهمة الأدوات والنماذج التي تظهر. تدعم المنصة مهام Ultralytics YOLO السبع كلها:

المهمةطريقة إضافة التسميات
الكشفمستطيل، أو التعليقات التوضيحية الذكية باستخدام SAM وYOLO
التجزئةمضلع، أو التعليقات التوضيحية الذكية باستخدام SAM وYOLO
دلاليمضلع، أو التعليقات التوضيحية الذكية باستخدام SAM وYOLO؛ تُستورد أقنعة PNG مباشرةً
تقدير الوضعيةنقاط مفتاحية على هياكل عظمية مضمّنة أو مخصصة؛ نماذج وضعيات YOLO للتعليقات التوضيحية الذكية
OBBمربع موجّه، أو التعليقات التوضيحية الذكية باستخدام SAM وYOLO
التصنيفمحدّد الفئات في الشريط الجانبي
العمقلا يوجد رسم: ارفع الصور مع خرائط العمق المقترنة بها (الرفع أو عنوان URL فقط)

مثال تطبيقي: تحقّق من مجموعة البيانات قبل رفعها#

تقبل المنصة صور JPEG وPNG وWebP وBMP وTIFF وHEIC وAVIF وJP2 وDNG وMPO حتى 50 MB، وبُعد لا يقل عن 28 px على الجانب الأقصر، وتقرأ تسميات YOLO وCOCO وLabelMe وNDJSON من Ultralytics أو Labelbox وأقنعة PNG الدلالية. يُكتشف تنسيق Pascal VOC XML، لكنه لا يُستورد. يتحقق هذا البرنامج النصي من مجموعة بيانات YOLO محلية وفقًا لهذه القواعد؛ وفي هذا المثال نستخدم مجموعة بيانات حبوب الدواء العامة:

from collections import Counter
from pathlib import Path

from PIL import Image

from ultralytics.data.utils import check_det_dataset

ACCEPTED = {".jpg", ".jpeg", ".png", ".webp", ".bmp", ".tif", ".tiff", ".heic", ".avif", ".jp2", ".dng", ".mpo"}
data = check_det_dataset("medical-pills.yaml")  # your local dataset YAML
root = Path(data["path"])

problems = Counter()
for split in ("train", "val", "test"):
    if not data.get(split):
        continue
    files = [p for p in Path(data[split]).rglob("*") if p.is_file()]
    images = [p for p in files if p.suffix.lower() in ACCEPTED]
    labeled = 0
    for img in images:
        label = Path(str(img).replace("images", "labels")).with_suffix(".txt")
        labeled += label.exists() and label.stat().st_size > 0
        if min(Image.open(img).size) < 28:
            problems["under 28 px (rejected)"] += 1
        if img.stat().st_size > 50 * 1024**2:
            problems["over 50 MB (rejected)"] += 1
    problems["unsupported files (skipped)"] += len(files) - len(images)
    print(f"{split:<5} {len(images):>4} images, {labeled:>4} labeled, {len(images) - labeled:>3} background")
problems["Pascal VOC .xml labels (not imported)"] += len(list(root.rglob("*.xml")))
print("classes:", data["names"])
print("problems:", {k: v for k, v in problems.items() if v} or "none")
train   92 images,   92 labeled,   0 background
val     23 images,   23 labeled,   0 background
classes: {0: 'pill'}
problems: none

ما الذي تخبرك به النتائج:

  • أعداد كل تقسيم. تحتفظ الصور الموجودة في مجلدات train/ وval/ وtest/ بالتقسيم نفسه عند الرفع، لذا فهذه هي الأعداد التي ستعرضها المنصة. ويعني غياب السطر val أن المنصة ستنشئ لك تقسيم تحقق عشوائيًا (راجع المشكلة أدناه).
  • صور الخلفية (من دون ملف تسمية) مقبولة باعتدال؛ فهي تعلّم النموذج شكل «عدم وجود شيء هنا». أما وجود المئات منها فيعني عادةً أن التسميات لم تُصدَّر بنجاح.
  • problems: none تعني أن كل صورة ستُعالَج. وأي عدد يظهر هنا يشير إلى ملف سينتهي به المطاف في علامة التبويب Errors أو لن يصل مطلقًا.

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

مثال تطبيقي: عاين الفيديو قبل أن تفعل المنصة ذلك#

تأخذ المنصة عينة من كل فيديو بمعدل إطار واحد في الثانية، وتحتفظ بما لا يزيد على 100 إطار، مع زيادة الفاصل الزمني للمقاطع التي تتجاوز مدتها 100 ثانية:

مدة المقطعالإطارات المحتفَظ بهاالفاصل الزمني
60 ثانية60ثانية واحدة
100 ثانية100ثانية واحدة
30 دقيقة (54,000 إطار بمعدل 30 fps)10018 ثانية

هذا مناسب لإلقاء نظرة سريعة، لكنه لا يلائم معظم المشاريع الحقيقية: إذ يتحول تسجيل وردية مدتها 30 دقيقة إلى 100 إطار، معظمها لممر فارغ. خذ عينات من اللقطات الطويلة بنفسك وارفع الإطارات:

لأخذ عينات منتظمة، يكفي FFmpeg:

mkdir -p frames
ffmpeg -i source.mp4 -vf fps=1 frames/%06d.jpg

لأخذ عينات موجّهة بالأحداث، دع نموذج YOLO مُدرّبًا مسبقًا من Ultralytics يحتفظ بالإطارات التي يظهر فيها العنصر المطلوب فقط:

from pathlib import Path

import cv2

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # or your latest fine-tune
out = Path("frames")
out.mkdir(exist_ok=True)

source = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"
seen = kept = 0
for i, result in enumerate(model.predict(source, stream=True, vid_stride=5, classes=[0], conf=0.5, verbose=False)):
    seen += 1
    if len(result.boxes):  # keep only frames where a person was detected
        cv2.imwrite(str(out / f"frame_{i:05d}.jpg"), result.orig_img)
        kept += 1
print(f"Kept {kept} of {seen} sampled frames")
Kept 12 of 12 sampled frames

يفحص vid_stride=5 كل إطار خامس، ويقصر classes=[0] الكشف على الأشخاص، ويتجاهل conf=0.5 التوقعات ضعيفة الثقة. يحتوي هذا المقطع التوضيحي المزدحم على أشخاص في كل إطار مأخوذ كعينة؛ أما في تسجيل لمشهد فارغ في معظمه، فستنخفض نسبة الإطارات المحتفَظ بها بشدة، وكذلك تكلفة وضع التسميات. ارفع قيمة vid_stride حتى لا تعود الإطارات المتجاورة المحتفَظ بها متطابقة في مظهرها.

اقرأ مؤشرات المعالجة في المنصة#

بعد الرفع، تتحقق المنصة من الملفات، وتوحّد تنسيقها (مع تغيير حجم الصور التي تتجاوز 4,096 px)، وتنشئ صورًا مصغرة، وتحلل التسميات، وتحسب الإحصاءات. تحقّق من ثلاثة مواضع:

صفحة مجموعة البيانات في Ultralytics Platform مع فتح علامة التبويب Errors، وتظهر فيها لافتة تفيد بتعذّر معالجة صورة واحدة، وصفّ في جدول يقرأ «تعذّرت قراءة ملف الصورة» مع تلميح للإصلاح

  • تظهر علامة التبويب Errors عند تعذّر معالجة ملفات فقط: الملفات التالفة، أو التنسيقات غير المدعومة، أو الصور التي يقل حجمها عن 28 px، أو الصور ذات أنماط الألوان CMYK والألوان المفهرسة؛ ويظهر مع كل منها تلميح للإصلاح. أعد تصدير هذه الملفات أو رفعها.
  • تعرض علامة التبويب Charts توزيع التقسيمات، والفئات الأكثر شيوعًا، وأبعاد الصور، وأحجام الملفات، ومواضع التعليقات التوضيحية، وأحجام الصناديق، وعدد العناصر في كل صورة. ابحث عن فئة نادرة الظهور، أو صور صغيرة جدًا، أو صناديق متجمعة في زاوية واحدة.
  • تُظهر الشارة في رأس مجموعة البيانات Ready بعد اكتمال المعالجة، شريطة أن تضم مجموعة البيانات صورة واحدة على الأقل من train، وصورة واحدة من val أو test، وصورة واحدة عليها تسمية. انقر على Not Ready لمعرفة الشرط غير المستوفى.

علامة التبويب Charts في Ultralytics Platform لمجموعة بيانات medical-pills، وتضم مخططي توزيع التقسيم والفئات الأكثر شيوعًا، ومدرجي أبعاد الصور وحجم ملفات الصور

ابدأ بمجموعة بيانات عامة#

مربع حوار استنساخ مجموعة البيانات في Ultralytics Platform لمجموعة بيانات عامة لمعدات الوقاية الشخصية في مواقع البناء، ويتضمن حقولًا للاسم الجديد، والجزء التعريفي لعنوان URL، والوصف، ونوع المهمة، والترخيص، ومفتاح تبديل مستوى الإتاحة

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

مواطن الخلل#

اختفاء تسميات Pascal VOC بصمت

العَرَض: ينجح الرفع، لكن تصل جميع الصور بلا تسميات. الحل: تكتشف Platform ملفات Pascal VOC XML ولا تستوردها. حوّلها أولًا إلى تسميات YOLO .txt أو إلى COCO JSON؛ إذ يحصي فحص ما قبل الرفع ملفات .xml حتى تكتشف المشكلة قبل الرفع.

تقسيم التحقق التلقائي يسرّب إطارات الفيديو

العَرَض: تحقق mAP التحقق نتائج ممتازة، لكن النموذج المنشور لا يحققها. الحل: إذا أدى رفع لم يُحدد فيه تقسيم إلى بقاء val فارغًا، تنقل Platform نحو 20% من صور التدريب عشوائيًا إلى val. وفي إطارات الفيديو، يضع ذلك إطارات متجاورة شبه متطابقة في كلا القسمين. ارفع البيانات مع مجلدَي train/ وval/ مقسّمين حسب الفيديو أو الكاميرا بدلًا من ذلك (الدرس 4).

أدوات التعليق التوضيحي غير متاحة

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

جرّبه

شغّل preflight.py على مجموعة بياناتك (أو مجموعة بيانات حبوب الدواء)، وأصلح كل مشكلة يرصدها. ثم أنشئ مجموعة بيانات خاصة على المنصة، وارفع مجموعة البيانات مع فيديو واحد، وتوقّع عدد الإطارات التي سينتجها الفيديو من الجدول قبل التحقق من المعرض.

متى يُعدّ مكتملًا
تكون قد أتممت الدرس عند تحقق جميع الشروط التالية.
  • يعرض preflight.py قيمة problems: none لمجموعة البيانات التي رفعتها.

  • يساوي عدد الصور في المعرض عدد صورك مضافًا إليه إطارات الفيديو التي توقعتها.

  • يُظهر رأس مجموعة البيانات Ready، أو تكون قد دوّنت بدقة الشرط غير المستوفى.

عرض الحل

الإجابة المحلولة لمجموعة بيانات حبوب الدواء وفيديو كاميرا خط إنتاج مدته 4 دقائق. فحص ما قبل الرفع: 92 صورة تدريب و23 صورة تحقق، جميعها عليها تسميات، ولا توجد مشكلات. الفيديو: مدته 240 ثانية، أي إنه يتجاوز 100 ثانية، لذا يزداد الفاصل الزمني إلى ceil(240 / 100) = 3 ثوانٍ، وتحتفظ المنصة بـ80 إطارًا (إطار واحد عند 0 s، ثم 3 s، …، ثم 237 s). العدد المتوقع في المعرض: 92 + 23 + 80 = 195 صورة. تصل إطارات الفيديو بلا تسميات إلى التقسيم المحدد في مرشح المعرض، لذا اختر التدريب قبل إضافة الفيديو لإبقائها خارج مجموعة التحقق. تُظهر الشارة Ready لأن صور التدريب والتحقق والصور ذات التسميات موجودة جميعًا. ولو رفعت الفيديو وحده، لأظهرت الشارة Not Ready لعدم وجود صورة عليها تسمية بعد.

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

بعد ذلك، ستُسنِد تسميات أولية للصور باستخدام نموذج، وتقيس مقدار عمل المراجعة الذي ينشئه كل حدّ للثقة.

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