انتقل إلى المحتوى

التحقق من صحة الصليب K-Fold مع Ultralytics

مقدمة

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

نظرة عامة على التحقق من صحة K-Fold

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

بدون مزيد من اللغط ، دعنا نتعمق!

اعداد

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

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

  • لعرضنا التوضيحي ، نستخدم مجموعة بيانات الكشف عن الفاكهة .

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

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

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

    • ال Ultralytics مكتبة: pip install -U ultralytics. بدلا من ذلك ، يمكنك استنساخ المسؤول الريبو.
    • Scikit-Learn و Pandas و PyYAML: pip install -U scikit-learn pandas pyyaml.
  • تحقق من وجود التعليقات التوضيحية في YOLO تنسيق الكشف.

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

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

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

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

    from pathlib import Path
    
    dataset_path = Path("./Fruit-detection")  # replace with 'path/to/dataset' for your custom data
    labels = sorted(dataset_path.rglob("*labels/*.txt"))  # all data in 'labels'
    
  3. الآن ، اقرأ محتويات ملف YAML لمجموعة البيانات واستخرج فهارس تسميات الفئة.

    yaml_file = "path/to/data.yaml"  # your data YAML with data directories and names dictionary
    with open(yaml_file, "r", encoding="utf8") as y:
        classes = yaml.safe_load(y)["names"]
    cls_idx = sorted(classes.keys())
    
  4. تهيئة فارغة pandas إطار البيانات.

    import pandas as pd
    
    indx = [l.stem for l in labels]  # uses base filename as ID (no extension)
    labels_df = pd.DataFrame([], columns=cls_idx, index=indx)
    
  5. عد مثيلات كل تسمية فئة موجودة في ملفات التعليقات التوضيحية.

    from collections import Counter
    
    for label in labels:
        lbl_counter = Counter()
    
        with open(label, "r") as lf:
            lines = lf.readlines()
    
        for l in lines:
            # classes for YOLO label uses integer at first position of each line
            lbl_counter[int(l.split(" ")[0])] += 1
    
        labels_df.loc[label.stem] = lbl_counter
    
    labels_df = labels_df.fillna(0.0)  # replace `nan` values with `0.0`
    
  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=indx, columns=folds)
    
    for idx, (train, val) in enumerate(kfolds, start=1):
        folds_df[f"split_{idx}"].loc[labels_df.iloc[train].index] = "train"
        folds_df[f"split_{idx}"].loc[labels_df.iloc[val].index] = "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 لمجموعة البيانات لكل تقسيم.

    import datetime
    
    supported_extensions = [".jpg", ".jpeg", ".png"]
    
    # Initialize an empty list to store image file paths
    images = []
    
    # Loop through supported extensions and gather image files
    for ext in supported_extensions:
        images.extend(sorted((dataset_path / "images").rglob(f"*{ext}")))
    
    # Create the necessary directories and dataset YAML files (unchanged)
    save_path = Path(dataset_path / f"{datetime.date.today().isoformat()}_{ksplit}-Fold_Cross-val")
    save_path.mkdir(parents=True, exist_ok=True)
    ds_yamls = []
    
    for split in folds_df.columns:
        # Create directories
        split_dir = save_path / split
        split_dir.mkdir(parents=True, exist_ok=True)
        (split_dir / "train" / "images").mkdir(parents=True, exist_ok=True)
        (split_dir / "train" / "labels").mkdir(parents=True, exist_ok=True)
        (split_dir / "val" / "images").mkdir(parents=True, exist_ok=True)
        (split_dir / "val" / "labels").mkdir(parents=True, exist_ok=True)
    
        # Create dataset YAML files
        dataset_yaml = split_dir / f"{split}_dataset.yaml"
        ds_yamls.append(dataset_yaml)
    
        with open(dataset_yaml, "w") as ds_y:
            yaml.safe_dump(
                {
                    "path": split_dir.as_posix(),
                    "train": "train",
                    "val": "val",
                    "names": classes,
                },
                ds_y,
            )
    
  5. أخيرا ، انسخ الصور والتسميات في الدليل المعني ("train" أو "val") لكل تقسيم.

    • ملاحظه: سيختلف الوقت المطلوب لهذا الجزء من التعليمات البرمجية بناء على حجم مجموعة البيانات وأجهزة النظام الخاصة بك.
    import shutil
    
    for image, label in zip(images, labels):
        for split, k_split in folds_df.loc[image.stem].items():
            # Destination directory
            img_to_path = save_path / split / k_split / "images"
            lbl_to_path = save_path / split / k_split / "labels"
    
            # Copy image and label files to new directory (SamefileError if file already exists)
            shutil.copy(image, img_to_path / image.name)
            shutil.copy(label, lbl_to_path / label.name)
    

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

اختياريا ، يمكنك حفظ سجلات K-Fold split وتوزيع التسمية DataFrames كملفات 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"
    model = YOLO(weights_path, task="detect")
    
  2. بعد ذلك ، كرر عبر ملفات YAML لمجموعة البيانات لتشغيل التدريب. سيتم حفظ النتائج في دليل محدد بواسطة project و name الحجج. بشكل افتراضي ، يكون هذا الدليل هو "exp / runs #" حيث # هو فهرس عدد صحيح.

    results = {}
    
    # Define your additional arguments here
    batch = 16
    project = "kfold_demo"
    epochs = 100
    
    for k in range(ksplit):
        dataset_yaml = ds_yamls[k]
        model.train(data=dataset_yaml, epochs=epochs, batch=batch, project=project)  # include any train arguments
        results[k] = model.metrics  # save output metrics for further analysis
    

استنتاج

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

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

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

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

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

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

الأسئلة المتداولة

ما هو التحقق التبادلي K-Fold Cross Validation ولماذا هو مفيد في اكتشاف الأجسام؟

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

كيف يمكنني تنفيذ التحقق التبادلي K-Fold Cross Validation باستخدام Ultralytics YOLO ؟

لتطبيق التحقق المتقاطع K-Fold Cross Validation مع Ultralytics YOLO ، عليك اتباع الخطوات التالية:

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

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

لماذا يجب أن أستخدم Ultralytics YOLO للكشف عن الأجسام؟

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

كيف يمكنني التأكد من أن التعليقات التوضيحية الخاصة بي بالصيغة الصحيحة لـ Ultralytics YOLO ؟

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

هل يمكنني استخدام التحقق التبادلي K-Fold Cross Validation مع مجموعات بيانات مخصصة أخرى غير كشف الفاكهة؟

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



تم الإنشاء 2023-11-12-2023، تم التحديث 2024-07-05
المؤلفون: جلين-جوتشر (10)، إيفور زو331 (1)، برهان-كيو (1)

التعليقات