İçeriğe geç

COCO Ek Açıklamaları YOLO Formatına Nasıl Dönüştürülür

Ultralytics YOLO modellerini eğitmek, ek açıklamaların YOLO formatında olmasını gerektirir, ancak birçok popüler ek açıklama aracı bunun yerine COCO JSON formatında dışa aktarır. Bu kılavuz, COCO ek açıklamalarınızı YOLO formatına nasıl dönüştüreceğinizi ve nesne algılama, örnek segmentasyon ve poz tahmini modellerini eğitmeye nasıl başlayacağınızı gösterir.

Neden COCO'dan YOLO'ya Dönüştürme?

COCO JSON formatı tüm ek açıklamaları tek bir dosyada saklarken, YOLO her görüntü için normalize edilmiş koordinatlara sahip bir metin dosyası kullanır. Dönüştürme gereklidir çünkü:

  • YOLO modelleri gerektirir .txt etiket dosyaları her görüntü için bir dosya ile, içeren class x_center y_center width height normalize edilmiş koordinatlarda.
  • COCO JSON piksel koordinatları kullanır içinde [x_min, y_min, width, height] tüm görüntüler için tek bir JSON dosyası içeren format.
  • Sınıf Kimlikleri farklıdır — COCO rastgele kullanır category_id değerler kullanırken, YOLO sıfır tabanlı sınıf kimlikleri gerektirir.
ÖzellikCOCO JSONYOLO TXT
YapıTüm görüntüler için tek JSON dosyasıBir .txt görüntü başına dosya
Bbox formatı[x_min, y_min, width, height] piksel cinsindenclass x_center y_center width height normalize edilmiş (0-1)
Sınıf Kimliklericategory_id (herhangi bir sayıdan başlayabilir)Sıfır tabanlı (0'dan başlar)
SegmentasyonPoligon dizileri segmentation alanındaSınıf Kimliğinden sonra poligon koordinatları
Anahtar Noktalar[x, y, visibility, ...] piksel cinsinden[x, y, visibility, ...] normalize edilmiş

Hızlı Başlangıç

COCO ek açıklamalarını dönüştürmenin ve eğitime başlamanın en hızlı yolu:

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
)

Dönüştürmeden sonra, dizin yapınızı düzenleyin, bir dataset.yaml oluşturun ve eğitime başlayın. Aşağıdaki tam adım adım kılavuza bakın.

Özel veri kümeleri: her zaman şunu kullanın cls91to80=False

cls91to80=True varsayılan olarak tasarlanmıştır sadece standart COCO veri kümesi 91 bitişik olmayan kategori kimliğini 80 bitişik sınıf kimliğine eşleyen 80 nesne sınıfı ile. Herhangi bir özel veri kümesi için, zorundasınız ayarlayın cls91to80=False — aksi takdirde sınıf kimlikleriniz sessizce yanlış eşlenecek ve modeliniz yanlış sınıfları öğrenecektir.

Adım Adım Dönüşüm Kılavuzu

1. COCO Veri Setinizi Hazırlayın

Ek açıklama araçlarından dışa aktarılan tipik bir COCO formatlı veri kümesi aşağıdaki yapıya sahiptir:

my_dataset/
├── images/
│   ├── train/
│   │   ├── img_001.jpg
│   │   ├── img_002.jpg
│   │   └── ...
│   └── val/
│       ├── img_100.jpg
│       └── ...
└── annotations/
    ├── instances_train.json
    └── instances_val.json

Her JSON dosyası şunları takip eder: COCO veri formatı üç zorunlu alan içeren belirtimi — images, annotationsve 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. Ek Açıklamaları Dönüştürün

Şunu kullanın: convert_coco() COCO JSON ek açıklamalarınızı YOLO'ya dönüştürme işlevi .txt biçimi:

COCO'yu YOLO formatına dönüştür

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. Dizin Yapısını Düzenleyin

Dönüştürmeden sonra, etiket dosyaları görüntülerinizin yanına yerleştirilmelidir. YOLO bir labels/ dizinini yansıtan bir images/ dizin:

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))

Nihai veri kümesi yapınız şöyle görünmelidir:

