التحقق المتقاطع بنظام K-Fold باستخدام Ultralytics#
مقدمة#
يوضح هذا الدليل الشامل كيفية تنفيذ التحقق المتقاطع بنظام K-Fold لمجموعات بيانات كشف الأجسام ضمن منظومة Ultralytics. سنستخدم تنسيق كشف YOLO ومكتبات Python الأساسية مثل sklearn وpandas وPyYAML لإرشادك خلال الإعداد الضروري، وعملية إنشاء متجهات السمات، وتنفيذ تقسيم مجموعة البيانات بنظام K-Fold.
سواء كان مشروعك يتضمن مجموعة بيانات Fruit Detection أو مصدر بيانات مخصصًا، يهدف هذا البرنامج التعليمي إلى مساعدتك على فهم التحقق المتقاطع بنظام K-Fold وتطبيقه لتعزيز موثوقية نماذج التعلم الآلي ومتانتها. نستخدم طيات k=5 لهذا البرنامج التعليمي، لكن ضع في اعتبارك أن العدد الأمثل للطيات قد يختلف بحسب مجموعة بياناتك وتفاصيل مشروعك. يحقق التحقق المتقاطع بنظام K-Fold أكبر قيمة عندما تكون مجموعة البيانات صغيرة أو مشوشة أو شديدة التباين؛ أما مجموعات البيانات الكبيرة والمتنوعة، فعادةً ما يكفيها تقسيم مُحكم إلى train/val/test.
لنبدأ.
الإعداد#
-
يجب أن تكون التعليقات التوضيحية لديك بتنسيق كشف YOLO.
-
يفترض هذا الدليل أن ملفات التعليقات التوضيحية متاحة محليًا.
-
لأغراض العرض التوضيحي، نستخدم مجموعة بيانات Fruit Detection.
- تحتوي مجموعة البيانات هذه على إجمالي 8479 صورة.
- وتتضمن 6 تسميات للفئات، مع إدراج إجمالي عدد مثيلاتها أدناه.
| تسمية الفئة | عدد المثيلات |
|---|---|
| تفاح | 7049 |
| عنب | 7202 |
| أناناس | 1613 |
| برتقال | 15549 |
| موز | 3536 |
| بطيخ | 1976 |
-
تتضمن حزم Python الضرورية ما يلي:
ultralyticssklearnpandaspyyaml
-
يعمل هذا البرنامج التعليمي باستخدام طيات
k=5. ومع ذلك، ينبغي لك تحديد أفضل عدد من الطيات لمجموعة بياناتك الخاصة.
-
أنشئ بيئة افتراضية جديدة لـ Python (
venv) لمشروعك وفعّلها. استخدمpip(أو مدير الحزم المفضل لديك) لتثبيت ما يلي:- مكتبة Ultralytics:
pip install -U ultralytics. وبدلًا من ذلك، يمكنك استنساخ المستودع الرسمي. - Scikit-learn وpandas وPyYAML:
pip install -U scikit-learn pandas pyyaml.
- مكتبة Ultralytics:
-
تحقق من أن تعليقاتك التوضيحية بتنسيق كشف YOLO.
- في هذا البرنامج التعليمي، توجد جميع ملفات التعليقات التوضيحية في الدليل
Fruit-Detection/labels.
- في هذا البرنامج التعليمي، توجد جميع ملفات التعليقات التوضيحية في الدليل
إنشاء متجهات السمات لمجموعة بيانات كشف الأجسام#
-
ابدأ بإنشاء ملف Python جديد باسم
example.pyلتنفيذ الخطوات أدناه. -
حمّل صور التدريب والتحقق المُهيّأة من خلال مالك مجموعة بيانات الحزمة، مع ترك تقسيم الاختبار دون تغيير.
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] -
اقرأ الآن محتويات ملف YAML لمجموعة البيانات واستخرج فهارس تسميات الفئات.
classes = data["names"] cls_idx = sorted(classes.keys()) -
هيّئ DataFrame فارغًا باسم
pandas.import pandas as pd labels_df = pd.DataFrame(0.0, columns=cls_idx, index=images) -
احسب عدد مثيلات كل فئة موجودة في ملفات التعليقات التوضيحية.
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()) -
فيما يلي نموذج لعرض 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#
-
سنستخدم الآن الفئة
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)) - مهم:
-
قُسّمت مجموعة البيانات الآن إلى
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" -
سنحسب الآن توزيع تسميات الفئات لكل طية كنسبة بين الفئات الموجودة في
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يتمثل السيناريو المثالي في أن تكون جميع نسب الفئات متشابهة إلى حد معقول لكل تقسيم وعبر الفئات. ومع ذلك، سيعتمد هذا على خصائص مجموعة بياناتك.
-
اكتب قوائم الصور وملف 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#
-
حمّل نموذج YOLO أولًا.
from ultralytics import YOLO weights_path = "path/to/weights.pt" # use yolo26n.pt for a small model model = YOLO(weights_path, task="detect") -
بعد ذلك، كرّر على ملفات 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 -
يمكنك أيضًا استخدام دالة 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، اتبع الخطوات التالية:
- تحقق من أن التعليقات التوضيحية بتنسيق كشف YOLO.
- استخدم مكتبات Python مثل
sklearnوpandasوpyyaml. - أنشئ متجهات سمات من مجموعة بياناتك.
- قسّم مجموعة بياناتك باستخدام
KFoldمنsklearn.model_selection. - درّب نموذج YOLO على كل تقسيم.
للاطلاع على دليل شامل، راجع قسم تقسيم مجموعة البيانات بنظام K-Fold في وثائقنا.
يستهدف سير العمل في هذا الدليل تنسيق كشف YOLO، لكن النهج نفسه يتكيف مع كل مهام YOLO — إذ تغيّر المهمة كيفية تكوين الطيات، لا مدى فائدة التحقق المتقاطع:
المهمة تصميم الطيات detectقسّم على مستوى الصورة، مع موازنة توزيعات الأجسام والفئات عبر الطيات. وأبقِ الصور المرتبطة (للمريض نفسه أو تسلسل الفيديو أو الكاميرا أو الموقع نفسه) ضمن طية واحدة. segmentاستخدم الاستراتيجية نفسها على مستوى الصورة كما في الكشف، مع الحفاظ إضافيًا على تغطية القناع والفئات في كل طية. classifyفضّل الطيات الطبقية بحيث تظل تكرارات الفئات متوازنة بين التدريب والتحقق. poseقسّم حسب الموضوع أو التسلسل بحيث لا يظهر الشخص أو الحيوان نفسه على جانبي الطية. obbقسّم على مستوى الصورة، مع إبقاء الأجزاء أو القصاصات من المشهد نفسه معًا — وهذا مهم خصوصًا للصور الجوية. بغض النظر عن المهمة، أبقِ العينات شبه المكررة والمرتبطة خارج الطيات المتقابلة؛ فهذا النوع من تسرب البيانات يضخم مقاييس التحقق بدرجة تتجاوز كثيرًا ما سيحققه النموذج في الإنتاج.
يوفر Ultralytics YOLO كشفًا متقدمًا للأجسام في الوقت الفعلي، مع دقة وكفاءة عاليتين. وهو متعدد الاستخدامات، إذ يدعم مهام الرؤية الحاسوبية المتعددة مثل الكشف وتجزئة المثيلات والتجزئة الدلالية والتصنيف. كما يتكامل بسلاسة مع أدوات مثل Ultralytics Platform لتدريب النماذج ونشرها دون كتابة تعليمات برمجية. لمزيد من التفاصيل، استكشف المزايا والميزات في صفحة Ultralytics YOLO.
ينبغي أن تتبع تعليقاتك التوضيحية تنسيق كشف YOLO. ويجب أن يسرد كل ملف تعليقات توضيحية فئة الجسم، إلى جانب إحداثيات الصندوق المحيط به في الصورة. ويضمن تنسيق YOLO معالجة بيانات مبسطة وموحّدة لتدريب نماذج كشف الأجسام. لمزيد من المعلومات حول تنسيق التعليقات التوضيحية الصحيح، راجع دليل تنسيق كشف YOLO.
نعم، يمكنك استخدام التحقق المتقاطع بنظام K-Fold مع أي مجموعة بيانات مخصصة، ما دامت التعليقات التوضيحية بتنسيق كشف YOLO. استبدل مسارات مجموعة البيانات وتسميات الفئات بما يخص مجموعة بياناتك المخصصة. وتضمن هذه المرونة استفادة أي مشروع لكشف الأجسام من تقييم متين للنموذج باستخدام التحقق المتقاطع بنظام K-Fold. للحصول على مثال عملي، راجع قسم إنشاء متجهات السمات.