التحقق المتقاطع ك-أضعاف التحقق المتقاطع مع Ultralytics
مقدمة
يوضح هذا الدليل الشامل تنفيذ التحقق المتقاطع K-Fold Cross Validation لمجموعات بيانات الكشف عن الكائنات ضمن النظام البيئي Ultralytics . سنستفيد من تنسيق الكشف YOLO ومكتبات Python الرئيسية مثل sklearn و pandas و PyYaml لإرشادك خلال الإعداد اللازم، وعملية توليد ناقلات الميزات، وتنفيذ تقسيم مجموعة بيانات K-Fold.
سواءً كان مشروعك يتضمن مجموعة بيانات Fruit Detection أو مصدر بيانات مخصص، يهدف هذا البرنامج التعليمي إلى مساعدتك على فهم وتطبيق التحقق المتقاطع K-Fold Cross Validation لتعزيز موثوقية ومتانة التعلّم الآلي النماذج. بينما نطبق 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`
-
فيما يلي نموذج لعرض نموذج لإطار البيانات المأهول:
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 Cross Validation على مجموعة بيانات الكشف عن الكائنات.
تقسيم مجموعة البيانات ك-أضعاف
-
الآن سنستخدم الآن
KFold
فئة منsklearn.model_selection
لتوليدk
تقسيمات مجموعة البيانات.- مهم:
- الإعداد
shuffle=True
يضمن التوزيع العشوائي للفئات في تقسيماتك. - من خلال الإعداد
random_state=M
حيثM
عدد صحيح مختار، يمكنك الحصول على نتائج قابلة للتكرار.
- الإعداد
- مهم:
-
تم تقسيم مجموعة البيانات الآن إلى
k
طيات، كل منها يحتوي على قائمةtrain
و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 لمجموعة البيانات لكل تقسيم.
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, )
-
أخيرًا، انسخ الصور والتسميات في الدليل الخاص بكل تقسيم ("قطار" أو "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 وتوزيع التسمية DataFrames كملفات CSV للرجوع إليها في المستقبل.
folds_df.to_csv(save_path / "kfold_datasplit.csv")
fold_lbl_distrb.to_csv(save_path / "kfold_label_distribution.csv")
تدريب YOLO باستخدام تقسيمات بيانات K- أضعاف البيانات
-
أولاً، قم بتحميل النموذج 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 = YOLO(weights_path, task="detect") 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 ، عليك اتباع الخطوات التالية:
- تحقق من وجود التعليقات التوضيحية بتنسيق الكشفYOLO .
- استخدم مكتبات Python مثل
sklearn
,pandas
وpyyaml
. - إنشاء متجهات ميزات من مجموعة البيانات الخاصة بك.
- قم بتقسيم مجموعة بياناتك باستخدام
KFold
منsklearn.model_selection
. - قم بتدريب نموذج 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. للحصول على مثال عملي، راجع قسم توليد متجهات الميزات.