my_dataset/
├── images/
│   ├── train/
│   │   ├── img_001.jpg
│   │   └── ...
│   └── val/
│       └── ...
├── labels/
│   ├── train/
│   │   ├── img_001.txt
│   │   └── ...
│   └── val/
│       └── ...
└── dataset.yaml

4. dataset.yaml Oluşturun

Bir tane oluşturun dataset.yaml COCO kategorilerinizi YOLO sınıf adlarına eşleyen bir yapılandırma dosyası. Bu dosya, YOLO'ya verilerinizin nerede olduğunu ve hangi sınıfları detect edeceğini söyler:

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)

Ortaya çıkan YAML dosyası:

path: /absolute/path/to/my_dataset
train: images/train
val: images/val
names:
    0: helmet
    1: vest

Veri kümesi YAML formatı hakkında daha fazla ayrıntı için veri kümesi yapılandırma kılavuzuna bakın.

5. YOLO Modelinizi Eğitin

Dönüştürülmüş veri kümeniz hazır olduğunda, bir YOLO modeli eğitin:

Dönüştürülmüş COCO verileri üzerinde eğitim yapın

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

Eğitim ipuçları ve en iyi uygulamalar için model eğitim kılavuzuna bakın.

6. Dönüşümünüzü Doğrulayın

Eğitimden önce, sınıf kimliklerinin ve koordinatların doğru olduğunu doğrulamak için birkaç etiket dosyasını kontrol edin:

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}"

İpucu

Negatif sınıf kimlikleri görüyorsanız, COCO JSON'unuz muhtemelen şunu kullanır: category_id 0'dan başlayarak. Tümüne 1 ekleyin category_id çalıştırmadan önce JSON'unuzdaki değerleri convert_coco(), çünkü sınıf kimliklerini şu şekilde eşler category_id - 1.

Sık Karşılaşılan Sorunları Giderme

Dönüşüm Sonrası Yanlış Sınıf Kimlikleri

Modeliniz eğitim alıyor ancak yanlış nesne sınıflarını detect ediyorsa, muhtemelen şunu kullanıyorsunuz cls91to80=True (varsayılan) özel bir veri kümesinde. Bu, sizin category_id değerlerini COCO 91'den 80'e arama tablosu aracılığıyla eşler, ki bu yalnızca standart için doğrudur COCO veri kümesi.

Çözüm: Her zaman şunu kullanın cls91to80=False özel veri kümeleri için.

Eğitim Sırasında Etiket Bulunamadı

Eğer eğitim sırasında şu görülüyorsa WARNING: No labels found veya 0 images, N backgrounds, etiket dosyalarınız beklenen dizinde değil. convert_coco() etiketleri ayrı bir çıktı dizinine kaydeder (örn., save_dir/labels/train/), ancak YOLO şunu bekler labels/ paralel olarak images/ veri kümesi dizininizin içinde.

Çözüm: Etiket dosyalarını beklenen dizin yapısına. Emin olun ki labels/train/ şunun kardeşidir images/train/.

Dönüşüm Sırasında KeyError

Eğer alırsanız KeyError: 'bbox' veya benzer hatalar alıyorsanız convert_coco(), sizin labels_dir muhtemelen örnek olmayan JSON dosyaları (örn., captions_train2017.json) içeriyor ve bunlar farklı bir açıklama yapısına sahip.

Çözüm: Yalnızca örnek açıklama JSON dosyalarını (örn., instances_train2017.json) şuraya yerleştirin labels_dir.

Dönüşüm Sonrası Boş Etiket Dosyaları

Dönüşüm tamamlandı ancak .txt dosyaları boş veya eksikse, tüm açıklamalar iscrowd: 1 (yaygın olarak SAM-oluşturulan maskelerle), veya sınırlayıcı kutular sıfır genişliğe veya yüksekliğe sahip.

Çözüm: JSON ek açıklamalarınızı şunun için inceleyin: iscrowd değerleri. SAM maskeleri kullanıyorsanız, JSON'u ayarlamak için ön işlemden geçirin. iscrowd: 0.

Dönüştürülen Etiketlerde Sınıf Kimliği Boşlukları

Etiket dosyalarındaki sınıf kimlikleri bitişik değilse (örn. 0, 1, 2 yerine 0, 4, 9), ek açıklama aracınız bitişik olmayan category_id değerler kullanır.

