رؤية YOLO 2026:

التحقق المتقاطع K-Fold مع Ultralytics#

مقدمة#

يوضح هذا الدليل الشامل تطبيق التحقق المتبادل K-Fold للobject detection مجموعات البيانات ضمن نظام Ultralytics البيئي. سنستفيد من تنسيق اكتشاف YOLO ومكتبات Python الرئيسية مثل sklearn و pandas و PyYAML لإرشادك خلال الإعداد اللازم، وعملية إنشاء متجهات الميزات، وتنفذ تقسيم مجموعة بيانات K-Fold.

K-fold cross validation data splitting

سواء كان مشروعك يتضمن مجموعة بيانات Fruit Detection أو مصدر بيانات مخصصاً، يهدف هذا الدليل إلى مساعدتك في فهم وتطبيق التحقق المتبادل بخ طي (K-Fold Cross Validation) لتعزيز موثوقية ومتانة نماذج التعلم الآلي الخاصة بك. بينما نطبق k=5 طيات في هذا الدليل، تذكر أن العدد الأمثل للطييات يمكن أن يختلف بناءً على مجموعة بياناتك وتفاصيل مشروعك. يقدم التحقق المتبادل بخ طي أعلى قيمة عندما تكون مجموعة بياناتك صغيرة أو صاخبة أو شديدة التباين؛ أما بالنسبة لمجموعات البيانات الكبيرة والمتنوعة، عادةً ما يكون التقسيم الجيد للتدريب/التحقق/الاختبار كافياً.

لنبدأ العمل.

الإعداد#

  • يجب أن تكون التعليقات التوضيحية الخاصة بك في YOLO detection format.

  • يفترض هذا الدليل أن ملفات التعليقات التوضيحية متاحة محلياً.

  • لعرضنا التوضيحي، نستخدم مجموعة البيانات Fruit Detection.

    • تحتوي مجموعة البيانات هذه على إجمالي 8479 صورة.
    • تتضمن 6 تصنيفات (ملصقات)، مع إدراج إجمالي عدد الأمثلة لكل منها أدناه.
تصنيف الملصقعدد الأمثلة
تفاح7049
عنب7202
أناناس1613
برتقال15549
موز3536
بطيخ1976
  • حزم Python الضرورية تشمل:

    • ultralytics
    • sklearn
    • pandas
    • pyyaml
  • يعمل هذا البرنامج التعليمي مع k=5 طيات. ومع ذلك، يجب عليك تحديد أفضل عدد من الطيات لمجموعة البيانات الخاصة بك.

  1. ابدأ بيئة افتراضية جديدة لـ Python (venv) لمشروعك وقم بتنشيطها. استخدم pip (أو مدير الحزم المفضل لديك) لتثبيت:

    • مكتبة Ultralytics: pip install -U ultralytics. بدلاً من ذلك، يمكنك استنساخ repo الرسمي.
    • Scikit-learn و pandas و PyYAML: pip install -U scikit-learn pandas pyyaml.
  2. تحقق من أن التعليقات التوضيحية الخاصة بك موجودة في YOLO detection format.

    • لهذا البرنامج التعليمي، توجد جميع ملفات التعليقات التوضيحية في الدليل Fruit-Detection/labels.

