Ultralytics YOLO27:

التحقق المتقاطع بنظام K-Fold باستخدام Ultralytics#

مقدمة#

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

K-fold cross validation data splitting

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

لنبدأ.

الإعداد#

  • يجب أن تكون التعليقات التوضيحية لديك بتنسيق كشف YOLO.

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

  • لأغراض العرض التوضيحي، نستخدم مجموعة بيانات 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. وبدلًا من ذلك، يمكنك استنساخ المستودع الرسمي.
    • Scikit-learn وpandas وPyYAML: pip install -U scikit-learn pandas pyyaml.
  2. تحقق من أن تعليقاتك التوضيحية بتنسيق كشف YOLO.

    • في هذا البرنامج التعليمي، توجد جميع ملفات التعليقات التوضيحية في الدليل 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. فيما يلي نموذج لعرض DataFrame بعد ملئه:

                                                           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 على مجموعة بيانات كشف الأجسام.

تقسيم مجموعة البيانات بنظام 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,
            )

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

يمكنك اختياريًا حفظ سجلات DataFrame الخاصة بتقسيم 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 أقسام، واستخدام جدول النسب المُنشأ لفحص توازن الفئات بعد التقسيم العشوائي.

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

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

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

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

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

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

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

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

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

    للاطلاع على دليل شامل، راجع قسم تقسيم مجموعة البيانات بنظام K-Fold في وثائقنا.

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

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

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

  • يوفر Ultralytics YOLO كشفًا متقدمًا للأجسام في الوقت الفعلي، مع دقة وكفاءة عاليتين. وهو متعدد الاستخدامات، إذ يدعم مهام الرؤية الحاسوبية المتعددة مثل الكشف وتجزئة المثيلات والتجزئة الدلالية والتصنيف. كما يتكامل بسلاسة مع أدوات مثل Ultralytics Platform لتدريب النماذج ونشرها دون كتابة تعليمات برمجية. لمزيد من التفاصيل، استكشف المزايا والميزات في صفحة Ultralytics YOLO.

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

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

التعليقات