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

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

| المصدر | استخدمه عندما | الخطة |
|---|---|---|
| الرفع | توجد الملفات على جهازك: صور أو مقاطع فيديو أو أرشيفات أو صادرات 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) | 100 | 18 ثانية |
هذا مناسب لإلقاء نظرة سريعة، لكنه لا يلائم معظم المشاريع الحقيقية: إذ يتحول تسجيل وردية مدتها 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)، وتنشئ صورًا مصغرة، وتحلل التسميات، وتحسب الإحصاءات. تحقّق من ثلاثة مواضع:

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

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

لا توجد بيانات بعد؟ تعرض صفحة الاستكشاف مجموعات البيانات الرسمية ومجموعات المجتمع. ينسخ استنساخ مجموعة البيانات الصور والتعليقات التوضيحية والفئات إلى مساحة عملك، وتُحتسب ضمن مساحة التخزين لديك، كما يحتفظ افتراضيًا بإتاحة المصدر للعامة؛ لذا بدّل الإعداد في مربع الحوار إذا كنت ستضيف أي بيانات حساسة.
مواطن الخلل#
العَرَض: ينجح الرفع، لكن تصل جميع الصور بلا تسميات. الحل: تكتشف Platform ملفات Pascal VOC XML ولا تستوردها. حوّلها أولًا إلى تسميات YOLO .txt أو إلى COCO JSON؛ إذ يحصي فحص ما قبل الرفع ملفات .xml حتى تكتشف المشكلة قبل الرفع.
العَرَض: تحقق mAP التحقق نتائج ممتازة، لكن النموذج المنشور لا يحققها. الحل: إذا أدى رفع لم يُحدد فيه تقسيم إلى بقاء val فارغًا، تنقل Platform نحو 20% من صور التدريب عشوائيًا إلى val. وفي إطارات الفيديو، يضع ذلك إطارات متجاورة شبه متطابقة في كلا القسمين. ارفع البيانات مع مجلدَي train/ وval/ مقسّمين حسب الفيديو أو الكاميرا بدلًا من ذلك (الدرس 4).
العَرَض: لا تستطيع العثور على أداة المضلعات أو النقاط المفتاحية. الحل: يحدد نوع المهمة الأدوات المتاحة. غيّره من رأس مجموعة البيانات؛ إذ تخزن كل صورة تسميات جميع المهام، ولذلك يؤدي التبديل إلى إخفاء تسميات المهام الأخرى لا حذفها.
عرض الحل
الإجابة المحلولة لمجموعة بيانات حبوب الدواء وفيديو كاميرا خط إنتاج مدته 4 دقائق. فحص ما قبل الرفع: 92 صورة تدريب و23 صورة تحقق، جميعها عليها تسميات، ولا توجد مشكلات. الفيديو: مدته 240 ثانية، أي إنه يتجاوز 100 ثانية، لذا يزداد الفاصل الزمني إلى ceil(240 / 100) = 3 ثوانٍ، وتحتفظ المنصة بـ80 إطارًا (إطار واحد عند 0 s، ثم 3 s، …، ثم 237 s). العدد المتوقع في المعرض: 92 + 23 + 80 = 195 صورة. تصل إطارات الفيديو بلا تسميات إلى التقسيم المحدد في مرشح المعرض، لذا اختر التدريب قبل إضافة الفيديو لإبقائها خارج مجموعة التحقق. تُظهر الشارة Ready لأن صور التدريب والتحقق والصور ذات التسميات موجودة جميعًا. ولو رفعت الفيديو وحده، لأظهرت الشارة Not Ready لعدم وجود صورة عليها تسمية بعد.