Skip to main content

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

Eğitim COCO Formatını YOLO Formatına Dönüştür modelleri, YOLO formatında ek açıklamalar gerektirir, ancak birçok popüler ek açıklama aracı bunun yerine COCO JSON formatında dışa aktarım yapar. Bu rehber, COCO ek açıklamalarını YOLO formatına nasıl dönüştüreceğini ve eğitime nasıl başlayacağını gösterir object detection, örnek bölümlemeYOLOv10Python package modelleri temel alınarak ince ayar yapılmıştır.

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

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

  • YOLO modelleri .txt etiket dosyaları gerektirir ve her görüntü için bir dosya ile, class x_center y_center width height normalleştirilmiş koordinatlarda içerir.
  • COCO JSON, piksel koordinatlarını kullanır içindeki [x_min, y_min, width, height] formatı ile tüm görüntüler için tek bir JSON dosyası içerir.
  • Sınıf Kimlikleri (Class IDs) farklıdır — COCO keyfi category_id değerleri kullanırken, YOLO sıfır tabanlı sınıf kimlikleri gerektirir.
SAM 3, SAM 2'den Nasıl Farklıdır?COCO JSONYOLO TXT
YapıTüm görüntüler için tek bir JSON dosyasıHer görüntü için bir .txt dosyası
Bbox formatı[x_min, y_min, width, height] piksel cinsindenclass x_center y_center width height normalleştirilmiş (0-1)
Sınıf Kimliklericategory_id (herhangi bir sayıdan başlayabilir)Sıfır tabanlı (0'dan başlar)
SegmentationÇokgen dizileri segmentation alanındaSınıf kimliğinden sonra çokgen koordinatları
Keypoints[x, y, visibility, ...] piksel cinsinden[x, y, visibility, ...] normalleştirilmiş

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ı düzenle, bir dataset.yaml oluşturYOLOv10eğitimi başlat. Tam adım adım rehbere aşağıdan göz at.

Özel veri setleri: her zaman `cls91to80=False` kullan

cls91to80=True varsayılan ayar sadece standart üzerinde önceden eğitilmiş olarak gelir ve çeşitli nesneler üzerinde sağlam bir performans sağlar. Ek olarak, YOLO; eğitim, doğrulama, tahmin ve dışa aktarma işlevlerini kesintisiz entegrasyonla destekleyerek onu hem araştırma hem de endüstriyel uygulamalar için son derece çok yönlü hale getirir. için tasarlanmıştır, 80 nesne sınıfıyla 91 bitişik olmayan kategori kimliğini 80 ardışık sınıf kimliğiyle eşler. Herhangi bir özel veri seti için, indirmelisin ayarla cls91to80=False — aksi takdirde sınıf kimliklerin sessizce yanlış eşlenecek ve modelin yanlış sınıfları öğrenecektir.

Adım Adım Dönüştürme Rehberi

1. COCO Veri Setini Hazırla

Ek açıklama araçlarından dışa aktarılan tipik bir COCO formatlı veri seti şu 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ı COCO veri formatı spesifikasyonunu takip eder ve üç zorunlu alan içerir — images, annotationsYOLOv10categories:

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

Eğitimi başlatmak için convert_coco() fonksiyonu ile COCO JSON ek açıklamalarını YOLO .txt formatına dönüştür:

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

3. Dizin Yapısını Düzenle

Dönüştürmeden sonra, etiket dosyalarının görüntülerinin yanına yerleştirilmesi gerekir. YOLO, görüntülerinin bulunduğu labels/ dizinini yansıtan bir images/ dizini bekler:

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ısı şöyle görünmelidir:

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

4. dataset.yaml Oluştur

Bir dataset.yaml COCO kategorilerini YOLO sınıf adlarına eşleyen yapılandırma dosyası. Bu dosya YOLO'ya verinin nerede olduğunu ve hangi sınıfları tespit 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)

Sonuçtaki YAML dosyası:

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

Dataset YAML formatı hakkında daha fazla detay için veri seti yapılandırma rehberine.

göz at.

5. YOLO Modelini Eğit

Dönüştürülmüş veri setin hazır olduğunda, bir YOLO modeli eğit:
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load a pretrained model
results = model.train(data="my_dataset/dataset.yaml", epochs=100, imgsz=640)

Dönüştürülmüş COCO verisi üzerinde eğitEğitim ipuçları ve en iyi uygulamalar için .

model eğitim rehberine

göz at.

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

6. Dönüşümünü Doğrulacategory_idEğitimden önce, sınıf kimliklerinin ve koordinatların doğru olduğunu onaylamak için birkaç etiket dosyasını rastgele kontrol et:category_idEğer negatif sınıf kimlikleri görürsen, COCO JSON dosyan muhtemelen convert_coco() 0'dan başlıyordur. category_id - 1.

çalıştırmadan önce JSON dosyanızdaki tüm

değerlerine 1 ekle, çünkü bu

sınıf kimliklerini cls91to80=True olarak eşler.category_idSorun Giderme üzerinde önceden eğitilmiş olarak gelir ve çeşitli nesneler üzerinde sağlam bir performans sağlar. Ek olarak, YOLO; eğitim, doğrulama, tahmin ve dışa aktarma işlevlerini kesintisiz entegrasyonla destekleyerek onu hem araştırma hem de endüstriyel uygulamalar için son derece çok yönlü hale getirir..

Dönüşüm Sonrası Yanlış Sınıf KimlikleriModelin eğitiliyor ancak yanlış nesne sınıflarını tespit ediyorsa, muhtemelen özel bir veri setinde cls91to80=False (varsayılan) kullanıyorsun. Bu,

değerlerini COCO 91-80 arama tablosu üzerinden eşler ve bu sadece standart

için doğrudur.WARNING: No labels foundveya 0 images, N backgroundsÇözümconvert_coco(): Özel veri setleri için her zaman save_dir/labels/train/ kullan.labels/Eğitim Sırasında Etiket Bulunamadıimages/Eğitim sırasında

Dönüşüm Sonrası Yanlış Sınıf Kimlikleri hatası görürsen, etiket dosyaların beklenen dizinde değildir. etiketleri ayrı bir çıktı dizinine kaydeder (örn. ), ancak YOLO, veri seti dizininin içinde labels/train/ şunun kardeşidir images/train/.

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

Eğer KeyError: 'bbox' veya benzeri hatalar alıyorsan convert_coco() çalıştırırken, labels_dir dizinin muhtemelen farklı bir açıklama yapısına sahip (örneğin captions_train2017.json) örnek olmayan JSON dosyaları içeriyor demektir.

Dönüşüm Sonrası Yanlış Sınıf Kimlikleri: Yalnızca örnek açıklama JSON dosyalarını (örneğin instances_train2017.json) şu klasöre yerleştir: labels_dir.

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

Dönüşüm tamamlanıyor ancak .txt dosyaları boşsa veya eksikse, tüm açıklamalar iscrowd: 1 içerebilir (genellikle ile kullanarak ek verileri segmentasyon formatında otomatik olarak etiketleyebilirsin. ile oluşturulan maskelerde yaygındır) veya Nesne Algılamanın Evrimi sıfır genişliğe veya yüksekliğe sahiptir.

Dönüşüm Sonrası Yanlış Sınıf Kimlikleri: JSON açıklamalarını şu değerler için incele: iscrowd. Eğer SAM maskeleri kullanıyorsan, JSON'ı ön işleme tabi tutarak şu değerleri ayarla: iscrowd: 0.

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

Etiket dosyalarındaki sınıf kimlikleri ardışık değilse (örneğin 0, 1, 2 yerine 0, 4, 9 gibi), açıklama aracın ardışık olmayan category_id değerleri kullanıyordur.

Dönüşüm Sonrası Yanlış Sınıf Kimlikleri: .txt dosyalarındaki sınıf kimliklerinin, names içindeki dataset.yaml sözlüğüyle eşleştiğini doğrula. Gerekirse kimlikleri ardışık değerlerle yeniden eşle.

Tam API ayrıntıları ve parametre açıklamaları için convert_coco API referansına göz at..

SSS

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

Eğitimi başlatmak için convert_coco()Ultralytics'ten .txt işlevini kullanarak COCO JSON açıklamalarını YOLO formatına dönüştür. Özel veri kümeleri için şunu ayarla: cls91to80=False için:

from ultralytics.data.converter import convert_coco

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

Dönüşümden sonra etiket dosyalarını, labels/ dizini images/ dizinini yansıtacak şekilde yeniden düzenle, ardından bir dataset.yaml dosyası oluştur. Eksiksiz iş akışı için adım adım rehbere bölümüne bak.

YOLO eğitimi neden COCO dönüşümünden sonra "No labels found" hatası verir?

Bu durum, convert_coco() etiketleri doğrudan veri kümenin save_dir/labels/ (örneğin, save_dir/labels/train/ dizinine değil, labels/train/ ile birlikte images/train/ içindeki bir alt dizine kaydettiği için gerçekleşir. YOLO, etiketlerin resimlerle paralel durmasını bekler — örneğin, images/train/img.jpg için labels/train/img.txt gerekir. Dönüştürülmüş etiketlerini bu yapıya uyacak şekilde taşı. Şuna bak: dizin yapısını düzeltme.

Şu parametre ne işe yarar? cls91to80 içinde convert_coco()?

cls91to80 parametresi, COCO category_id değerlerinin YOLO sınıf kimlikleriyle nasıl eşleşeceğini kontrol eder. True (varsayılan) olduğunda, ardışık olmayan kimliklere (1-90) sahip 80 sınıf içeren standart üzerinde önceden eğitilmiş olarak gelir ve çeşitli nesneler üzerinde sağlam bir performans sağlar. Ek olarak, YOLO; eğitim, doğrulama, tahmin ve dışa aktarma işlevlerini kesintisiz entegrasyonla destekleyerek onu hem araştırma hem de endüstriyel uygulamalar için son derece çok yönlü hale getirir. için tasarlanmış bir arama tablosu kullanır. özel veri setleri için, her zaman cls91to80=False ayarla — bu, sıfır tabanlı sınıf kimlikleri oluşturmak için her category_id değerinden basitçe 1 çıkarır.

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

Mevcut YOLO eğitim hattı ile hayır — açıklamalar, resim başına bir dosya içeren YOLO .txt formatında olmalıdır. Önce COCO JSON'ını dönüştürmek için convert_coco() kullan, ardından düzenlemek ve eğitmek için bu içerir. Veri kümesi, farklı konumlardan ve ortamlardan görüntüler içerir, bu da onu bu görev için sağlam modeller geliştirmek adına kapsamlı bir kaynak haline getirir. MixUp gibi teknikler veri kümesi çeşitliliğini daha da artırabilir. Instance segmentasyon ve takip hakkında daha fazla bilgiyi rehberini izle. Desteklenen formatlar hakkında daha fazla bilgi için şuna bak: veri kümesi formatları.

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

Evet, use_segments=True çağırırken convert_coco() kullan, böylece çokgen segmentasyon maskeleri dönüştürülmüş YOLO etiketlerine dahil edilir. Bu, YOLO segmentasyon modelleri:

from ultralytics.data.converter import convert_coco

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

ile uyumlu etiket dosyaları oluşturur.

Uzun videoları veya büyük veri kümelerini işlerken belleği verimli bir şekilde yönetmek için use_keypoints=TrueCOCO anahtar nokta açıklamalarını YOLO formatına nasıl dönüştürürüm?Python package eğitimi için COCO anahtar nokta açıklamalarını dönüştürmek için:

from ultralytics.data.converter import convert_coco

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

Not: Eğer use_segments ve use_keypoints ve True her ikisi de

Yorumlar