Ultralytics YOLO27:
Get Started

التحقق المتقاطع بطريقة 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 أكبر فائدة عندما تكون مجموعة البيانات صغيرة أو مشوشة أو شديدة التباين؛ أما مجموعات البيانات الكبيرة والمتنوعة، فعادةً ما يكفيها تقسيم مُعدّ جيدًا إلى تدريب/تحقق/اختبار.

لنبدأ.

الإعداد#

  • ينبغي أن تكون التعليقات التوضيحية بتنسيق 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)  # ⁨ضبط random_state للحصول على نتائج قابلة للتكرار⁩
    
    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 وDataFrame توزيع التسميات في ملفات 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"  # ⁨استخدم yolo26n.pt لنموذج صغير⁩
    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
    
    # ⁨تقسيم مجموعة البيانات تلقائيًا إلى تدريب/تحقق/اختبار⁩
    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 لتدريب النماذج ونشرها دون كتابة التعليمات البرمجية. لمزيد من التفاصيل، استكشف مزايا وميزات صفحة Ultralytics YOLO.

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

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

التعليقات