إنشاء متجهات الميزات لمجموعة بيانات اكتشاف الأشياء#

  1. ابدأ بإنشاء ملف Python جديد example.py للخطوات أدناه.

  2. قم بتحميل صور التدريب والتحقق المكوّنة من خلال مالك مجموعة بيانات الحزمة، مع ترك تقسيم الاختبار دون تغيير.

    from pathlib import Path
    
    from ultralytics.data.dataset import YOLODataset
    from ultralytics.data.utils import check_det_dataset
    
    yaml_file = "path/to/data.yaml"
    data = check_det_dataset(yaml_file)
    dataset_path = Path(data["path"])
    sources = []
    for split in ("train", "val"):
        source = data.get(split)
        if source:
            sources.extend(source if isinstance(source, list) else [source])
    dataset = YOLODataset(sources, data=data, augment=False)
    images = [Path(p) for p in dataset.im_files]
  3. الآن، اقرأ محتويات ملف YAML الخاص بمجموعة البيانات واستخرج فهارس تصنيفات الملصقات.

    classes = data["names"]
    cls_idx = sorted(classes.keys())
  4. قم بتهيئة DataFrame فارغ pandas.

    import pandas as pd
    
    labels_df = pd.DataFrame(0.0, columns=cls_idx, index=images)
  5. احسب أمثلة كل تصنيف ملصق موجود في ملفات التعليقات التوضيحية.

    from collections import Counter
    
    for image, label in zip(images, dataset.labels):
        lbl_counter = Counter(label["cls"].flatten().astype(int))
        labels_df.loc[image, list(lbl_counter)] = list(lbl_counter.values())
  6. فيما يلي عرض تجريبي لإطار البيانات المملوء:

                                                           0    1    2    3    4    5
    '0000a16e4b057580_jpg.rf.00ab48988370f64f5ca8ea4...'  0.0  0.0  0.0  0.0  0.0  7.0
    '0000a16e4b057580_jpg.rf.7e6dce029fb67f01eb19aa7...'  0.0  0.0  0.0  0.0  0.0  7.0
    '0000a16e4b057580_jpg.rf.bc4d31cdcbe229dd022957a...'  0.0  0.0  0.0  0.0  0.0  7.0
    '00020ebf74c4881c_jpg.rf.508192a0a97aa6c4a3b6882...'  0.0  0.0  0.0  1.0  0.0  0.0
    '00020ebf74c4881c_jpg.rf.5af192a2254c8ecc4188a25...'  0.0  0.0  0.0  1.0  0.0  0.0
     ...                                                  ...  ...  ...  ...  ...  ...
    'ff4cd45896de38be_jpg.rf.c4b5e967ca10c7ced3b9e97...'  0.0  0.0  0.0  0.0  0.0  2.0
    'ff4cd45896de38be_jpg.rf.ea4c1d37d2884b3e3cbce08...'  0.0  0.0  0.0  0.0  0.0  2.0
    'ff5fd9c3c624b7dc_jpg.rf.bb519feaa36fc4bf630a033...'  1.0  0.0  0.0  0.0  0.0  0.0
    'ff5fd9c3c624b7dc_jpg.rf.f0751c9c3aa4519ea3c9d6a...'  1.0  0.0  0.0  0.0  0.0  0.0
    'fffe28b31f2a70d4_jpg.rf.7ea16bd637ba0711c53b540...'  0.0  6.0  0.0  0.0  0.0  0.0

تستخدم الصفوف مسارات الصور المطلقة، وتتطابق الأعمدة مع مؤشرات تسميات الفئات. تظل التسميات المفقودة صفوف خلفية كلها أصفار. تتيح بنية البيانات هذه تطبيق K-Fold Cross Validation على مجموعة بيانات كشف الكائنات.

تقسيم مجموعة بيانات K-Fold#

  1. الآن سنستخدم الفئة KFold من sklearn.model_selection لإنشاء k تقسيمات لمجموعة البيانات.

    • هام:
      • ضبط shuffle=True يضمن توزيعاً عشوائياً للفئات في الانقسامات الخاصة بك.
      • عن طريق ضبط random_state=M حيث M هو عدد صحيح مختار، يمكنك الحصول على نتائج قابلة للتكرار.
    from sklearn.model_selection import KFold
    
    ksplit = 5
    kf = KFold(n_splits=ksplit, shuffle=True, random_state=20)  # setting random_state for repeatable results
    
    kfolds = list(kf.split(labels_df))
  2. تم تقسيم مجموعة البيانات الآن إلى k طيات، ولكل منها قائمة من مؤشرات train و val. سنقوم بإنشاء DataFrame لعرض هذه النتائج بشكل أكثر وضوحاً.

    folds = [f"split_{n}" for n in range(1, ksplit + 1)]
    folds_df = pd.DataFrame(index=labels_df.index, columns=folds)
    
    for i, (train, val) in enumerate(kfolds, start=1):
        folds_df.loc[labels_df.index[train], f"split_{i}"] = "train"
        folds_df.loc[labels_df.index[val], f"split_{i}"] = "val"
  3. الآن سنقوم بحساب توزيع تسميات الفئات لكل طية كنسبة للفئات الموجودة في val إلى تلك الموجودة في train.

    fold_lbl_distrb = pd.DataFrame(index=folds, columns=cls_idx)
    
    for n, (train_indices, val_indices) in enumerate(kfolds, start=1):
        train_totals = labels_df.iloc[train_indices].sum()
        val_totals = labels_df.iloc[val_indices].sum()
    
        # To avoid division by zero, we add a small value (1E-7) to the denominator
        ratio = val_totals / (train_totals + 1e-7)
        fold_lbl_distrb.loc[f"split_{n}"] = ratio

    السيناريو المثالي هو أن تكون جميع نسب الفئات متشابهة بشكل معقول لكل تقسيم وعبر الفئات. ومع ذلك، سيخضع هذا لخصوصيات مجموعة بياناتك.

  4. اكتب قوائم الصور وملف YAML لمجموعة البيانات لكل تقسيم. تتجنب قوائم النصوص نسخ مجموعة البيانات بعدد k من المرات.

    import yaml
    
    save_path = dataset_path.parent / f"{ksplit}-Fold_Cross-val"
    save_path.mkdir(parents=True, exist_ok=True)
    ds_yamls = []
    
    for split in folds_df.columns:
        for partition in ("train", "val"):
            split_images = folds_df.index[folds_df[split] == partition]
            paths = "\n".join(map(str, split_images))
            (save_path / f"{split}_{partition}.txt").write_text(f"{paths}\n")
    
        dataset_yaml = save_path / f"{split}.yaml"
        ds_yamls.append(dataset_yaml)
        with open(dataset_yaml, "w") as ds_y:
            yaml.safe_dump(
                {
                    "path": save_path.as_posix(),
                    "train": f"{split}_train.txt",
                    "val": f"{split}_val.txt",
                    "names": classes,
                },
                ds_y,
            )