Çözüm: Şunlardaki sınıf kimliklerini doğrulayın: .txt dosyaları şununla eşleşir: names sözlüğü içinde dataset.yaml. Gerekirse kimlikleri bitişik değerlere yeniden eşleyin.

Tüm API ayrıntıları ve parametre açıklamaları için şuraya bakın: convert_coco API referansı.

SSS

COCO JSON ek açıklamalarını YOLO formatına nasıl dönüştürürüm?

Şunu kullanın: convert_coco() Ultralytics'tan COCO JSON ek açıklamalarını YOLO'ya dönüştürmek için işlev .txt biçimi. Ayarlayın cls91to80=False özel veri kümeleri için:

from ultralytics.data.converter import convert_coco

convert_coco(labels_dir="path/to/annotations/", save_dir="output/", cls91to80=False)

Dönüştürmeden sonra, etiket dosyalarınızı yeniden düzenleyin, böylece labels/ şunu yansıtır: images/ dizini, ardından bir dataset.yaml dosyası oluşturun. Şuraya bakın: adım adım kılavuz eksiksiz iş akışı için.

COCO dönüşümünden sonra YOLO eğitimi neden "Etiket bulunamadı" gösteriyor?

Bu durum şundan dolayı oluşur: convert_coco() etiketleri şunun içindeki bir alt dizine kaydeder: save_dir/labels/ (örneğin, save_dir/labels/train/) doğrudan veri kümenizin içine değil. labels/train/ ile birlikte images/train/. YOLO, etiketlerin görüntülere paralel olmasını bekler — örneğin, images/train/img.jpg gereksinimler labels/train/img.txt. Dönüştürülmüş etiketlerinizi bu yapıya uyacak şekilde taşıyın. Bkz. dizin yapısını düzeltme.

Ne işe yarar cls91to80 ne yapar convert_coco()?

cls91to80 parametresi, COCO category_id değerlerinin YOLO sınıf kimliklerine eşlendiğini kontrol eder. Ne zaman True (varsayılan), standart için tasarlanmış bir arama tablosu kullanır COCO veri kümesi, 80 sınıfı ve bitişik olmayan kimlikleri (1-90) olan. İçin özel veri kümeleri, her zaman ayarlayın cls91to80=False — bu, her birinden 1 çıkarır category_id sıfır tabanlı sınıf kimlikleri oluşturmak için.

Dönüştürmeden doğrudan COCO JSON üzerinde YOLO eğitebilir miyim?

Mevcut YOLO eğitim hattı ile değil — ek açıklamalar YOLO .txt formatında, her görüntü için bir dosya ile. Kullanın convert_coco() COCO JSON'unuzu önce dönüştürmek için, ardından bu kılavuzu düzenlemek ve eğitmek için. Desteklenen formatlar hakkında daha fazla bilgi için bkz. veri kümesi formatları.

COCO segmentasyon ek açıklamalarını YOLO formatına dönüştürebilir miyim?

Evet, kullanın use_segments=True çağırırken convert_coco() dönüştürülmüş YOLO etiketlerine poligon segment maskelerini dahil etmek için. Bu, ile uyumlu etiket dosyaları üretir YOLO segmentasyon modelleri:

from ultralytics.data.converter import convert_coco

convert_coco(labels_dir="annotations/", save_dir="output/", use_segments=True, cls91to80=False)

COCO anahtar nokta ek açıklamalarını YOLO formatına nasıl dönüştürürüm?

Kullanım use_keypoints=True COCO anahtar nokta ek açıklamalarını dönüştürmek için poz tahmini eğitim için:

from ultralytics.data.converter import convert_coco

convert_coco(labels_dir="annotations/", save_dir="output/", use_keypoints=True, cls91to80=False)

Şunu unutmayın ki eğer her ikisi de use_segments ve use_keypoints ayarlanmışsa True, etiket dosyalarına yalnızca anahtar noktalar yazılacak — segment'ler sessizce göz ardı edilecektir.



📅 6 gün önce oluşturuldu ✏️ 6 gün önce güncellendi
dependabotraimbekovm

Yorumlar