التحقق من صحة الصليب K-Fold مع Ultralytics
مقدمة
This comprehensive guide illustrates the implementation of K-Fold Cross Validation for object detection datasets within the Ultralytics ecosystem. We'll leverage the YOLO detection format and key Python libraries such as sklearn, pandas, and PyYaml to guide you through the necessary setup, the process of generating feature vectors, and the execution of a K-Fold dataset split.
Whether your project involves the Fruit Detection dataset or a custom data source, this tutorial aims to help you comprehend and apply K-Fold Cross Validation to bolster the reliability and robustness of your machine learning models. While we're applying 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
.
- ال Ultralytics مكتبة:
تحقق من وجود التعليقات التوضيحية في YOLO تنسيق الكشف.
- في هذا البرنامج التعليمي، تم العثور على جميع ملفات التعليقات التوضيحية في
Fruit-Detection/labels
دليل.
- في هذا البرنامج التعليمي، تم العثور على جميع ملفات التعليقات التوضيحية في
إنشاء متجهات المعالم لمجموعة بيانات اكتشاف الكائنات
ابدأ بإنشاء ملف جديد
example.py
Python للخطوات أدناه.تابع استرداد جميع ملفات الملصقات لمجموعة البيانات الخاصة بك.
الآن ، اقرأ محتويات ملف YAML لمجموعة البيانات واستخرج فهارس تسميات الفئة.
تهيئة فارغة
pandas
إطار البيانات.عد مثيلات كل تسمية فئة موجودة في ملفات التعليقات التوضيحية.
from collections import Counter for label in labels: lbl_counter = Counter() with open(label, "r") as lf: lines = lf.readlines() for line in lines: # classes for YOLO label uses integer at first position of each line lbl_counter[int(line.split(" ")[0])] += 1 labels_df.loc[label.stem] = lbl_counter labels_df = labels_df.fillna(0.0) # replace `nan` values with `0.0`
فيما يلي نموذج عرض ل 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
هو عدد صحيح مختار ، يمكنك الحصول على نتائج قابلة للتكرار.
- اعداد
- مهم:
تم الآن تقسيم مجموعة البيانات إلى
k
طيات ، لكل منها قائمةtrain
وval
مؤشرات. سنقوم بإنشاء DataFrame لعرض هذه النتائج بشكل أكثر وضوحا.سنقوم الآن بحساب توزيع تسميات الفئة لكل طية كنسبة من الفئات الموجودة في
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 لمجموعة البيانات لكل تقسيم.
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, )
أخيرا ، انسخ الصور والتسميات في الدليل المعني ("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
أولا ، قم بتحميل ملف YOLO نموذج.
بعد ذلك ، كرر عبر ملفات 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 is a technique where the dataset is divided into 'k' subsets (folds) to evaluate model performance more reliably. Each fold serves as both training and validation data. In the context of object detection, using K-Fold Cross Validation helps to ensure your Ultralytics YOLO model's performance is robust and generalizable across different data splits, enhancing its reliability. For detailed instructions on setting up K-Fold Cross Validation with Ultralytics YOLO, refer to K-Fold Cross Validation with Ultralytics.
كيف يمكنني تنفيذ التحقق التبادلي K-Fold Cross Validation باستخدام Ultralytics YOLO ؟
لتطبيق التحقق المتقاطع K-Fold Cross Validation مع Ultralytics YOLO ، عليك اتباع الخطوات التالية:
- تحقق من وجود التعليقات التوضيحية بتنسيق الكشفYOLO .
- استخدم مكتبات Python مثل
sklearn
,pandas
وpyyaml
. - إنشاء متجهات ميزات من مجموعة البيانات الخاصة بك.
- قم بتقسيم مجموعة بياناتك باستخدام
KFold
منsklearn.model_selection
. - قم بتدريب نموذج YOLO على كل تقسيم.
للاطلاع على دليل شامل، راجع قسم تقسيم مجموعة البيانات K-Fold Dataset Split في وثائقنا.
لماذا يجب أن أستخدم Ultralytics YOLO للكشف عن الأجسام؟
Ultralytics YOLO offers state-of-the-art, real-time object detection with high accuracy and efficiency. It's versatile, supporting multiple computer vision tasks such as detection, segmentation, and classification. Additionally, it integrates seamlessly with tools like Ultralytics HUB for no-code model training and deployment. For more details, explore the benefits and features on our Ultralytics YOLO page.
كيف يمكنني التأكد من أن التعليقات التوضيحية الخاصة بي بالصيغة الصحيحة لـ Ultralytics YOLO ؟
Your annotations should follow the YOLO detection format. Each annotation file must list the object class, alongside its bounding box coordinates in the image. The YOLO format ensures streamlined and standardized data processing for training object detection models. For more information on proper annotation formatting, visit the YOLO detection format guide.
هل يمكنني استخدام التحقق التبادلي K-Fold Cross Validation مع مجموعات بيانات مخصصة أخرى غير كشف الفاكهة؟
نعم، يمكنك استخدام التحقق التبادلي K-Fold Cross Validation مع أي مجموعة بيانات مخصصة طالما كانت التعليقات التوضيحية بتنسيق الكشف YOLO . استبدل مسارات مجموعة البيانات وتسميات الفئات بتلك الخاصة بمجموعة بياناتك المخصصة. تضمن هذه المرونة إمكانية استفادة أي مشروع للكشف عن الكائنات من التقييم القوي للنموذج باستخدام التحقق المتقاطع K-Fold Cross Validation. للحصول على مثال عملي، راجع قسم توليد متجهات الميزات.