حفظ السجلات (اختياري)#

اختيارياً، يمكنك حفظ سجلات تقسيم K-Fold وإطارات بيانات توزيع الملصقات كملفات CSV للرجوع إليها في المستقبل.

folds_df.to_csv(save_path / "kfold_datasplit.csv")
fold_lbl_distrb.to_csv(save_path / "kfold_label_distribution.csv")

تدريب YOLO باستخدام تقسيمات بيانات K-Fold#

  1. أولاً، قم بتحميل نموذج YOLO.

    from ultralytics import YOLO
    
    weights_path = "path/to/weights.pt"  # use yolo26n.pt for a small model
    model = YOLO(weights_path, task="detect")
  2. بعد ذلك، قم بالتكرار فوق ملفات YAML الخاصة بمجموعة البيانات لتشغيل التدريب. سيتم حفظ النتائج في دليل تحدده وسائط project و name. بشكل افتراضي، يكون هذا الدليل 'runs/detect/train#' حيث # هو فهرس عدد صحيح.

    results = {}
    
    # Define your additional arguments here
    batch = 16
    project = "kfold_demo"
    epochs = 100
    
    for k, dataset_yaml in enumerate(ds_yamls):
        model = YOLO(weights_path, task="detect")
        results[k] = model.train(
            data=dataset_yaml, epochs=epochs, batch=batch, project=project, name=f"fold_{k + 1}"
        )  # include any additional train arguments
  3. يمكنك أيضاً استخدام وظيفة Ultralytics data.split.autosplit للتقسيم التلقائي لمجموعة البيانات:

    from ultralytics.data.split import autosplit
    
    # Automatically split dataset into train/val/test
    autosplit(path="path/to/images", weights=(0.8, 0.2, 0.0), annotated_only=True)

الخلاصة#

في هذا الدليل، استكشفنا عملية استخدام التحقق المتبادل K-Fold لتدريب نموذج كشف الكائنات YOLO. تعلّمنا كيفية تقسيم مجموعة التدريب والتحقق إلى K أقسام واستخدام جدول النسبة المُنشأ لفحص توازن الفئات بعد التقسيم العشوائي.

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

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

أخيراً، نفذنا التدريب الفعلي للنموذج باستخدام كل تقسيم في حلقة تكرارية، مع حفظ نتائج التدريب للمزيد من التحليل والمقارنة.

تعتبر تقنية التحقق المتبادل K-Fold هذه طريقة قوية للاستفادة القصوى من البيانات المتاحة لديك، وتساعد في ضمان أن أداء نموذجك موثوق ومتسق عبر مجموعات البيانات الفرعية المختلفة. ينتج عن هذا نموذج أكثر قابلية للتعميم وموثوقية وأقل عرضة لـ overfit لأنماط البيانات المحددة.

تذكر أنه على الرغم من استخدامنا لـ YOLO في هذا الدليل، فإن هذه الخطوات قابلة للنقل إلى حد كبير إلى نماذج تعلم آلي أخرى. يسمح لك فهم هذه الخطوات بتطبيق التحقق المتقاطع بفعالية في مشاريع التعلم الآلي الخاصة بك.

