كيفية تحويل COCO إلى YOLO
التدريب Ultralytics YOLO تتطلب نماذج YOLO تعليقات توضيحية YOLO ولكن العديد من أدوات التعليقات التوضيحية الشائعة تقوم بالتصدير بتنسيق COCO بدلاً من ذلك. يوضح لك هذا الدليل كيفية تحويل COCO إلى YOLO والبدء في تدريب نماذج الكشف عن الكائنات وتقسيم الحالات وتقدير الوضع.
لماذا التحويل من COCO YOLO؟
يخزن تنسيق COCO جميع التعليقات التوضيحية في ملف واحد، بينما YOLO ملف نصي واحد لكل صورة مع إحداثيات معيارية. التحويل ضروري للأسباب التالية:
- تتطلب YOLO
.txtملفات التسمية بملف واحد لكل صورة، يحتوي علىclass x_center y_center width heightبالإحداثيات المعيارية. - يستخدم COCO JSON إحداثيات البكسل في
[x_min, y_min, width, height]تنسيق ملف JSON واحد لجميع الصور. - تختلف معرفات الفئات — COCO قيمًا عشوائية
category_idالقيم، بينما YOLO معرّفات الفئات ذات الترقيم من الصفر.
| ميزة | COCO JSON | YOLO |
|---|---|---|
| الهيكل | ملف JSON واحد لجميع الصور | واحد .txt ملف لكل صورة |
| تنسيق Bbox | [x_min, y_min, width, height] بالبكسل | class x_center y_center width height مُعَدَّلة (0-1) |
| معرفات الفئات | category_id (يمكن أن يبدأ من أي رقم) | مُرقَّم من الصفر (يبدأ من 0) |
| التجزئة | مصفوفات متعددة الأضلاع في segmentation الميدان | إحداثيات المضلع بعد معرّف الفئة |
| النقاط الرئيسية | [x, y, visibility, ...] بالبكسل | [x, y, visibility, ...] طبيعي |
بدء سريع
أسرع طريقة لتحويل COCO والبدء في التدريب:
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="path/to/annotations/", # directory containing your JSON files
save_dir="path/to/output/", # where to save converted labels
cls91to80=False, # IMPORTANT: set False for custom datasets
)
بعد التحويل، نظّم بنية الدليل الخاص بك، أنشئ ملف dataset.yaml، وابدأ التدريب. راجع الدليل الكامل خطوة بخطوة أدناه.
مجموعات البيانات المخصصة: استخدم دائمًا cls91to80=False
في cls91to80=True مصمم بشكل افتراضي فقط بالنسبة للمعيار مجموعة بيانات COCO مع 80 فئة كائنات، حيث يتم ربط 91 معرّف فئة غير متجاور بـ 80 معرّف فئة متجاور. بالنسبة لأي مجموعة بيانات مخصصة، يمكنك يجب مجموعة cls91to80=False — وإلا فسيتم تعيين معرّفات الفئات بشكل خاطئ دون أن تلاحظ ذلك، وسيتعلم النموذج فئات خاطئة.
دليل التحويل خطوة بخطوة
1. جهّز مجموعة بيانات COCO الخاصة بك
مجموعة بيانات نموذجية بتنسيق COCO تم تصديرها من أدوات التعليق التوضيحي لها الهيكل التالي:
my_dataset/
├── images/
│ ├── train/
│ │ ├── img_001.jpg
│ │ ├── img_002.jpg
│ │ └── ...
│ └── val/
│ ├── img_100.jpg
│ └── ...
└── annotations/
├── instances_train.json
└── instances_val.json
يتبع كل ملف JSON تنسيق بيانات COCO مواصفات تتضمن ثلاثة حقول إلزامية — images, annotations، و categories:
{
"images": [{ "id": 1, "file_name": "img_001.jpg", "width": 640, "height": 480 }],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 1,
"bbox": [100, 50, 200, 150],
"area": 30000,
"iscrowd": 0
}
],
"categories": [
{ "id": 1, "name": "helmet" },
{ "id": 2, "name": "vest" }
]
}
2. تحويل التعليقات التوضيحية
استخدم convert_coco() وظيفة لتحويل تعليقات COCO إلى YOLO .txt التنسيق:
تحويل COCO إلى تنسيق YOLO
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="my_dataset/annotations/",
save_dir="my_dataset/converted/",
cls91to80=False,
)
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="my_dataset/annotations/",
save_dir="my_dataset/converted/",
use_segments=True,
cls91to80=False,
)
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="my_dataset/annotations/",
save_dir="my_dataset/converted/",
use_keypoints=True,
cls91to80=False,
)
3. تنظيم هيكل الدليل
بعد التحويل، يجب وضع ملفات التسميات بجانب صورك. يتوقع YOLO labels/ دليل يعكس images/ الدليل:
import shutil
from pathlib import Path
# Paths
converted_dir = Path("my_dataset/converted/labels")
dataset_dir = Path("my_dataset")
# Move labels next to images for each split
for split in ["train", "val"]:
src = converted_dir / split # convert_coco strips "instances_" prefix from JSON filename
dst = dataset_dir / "labels" / split
dst.mkdir(parents=True, exist_ok=True)
for f in src.glob("*.txt"):
shutil.move(str(f), str(dst / f.name))
يجب أن تبدو بنية مجموعة البيانات النهائية كما يلي:
my_dataset/
├── images/
│ ├── train/
│ │ ├── img_001.jpg
│ │ └── ...
│ └── val/
│ └── ...
├── labels/
│ ├── train/
│ │ ├── img_001.txt
│ │ └── ...
│ └── val/
│ └── ...
└── dataset.yaml
4. إنشاء ملف dataset.yaml
إنشاء dataset.yaml ملف التكوين الذي يربط فئات COCO الخاصة بك بأسماء فئات YOLO. يخبر هذا الملف YOLO بمكان بياناتك وما هي الفئات التي يجب detect:
import json
from pathlib import Path
import yaml
# Read categories from your COCO JSON
with open("my_dataset/annotations/instances_train.json") as f:
coco = json.load(f)
# Build class names matching convert_coco output (category_id - 1)
categories = sorted(coco["categories"], key=lambda x: x["id"])
names = {cat["id"] - 1: cat["name"] for cat in categories}
# NOTE: convert_coco maps class IDs as category_id - 1, so category_id must
# start from 1. If your categories start from 0, add 1 to each ID first.
# Create dataset.yaml
dataset = {
"path": str(Path("my_dataset").resolve()),
"train": "images/train",
"val": "images/val",
"names": names,
}
with open("my_dataset/dataset.yaml", "w") as f:
yaml.dump(dataset, f, default_flow_style=False)
ملف YAML الناتج:
path: /absolute/path/to/my_dataset
train: images/train
val: images/val
names:
0: helmet
1: vest
لمزيد من التفاصيل حول تنسيق YAML لمجموعة البيانات، راجع دليل تكوين مجموعة البيانات.
5. تدريب نموذج YOLO الخاص بك
بعد أن أصبحت مجموعة البيانات المحولة جاهزة، قم بتدريب YOLO :
التدريب على COCO المُحوَّلة
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load a pretrained model
results = model.train(data="my_dataset/dataset.yaml", epochs=100, imgsz=640)
yolo detect train model=yolo26n.pt data=my_dataset/dataset.yaml epochs=100 imgsz=640
للحصول على نصائح حول التدريب وأفضل الممارسات، راجع دليل التدريب النموذجي.
6. تحقق من تحويلك
قبل التدريب، تحقق سريعًا من بعض ملفات التسميات للتأكد من صحة معرفات الفئات والإحداثيات:
from pathlib import Path
label_file = Path("my_dataset/labels/train/img_001.txt")
for line in label_file.read_text().strip().splitlines():
parts = line.split()
cls_id = int(parts[0])
coords = [float(v) for v in parts[1:5]]
assert cls_id >= 0, f"Negative class ID {cls_id} — category_id in your JSON may start from 0"
assert all(0 <= v <= 1 for v in coords), f"Coordinates out of [0, 1] range: {coords}"
نصيحة
إذا رأيت معرّفات فئات سالبة، فمن المرجح أن COCO الخاص بـ COCO يستخدم category_id بدءًا من 0. أضف 1 إلى كل category_id القيم الموجودة في ملف JSON الخاص بك قبل التشغيل convert_coco()، نظرًا لأنه يربط معرفات الفئات كـ category_id - 1.
حل المشكلات الشائعة
أرقام تعريف الفئات غير الصحيحة بعد التحويل
إذا كان نموذجك يعمل ولكنه يكتشف فئات كائنات خاطئة، فمن المحتمل أنك تستخدم cls91to80=True (افتراضي) على مجموعة بيانات مخصصة. هذا يربط category_id القيم من خلال جدول البحث COCO ، وهو صحيح فقط بالنسبة للمعيار مجموعة بيانات COCO.
الحل: استخدم دائمًا cls91to80=False للمجموعات المخصصة من البيانات.
لم يتم العثور على أي علامات أثناء التدريب
إذا أظهرت التدريبات WARNING: No labels found أو 0 images, N backgrounds، ملفات التسمية الخاصة بك ليست في الدليل المتوقع. convert_coco() يحفظ العلامات في دليل إخراج منفصل (على سبيل المثال، save_dir/labels/train/، لكن YOLO يتوقع labels/ بالتوازي مع images/ داخل مجلد مجموعة البيانات الخاصة بك.
الحل: انقل ملفات التسميات لتتوافق مع المتوقع هيكل الدليلتأكد. labels/train/ هو شقيق/شقيقة images/train/.
خطأ KeyError أثناء التحويل
إذا حصلت على KeyError: 'bbox' أو أخطاء مشابهة عند التشغيل convert_coco()، الخاص بك labels_dir من المحتمل أن يحتوي على ملفات JSON غير مرتبطة بمثيل (على سبيل المثال، captions_train2017.json) التي لها بنية تعليق توضيحي مختلفة.
الحل: ضع فقط ملفات JSON لتعليقات المثيلات التوضيحية (على سبيل المثال، instances_train2017.json) في الـ labels_dir.
إفراغ ملفات العلامات بعد التحويل
إذا اكتمل التحويل ولكن .txt إذا كانت الملفات فارغة أو مفقودة، فقد تكون جميع التعليقات التوضيحية iscrowd: 1 (شائع مع SAM-أقنعة مُنشأة)، أو المربعات المحيطة لا تحتوي على عرض أو ارتفاع.
الحل: افحص تعليقات JSON التوضيحية الخاصة بك لـ iscrowd القيم. في حالة استخدام SAM ، قم بمعالجة ملف JSON مسبقًا لتعيين iscrowd: 0.
فجوات معرفات الفئات في التسميات المحولة
إذا كانت معرّفات الفئات في ملفات التسميات غير متجاورة (على سبيل المثال، 0، 4، 9 بدلاً من 0، 1، 2)، فإن أداة التعليق التوضيحي الخاصة بك تستخدم معرّفات غير متجاورة category_id القيم.
الحل: تحقق من معرفات الفئة في ملفك .txt الملفات تتطابق مع names قاموس في dataset.yamlأعد تعيين المعرفات إلى قيم متجاورة إذا لزم الأمر.
للاطلاع على التفاصيل الكاملة لواجهة برمجة التطبيقات (API) ووصف المعلمات، انظر convert_coco مرجع API.
الأسئلة الشائعة
كيف يمكنني تحويل تعليقات COCO إلى YOLO ؟
استخدم convert_coco() وظيفة من Ultralytics تعليقات COCO إلى YOLO .txt التنسيق. تعيين cls91to80=False بالنسبة لمجموعات البيانات المخصصة:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="path/to/annotations/", save_dir="output/", cls91to80=False)
بعد التحويل، أعد تنظيم ملفات التسميات الخاصة بك بحيث labels/ يعكس images/ الدليل، ثم قم بإنشاء dataset.yaml ملف. انظر دليل تفصيلي للحصول على سير العمل الكامل.
لماذا يظهر YOLO رسالة "لم يتم العثور على أي تسميات" بعد COCO ؟
يحدث هذا لأن convert_coco() يحفظ الملصقات في مجلد فرعي داخل save_dir/labels/ (على سبيل المثال، save_dir/labels/train/) بدلاً من إدخالها مباشرة في مجموعة بياناتك labels/train/ بجانب images/train/. تتوقع YOLO أن تكون التسميات موازية للصور — على سبيل المثال، images/train/img.jpg الاحتياجات labels/train/img.txtانقل تسمياتك المحولة لتتوافق مع هذا الهيكل. انظر تحديد بنية الدليل.
ماذا يعني cls91to80 يفعل في convert_coco()?
في cls91to80 تحدد هذه المعلمة كيفية عمل COCO category_id يتم ربط القيم بمعرفات YOLO . عندما True (افتراضي)، فإنه يستخدم جدول بحث مصمم للمعايير مجموعة بيانات COCO، والتي تحتوي على 80 فئة بمعرفات غير متجاورة (1-90). لـ مجموعات بيانات مخصصة، يتم تعيينه دائمًا cls91to80=False — وهذا يعني ببساطة طرح 1 من كل عدد category_id لإنشاء معرّفات فئات تبدأ من الصفر.
هل يمكنني تدريب YOLO مباشرة على COCO JSON دون تحويل؟
ليس مع مسار YOLO الحالي — يجب أن تكون التعليقات التوضيحية بتنسيق YOLO .txt تنسيق ملف واحد لكل صورة. استخدم convert_coco() قم بتحويل ملف COCO الخاص بـ COCO أولاً، ثم اتبع هذه الخطوات دليل للتنظيم والتدريب. لمزيد من المعلومات حول التنسيقات المدعومة، انظر صيغ مجموعة البيانات.
هل يمكنني تحويل تعليقات COCO segmentation التوضيحية إلى تنسيق YOLO؟
نعم، استخدم use_segments=True عند الاتصال convert_coco() لتضمين أقنعة تجزئة المضلعات في YOLO المحولة. ويؤدي ذلك إلى إنتاج ملفات تسميات متوافقة مع نماذج YOLO:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="annotations/", save_dir="output/", use_segments=True, cls91to80=False)
كيف يمكنني تحويل تعليقات COCO إلى YOLO ؟
استخدم use_keypoints=True لتحويل تعليقات COCO من أجل تقدير الوضعية التدريب:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="annotations/", save_dir="output/", use_keypoints=True, cls91to80=False)
يرجى ملاحظة أنه إذا كان كلاهما use_segments و use_keypoints مُعيّنة على True، سيتم كتابة النقاط الرئيسية فقط إلى ملفات التسميات — يتم تجاهل الـ segments بصمت.