الأسئلة الشائعة#

  • التحقق المتبادل K-Fold هو تقنية يتم فيها تقسيم مجموعة البيانات إلى 'k' مجموعات فرعية (طيات) لتقييم أداء النموذج بشكل أكثر موثوقية. تعمل كل طية كبيانات تدريب وvalidation data. في سياق اكتشاف الكائنات، يساعد استخدام التحقق المتبادل K-Fold في ضمان أن أداء نموذج Ultralytics YOLO الخاص بك قوي وقابل للتعميم عبر تقسيمات البيانات المختلفة، مما يعزز موثوقيته. للحصول على إرشادات تفصيلية حول إعداد التحقق المتبادل K-Fold مع Ultralytics YOLO، راجع K-Fold Cross Validation with Ultralytics.

  • لتنفيذ التحقق المتقاطع K-Fold مع Ultralytics YOLO، تحتاج إلى اتباع الخطوات التالية:

    1. تحقق من أن التعليقات التوضيحية موجودة في YOLO detection format.
    2. استخدم مكتبات Python مثل sklearn و pandas و pyyaml.
    3. أنشئ متجهات ميزات من مجموعة بياناتك.
    4. قم بتقسيم مجموعة البيانات الخاصة بك باستخدام KFold من sklearn.model_selection.
    5. قم بتدريب نموذج YOLO على كل تقسيم.

    للحصول على دليل شامل، راجع قسم K-Fold Dataset Split في وثائقنا.

  • يستهدف سير العمل في هذا الدليل تنسيق الكشف في YOLO، ولكن نفس النهج يتكيف مع كل مهام YOLO — فالمهمة تغير كيفية تكوين الطيات، وليس ما إذا كان التحقق المتبادل مفيداً أم لا:

    المهمةتصميم الطيات
    detectالتقسيم على مستوى الصورة، مع موازنة توزيعات الكائنات والفئات عبر الطيات. حافظ على الصور المرتبطة (نفس المريض، أو تسلسل الفيديو، أو الكاميرا، أو الموقع) ضمن طية واحدة.
    segmentاستخدم نفس استراتيجية مستوى الصورة المتبعة في الكشف، مع الحفاظ بالإضافة إلى ذلك على تغطية القناع والفئة في كل طية.
    classifyفضل الطيات الطبقية بحيث تظل تكرارات الفئات متوازنة بين التدريب والتحقق.
    poseالتقسيم حسب الموضوع أو التسلسل بحيث لا يظهر نفس الشخص أو الحيوان أبداً على كلا جانبي الطية.
    obbالتقسيم على مستوى الصورة، مع إبقاء البلاطات أو المقتطفات من نفس المشهد معاً — وهو أمر مهم بشكل خاص للصور الجوية.

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

  • يقدم Ultralytics YOLO اكتشاف كائنات في الوقت الفعلي بأحدث التقنيات مع accuracy عالية وكفاءة. إنه متعدد الاستخدامات، ويدعم مهام computer vision متعددة مثل detection وinstance segmentation وsemantic segmentation وclassification. بالإضافة إلى ذلك، يتكامل بسلاسة مع أدوات مثل Ultralytics Platform لتدريب النماذج ونشرها بدون برمجة. لمزيد من التفاصيل، استكشف الفوائد والميزات على Ultralytics YOLO page.

  • يجب أن تتبع التعليقات التوضيحية الخاصة بك تنسيق اكتشاف YOLO. يجب أن يسرد كل ملف تعليق توضيحي فئة الكائن، إلى جانب إحداثيات bounding box الخاصة به في الصورة. يضمن تنسيق YOLO معالجة بيانات مبسطة وموحدة لتدريب نماذج اكتشاف الكائنات. لمزيد من المعلومات حول تنسيق التعليقات التوضيحية الصحيح، تفضل بزيارة YOLO detection format guide.

  • نعم، يمكنك استخدام التحقق المتبادل K-Fold مع أي مجموعة بيانات مخصصة طالما أن التعليقات التوضيحية بتنسيق اكتشاف YOLO. استبدل مسارات مجموعة البيانات وتسميات الفئات لتلك الخاصة بمجموعة البيانات المخصصة الخاصة بك. تضمن هذه المرونة أن أي مشروع اكتشاف كائنات يمكنه الاستفادة من تقييم النموذج القوي باستخدام التحقق المتبادل K-Fold. للحصول على مثال عملي، راجع قسم Generating Feature Vectors.

التعليقات